Package org.eclipse.egit.ui.view.repositories

Source Code of org.eclipse.egit.ui.view.repositories.GitRepositoriesViewTest

/*******************************************************************************
* Copyright (c) 2010, 2013 SAP AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*    Mathias Kinzler (SAP AG) - initial implementation
*******************************************************************************/
package org.eclipse.egit.ui.view.repositories;

import static org.eclipse.swtbot.swt.finder.waits.Conditions.shellCloses;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.Matchers.hasItem;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;

import java.io.File;
import java.util.Arrays;
import java.util.List;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.egit.core.project.RepositoryMapping;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.JobFamilies;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.egit.ui.test.ContextMenuHelper;
import org.eclipse.egit.ui.test.TestUtil;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
import org.eclipse.swtbot.swt.finder.utils.TableCollection;
import org.eclipse.swtbot.swt.finder.waits.Conditions;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotButton;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.IWorkingSetManager;
import org.eclipse.ui.PlatformUI;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;

/**
* SWTBot Tests for the Git Repositories View.
*
* <pre>
* TODO
* global copy and paste command
* bare repository support including copy of path from workdir
* copy path from file and folder
* paste with empty and invalid path
* create branch with selection not on a ref
* tags altogether
* fetch and push to configured remote
* import wizard outside the "golden path"
* </pre>
*/
@RunWith(SWTBotJunit4ClassRunner.class)
public class GitRepositoriesViewTest extends GitRepositoriesViewTestBase {

  private File repositoryFile;

  @Before
  public void beforeClass() throws Exception {
    setVerboseBranchMode(false);
    repositoryFile = createProjectAndCommitToRepository();
    Activator.getDefault().getRepositoryUtil().addConfiguredRepository(
        repositoryFile);
  }

  /**
   * First level should have 5 children
   *
   * @throws Exception
   */
  @Test
  public void testExpandFirstLevel() throws Exception {
    SWTBotTree tree = getOrOpenView().bot().tree();
    SWTBotTreeItem item = myRepoViewUtil.getRootItem(tree, repositoryFile)
        .expand();
    SWTBotTreeItem[] children = item.getItems();
    assertEquals("Wrong number of children", 5, children.length);
  }

  /**
   * Open (expand, file->editor, branch->checkout)
   *
   * @throws Exception
   */
  @Test
  public void testOpen() throws Exception {
    // expand first level
    SWTBotTree tree = getOrOpenView().bot().tree();
    SWTBotTreeItem item = myRepoViewUtil.getRootItem(tree, repositoryFile);
    item.collapse();
    refreshAndWait();
    item = myRepoViewUtil.getRootItem(tree, repositoryFile);
    assertTrue("Item should not be expanded", !item.isExpanded());
    item.doubleClick();
    assertTrue("Item should be expanded", item.isExpanded());
    // open a file in editor
    item = myRepoViewUtil.getWorkdirItem(tree, repositoryFile).expand();
    SWTBotTreeItem fileiItem = item.getNode(PROJ1).expand().getNode(FOLDER)
        .expand().getNode(FILE1).select();
    fileiItem.doubleClick();
    assertTrue(bot.activeEditor().getTitle().equals(FILE1));
    bot.activeEditor().close();
    // open a branch (checkout)
    checkoutWithDoubleClick(tree, "master");
    String contentMaster = getTestFileContent();
    checkoutWithDoubleClick(tree, "stable");
    TestUtil.joinJobs(JobFamilies.CHECKOUT);
    String contentStable = getTestFileContent();
    assertNotEquals("Content of master and stable should differ",
        contentMaster, contentStable);
  }

  private void checkoutWithDoubleClick(SWTBotTree tree, String branch)
      throws Exception {
    myRepoViewUtil.getLocalBranchesItem(tree, repositoryFile).expand()
        .getNode(branch).doubleClick();
    SWTBotShell shell = bot
        .shell(UIText.RepositoriesView_CheckoutConfirmationTitle);
    shell.bot().button(IDialogConstants.OK_LABEL).click();
    refreshAndWait();
  }

