/******************************************************************************* * Copyright (c) 2012-2016 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.extension.machine.client.perspective.widgets.machine.panel; import com.google.gwt.resources.client.ImageResource; import com.google.gwt.user.client.ui.AcceptsOneWidget; import com.google.web.bindery.event.shared.EventBus; import org.eclipse.che.api.machine.gwt.client.MachineServiceClient; import org.eclipse.che.api.machine.shared.dto.MachineDto; import org.eclipse.che.api.machine.shared.dto.MachineStateDto; import org.eclipse.che.api.promises.client.Operation; import org.eclipse.che.api.promises.client.OperationException; import org.eclipse.che.api.promises.client.Promise; import org.eclipse.che.api.promises.client.PromiseError; import org.eclipse.che.api.workspace.shared.dto.ProjectConfigDto; import org.eclipse.che.api.workspace.shared.dto.UsersWorkspaceDto; import org.eclipse.che.ide.api.app.AppContext; import org.eclipse.che.ide.api.app.CurrentProject; import org.eclipse.che.ide.api.event.ActivePartChangedEvent; import org.eclipse.che.ide.extension.machine.client.MachineLocalizationConstant; import org.eclipse.che.ide.extension.machine.client.MachineResources; import org.eclipse.che.ide.extension.machine.client.inject.factories.EntityFactory; import org.eclipse.che.ide.extension.machine.client.inject.factories.WidgetsFactory; import org.eclipse.che.ide.extension.machine.client.machine.Machine; import org.eclipse.che.api.machine.gwt.client.events.MachineStartingEvent; import org.eclipse.che.ide.extension.machine.client.machine.events.MachineStateEvent; import org.eclipse.che.ide.extension.machine.client.perspective.widgets.machine.appliance.MachineAppliancePresenter; import org.eclipse.che.ide.ui.dialogs.InputCallback; import org.eclipse.che.api.workspace.gwt.client.event.StartWorkspaceEvent; import org.eclipse.che.ide.workspace.start.StopWorkspaceEvent; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import java.util.Collections; import java.util.List; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.nullValue; import static org.junit.Assert.assertThat; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Matchers.isNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; /** * @author Dmitry Shnurenko */ @RunWith(MockitoJUnitRunner.class) public class MachinePanelPresenterTest { private static final String TEXT = "There is nothing either good or bad but thinking makes it so."; //constructor mocks @Mock private MachinePanelView view; @Mock private MachineServiceClient service; @Mock private EntityFactory entityFactory; @Mock private WidgetsFactory widgetsFactory; @Mock private MachineLocalizationConstant locale; @Mock private MachineAppliancePresenter appliance; @Mock private EventBus eventBus; @Mock private MachineResources resources; //additional mocks @Mock private Promise<List<MachineStateDto>> machineStatePromise; @Mock private Promise<MachineDto> machinePromise; @Mock private CurrentProject currentProject; @Mock private ProjectConfigDto projectConfig; @Mock private MachineDto machineDescriptor1; @Mock private MachineDto machineDescriptor2; @Mock private Machine machine1; @Mock private Machine machine2; @Mock private MachineStateDto machineState1; @Mock private MachineStateDto machineState2; @Mock private AcceptsOneWidget container; @Mock private MachineTreeNode rootNode; @Mock private MachineTreeNode machineNode1; @Mock private MachineTreeNode machineNode2; @Mock private UsersWorkspaceDto workspaceDto; @Mock private MachineStateEvent stateEvent; @Mock private AppContext appContext; @Mock private UsersWorkspaceDto usersWorkspaceDto; @Captor private ArgumentCaptor<Operation<List<MachineStateDto>>> operationMachineStateCaptor; @Captor private ArgumentCaptor<Operation<MachineDto>> operationMachineCaptor; @Captor private ArgumentCaptor<InputCallback> inputCallbackCaptor; @Captor private ArgumentCaptor<Operation<PromiseError>> errorPromiseCaptor; private MachinePanelPresenter presenter; @Before public void setUp() { when(entityFactory.createMachine(machineDescriptor1)).thenReturn(machine1); when(entityFactory.createMachine(machineDescriptor2)).thenReturn(machine2); when(entityFactory.createMachineNode(isNull(MachineTreeNode.class), anyString(), Matchers.<List<MachineTreeNode>>anyObject())).thenReturn(rootNode); //noinspection unchecked when(entityFactory.createMachineNode(eq(rootNode), eq(machineState2), isNull(List.class))).thenReturn(machineNode2); //noinspection unchecked when(entityFactory.createMachineNode(eq(rootNode), eq(machineState1), isNull(List.class))).thenReturn(machineNode1); presenter = new MachinePanelPresenter(view, service, entityFactory, locale, appliance, eventBus, resources, appContext); when(service.getMachinesStates(anyString())).thenReturn(machineStatePromise); when(machineStatePromise.then(Matchers.<Operation<List<MachineStateDto>>>anyObject())).thenReturn(machineStatePromise); when(service.getMachine(anyString())).thenReturn(machinePromise); when(machinePromise.then(Matchers.<Operation<MachineDto>>anyObject())).thenReturn(machinePromise); when(appContext.getWorkspace()).thenReturn(usersWorkspaceDto); when(usersWorkspaceDto.getId()).thenReturn(TEXT); } @Test public void constructorShouldBeVerified() { verify(entityFactory).createMachineNode(eq(null), eq("root"), Matchers.<List<MachineTreeNode>>anyObject()); verify(eventBus).addHandler(MachineStateEvent.TYPE, presenter); verify(eventBus).addHandler(StartWorkspaceEvent.TYPE, presenter); verify(eventBus).addHandler(StopWorkspaceEvent.TYPE, presenter); verify(eventBus).addHandler(MachineStartingEvent.TYPE, presenter); } @Test public void treeShouldBeDisplayedWithMachines() throws Exception { presenter.showMachines(); verify(service).getMachinesStates(anyString()); verify(machineStatePromise).then(operationMachineStateCaptor.capture()); operationMachineStateCaptor.getValue().apply(Collections.singletonList(machineState1)); verify(entityFactory).createMachineNode(isNull(MachineTreeNode.class), eq("root"), Matchers.<List<MachineTreeNode>>anyObject()); verify(entityFactory).createMachineNode(eq(rootNode), eq(machineState1), eq(null)); verify(view).setData(Matchers.<MachineTreeNode>anyObject()); verify(view).selectNode(machineNode1); } @Test public void stubShouldBeDisplayedWhenMachinesNotExist() throws OperationException { presenter.showMachines(); verify(machineStatePromise).then(operationMachineStateCaptor.capture()); operationMachineStateCaptor.getValue().apply(Collections.<MachineStateDto>emptyList()); verify(locale).unavailableMachineInfo(); verify(appliance).showStub(anyString()); verify(view, never()).setData(rootNode); } @Test public void requestShouldBeSendToGetMachine() throws Exception { presenter.onMachineSelected(machineState1); verify(machineState1).getId(); verify(machinePromise).then(operationMachineCaptor.capture()); operationMachineCaptor.getValue().apply(machineDescriptor1); verify(entityFactory).createMachine(machineDescriptor1); verify(appliance).showAppliance(machine1); assertThat(machineState1, is(equalTo(presenter.getSelectedMachineState()))); assertThat(presenter.isMachineRunning(), is(true)); } @Test public void machineShouldBeGotFromCacheWhenWeSelectMachineTheSecondTime() throws Exception { presenter.onMachineSelected(machineState1); verify(machinePromise).then(operationMachineCaptor.capture()); operationMachineCaptor.getValue().apply(machineDescriptor1); reset(service, appliance); presenter.onMachineSelected(machineState1); verify(appliance).showAppliance(machine1); verify(service, never()).getMachine(anyString()); assertThat(machineState1, is(equalTo(presenter.getSelectedMachineState()))); assertThat(presenter.isMachineRunning(), is(true)); } @Test public void stubShouldBeDisplayedWhenWeTryGetMachineWhichIsNotCreatedYet() throws Exception { PromiseError error = mock(PromiseError.class); presenter.onMachineSelected(machineState1); verify(machinePromise).catchError(errorPromiseCaptor.capture()); errorPromiseCaptor.getValue().apply(error); verify(machineState1).getName(); verify(locale).unavailableMachineStarting(anyString()); verify(appliance).showStub(anyString()); assertThat(presenter.isMachineRunning(), is(false)); assertThat(machineState1, is(equalTo(presenter.getSelectedMachineState()))); } @Test public void titleShouldBeReturned() { presenter.getTitle(); verify(locale).machinePanelTitle(); } @Test public void titleImageShouldBeReturned() { ImageResource resource = presenter.getTitleImage(); assertThat(resource, nullValue(ImageResource.class)); } @Test public void titleTooltipShouldBeReturned() { presenter.getTitleToolTip(); verify(locale).machinePanelTooltip(); } @Test public void viewShouldBeSetToContainer() { presenter.go(container); verify(container).setWidget(view); } @Test public void machineShouldBeAddedToTreeWhenItIsJustCreated() { MachineStartingEvent startingEvent = mock(MachineStartingEvent.class); when(startingEvent.getMachineState()).thenReturn(machineState1); presenter.onMachineStarting(startingEvent); verify(view).setData(rootNode); verify(view).selectNode(machineNode1); assertThat(presenter.isMachineRunning(), is(false)); } @Test public void machineShouldBeSelectedWhenItIsRunning() { MachineStartingEvent startingEvent = mock(MachineStartingEvent.class); when(startingEvent.getMachineState()).thenReturn(machineState1); when(stateEvent.getMachineState()).thenReturn(machineState1); presenter.onMachineStarting(startingEvent); reset(view); presenter.onMachineRunning(stateEvent); verify(view).selectNode(machineNode1); assertThat(presenter.isMachineRunning(), is(true)); } @Test public void machineShouldBeRemovedFromTreeWhenItIsDestroyed() { MachineStartingEvent startingEvent = mock(MachineStartingEvent.class); when(startingEvent.getMachineState()).thenReturn(machineState1); when(stateEvent.getMachineState()).thenReturn(machineState1); presenter.onMachineStarting(startingEvent); reset(view); presenter.onMachineRunning(stateEvent); verify(view).selectNode(machineNode1); reset(view); presenter.onMachineDestroyed(stateEvent); verify(view).setData(rootNode); verify(view, never()).selectNode(machineNode1); } @Test public void shouldShowMachinesWhenMachinesPartIsActive() throws Exception { ActivePartChangedEvent event = mock(ActivePartChangedEvent.class); when(event.getActivePart()).thenReturn(presenter); presenter.onActivePartChanged(event); verify(event).getActivePart(); verify(appContext).getWorkspace(); verify(service).getMachinesStates(anyString()); verify(machineStatePromise).then(operationMachineStateCaptor.capture()); operationMachineStateCaptor.getValue().apply(Collections.singletonList(machineState1)); verify(entityFactory).createMachineNode(isNull(MachineTreeNode.class), eq("root"), Matchers.<List<MachineTreeNode>>anyObject()); verify(entityFactory).createMachineNode(eq(rootNode), eq(machineState1), eq(null)); verify(view).setData(Matchers.<MachineTreeNode>anyObject()); verify(view).selectNode(machineNode1); } }