/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * 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: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.command.editor.page.project; import com.google.gwtmockito.GwtMockitoTestRunner; import com.google.web.bindery.event.shared.EventBus; import org.eclipse.che.ide.api.app.AppContext; import org.eclipse.che.ide.api.command.CommandImpl; import org.eclipse.che.ide.api.command.CommandImpl.ApplicableContext; import org.eclipse.che.ide.api.resources.Project; import org.eclipse.che.ide.api.resources.Resource; import org.eclipse.che.ide.api.resources.ResourceChangedEvent; import org.eclipse.che.ide.api.resources.ResourceDelta; import org.eclipse.che.ide.command.editor.EditorMessages; import org.eclipse.che.ide.command.editor.page.CommandEditorPage.DirtyStateListener; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; import java.util.HashSet; import java.util.Map; import java.util.Set; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; /** Tests for {@link ProjectsPage}. */ @RunWith(GwtMockitoTestRunner.class) public class ProjectsPageTest { private static final String PROJECT_PATH = "/projects/p1"; @Mock private ProjectsPageView view; @Mock private AppContext appContext; @Mock private EditorMessages messages; @Mock private EventBus eventBus; @InjectMocks private ProjectsPage page; @Mock private DirtyStateListener dirtyStateListener; @Mock private CommandImpl editedCommand; @Mock private ApplicableContext applicableContext; @Mock private Project project; @Captor private ArgumentCaptor<Map<Project, Boolean>> projectsStatesCaptor; @Before public void setUp() throws Exception { when(project.getPath()).thenReturn(PROJECT_PATH); when(appContext.getProjects()).thenReturn(new Project[]{project}); when(editedCommand.getApplicableContext()).thenReturn(applicableContext); page.setDirtyStateListener(dirtyStateListener); page.edit(editedCommand); } @Test public void shouldSetViewDelegate() throws Exception { verify(view).setDelegate(page); } @Test public void shouldReturnView() throws Exception { assertEquals(view, page.getView()); } @Test public void shouldSetProjects() throws Exception { setUpApplicableProjectToContext(); verifySettingProjects(); } @Test public void shouldNotifyListenerWhenApplicableProjectChanged() throws Exception { page.onApplicableProjectChanged(mock(Project.class), true); verify(dirtyStateListener, times(2)).onDirtyStateChanged(); } @Test public void shouldAddApplicableProjectInContext() throws Exception { page.onApplicableProjectChanged(project, true); verify(applicableContext).addProject(eq(PROJECT_PATH)); } @Test public void shouldRemoveApplicableProjectFromContext() throws Exception { page.onApplicableProjectChanged(project, false); verify(applicableContext).removeProject(eq(PROJECT_PATH)); } @Test public void shouldUnsetWorkspaceApplicableWhenAnyApplicableProject() throws Exception { page.onApplicableProjectChanged(project, true); verify(applicableContext).setWorkspaceApplicable(eq(Boolean.FALSE)); } @Test public void shouldSetWorkspaceApplicableWhenNoApplicableProject() throws Exception { page.onApplicableProjectChanged(project, false); verify(applicableContext).setWorkspaceApplicable(eq(Boolean.TRUE)); } @Test public void shouldSetProjectsOnResourceChanged() throws Exception { setUpApplicableProjectToContext(); ResourceDelta resourceDelta = mock(ResourceDelta.class); Resource resource = mock(Resource.class); when(resourceDelta.getResource()).thenReturn(resource); when(resource.isProject()).thenReturn(true); page.onResourceChanged(new ResourceChangedEvent(resourceDelta)); verifySettingProjects(); } private void setUpApplicableProjectToContext() { Set<String> applicableProjects = new HashSet<>(); applicableProjects.add(PROJECT_PATH); when(applicableContext.getApplicableProjects()).thenReturn(applicableProjects); } private void verifySettingProjects() throws Exception { verify(view).setProjects(projectsStatesCaptor.capture()); Map<Project, Boolean> map = projectsStatesCaptor.getValue(); assertTrue(map.containsKey(project)); } }