  /**
   * Checks for the Symbolic Reference node
   *
   * @throws Exception
   */
  @Test
  public void testExpandSymbolicRef() throws Exception {
    SWTBotTree tree = getOrOpenView().bot().tree();
    SWTBotTreeItem item = myRepoViewUtil.getSymbolicRefsItem(tree,
        repositoryFile).expand();
    List<String> children = item.getNodes();
    boolean found = false;
    for (String child : children)
      if (child.contains(Constants.HEAD))
        found = true;
    assertTrue(found);
  }

  /**
   * Checks the first level of the working directory
   *
   * @throws Exception
   */
  @Test
  public void testExpandWorkDir() throws Exception {
    SWTBotTree tree = getOrOpenView().bot().tree();
    Repository myRepository = lookupRepository(repositoryFile);
    List<String> children = Arrays
        .asList(myRepository.getWorkTree().list());
    List<String> treeChildren = myRepoViewUtil.getWorkdirItem(tree,
        repositoryFile).expand().getNodes();
    assertTrue(children.containsAll(treeChildren)
        && treeChildren.containsAll(children));
    myRepoViewUtil.getWorkdirItem(tree, repositoryFile).expand().getNode(
        PROJ1).expand().getNode(FOLDER).expand().getNode(FILE1);
  }

  /**
   * Checks is some context menus are available, should be replaced with real
   * tests
   *
   * @throws Exception
   */
  @Test
  public void testContextMenuRepository() throws Exception {
    // We just check if the dialogs open, the actual commit and import projects
    // is tested elsewhere
    SWTBotTree tree = getOrOpenView().bot().tree();
    SWTBotTreeItem item = myRepoViewUtil.getRootItem(tree, repositoryFile);
    item.select();
    assertClickOpens(tree,
        myUtil.getPluginLocalizedValue("RepoViewCommit.label"),
        UIText.CommitDialog_CommitChanges);
    assertClickOpens(tree,
        myUtil.getPluginLocalizedValue("RepoViewImportProjects.label"),
        NLS.bind(UIText.GitCreateProjectViaWizardWizard_WizardTitle,
            repositoryFile));
  }

  /**
   * Show properties
   *
   * @throws Exception
   */
  @Test
  public void testShowProperties() throws Exception {
    SWTBotTree tree = getOrOpenView().bot().tree();
    SWTBotTreeItem item = myRepoViewUtil.getRootItem(tree, repositoryFile);
    item.select();
    ContextMenuHelper.clickContextMenuSync(tree,
        myUtil.getPluginLocalizedValue("ShowIn"),
        "Properties");
    SWTBotView propertieView = bot.viewById("org.eclipse.ui.views.PropertySheet");
    assertTrue(propertieView.isActive());
  }

