package com.constellio.app.ui.pages.search.savedSearch; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import com.constellio.sdk.tests.MockedNavigation; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import com.constellio.app.ui.application.CoreViews; import com.constellio.app.ui.entities.RecordVO; import com.constellio.app.ui.entities.RecordVO.VIEW_MODE; import com.constellio.app.ui.framework.builders.RecordToVOBuilder; import com.constellio.app.ui.framework.data.RecordVODataProvider; import com.constellio.app.ui.pages.base.SessionContext; import com.constellio.app.ui.pages.search.criteria.Criterion; import com.constellio.app.ui.pages.search.criteria.Criterion.SearchOperator; import com.constellio.app.ui.pages.search.criteria.SearchCriterionTestSetup; import com.constellio.app.ui.pages.search.criteria.SearchCriterionTestSetup.CriterionTestRecord; import com.constellio.model.entities.records.wrappers.RecordWrapper; import com.constellio.model.entities.records.wrappers.SavedSearch; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.records.RecordServicesException; import com.constellio.model.services.records.RecordServicesRuntimeException.NoSuchRecordWithId; import com.constellio.sdk.tests.ConstellioTest; import com.constellio.sdk.tests.FakeSessionContext; public class SavedSearchPresenterAcceptanceTest extends ConstellioTest { public static final String STRING_VALUE = "string value"; SearchCriterionTestSetup setup = new SearchCriterionTestSetup(zeCollection); CriterionTestRecord shortcuts = setup.getShortcuts(); MockedNavigation navigator; @Mock private SavedSearchView view; private SavedSearchPresenter presenter; private RecordServices recordServices; private RecordToVOBuilder voBuilder; private User adminUser; private SessionContext sessionContext; @Before public void setUp() throws Exception { navigator = new MockedNavigation(); prepareSystem(withZeCollection().withConstellioRMModule().withAllTestUsers()); defineSchemasManager().using(setup); adminUser = getModelLayerFactory().newUserServices().getUserInCollection(admin, zeCollection); sessionContext = FakeSessionContext.forRealUserIncollection(adminUser); when(view.getSessionContext()).thenReturn(sessionContext); when(view.getCollection()).thenReturn(zeCollection); voBuilder = new RecordToVOBuilder(); recordServices = getModelLayerFactory().newRecordServices(); presenter = new SavedSearchPresenter(view); when(view.navigate()).thenReturn(navigator); } @Test public void givenUserAndPublicSearchesThenAllDataProvidersOk() throws Exception { SavedSearch userSavedSearch1 = newSavedSearch(adminUser.getId(), false); SavedSearch userSavedSearch2 = newSavedSearch(adminUser.getId(), false); SavedSearch publicSavedSearch1 = newSavedSearch(null, true); SavedSearch publicSavedSearch2 = newSavedSearch(null, true); verifyThat(presenter.getUserSearchesDataProvider()).containsOnly(userSavedSearch1, userSavedSearch2); verifyThat(presenter.getPublicSearchesDataProvider()).containsOnly(publicSavedSearch1, publicSavedSearch2); } @Test public void whenEditingSavedSearchThenEditedProperly() throws Exception { SavedSearch userSavedSearch1 = newSavedSearch(adminUser.getId(), false); RecordVO recordVO = toVO(userSavedSearch1); recordVO.setTitle("New Title"); recordVO.set(SavedSearch.PUBLIC, true); presenter.searchModificationRequested(recordVO); userSavedSearch1 = new SavedSearch(recordServices.getDocumentById(userSavedSearch1.getId()), setup.getTypes()); assertThat(userSavedSearch1.getTitle()).isEqualTo("New Title"); assertThat(userSavedSearch1.isPublic()).isTrue(); verify(navigator.to()).listSavedSearches(); } @Test public void whenDeletingRecordThenRecordDeleted() throws Exception { MockedNavigation navigator = new MockedNavigation(); when(view.navigate()).thenReturn(navigator); SavedSearch userSavedSearch1 = newSavedSearch(adminUser.getId(), false); RecordVO recordVO = toVO(userSavedSearch1); presenter.deleteButtonClicked(recordVO); try { recordServices.getDocumentById(userSavedSearch1.getId()); } catch (NoSuchRecordWithId ex) { // SUCCESS } } public RecordVO toVO(SavedSearch userSavedSearch1) { return voBuilder.build(userSavedSearch1.getWrappedRecord(), VIEW_MODE.FORM, sessionContext); } public SavedSearch newSavedSearch(String userId, boolean isPublic) throws RecordServicesException { SavedSearch savedSearch = new SavedSearch(recordServices.newRecordWithSchema(setup.getSchema( SavedSearch.DEFAULT_SCHEMA)), setup.getTypes()); savedSearch.setAdvancedSearch(Arrays.asList(stringCriterion())); if (userId != null) { savedSearch.setUser(adminUser.getId()); } savedSearch.setPublic(isPublic); recordServices.add(savedSearch, adminUser); return savedSearch; } private Criterion stringCriterion() { // criterionTestRecord_default_aString CONTAINS "string value" Criterion criterion = new Criterion(shortcuts.code()); criterion.setMetadata(shortcuts.aString().getCode(), shortcuts.aString().getType(), null); criterion.setSearchOperator(SearchOperator.CONTAINS_TEXT); criterion.setValue(STRING_VALUE); return criterion; } // private Criterion relativeNewerThanDateCriterion() { // Criterion criterion = new Criterion(shortcuts.code()); // criterion.setMetadata(shortcuts.aDate().getCode(), shortcuts.aDate().getType(), null); // criterion.setSearchOperator(SearchOperator.NEWER_THAN); // // LocalDateTime ldt = TimeProvider.getLocalDateTime(); // criterion.setMeasuringUnitTimeValue(2); // criterion.setMeasuringUnitTime(MeasuringUnitTime.DAYS); // return criterion; // } private DataProvided verifyThat(RecordVODataProvider dataProvider) { List<String> recordsIds = new ArrayList<>(); for (RecordVO recordVO : dataProvider.listRecordVOs(0, dataProvider.size())) { recordsIds.add(recordVO.getId()); } return new DataProvided(recordsIds); } private class DataProvided { List<String> recordsIds; public DataProvided(List<String> recordsIds) { this.recordsIds = recordsIds; } public void containsOnly(RecordWrapper... records) { assertThat(records.length).isEqualTo(recordsIds.size()); for (RecordWrapper record : records) { assertThat(recordsIds).contains(record.getId()); } } } }