/*******************************************************************************
* 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;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.web.bindery.event.shared.EventBus;
import com.google.web.bindery.event.shared.HandlerRegistration;
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.ide.CoreLocalizationConstant;
import org.eclipse.che.ide.api.command.CommandImpl;
import org.eclipse.che.ide.api.command.CommandImpl.ApplicableContext;
import org.eclipse.che.ide.api.command.CommandManager;
import org.eclipse.che.ide.api.command.CommandRemovedEvent;
import org.eclipse.che.ide.api.dialogs.DialogFactory;
import org.eclipse.che.ide.api.editor.EditorAgent;
import org.eclipse.che.ide.api.editor.EditorInput;
import org.eclipse.che.ide.api.icon.IconRegistry;
import org.eclipse.che.ide.api.notification.NotificationManager;
import org.eclipse.che.ide.api.parts.WorkspaceAgent;
import org.eclipse.che.ide.command.editor.page.CommandEditorPage.DirtyStateListener;
import org.eclipse.che.ide.command.editor.page.commandline.CommandLinePage;
import org.eclipse.che.ide.command.editor.page.goal.GoalPage;
import org.eclipse.che.ide.command.editor.page.name.NamePage;
import org.eclipse.che.ide.command.editor.page.previewurl.PreviewUrlPage;
import org.eclipse.che.ide.command.editor.page.project.ProjectsPage;
import org.eclipse.che.ide.command.node.CommandFileNode;
import org.eclipse.che.ide.command.node.NodeFactory;
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 org.mockito.runners.MockitoJUnitRunner;
import static org.eclipse.che.ide.api.notification.StatusNotification.DisplayMode.EMERGE_MODE;
import static org.eclipse.che.ide.api.notification.StatusNotification.Status.WARNING;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/** Tests for {@link CommandEditor}. */
@RunWith(MockitoJUnitRunner.class)
public class CommandEditorTest {
private static final String EDITED_COMMAND_NAME = "build";
@Mock
private CommandEditorView view;
@Mock
private WorkspaceAgent workspaceAgent;
@Mock
private IconRegistry iconRegistry;
@Mock
private CommandManager commandManager;
@Mock
private NamePage namePage;
@Mock
private CommandLinePage commandLinePage;
@Mock
private GoalPage goalPage;
@Mock
private ProjectsPage projectsPage;
@Mock
private PreviewUrlPage previewUrlPage;
@Mock
private NotificationManager notificationManager;
@Mock
private DialogFactory dialogFactory;
@Mock
private EditorAgent editorAgent;
@Mock
private CoreLocalizationConstant localizationConstants;
@Mock
private EditorMessages editorMessages;
@Mock
private NodeFactory nodeFactory;
@Mock
private EventBus eventBus;
@InjectMocks
private CommandEditor editor;
@Mock
private EditorInput editorInput;
@Mock
private CommandFileNode editedCommandFile;
@Mock
private CommandImpl editedCommand;
@Mock
private EditorAgent.OpenEditorCallback openEditorCallback;
@Mock
private HandlerRegistration handlerRegistration;
@Mock
private Promise<CommandImpl> commandPromise;
@Captor
private ArgumentCaptor<Operation<CommandImpl>> operationCaptor;
@Captor
private ArgumentCaptor<Operation<PromiseError>> errorOperationCaptor;
@Before
public void setUp() throws Exception {
when(eventBus.addHandler(eq(CommandRemovedEvent.getType()), eq(editor))).thenReturn(handlerRegistration);
when(editedCommand.getName()).thenReturn(EDITED_COMMAND_NAME);
when(editedCommand.getApplicableContext()).thenReturn(mock(ApplicableContext.class));
when(editedCommandFile.getData()).thenReturn(editedCommand);
when(editorInput.getFile()).thenReturn(editedCommandFile);
editor.init(editorInput, openEditorCallback);
}
@Test
public void shouldBeInitialized() throws Exception {
verify(view).setDelegate(editor);
verify(eventBus).addHandler(CommandRemovedEvent.getType(), editor);
verify(commandLinePage).setDirtyStateListener(any(DirtyStateListener.class));
verify(goalPage).setDirtyStateListener(any(DirtyStateListener.class));
verify(projectsPage).setDirtyStateListener(any(DirtyStateListener.class));
verify(previewUrlPage).setDirtyStateListener(any(DirtyStateListener.class));
verify(commandLinePage).edit(editor.editedCommand);
verify(goalPage).edit(editor.editedCommand);
verify(projectsPage).edit(editor.editedCommand);
verify(previewUrlPage).edit(editor.editedCommand);
}
@Test
public void shouldExposeViewOnGo() throws Exception {
AcceptsOneWidget container = mock(AcceptsOneWidget.class);
editor.go(container);
verify(container).setWidget(view);
}
@Test
public void shouldReturnTitle() throws Exception {
editor.getTitle();
verify(editorInput).getName();
}
@Test
public void shouldReturnTitleTooltip() throws Exception {
editor.getTitleToolTip();
verify(editorInput).getName();
}
@Test
public void shouldReturnView() throws Exception {
assertEquals(view, editor.getView());
}
@Test
public void shouldSaveCommand() throws Exception {
when(commandManager.updateCommand(anyString(), eq(editor.editedCommand))).thenReturn(commandPromise);
when(commandPromise.then(any(Operation.class))).thenReturn(commandPromise);
editor.doSave();
verify(commandManager).updateCommand(anyString(), eq(editor.editedCommand));
}
@Test(expected = OperationException.class)
public void shouldShowNotificationWhenFailedToSaveCommand() throws Exception {
when(commandManager.updateCommand(anyString(), eq(editor.editedCommand))).thenReturn(commandPromise);
when(commandPromise.then(any(Operation.class))).thenReturn(commandPromise);
editor.doSave();
verify(commandPromise).catchError(errorOperationCaptor.capture());
errorOperationCaptor.getValue().apply(mock(PromiseError.class));
verify(editorMessages).editorMessageUnableToSave();
verify(notificationManager).notify(anyString(), anyString(), WARNING, EMERGE_MODE);
}
@Test
public void shouldCloseEditor() throws Exception {
editor.close(true);
verify(workspaceAgent).removePart(editor);
}
@Test
public void shouldCloseEditorWhenCancellingRequested() throws Exception {
editor.onCommandCancel();
verify(workspaceAgent).removePart(editor);
}
@Test
public void shouldSaveCommandWhenSavingRequested() throws Exception {
when(commandManager.updateCommand(anyString(), eq(editor.editedCommand))).thenReturn(commandPromise);
when(commandPromise.then(any(Operation.class))).thenReturn(commandPromise);
editor.onCommandSave();
verify(commandManager).updateCommand(anyString(), eq(editor.editedCommand));
}
@Test
public void shouldCloseEditorWhenEditedCommandRemoved() throws Exception {
CommandImpl removedCommand = mock(CommandImpl.class);
when(removedCommand.getName()).thenReturn(EDITED_COMMAND_NAME);
CommandRemovedEvent event = mock(CommandRemovedEvent.class);
when(event.getCommand()).thenReturn(removedCommand);
editor.onCommandRemoved(event);
verify(editorAgent).closeEditor(editor);
verify(handlerRegistration).removeHandler();
}
}