  /**
   * Import wizard golden path test
   *
   * @throws Exception
   */
  @Test
  public void testImportWizard() throws Exception {
    deleteAllProjects();
    assertProjectExistence(PROJ1, false);
    SWTBotTree tree = getOrOpenView().bot().tree();
    SWTBotTreeItem item = myRepoViewUtil.getRootItem(tree, repositoryFile);
    String wizardTitle = NLS.bind(
        UIText.GitCreateProjectViaWizardWizard_WizardTitle,
        repositoryFile.getPath());
    // start wizard from root item
    item.select();
    ContextMenuHelper.clickContextMenu(tree, myUtil
        .getPluginLocalizedValue("ImportProjectsCommand"));
    SWTBotShell shell = bot.shell(wizardTitle);
    bot.radio(UIText.GitSelectWizardPage_ImportExistingButton).click();
    TableCollection selected = shell.bot().tree().selection();
    String wizardNode = selected.get(0, 0);
    // wizard directory should be working dir
    assertEquals(myRepoViewUtil.getWorkdirItem(tree, repositoryFile)
        .getText(), wizardNode);
    shell.close();
    // start wizard from .git
    myRepoViewUtil.getWorkdirItem(tree, repositoryFile).expand().getNode(
        Constants.DOT_GIT).select();
    ContextMenuHelper.clickContextMenu(tree, myUtil
        .getPluginLocalizedValue("ImportProjectsCommand"));
    shell = bot.shell(wizardTitle);
    selected = shell.bot().tree().selection();
    wizardNode = selected.get(0, 0);
    // wizard directory should be .git
    assertEquals(Constants.DOT_GIT, wizardNode);
    shell.bot().button(IDialogConstants.NEXT_LABEL).click();
    shell.bot().label("Import Projects"); // wait for import projects page
    assertEquals(0, shell.bot().tree().getAllItems().length);
    shell.bot().button(IDialogConstants.BACK_LABEL).click();
    // go to project with .project
    shell.bot().tree().getAllItems()[0].getNode(PROJ1).select();
    // next is 1
    shell.bot().button(IDialogConstants.NEXT_LABEL).click();
    bot.button(UIText.WizardProjectsImportPage_deselectAll).click();
    assertEquals(1, shell.bot().tree().getAllItems().length);
    assertTrue(!shell.bot().button(IDialogConstants.FINISH_LABEL)
        .isEnabled());
    shell.bot().button(UIText.WizardProjectsImportPage_selectAll).click();
    assertTrue(shell.bot().button(IDialogConstants.FINISH_LABEL)
        .isEnabled());
    shell.bot().button(IDialogConstants.FINISH_LABEL).click();
    bot.waitUntil(Conditions.shellCloses(shell));
    assertProjectExistence(PROJ1, true);
    assertProjectIsShared(PROJ1, true);
  }

  @Test
  public void testImportWizardGeneralProject() throws Exception {
    deleteAllProjects();
    assertProjectExistence(PROJ2, false);
    SWTBotTree tree = getOrOpenView().bot().tree();
    String wizardTitle = NLS.bind(
        UIText.GitCreateProjectViaWizardWizard_WizardTitle,
        repositoryFile.getPath());
    // start wizard from PROJ2
    myRepoViewUtil.getWorkdirItem(tree, repositoryFile).expand().getNode(
        PROJ2).select();
    ContextMenuHelper.clickContextMenu(tree, myUtil
        .getPluginLocalizedValue("ImportProjectsCommand"));
    SWTBotShell shell = bot.shell(wizardTitle);
    shell = bot.shell(wizardTitle);
    // try import existing project first
    bot.radio(UIText.GitSelectWizardPage_ImportExistingButton).click();
    TableCollection selected = shell.bot().tree().selection();
    String wizardNode = selected.get(0, 0);
    // wizard directory should be PROJ2
    assertEquals(PROJ2, wizardNode);
    shell.bot().button(IDialogConstants.NEXT_LABEL).click();
    shell.bot().text(" " + UIText.GitProjectsImportPage_NoProjectsMessage);
    assertEquals(0, shell.bot().tree().getAllItems().length);
    shell.bot().button(IDialogConstants.BACK_LABEL).click();
    // import as general
    shell.bot().radio(UIText.GitSelectWizardPage_ImportAsGeneralButton).click();
    shell.bot().button(IDialogConstants.NEXT_LABEL).click();
    assertEquals(PROJ2, shell.bot().textWithLabel(
        UIText.GitCreateGeneralProjectPage_ProjectNameLabel).getText());
    // switch to a sub directory and see if this is used
    shell.bot().button(IDialogConstants.BACK_LABEL).click();
    shell.bot().tree().getAllItems()[0].expand().getNode(PROJ2).expand()
        .getNode(FOLDER).select();
    shell.bot().button(IDialogConstants.NEXT_LABEL).click();
    String name = shell.bot().textWithLabel(
        UIText.GitCreateGeneralProjectPage_ProjectNameLabel).getText();
    assertEquals(FOLDER, name);
    shell.bot().button(IDialogConstants.BACK_LABEL).click();
    // switch back to the root directory
    shell.bot().tree().getAllItems()[0].expand().getNode(PROJ2).select();
    shell.bot().button(IDialogConstants.NEXT_LABEL).click();
    assertEquals(PROJ2, shell.bot().textWithLabel(
        UIText.GitCreateGeneralProjectPage_ProjectNameLabel).getText());

    shell.bot().button(IDialogConstants.FINISH_LABEL).click();
    bot.waitUntil(Conditions.shellCloses(shell));
    assertProjectExistence(PROJ2, true);
    assertProjectIsShared(PROJ2, true);
  }

