/*******************************************************************************
* 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.ext.git.ssh.client.manage;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.gwtmockito.GwtMockitoTestRunner;
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.promises.client.js.JsPromiseError;
import org.eclipse.che.api.ssh.gwt.client.SshServiceClient;
import org.eclipse.che.api.ssh.shared.dto.SshPairDto;
import org.eclipse.che.ide.api.app.AppContext;
import org.eclipse.che.ide.api.notification.NotificationManager;
import org.eclipse.che.ide.api.notification.StatusNotification;
import org.eclipse.che.ide.ext.git.ssh.client.SshLocalizationConstant;
import org.eclipse.che.ide.ext.git.ssh.client.SshResources;
import org.eclipse.che.ide.ext.git.ssh.client.upload.UploadSshKeyPresenter;
import org.eclipse.che.ide.rest.DtoUnmarshallerFactory;
import org.eclipse.che.ide.ui.dialogs.CancelCallback;
import org.eclipse.che.ide.ui.dialogs.ConfirmCallback;
import org.eclipse.che.ide.ui.dialogs.DialogFactory;
import org.eclipse.che.ide.ui.dialogs.InputCallback;
import org.eclipse.che.ide.ui.dialogs.confirm.ConfirmDialog;
import org.eclipse.che.ide.ui.dialogs.input.InputDialog;
import org.eclipse.che.ide.ui.dialogs.message.MessageDialog;
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.Matchers;
import org.mockito.Mock;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import java.util.ArrayList;
import java.util.List;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.RETURNS_DEFAULTS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* Testing {@link SshKeyManagerPresenter} functionality.
*
* @author Roman Nikitenko
*/
@RunWith(GwtMockitoTestRunner.class)
public class SshKeyManagerPresenterTest {
public static final String GITHUB_HOST = "github.com";
@Captor
private ArgumentCaptor<AsyncCallback<Void>> asyncCallbackCaptor;
@Captor
private ArgumentCaptor<ConfirmCallback> confirmCallbackCaptor;
@Captor
private ArgumentCaptor<CancelCallback> cancelCallbackCaptor;
@Captor
private ArgumentCaptor<InputCallback> inputCallbackCaptor;
@Captor
private ArgumentCaptor<Operation<Void>> operationVoidCapture;
@Captor
private ArgumentCaptor<Operation<List<SshPairDto>>> operationSshPairDTOsCapture;
@Captor
private ArgumentCaptor<Operation<SshPairDto>> operationSshPairDTOCapture;
@Captor
private ArgumentCaptor<Operation<PromiseError>> operationErrorCapture;
private Promise<Void> voidPromise;
private Promise<SshPairDto> sshPairDTOPromise;
private Promise<List<SshPairDto>> sshPairDTOsPromise;
@Mock
private AppContext appContext;
@Mock
private DtoUnmarshallerFactory dtoUnmarshallerFactory;
@Mock
private DialogFactory dialogFactory;
@Mock
private SshKeyManagerView view;
@Mock
private SshServiceClient service;
@Mock
private SshLocalizationConstant constant;
@Mock
private SshResources resources;
@Mock
private UploadSshKeyPresenter uploadSshKeyPresenter;
@Mock
private NotificationManager notificationManager;
@InjectMocks
private SshKeyManagerPresenter presenter;
@Mock
SshPairDto sshPairDto;
@Before
@SuppressWarnings("unchecked")
public void setUp() throws Exception {
voidPromise = createPromiseMock();
sshPairDTOsPromise = createPromiseMock();
sshPairDTOPromise = createPromiseMock();
when(service.getPairs(anyString())).thenReturn(sshPairDTOsPromise);
when(service.deletePair(anyString(), anyString())).thenReturn(voidPromise);
when(service.generatePair(anyString(), anyString())).thenReturn(sshPairDTOPromise);
}
private Promise createPromiseMock() {
return mock(Promise.class, new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
if (invocation.getMethod().getReturnType().isInstance(invocation.getMock())) {
return invocation.getMock();
}
return RETURNS_DEFAULTS.answer(invocation);
}
});
}
@Test
public void testGo() {
AcceptsOneWidget container = mock(AcceptsOneWidget.class);
presenter.go(container);
verify(service).getPairs(Matchers.eq(SshKeyManagerPresenter.GIT_SSH_SERVICE));
verify(container).setWidget(eq(view));
}
@Test
public void testOnViewClickedWhenGetPublicKeyIsSuccess() {
when(sshPairDto.getPublicKey()).thenReturn("publicKey");
MessageDialog messageDialog = mock(MessageDialog.class);
when(dialogFactory.createMessageDialog(anyString(), anyString(), (ConfirmCallback)anyObject())).thenReturn(messageDialog);
presenter.onViewClicked(sshPairDto);
verify(dialogFactory).createMessageDialog(anyString(), eq("publicKey"), (ConfirmCallback)anyObject());
verify(messageDialog).show();
}
@Test
public void testOnDeleteClickedWhenDeleteKeyConfirmed() {
when(sshPairDto.getService()).thenReturn(SshKeyManagerPresenter.GIT_SSH_SERVICE);
when(sshPairDto.getName()).thenReturn(GITHUB_HOST);
SafeHtml safeHtml = mock(SafeHtml.class);
ConfirmDialog confirmDialog = mock(ConfirmDialog.class);
when(constant.deleteSshKeyQuestion(anyString())).thenReturn(safeHtml);
when(safeHtml.asString()).thenReturn("");
when(dialogFactory.createConfirmDialog(anyString(), anyString(), (ConfirmCallback)anyObject(), (CancelCallback)anyObject()))
.thenReturn(confirmDialog);
presenter.onDeleteClicked(sshPairDto);
verify(dialogFactory).createConfirmDialog(anyString(), anyString(), confirmCallbackCaptor.capture(), (CancelCallback)anyObject());
ConfirmCallback confirmCallback = confirmCallbackCaptor.getValue();
confirmCallback.accepted();
verify(confirmDialog).show();
verify(service).deletePair(Matchers.eq(SshKeyManagerPresenter.GIT_SSH_SERVICE), eq(GITHUB_HOST));
}
@Test
public void testOnDeleteClickedWhenDeleteKeyCanceled() {
SafeHtml safeHtml = mock(SafeHtml.class);
ConfirmDialog confirmDialog = mock(ConfirmDialog.class);
when(constant.deleteSshKeyQuestion(anyString())).thenReturn(safeHtml);
when(safeHtml.asString()).thenReturn("");
when(dialogFactory.createConfirmDialog(anyString(), anyString(), (ConfirmCallback)anyObject(), (CancelCallback)anyObject()))
.thenReturn(confirmDialog);
presenter.onDeleteClicked(sshPairDto);
verify(dialogFactory).createConfirmDialog(anyString(), anyString(), (ConfirmCallback)anyObject(), cancelCallbackCaptor.capture());
CancelCallback cancelCallback = cancelCallbackCaptor.getValue();
cancelCallback.cancelled();
verify(confirmDialog).show();
verify(service, never()).deletePair(Matchers.eq(SshKeyManagerPresenter.GIT_SSH_SERVICE), anyString());
}
@Test
public void testOnDeleteClickedWhenDeleteKeyIsSuccess() throws OperationException {
when(sshPairDto.getService()).thenReturn(SshKeyManagerPresenter.GIT_SSH_SERVICE);
when(sshPairDto.getName()).thenReturn(GITHUB_HOST);
SafeHtml safeHtml = mock(SafeHtml.class);
ConfirmDialog confirmDialog = mock(ConfirmDialog.class);
when(constant.deleteSshKeyQuestion(anyString())).thenReturn(safeHtml);
when(safeHtml.asString()).thenReturn("");
when(dialogFactory.createConfirmDialog(anyString(), anyString(), (ConfirmCallback)anyObject(), (CancelCallback)anyObject()))
.thenReturn(confirmDialog);
presenter.onDeleteClicked(sshPairDto);
verify(dialogFactory).createConfirmDialog(anyString(), anyString(), confirmCallbackCaptor.capture(), (CancelCallback)anyObject());
ConfirmCallback confirmCallback = confirmCallbackCaptor.getValue();
confirmCallback.accepted();
verify(voidPromise).then(operationVoidCapture.capture());
operationVoidCapture.getValue().apply(null);
verify(confirmDialog).show();
verify(service).deletePair(Matchers.eq(SshKeyManagerPresenter.GIT_SSH_SERVICE), eq(GITHUB_HOST));
verify(service).getPairs(Matchers.eq(SshKeyManagerPresenter.GIT_SSH_SERVICE));
}
@Test
public void testOnDeleteClickedWhenDeleteKeyIsFailure() throws OperationException {
when(sshPairDto.getService()).thenReturn(SshKeyManagerPresenter.GIT_SSH_SERVICE);
when(sshPairDto.getName()).thenReturn(GITHUB_HOST);
SafeHtml safeHtml = mock(SafeHtml.class);
ConfirmDialog confirmDialog = mock(ConfirmDialog.class);
when(constant.deleteSshKeyQuestion(anyString())).thenReturn(safeHtml);
when(safeHtml.asString()).thenReturn("");
when(dialogFactory.createConfirmDialog(anyString(), anyString(), (ConfirmCallback)anyObject(), (CancelCallback)anyObject()))
.thenReturn(confirmDialog);
presenter.onDeleteClicked(sshPairDto);
verify(dialogFactory).createConfirmDialog(anyString(), anyString(), confirmCallbackCaptor.capture(), (CancelCallback)anyObject());
ConfirmCallback confirmCallback = confirmCallbackCaptor.getValue();
confirmCallback.accepted();
verify(voidPromise).catchError(operationErrorCapture.capture());
operationErrorCapture.getValue().apply(JsPromiseError.create(""));
verify(confirmDialog).show();
verify(service).deletePair(Matchers.eq(SshKeyManagerPresenter.GIT_SSH_SERVICE), anyString());
verify(notificationManager).notify(anyString(), eq(StatusNotification.Status.FAIL), eq(true));
verify(service, never()).getPairs(Matchers.eq(SshKeyManagerPresenter.GIT_SSH_SERVICE));
}
@Test
public void testShouldRefreshKeysAfterSuccessfulDeleteKey() throws OperationException {
when(sshPairDto.getService()).thenReturn(SshKeyManagerPresenter.GIT_SSH_SERVICE);
when(sshPairDto.getName()).thenReturn(GITHUB_HOST);
SafeHtml safeHtml = mock(SafeHtml.class);
ConfirmDialog confirmDialog = mock(ConfirmDialog.class);
List<SshPairDto> sshPairDtoArray = new ArrayList<>();
when(constant.deleteSshKeyQuestion(anyString())).thenReturn(safeHtml);
when(safeHtml.asString()).thenReturn("");
when(dialogFactory.createConfirmDialog(anyString(), anyString(), (ConfirmCallback)anyObject(), (CancelCallback)anyObject()))
.thenReturn(confirmDialog);
presenter.onDeleteClicked(sshPairDto);
verify(dialogFactory).createConfirmDialog(anyString(), anyString(), confirmCallbackCaptor.capture(), (CancelCallback)anyObject());
ConfirmCallback confirmCallback = confirmCallbackCaptor.getValue();
confirmCallback.accepted();
verify(voidPromise).then(operationVoidCapture.capture());
operationVoidCapture.getValue().apply(null);
verify(sshPairDTOsPromise).then(operationSshPairDTOsCapture.capture());
operationSshPairDTOsCapture.getValue().apply(sshPairDtoArray);
verify(confirmDialog).show();
verify(service).deletePair(Matchers.eq(SshKeyManagerPresenter.GIT_SSH_SERVICE), eq(GITHUB_HOST));
verify(service).getPairs(Matchers.eq(SshKeyManagerPresenter.GIT_SSH_SERVICE));
verify(view).setPairs(eq(sshPairDtoArray));
}
@Test
public void testFailedRefreshKeysAfterSuccessfulDeleteKey() throws OperationException {
when(sshPairDto.getService()).thenReturn(SshKeyManagerPresenter.GIT_SSH_SERVICE);
when(sshPairDto.getName()).thenReturn(GITHUB_HOST);
SafeHtml safeHtml = mock(SafeHtml.class);
ConfirmDialog confirmDialog = mock(ConfirmDialog.class);
List<SshPairDto> sshPairDtoArray = new ArrayList<>();
when(constant.deleteSshKeyQuestion(anyString())).thenReturn(safeHtml);
when(safeHtml.asString()).thenReturn("");
when(dialogFactory.createConfirmDialog(anyString(), anyString(), (ConfirmCallback)anyObject(), (CancelCallback)anyObject()))
.thenReturn(confirmDialog);
presenter.onDeleteClicked(sshPairDto);
verify(dialogFactory).createConfirmDialog(anyString(), anyString(), confirmCallbackCaptor.capture(), (CancelCallback)anyObject());
ConfirmCallback confirmCallback = confirmCallbackCaptor.getValue();
confirmCallback.accepted();
verify(voidPromise).then(operationVoidCapture.capture());
operationVoidCapture.getValue().apply(null);
verify(sshPairDTOsPromise).catchError(operationErrorCapture.capture());
operationErrorCapture.getValue().apply(JsPromiseError.create(""));
verify(confirmDialog).show();
verify(service).deletePair(Matchers.eq(SshKeyManagerPresenter.GIT_SSH_SERVICE), eq(GITHUB_HOST));
verify(service).getPairs(Matchers.eq(SshKeyManagerPresenter.GIT_SSH_SERVICE));
verify(view, never()).setPairs(eq(sshPairDtoArray));
verify(notificationManager).notify(anyString(), any(StatusNotification.Status.class), anyBoolean());
}
@Test
public void testShouldRefreshKeysAfterSuccessfulUploadKey() throws OperationException {
List<SshPairDto> sshPairDtoArray = new ArrayList<>();
presenter.onUploadClicked();
verify(uploadSshKeyPresenter).showDialog(asyncCallbackCaptor.capture());
AsyncCallback<Void> asyncCallback = asyncCallbackCaptor.getValue();
asyncCallback.onSuccess(null);
verify(sshPairDTOsPromise).then(operationSshPairDTOsCapture.capture());
operationSshPairDTOsCapture.getValue().apply(sshPairDtoArray);
verify(service).getPairs(Matchers.eq(SshKeyManagerPresenter.GIT_SSH_SERVICE));
verify(view).setPairs(eq(sshPairDtoArray));
}
@Test
public void testFailedRefreshKeysAfterSuccessfulUploadKey() throws OperationException {
List<SshPairDto> sshPairDtoArray = new ArrayList<>();
presenter.onUploadClicked();
verify(uploadSshKeyPresenter).showDialog(asyncCallbackCaptor.capture());
AsyncCallback<Void> asyncCallback = asyncCallbackCaptor.getValue();
asyncCallback.onSuccess(null);
verify(sshPairDTOsPromise).catchError(operationErrorCapture.capture());
operationErrorCapture.getValue().apply(JsPromiseError.create(""));
verify(service).getPairs(Matchers.eq(SshKeyManagerPresenter.GIT_SSH_SERVICE));
verify(view, never()).setPairs(eq(sshPairDtoArray));
}
@Test
public void testOnGenerateClickedWhenUserConfirmGenerateKey() {
InputDialog inputDialog = mock(InputDialog.class);
when(dialogFactory.createInputDialog(anyString(), anyString(), (InputCallback)anyObject(), (CancelCallback)anyObject()))
.thenReturn(inputDialog);
presenter.onGenerateClicked();
verify(dialogFactory).createInputDialog(anyString(), anyString(), inputCallbackCaptor.capture(), (CancelCallback)anyObject());
InputCallback inputCallback = inputCallbackCaptor.getValue();
inputCallback.accepted(GITHUB_HOST);
verify(service).generatePair(Matchers.eq(SshKeyManagerPresenter.GIT_SSH_SERVICE), eq(GITHUB_HOST));
}
@Test
public void testOnGenerateClickedWhenUserCancelGenerateKey() {
InputDialog inputDialog = mock(InputDialog.class);
when(dialogFactory.createInputDialog(anyString(), anyString(), (InputCallback)anyObject(), (CancelCallback)anyObject()))
.thenReturn(inputDialog);
presenter.onGenerateClicked();
verify(dialogFactory).createInputDialog(anyString(), anyString(), (InputCallback)anyObject(), cancelCallbackCaptor.capture());
CancelCallback cancelCallback = cancelCallbackCaptor.getValue();
cancelCallback.cancelled();
verify(service, never()).generatePair(Matchers.eq(SshKeyManagerPresenter.GIT_SSH_SERVICE), eq(GITHUB_HOST));
}
@Test
public void testOnGenerateClickedWhenGenerateKeyIsFailed() throws OperationException {
InputDialog inputDialog = mock(InputDialog.class);
when(dialogFactory.createInputDialog(anyString(), anyString(), (InputCallback)anyObject(), (CancelCallback)anyObject()))
.thenReturn(inputDialog);
presenter.onGenerateClicked();
verify(dialogFactory).createInputDialog(anyString(), anyString(),
inputCallbackCaptor.capture(), cancelCallbackCaptor.capture());
InputCallback inputCallback = inputCallbackCaptor.getValue();
inputCallback.accepted(GITHUB_HOST);
verify(sshPairDTOPromise).catchError(operationErrorCapture.capture());
operationErrorCapture.getValue().apply(JsPromiseError.create(""));
verify(service).generatePair(Matchers.eq(SshKeyManagerPresenter.GIT_SSH_SERVICE), eq(GITHUB_HOST));
verify(service, never()).getPairs(Matchers.eq(SshKeyManagerPresenter.GIT_SSH_SERVICE));
verify(view, never()).setPairs((List<SshPairDto>)anyObject());
verify(notificationManager).notify(anyString(), anyString(), any(StatusNotification.Status.class), anyBoolean());
}
@Test
public void testShouldRefreshKeysAfterSuccessfulGenerateKey() throws OperationException {
List<SshPairDto> sshPairDtoArray = new ArrayList<>();
InputDialog inputDialog = mock(InputDialog.class);
when(dialogFactory.createInputDialog(anyString(), anyString(), (InputCallback)anyObject(), (CancelCallback)anyObject()))
.thenReturn(inputDialog);
presenter.onGenerateClicked();
verify(dialogFactory).createInputDialog(anyString(), anyString(),
inputCallbackCaptor.capture(), cancelCallbackCaptor.capture());
InputCallback inputCallback = inputCallbackCaptor.getValue();
inputCallback.accepted(GITHUB_HOST);
verify(sshPairDTOPromise).then(operationSshPairDTOCapture.capture());
operationSshPairDTOCapture.getValue().apply(null);
verify(sshPairDTOsPromise).then(operationSshPairDTOsCapture.capture());
operationSshPairDTOsCapture.getValue().apply(sshPairDtoArray);
verify(service).generatePair(Matchers.eq(SshKeyManagerPresenter.GIT_SSH_SERVICE), eq(GITHUB_HOST));
verify(service).getPairs(Matchers.eq(SshKeyManagerPresenter.GIT_SSH_SERVICE));
verify(view).setPairs(eq(sshPairDtoArray));
}
}