package com.constellio.app.api.extensions;
import static com.constellio.app.ui.pages.search.criteria.Criterion.BooleanOperator.OR;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import com.constellio.app.api.extensions.taxonomies.UserSearchEvent;
import com.constellio.app.modules.rm.RMTestRecords;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
import com.constellio.app.modules.rm.wrappers.Folder;
import com.constellio.app.services.factories.AppLayerFactory;
import com.constellio.app.ui.entities.UserVO;
import com.constellio.app.ui.framework.builders.RecordToVOBuilder;
import com.constellio.app.ui.pages.search.AdvancedSearchPresenter;
import com.constellio.app.ui.pages.search.AdvancedSearchView;
import com.constellio.app.ui.pages.search.SimpleSearchPresenter;
import com.constellio.app.ui.pages.search.SimpleSearchView;
import com.constellio.app.ui.pages.search.criteria.ConditionBuilder;
import com.constellio.app.ui.pages.search.criteria.CriteriaBuilder;
import com.constellio.app.ui.pages.search.criteria.Criterion;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.FakeSessionContext;
import com.constellio.sdk.tests.MockedNavigation;
/**
* Created by Constelio on 2016-10-19.
*/
public class SearchPageExtensionAcceptanceTest extends ConstellioTest {
@Mock SearchPageExtension searchPageExtension;
@Mock SearchPageExtension searchPageExtension2;
@Mock UserVO user;
@Mock RecordToVOBuilder recordToVOBuilder;
@Mock SimpleSearchView simpleSearchView;
@Mock AdvancedSearchView advancedSearchView;
MockedNavigation navigator = new MockedNavigation();
RMSchemasRecordsServices rm;
AppLayerFactory appLayerFactory;
RMTestRecords records = new RMTestRecords(zeCollection);
CriteriaBuilder criteriaBuilder;
@Before
public void setup() {
prepareSystem(
withZeCollection().withConstellioRMModule().withConstellioESModule().withAllTestUsers()
.withRMTest(records).withFoldersAndContainersOfEveryStatus().withDocumentsDecommissioningList()
);
appLayerFactory = getAppLayerFactory();
rm = new RMSchemasRecordsServices(zeCollection, appLayerFactory);
when(simpleSearchView.getConstellioFactories()).thenReturn(getConstellioFactories());
when(simpleSearchView.getSessionContext()).thenReturn(FakeSessionContext.gandalfInCollection(zeCollection));
when(simpleSearchView.navigate()).thenReturn(navigator);
when(simpleSearchView.getCollection()).thenReturn(zeCollection);
when(advancedSearchView.getConstellioFactories()).thenReturn(getConstellioFactories());
when(advancedSearchView.getSessionContext()).thenReturn(FakeSessionContext.gandalfInCollection(zeCollection));
when(advancedSearchView.navigate()).thenReturn(navigator);
when(advancedSearchView.getCollection()).thenReturn(zeCollection);
criteriaBuilder = new CriteriaBuilder(rm.folderSchemaType(), advancedSearchView.getSessionContext());
criteriaBuilder.addCriterion(Folder.TITLE).isEqualTo("Abeille").booleanOperator(OR);
criteriaBuilder.addCriterion(Folder.TITLE).isEqualTo("Cheval");
when(advancedSearchView.getSearchCriteria()).thenReturn(criteriaBuilder.build());
}
@Test
public void givenASimpleSearchThenWriteValidParam() {
appLayerFactory.getExtensions().forCollection(zeCollection).searchPageExtensions.add(searchPageExtension);
appLayerFactory.getExtensions().forCollection(zeCollection).searchPageExtensions.add(searchPageExtension2);
final LogicalSearchQuery query = new LogicalSearchQuery(from(rm.folder.schema()).where(rm.folder.title())
.isEqualTo("Abeille"));
SimpleSearchPresenter simpleSearchPresenter = new SimpleSearchPresenter(simpleSearchView) {
@Override
protected LogicalSearchQuery getSearchQuery() {
return query;
}
};
simpleSearchPresenter.getSearchResults().listSearchResultVOs(0, 10);
ArgumentCaptor<UserSearchEvent> paramCaptor = ArgumentCaptor.forClass(UserSearchEvent.class);
verify(searchPageExtension).notifyNewUserSearch(paramCaptor.capture());
UserSearchEvent capturedParam = paramCaptor.getValue();
verify(searchPageExtension, times(1)).notifyNewUserSearch(any(UserSearchEvent.class));
verify(searchPageExtension2, times(1)).notifyNewUserSearch(any(UserSearchEvent.class));
assertThat(capturedParam.getUsername()).isEqualTo(gandalf);
assertThat(rm.getUser(capturedParam.getUserID()).toString()).isEqualTo(gandalf);
assertThat(capturedParam.getCollection()).isEqualTo(zeCollection);
assertThat(capturedParam.getNumFound()).isEqualTo(1);
assertThat(capturedParam.getSolrQuery()).isEqualTo("( title_t_fr:\"Abeille\" )");
}
@Test
public void givenAnAdvancedSearchThenWriteValidParam()
throws Exception {
appLayerFactory.getExtensions().forCollection(zeCollection).searchPageExtensions.add(searchPageExtension);
appLayerFactory.getExtensions().forCollection(zeCollection).searchPageExtensions.add(searchPageExtension2);
final LogicalSearchQuery query = new LogicalSearchQuery()
.setCondition(new ConditionBuilder(rm.folderSchemaType(), "fr").build(criteriaBuilder.build()));
AdvancedSearchPresenter advancedSearchPresenter = new AdvancedSearchPresenter(advancedSearchView) {
@Override
protected LogicalSearchQuery getSearchQuery() {
return query;
}
};
advancedSearchPresenter.getSearchResults().listSearchResultVOs(0, 10);
ArgumentCaptor<UserSearchEvent> paramCaptor = ArgumentCaptor.forClass(UserSearchEvent.class);
verify(searchPageExtension).notifyNewUserSearch(paramCaptor.capture());
UserSearchEvent capturedParam = paramCaptor.getValue();
List<Criterion> criterionList = capturedParam.getCriterionList();
verify(searchPageExtension, times(1)).notifyNewUserSearch(any(UserSearchEvent.class));
verify(searchPageExtension2, times(1)).notifyNewUserSearch(any(UserSearchEvent.class));
assertThat(capturedParam.getUsername()).isEqualTo(gandalf);
assertThat(rm.getUser(capturedParam.getUserID()).toString()).isEqualTo(gandalf);
assertThat(capturedParam.getCollection()).isEqualTo(zeCollection);
assertThat(capturedParam.getNumFound()).isEqualTo(2);
assertThat(capturedParam.getSolrQuery()).isEqualTo("( ( title_t_fr:\"Abeille\" ) OR ( title_t_fr:\"Cheval\" ) )");
assertThat(criterionList.size()).isEqualTo(2);
assertThat(criterionList.get(0).getSchemaType().toString()).isEqualTo("folder");
assertThat(criterionList.get(0).getMetadataCode()).isEqualTo("folder_default_title");
assertThat(criterionList.get(0).getValue()).isEqualTo("Abeille");
}
}