  @Test
  public void testImportWizardGeneralProjectWithWorkingSet() throws Exception {
    deleteAllProjects();
    assertProjectExistence(PROJ1, false);
    String workingSetName = "myWorkingSet";
    removeWorkingSet(workingSetName);
    SWTBotTree tree = getOrOpenView().bot().tree();
    String wizardTitle = NLS.bind(
        UIText.GitCreateProjectViaWizardWizard_WizardTitle,
        repositoryFile.getPath());
    // start wizard from PROJ1
    myRepoViewUtil.getWorkdirItem(tree, repositoryFile).expand().getNode(
        PROJ1).select();
    ContextMenuHelper.clickContextMenu(tree, myUtil
        .getPluginLocalizedValue("ImportProjectsCommand"));
    SWTBotShell shell = bot.shell(wizardTitle);
    shell = bot.shell(wizardTitle);
    // try import existing project first
    bot.radio(UIText.GitSelectWizardPage_ImportExistingButton).click();
    SWTBotButton button = shell.bot().button(IDialogConstants.NEXT_LABEL);
    // Set focus on the next button. If this is not done, Wizard Framework restores
    // the focus to the "Import as &General Project" radio button. Setting the focus on
    // the radio button selects the button and causes the test to fail.
    // See also SWTBot Bug 337465
    button.setFocus();
    button.click();
    shell.bot().text(UIText.WizardProjectsImportPage_ImportProjectsDescription);
    shell.bot().tree().getAllItems()[0].check();
    // add to working set
    shell.bot().checkBox("Add project to working sets").select();
    // create new working set
    shell.bot().button("Select...").click();
    SWTBotShell workingSetDialog = bot.shell("Select Working Sets");
    workingSetDialog.bot().button("New...").click();
    SWTBotShell newDialog = bot.shell("New Working Set");
    newDialog.bot().table().select("Java");
    newDialog.bot().button(IDialogConstants.NEXT_LABEL).click();
    newDialog.bot().text(0).setText(workingSetName);
    newDialog.bot().button(IDialogConstants.FINISH_LABEL).click();
    workingSetDialog.bot().table().getTableItem(workingSetName).check();
    workingSetDialog.bot().button(IDialogConstants.OK_LABEL).click();
    shell.bot().button(IDialogConstants.FINISH_LABEL).click();
    bot.waitUntil(Conditions.shellCloses(shell));
    assertProjectExistence(PROJ1, true);
    assertProjectInWorkingSet(workingSetName, PROJ1);
    assertProjectIsShared(PROJ1, true);
    removeWorkingSet(workingSetName);
  }

  private void assertProjectInWorkingSet(String workingSetName,
      String projectName) {
    IWorkingSetManager workingSetManager = PlatformUI.getWorkbench()
        .getWorkingSetManager();
    IWorkingSet workingSet = workingSetManager
        .getWorkingSet(workingSetName);
    IAdaptable[] elements = workingSet.getElements();
    assertEquals("Wrong number of projects in working set", 1,
        elements.length);
    IProject project = (IProject) elements[0].getAdapter(IProject.class);
    assertEquals("Wrong project in working set", projectName, project
        .getName());
  }

