/*******************************************************************************
* 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.appliance;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwtmockito.GwtMockitoTestRunner;
import com.google.web.bindery.event.shared.EventBus;
import org.eclipse.che.ide.api.event.ActivePartChangedEvent;
import org.eclipse.che.ide.client.inject.factories.TabItemFactory;
import org.eclipse.che.ide.extension.machine.client.MachineLocalizationConstant;
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.ide.extension.machine.client.perspective.terminal.container.TerminalContainer;
import org.eclipse.che.ide.extension.machine.client.perspective.widgets.machine.appliance.recipe.RecipeTabPresenter;
import org.eclipse.che.ide.extension.machine.client.perspective.widgets.machine.appliance.server.ServerPresenter;
import org.eclipse.che.ide.extension.machine.client.perspective.widgets.machine.appliance.sufficientinfo.MachineInfoPresenter;
import org.eclipse.che.ide.extension.machine.client.perspective.widgets.machine.panel.MachinePanelPresenter;
import org.eclipse.che.ide.extension.machine.client.perspective.widgets.machine.panel.MachinePanelView;
import org.eclipse.che.ide.extension.machine.client.perspective.widgets.recipe.RecipePartPresenter;
import org.eclipse.che.ide.extension.machine.client.perspective.widgets.recipe.RecipePartView;
import org.eclipse.che.ide.extension.machine.client.perspective.widgets.recipe.container.RecipesContainerPresenter;
import org.eclipse.che.ide.extension.machine.client.perspective.widgets.tab.Tab;
import org.eclipse.che.ide.extension.machine.client.perspective.widgets.tab.container.TabContainerPresenter;
import org.eclipse.che.ide.extension.machine.client.perspective.widgets.tab.container.TabContainerView;
import org.eclipse.che.ide.extension.machine.client.perspective.widgets.tab.container.TabContainerView.TabSelectHandler;
import org.eclipse.che.ide.extension.machine.client.perspective.widgets.tab.header.TabHeader;
import org.eclipse.che.ide.part.PartStackPresenter.PartStackEventHandler;
import org.eclipse.che.ide.part.PartsComparator;
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 static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* @author Dmitry Shnurenko
* @author Valeriy Svydenko
*/
@RunWith(GwtMockitoTestRunner.class)
public class MachineAppliancePresenterTest {
private final static String SOME_TEXT = "someText";
//constructor mocks
@Mock
private EventBus eventBus;
@Mock
private PartStackEventHandler partStackEventHandler;
@Mock
private MachineApplianceView view;
@Mock
private MachineLocalizationConstant locale;
@Mock
private WidgetsFactory widgetsFactory;
@Mock
private EntityFactory entityFactory;
@Mock
private TabItemFactory tabItemFactory;
@Mock
private PartsComparator comparator;
@Mock
private RecipesContainerPresenter recipesContainerPresenter;
@Mock
private RecipeTabPresenter recipeTabPresenter;
@Mock
private TerminalContainer terminalContainer;
@Mock
private MachineInfoPresenter infoPresenter;
@Mock
private ServerPresenter serverPresenter;
@Mock
private TabContainerPresenter tabContainer;
//additional mocks
@Mock
private TabHeader tabHeader;
@Mock
private Tab terminalTab;
@Mock
private Tab infoTab;
@Mock
private Tab serverTab;
@Mock
private Tab recipeTab;
@Mock
private TabContainerView tabContainerView;
@Mock
private Machine machine;
@Mock
private Widget widget;
@Mock
private ActivePartChangedEvent event;
@Mock
private RecipePartPresenter recipePartPresenter;
@Mock
private MachinePanelPresenter machinePanelPresenter;
@Mock
private MachinePanelView machinePanelView;
@Mock
private RecipePartView recipePartView;
@Mock
private AcceptsOneWidget container;
@Captor
private ArgumentCaptor<TabSelectHandler> handlerCaptor;
private MachineAppliancePresenter presenter;
@Before
public void setUp() {
when(machine.getId()).thenReturn(SOME_TEXT);
when(tabContainer.getView()).thenReturn(tabContainerView);
when(tabContainerView.asWidget()).thenReturn(widget);
when(recipesContainerPresenter.getView()).thenReturn(recipePartView);
when(locale.tabTerminal()).thenReturn(SOME_TEXT);
when(locale.tabInfo()).thenReturn(SOME_TEXT);
when(locale.tabServer()).thenReturn(SOME_TEXT);
when(locale.tabRecipe()).thenReturn(SOME_TEXT);
when(widgetsFactory.createTabHeader(SOME_TEXT)).thenReturn(tabHeader);
when(entityFactory.createTab(Matchers.<TabHeader>anyObject(),
eq(terminalContainer),
Matchers.<TabSelectHandler>anyObject())).thenReturn(terminalTab);
when(entityFactory.createTab(Matchers.<TabHeader>anyObject(),
eq(infoPresenter),
Matchers.<TabSelectHandler>anyObject())).thenReturn(infoTab);
when(entityFactory.createTab(Matchers.<TabHeader>anyObject(),
eq(serverPresenter),
Matchers.<TabSelectHandler>anyObject())).thenReturn(serverTab);
when(entityFactory.createTab(Matchers.<TabHeader>anyObject(),
eq(recipeTabPresenter),
Matchers.<TabSelectHandler>anyObject())).thenReturn(recipeTab);
presenter = new MachineAppliancePresenter(eventBus,
comparator,
partStackEventHandler,
view,
locale,
widgetsFactory,
entityFactory,
tabItemFactory,
terminalContainer,
infoPresenter,
recipesContainerPresenter,
serverPresenter,
recipeTabPresenter,
tabContainer);
}
@Test
public void constructorShouldBeVerified() {
verify(widgetsFactory, times(4)).createTabHeader(SOME_TEXT);
verify(entityFactory).createTab(eq(tabHeader), eq(terminalContainer), Matchers.<TabSelectHandler>anyObject());
verify(entityFactory).createTab(eq(tabHeader), eq(infoPresenter), Matchers.<TabSelectHandler>anyObject());
verify(entityFactory).createTab(eq(tabHeader), eq(serverPresenter), Matchers.<TabSelectHandler>anyObject());
verify(entityFactory).createTab(eq(tabHeader), eq(recipeTabPresenter), Matchers.<TabSelectHandler>anyObject());
verify(locale).tabTerminal();
verify(locale).tabInfo();
verify(locale).tabServer();
verify(tabContainer).addTab(terminalTab);
verify(tabContainer).addTab(infoTab);
verify(tabContainer).addTab(serverTab);
verify(tabContainer).addTab(recipeTab);
verify(tabContainer).getView();
verify(view).addContainer(tabContainerView);
verify(view).addContainer(recipePartView);
}
@Test
public void terminalHandlerShouldBePerformed() {
callAndVerifyHandler();
verify(locale).tabTerminal();
verify(terminalContainer, times(2)).addOrShowTerminal(machine);
}
private void callAndVerifyHandler() {
presenter.showAppliance(machine);
verify(entityFactory).createTab(eq(tabHeader), eq(terminalContainer), handlerCaptor.capture());
handlerCaptor.getValue().onTabSelected();
verify(machine).setActiveTabName(SOME_TEXT);
}
@Test
public void infoHandlerShouldBePerformed() {
callAndVerifyHandler();
verify(locale).tabInfo();
}
@Test
public void serverHandlerShouldBePerformed() {
callAndVerifyHandler();
verify(locale).tabServer();
}
@Test
public void infoShouldBeShown() {
reset(tabContainer);
when(machine.getActiveTabName()).thenReturn(SOME_TEXT);
when(tabContainer.getView()).thenReturn(tabContainerView);
presenter.showAppliance(machine);
verify(tabContainer).getView();
verify(view).showContainer(tabContainerView);
verify(tabContainer).showTab(SOME_TEXT);
verify(terminalContainer).addOrShowTerminal(machine);
verify(infoPresenter).update(machine);
verify(serverPresenter).updateInfo(machine);
}
@Test
public void viewShouldBeSetToContainer() {
presenter.go(container);
verify(container).setWidget(view);
}
@Test
public void recipeEditorShouldBeShowed() throws Exception {
when(event.getActivePart()).thenReturn(recipePartPresenter);
when(recipePartPresenter.getView()).thenReturn(recipePartView);
presenter.onActivePartChanged(event);
verify(view).showContainer(recipePartView);
}
@Test
public void machinesShouldBeShowed() throws Exception {
when(event.getActivePart()).thenReturn(machinePanelPresenter);
presenter.showAppliance(machine);
reset(view);
presenter.onActivePartChanged(event);
verify(view).showContainer(tabContainerView);
}
@Test
public void stubShouldBeShownWhenMachineIsNull() {
when(event.getActivePart()).thenReturn(machinePanelPresenter);
presenter.onActivePartChanged(event);
verify(view, never()).showContainer(tabContainerView);
verify(view).showStub(anyString());
}
}