/*******************************************************************************
* 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.search;
import com.google.common.base.Optional;
import com.google.gwtmockito.GwtMockitoTestRunner;
import org.eclipse.che.api.promises.client.Operation;
import org.eclipse.che.api.promises.client.Promise;
import org.eclipse.che.api.promises.client.PromiseError;
import org.eclipse.che.commons.lang.NameGenerator;
import org.eclipse.che.ide.api.app.AppContext;
import org.eclipse.che.ide.api.resources.Container;
import org.eclipse.che.ide.api.resources.Resource;
import org.eclipse.che.ide.resource.Path;
import org.eclipse.che.ide.search.presentation.FindResultPresenter;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* Tests for {@link FullTextSearchPresenter}.
*
* @author Valeriy Svydenko
*/
@RunWith(GwtMockitoTestRunner.class)
public class FullTextSearchPresenterTest {
private final String SEARCHED_TEXT = "to be or not to be";
@Mock
private FullTextSearchView view;
@Mock
private FindResultPresenter findResultPresenter;
@Mock
private AppContext appContext;
@Mock
private Container workspaceRoot;
@Mock
private Container searchContainer;
@Mock
private Promise<Optional<Container>> optionalContainerPromise;
@Captor
private ArgumentCaptor<Operation<Optional<Container>>> optionalContainerCaptor;
@Mock
private Promise<Resource[]> searchResultPromise;
@Captor
private ArgumentCaptor<Operation<Resource[]>> searchResultCaptor;
@Captor
private ArgumentCaptor<Operation<PromiseError>> operationErrorCapture;
@Captor
private ArgumentCaptor<Operation<Resource[]>> operationSuccessCapture;
FullTextSearchPresenter fullTextSearchPresenter;
@Before
public void setUp() throws Exception {
fullTextSearchPresenter = new FullTextSearchPresenter(view,
findResultPresenter,
appContext);
}
@Test
public void viewShouldBeShowed() {
final Path path = Path.valueOf("/search");
fullTextSearchPresenter.showDialog(path);
verify(view).showDialog();
verify(view).clearInput();
verify(view).setPathDirectory(eq(path.toString()));
}
@Test
public void searchShouldBeSuccessfullyFinished() throws Exception {
when(view.getPathToSearch()).thenReturn("/search");
when(appContext.getWorkspaceRoot()).thenReturn(workspaceRoot);
when(workspaceRoot.getContainer(any(Path.class))).thenReturn(optionalContainerPromise);
when(searchContainer.search(anyString(), anyString())).thenReturn(searchResultPromise);
fullTextSearchPresenter.search(SEARCHED_TEXT);
verify(optionalContainerPromise).then(optionalContainerCaptor.capture());
optionalContainerCaptor.getValue().apply(Optional.of(searchContainer));
verify(searchResultPromise).then(searchResultCaptor.capture());
searchResultCaptor.getValue().apply(new Resource[0]);
verify(view, never()).showErrorMessage(anyString());
verify(view).close();
verify(findResultPresenter).handleResponse(eq(new Resource[0]), eq(SEARCHED_TEXT));
}
@Test
public void searchWholeWordUnSelect() throws Exception {
when(view.getPathToSearch()).thenReturn("/search");
when(view.isWholeWordsOnly()).thenReturn(false);
when(appContext.getWorkspaceRoot()).thenReturn(workspaceRoot);
when(workspaceRoot.getContainer(any(Path.class))).thenReturn(optionalContainerPromise);
when(searchContainer.search(anyString(), anyString())).thenReturn(searchResultPromise);
final String search = NameGenerator.generate("test", 10);
fullTextSearchPresenter.search(search);
verify(optionalContainerPromise).then(optionalContainerCaptor.capture());
optionalContainerCaptor.getValue().apply(Optional.of(searchContainer));
verify(searchResultPromise).then(searchResultCaptor.capture());
searchResultCaptor.getValue().apply(new Resource[0]);
verify(searchContainer).search(anyString(), eq("*" + search + "*"));
verify(view).isWholeWordsOnly();
verify(view, never()).showErrorMessage(anyString());
verify(view).close();
verify(findResultPresenter).handleResponse(eq(new Resource[0]), eq(search));
}
@Test
public void searchWholeWordSelect() throws Exception {
when(view.getPathToSearch()).thenReturn("/search");
when(view.isWholeWordsOnly()).thenReturn(true);
when(appContext.getWorkspaceRoot()).thenReturn(workspaceRoot);
when(workspaceRoot.getContainer(any(Path.class))).thenReturn(optionalContainerPromise);
when(searchContainer.search(anyString(), anyString())).thenReturn(searchResultPromise);
final String search = NameGenerator.generate("test", 10);
fullTextSearchPresenter.search(search);
verify(optionalContainerPromise).then(optionalContainerCaptor.capture());
optionalContainerCaptor.getValue().apply(Optional.of(searchContainer));
verify(searchResultPromise).then(searchResultCaptor.capture());
searchResultCaptor.getValue().apply(new Resource[0]);
verify(searchContainer).search(anyString(), eq(search));
verify(view).isWholeWordsOnly();
verify(view, never()).showErrorMessage(anyString());
verify(view).close();
verify(findResultPresenter).handleResponse(eq(new Resource[0]), eq(search));
}
@Test
public void searchHasDoneWithSomeError() throws Exception {
when(view.getPathToSearch()).thenReturn("/search");
when(appContext.getWorkspaceRoot()).thenReturn(workspaceRoot);
when(workspaceRoot.getContainer(any(Path.class))).thenReturn(optionalContainerPromise);
fullTextSearchPresenter.search(SEARCHED_TEXT);
verify(optionalContainerPromise).then(optionalContainerCaptor.capture());
optionalContainerCaptor.getValue().apply(Optional.<Container>absent());
verify(view).showErrorMessage(anyString());
verify(view, never()).close();
verify(findResultPresenter, never()).handleResponse(any(Resource[].class), anyString());
}
@Test
public void onEnterClickedWhenAcceptButtonInFocus() throws Exception {
when(view.getSearchText()).thenReturn(SEARCHED_TEXT);
when(view.isAcceptButtonInFocus()).thenReturn(true);
when(view.getPathToSearch()).thenReturn("/search");
when(appContext.getWorkspaceRoot()).thenReturn(workspaceRoot);
when(workspaceRoot.getContainer(any(Path.class))).thenReturn(optionalContainerPromise);
when(searchContainer.search(anyString(), anyString())).thenReturn(searchResultPromise);
Resource[] result = new Resource[0];
fullTextSearchPresenter.onEnterClicked();
verify(optionalContainerPromise).then(optionalContainerCaptor.capture());
optionalContainerCaptor.getValue().apply(Optional.of(searchContainer));
verify(searchResultPromise).then(searchResultCaptor.capture());
searchResultCaptor.getValue().apply(result);
verify(view, never()).showErrorMessage(anyString());
verify(view).close();
verify(findResultPresenter).handleResponse(eq(result), eq(SEARCHED_TEXT));
}
@Test
public void onEnterClickedWhenCancelButtonInFocus() throws Exception {
when(view.isCancelButtonInFocus()).thenReturn(true);
fullTextSearchPresenter.onEnterClicked();
verify(view).close();
verify(view, never()).getSearchText();
}
@Test
public void onEnterClickedWhenSelectPathButtonInFocus() throws Exception {
when(view.isSelectPathButtonInFocus()).thenReturn(true);
fullTextSearchPresenter.onEnterClicked();
verify(view).showSelectPathDialog();
verify(view, never()).getSearchText();
}
}