  private void removeWorkingSet(String name) {
    IWorkingSetManager workingSetManager = PlatformUI.getWorkbench()
        .getWorkingSetManager();
    IWorkingSet workingSet = workingSetManager.getWorkingSet(name);
    if (workingSet != null)
      workingSetManager.removeWorkingSet(workingSet);
  }

  private void assertProjectIsShared(String projectName,
      boolean shouldBeShared) {
    IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(
        projectName);
    RepositoryMapping mapping = RepositoryMapping.getMapping(project);
    if (shouldBeShared) {
      assertNotNull(mapping);
      assertNotNull(mapping.getRepository());
    } else
      assertNull(mapping);
  }

  @Test
  public void testLinkWithSelectionNavigator() throws Exception {
    deleteAllProjects();
    shareProjects(repositoryFile);
    SWTBotTree tree = getOrOpenView().bot().tree();
    myRepoViewUtil.getRootItem(tree, repositoryFile).select();
    // the selection should be root
    assertTrue(tree.selection().get(0, 0).startsWith(REPO1));

    SWTBotTree projectExplorerTree = TestUtil.getExplorerTree();
    getProjectItem(projectExplorerTree, PROJ1).select();

    // the selection should be still be root
    assertTrue(tree.selection().get(0, 0).startsWith(REPO1));

    // activate the link with selection
    toggleLinkWithSelection();

    // the selection should be still be root
    assertTrue(tree.selection().get(0, 0).startsWith(REPO1));

    // select again the project
    projectExplorerTree = TestUtil.getExplorerTree();
    getProjectItem(projectExplorerTree, PROJ1).select();

    // the selection should be project
    assertTrue(tree.selection().get(0, 0).equals(PROJ1));

    // deactivate the link with selection
    toggleLinkWithSelection();
  }

  /**
   * Link with editor, both ways
   *
   * @throws Exception
   */
  @Test
  @Ignore("'Link with Selection' does not activate editor on selection change (bug 409722).")
  public void testLinkWithSelectionEditor() throws Exception {
    deleteAllProjects();
    shareProjects(repositoryFile);
    SWTBotTree tree = getOrOpenView().bot().tree();
    myRepoViewUtil.getRootItem(tree, repositoryFile).select();
    // the selection should be root
    assertTrue(tree.selection().get(0, 0).startsWith(REPO1));

    SWTBotView view = TestUtil.showExplorerView();
    SWTBotTree projectExplorerTree = view.bot().tree();

    SWTBotTreeItem item = getProjectItem(projectExplorerTree, PROJ1)
        .expand().getNode(FOLDER).expand().getNode(FILE1);
    view.show();
    item.doubleClick();

    item = getProjectItem(projectExplorerTree, PROJ1).expand()
        .getNode(FOLDER).expand().getNode(FILE2);
    view.show();
    item.doubleClick();
    // now we should have two editors

    // the selection should be still be root
    assertTrue(tree.selection().get(0, 0).startsWith(REPO1));

    // activate the link with selection
    toggleLinkWithSelection();

    bot.editorByTitle(FILE2).show();
    // the selection should have changed to the latest editor
    TestUtil.waitUntilTreeHasSelectedNodeWithText(bot, tree, FILE2, 10000);

    bot.editorByTitle(FILE1).show();
    // selection should have changed
    TestUtil.waitUntilTreeHasSelectedNodeWithText(bot, tree, FILE1, 10000);

    // deactivate the link with editor
    toggleLinkWithSelection();

    bot.editorByTitle(FILE2).show();
    // the selection should be still be test.txt
    TestUtil.waitUntilTreeHasSelectedNodeWithText(bot, tree, FILE1, 10000);

    bot.editorByTitle(FILE1).show();

    myRepoViewUtil.getWorkdirItem(tree, repositoryFile).expand()
        .getNode(PROJ1).expand().getNode(FOLDER).expand()
        .getNode(FILE2).select();

    // the editor should still be test.txt
    assertEquals(FILE1, bot.activeEditor().getTitle());

    // activate again
    toggleLinkWithSelection();

    // make sure focus is here
    // tried to remove this waitInUI but failed.
    // tried setting focus, waiting for focus, joining RepositoriesView
    // refresh job
    waitInUI();
    myRepoViewUtil.getWorkdirItem(tree, repositoryFile).expand()
        .getNode(PROJ1).expand().getNode(FOLDER).expand()
        .getNode(FILE2).select();
    TestUtil.waitUntilEditorIsActive(bot, bot.editorByTitle(FILE2), 10000);

    myRepoViewUtil.getWorkdirItem(tree, repositoryFile).expand()
        .getNode(PROJ1).expand().getNode(FOLDER).expand()
        .getNode(FILE1).select();
    TestUtil.waitUntilEditorIsActive(bot, bot.editorByTitle(FILE1), 10000);

    // deactivate the link with editor
    toggleLinkWithSelection();

    myRepoViewUtil.getWorkdirItem(tree, repositoryFile).expand()
        .getNode(PROJ1).expand().getNode(FOLDER).expand()
        .getNode(FILE2).select();
    TestUtil.waitUntilEditorIsActive(bot, bot.editorByTitle(FILE1), 10000);
  }

  @Test
  public void testDeleteSingleBranch() throws Exception {
    // expand first level
    SWTBotTree tree = getOrOpenView().bot().tree();
    refreshAndWait();
    // create a branch (no checkout)
    SWTBotTreeItem localBranchesItem = myRepoViewUtil.getLocalBranchesItem(
        tree, repositoryFile).expand();
    SWTBotTreeItem masterNode = localBranchesItem.getNode("master");
    masterNode.select();
    ContextMenuHelper.clickContextMenu(tree, myUtil
        .getPluginLocalizedValue("RepoViewCreateBranch.label"));
    SWTBotShell createBranchShell = bot
        .shell(UIText.CreateBranchWizard_NewBranchTitle);
    createBranchShell.bot().textWithId("BranchName").setText("abc");
    createBranchShell.bot()
        .checkBox(UIText.CreateBranchPage_CheckoutButton).deselect();
    createBranchShell.bot().button(IDialogConstants.FINISH_LABEL).click();
    refreshAndWait();
    // delete branch
    // lookup node again. Widget might have changed due to refresh
    localBranchesItem = myRepoViewUtil.getLocalBranchesItem(
        tree, repositoryFile).expand();
    localBranchesItem.getNode("abc").select();
    ContextMenuHelper.clickContextMenuSync(tree,
        myUtil.getPluginLocalizedValue("RepoViewDeleteBranch.label"));

    refreshAndWait();
    SWTBotTreeItem[] items = myRepoViewUtil.getLocalBranchesItem(tree,
        repositoryFile).getItems();
    assertEquals("Wrong number of branches", 2, items.length);
    assertEquals("master", items[0].getText());
    assertEquals("stable", items[1].getText());
  }

  @Test
  public void testDeleteMultipleBranches() throws Exception {
    // expand first level
    SWTBotTree tree = getOrOpenView().bot().tree();
    refreshAndWait();
    // open a branch (checkout)
    SWTBotTreeItem localBranchesItem = myRepoViewUtil.getLocalBranchesItem(
        tree, repositoryFile).expand();
    SWTBotTreeItem masterNode = localBranchesItem.getNode("master");
    // create first branch (abc)
    masterNode.select();
    ContextMenuHelper.clickContextMenu(tree, "Create Branch...");
    SWTBotShell createBranchShell = bot
        .shell(UIText.CreateBranchWizard_NewBranchTitle);
    createBranchShell.bot().textWithId("BranchName").setText("abc");
    createBranchShell.bot()
        .checkBox(UIText.CreateBranchPage_CheckoutButton).deselect();
    createBranchShell.bot().button(IDialogConstants.FINISH_LABEL).click();
    // create second branch (123)
    ContextMenuHelper.clickContextMenu(tree, "Create Branch...");
    createBranchShell = bot.shell(UIText.CreateBranchWizard_NewBranchTitle);
    createBranchShell.bot().textWithId("BranchName").setText("123");
    createBranchShell.bot()
        .checkBox(UIText.CreateBranchPage_CheckoutButton).deselect();
    createBranchShell.bot().button(IDialogConstants.FINISH_LABEL).click();
    refreshAndWait();
    localBranchesItem = myRepoViewUtil.getLocalBranchesItem(tree,
        repositoryFile).expand();
    // delete both
    localBranchesItem.select("abc", "123");
    ContextMenuHelper.clickContextMenuSync(tree, myUtil
        .getPluginLocalizedValue("RepoViewDeleteBranch.label"));
    refreshAndWait();

    SWTBotTreeItem[] items = myRepoViewUtil.getLocalBranchesItem(tree,
        repositoryFile).getItems();
    assertEquals("Wrong number of branches", 2, items.length);
    assertEquals("master", items[0].getText());
    assertEquals("stable", items[1].getText());
  }

  @Test
  public void testDeleteFileInProject() throws Exception {
    SWTBotTree tree = getOrOpenView().bot().tree();
    refreshAndWait();

    IProject project1 = ResourcesPlugin.getWorkspace().getRoot().getProject(PROJ1);
    // Make sure that the refresh doesn't happen on delete and cause a timeout
    project1.refreshLocal(IResource.DEPTH_INFINITE, null);

    SWTBotTreeItem folder = findWorkdirNode(tree, PROJ1, FOLDER);
    folder.getNode(FILE1).select();

    ContextMenuHelper.clickContextMenu(tree,
        myUtil.getPluginLocalizedValue("RepoViewDeleteFile.label"));

    SWTBotShell confirm = bot.shell("Delete Resources");
    confirm.bot().button(IDialogConstants.OK_LABEL).click();
    bot.waitUntil(shellCloses(confirm));
    TestUtil.joinJobs(JobFamilies.REPO_VIEW_REFRESH);

    folder = findWorkdirNode(tree, PROJ1, FOLDER);
    assertThat(folder.getNodes(), not(hasItem(FILE1)));
    assertThat(folder.getNodes(), hasItem(FILE2));
  }

  @Test
  public void testDeleteFileNotInProject() throws Exception {
    SWTBotTree tree = getOrOpenView().bot().tree();
    refreshAndWait();

    SWTBotTreeItem folder = findWorkdirNode(tree, PROJ2, FOLDER);
    folder.getNode(FILE1).select();

    ContextMenuHelper.clickContextMenu(tree,
        myUtil.getPluginLocalizedValue("RepoViewDeleteFile.label"));

    SWTBotShell confirm = bot.shell(UIText.DeleteResourcesOperationUI_confirmActionTitle);
    confirm.bot().button(IDialogConstants.OK_LABEL).click();
    bot.waitUntil(shellCloses(confirm));
    TestUtil.joinJobs(JobFamilies.REPO_VIEW_REFRESH);

    folder = findWorkdirNode(tree, PROJ2, FOLDER);
    assertThat(folder.getNodes(), not(hasItem(FILE1)));
    assertThat(folder.getNodes(), hasItem(FILE2));
  }

  private void toggleLinkWithSelection() throws Exception {
    getOrOpenView().toolbarButton(
        myUtil.getPluginLocalizedValue("LinkWithSelectionCommand"))
        .click();
  }

  private SWTBotTreeItem findWorkdirNode(SWTBotTree tree, String... nodes) throws Exception {
    SWTBotTreeItem item = myRepoViewUtil.getWorkdirItem(tree, repositoryFile).expand();
    for (String node : nodes)
      item = item.getNode(node).expand();
    return item;
  }
}
TOP

Related Classes of org.eclipse.egit.ui.view.repositories.GitRepositoriesViewTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.