package com.constellio.app.modules.rm.reports.model.search; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from; import static java.util.Arrays.asList; import static org.mockito.Mockito.when; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.*; import com.constellio.app.entities.schemasDisplay.MetadataDisplayConfig; import com.constellio.app.entities.schemasDisplay.SchemaTypesDisplayConfig; import com.constellio.app.entities.schemasDisplay.enums.MetadataInputType; import com.constellio.app.services.schemasDisplay.SchemasDisplayManager; import com.constellio.app.ui.entities.MetadataVO; import com.constellio.model.entities.Language; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.schemas.MetadataValueType; import com.constellio.model.services.parser.FileParser; import com.constellio.model.services.parser.FileParserException; import com.constellio.model.services.schemas.MetadataSchemaTypesAlteration; import com.constellio.model.services.schemas.MetadataSchemasManager; import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder; import com.constellio.model.services.search.SearchServices; import org.apache.solr.schema.SchemaManager; import org.junit.Before; import org.junit.Test; 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.model.entities.schemas.Schemas; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.records.RecordServicesException; import com.constellio.model.services.search.query.logical.LogicalSearchQuery; import com.constellio.model.services.users.UserServices; import com.constellio.sdk.tests.ConstellioTest; public class SearchResultReportPresenterAcceptTest extends ConstellioTest { RMTestRecords records = new RMTestRecords(zeCollection); SearchResultReportPresenter presenter; final String reportTitle = "zReportTitle"; final List<String> foldersA01AndA02 = new ArrayList<>(); final String folderSchemaType = Folder.SCHEMA_TYPE; private RecordServices recordServices; private ReportTestUtils reportTestUtils; private LogicalSearchQuery searchQuery; @Before public void setUp() throws Exception { prepareSystem( withZeCollection().withConstellioRMModule().withRMTest(records) .withFoldersAndContainersOfEveryStatus().withAllTestUsers() ); recordServices = getModelLayerFactory().newRecordServices(); UserServices userServices = getModelLayerFactory().newUserServices(); userServices.addUserToCollection(userServices.getUserCredential(chuckNorris), zeCollection); reportTestUtils = new ReportTestUtils(getModelLayerFactory(), zeCollection, records); updateFolderA01Metadata(); updateFolderA02Metadata(); updateFolderA03Metadata(); foldersA01AndA02.clear(); foldersA01AndA02.add(records.folder_A01); foldersA01AndA02.add(records.folder_A02); RMSchemasRecordsServices schemas = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory()); searchQuery = new LogicalSearchQuery(from(schemas.folderSchemaType()).where(Schemas.IDENTIFIER) .isIn(asList(records.folder_A01, records.folder_A02, records.folder_A03))).sortAsc(Schemas.TITLE); } private void updateFolderA01Metadata() { try { recordServices.update(records.getFolder_A01() .setTitle(reportTestUtils.getExpectedFolderTitle_A01()) .setDescription(reportTestUtils.getExpectedFolderDescription_A01()) .setCreatedBy(reportTestUtils.getExpectedFolderCreator_A01())); } catch (RecordServicesException e) { throw new RuntimeException(e); } } private void updateFolderA02Metadata() { try { recordServices.update(records.getFolder_A02() .setTitle(reportTestUtils.getExpectedFolderTitle_A02()) .setDescription(reportTestUtils.getExpectedFolderDescription_A02()) .setCreatedBy(reportTestUtils.getExpectedFolderCreator_A02())); } catch (RecordServicesException e) { throw new RuntimeException(e); } } private void updateFolderA03Metadata() { try { recordServices.update(records.getFolder_A03() .setTitle(reportTestUtils.getExpectedFolderTitle_A03()) .setDescription(reportTestUtils.getExpectedFolderDescription_A03()) .setCreatedBy(reportTestUtils.getExpectedFolderCreator_A02())); } catch (RecordServicesException e) { throw new RuntimeException(e); } } @Test(expected = NoSuchReportRuntimeException.class) public void whenInvalidReportThenThrowsNoSuchReportRuntimeException() { presenter = new SearchResultReportPresenter(getAppLayerFactory(), foldersA01AndA02, folderSchemaType, zeCollection, chuckNorris, reportTitle, searchQuery, Locale.FRENCH); presenter.buildModel(getModelLayerFactory()); } @Test public void givenValidReportWhenNoFolderChosenThenGenerateReportWithAllQueryRecords() { SearchResultReportPresenter.LIMIT = 1000; SearchResultReportPresenter.BATCH_SIZE = 100; reportTestUtils.addUserReport(reportTitle, records.getChuckNorris().getUsername()); presenter = new SearchResultReportPresenter(getAppLayerFactory(), new ArrayList<String>(), folderSchemaType, zeCollection, chuckNorris, reportTitle, searchQuery, Locale.FRENCH); SearchResultReportModel model = presenter.buildModel(getModelLayerFactory()); reportTestUtils.validateUserReportWithAllQueryFolders(model); } @Test public void givenValidReportAndQueryWithResultCountGreaterThanLimitWhenNoFolderChosenThenGenerateFirstQueryRecords() { SearchResultReportPresenter.LIMIT = 2; SearchResultReportPresenter.BATCH_SIZE = 1; reportTestUtils.addUserReport(reportTitle, records.getChuckNorris().getUsername()); presenter = new SearchResultReportPresenter(getAppLayerFactory(), new ArrayList<String>(), folderSchemaType, zeCollection, chuckNorris, reportTitle, searchQuery, Locale.FRENCH); SearchResultReportModel model = presenter.buildModel(getModelLayerFactory()); reportTestUtils.validateUserReportWithSelectedFolders(model); } @Test public void givenValidReportWhenTwoFoldersThenGenerateValidReportWithValidData() { reportTestUtils.addUserReport(reportTitle, records.getChuckNorris().getUsername()); presenter = new SearchResultReportPresenter(getAppLayerFactory(), foldersA01AndA02, folderSchemaType, zeCollection, chuckNorris, reportTitle, searchQuery, Locale.FRENCH); SearchResultReportModel model = presenter.buildModel(getModelLayerFactory()); reportTestUtils.validateUserReportWithSelectedFolders(model); } @Test public void whenReportWithDisabledMetadataThenGenerateReportWithDisabledMetadata() { reportTestUtils.addUserReport(reportTitle, records.getChuckNorris().getUsername()); reportTestUtils.disableAUserReportMetadata(); presenter = new SearchResultReportPresenter(getAppLayerFactory(), foldersA01AndA02, folderSchemaType, zeCollection, chuckNorris, reportTitle, searchQuery, Locale.FRENCH); SearchResultReportModel model = presenter.buildModel(getModelLayerFactory()); reportTestUtils.validateUserReportWithDisabledMetadata(model); } @Test public void givenChuckNorrisReportAndDefaultReportThenGenerateChuckNorrisReportForChuckNorris() { reportTestUtils.addUserReport(reportTitle, chuckNorris); reportTestUtils.addDefaultReport(reportTitle); presenter = new SearchResultReportPresenter(getAppLayerFactory(), foldersA01AndA02, folderSchemaType, zeCollection, chuckNorris, reportTitle, searchQuery, Locale.FRENCH); SearchResultReportModel model = presenter.buildModel(getModelLayerFactory()); reportTestUtils.validateUserReportWithSelectedFolders(model); } @Test public void givenChuckNorrisReportAndDefaultReportThenGenerateDefaultReportForBob() { reportTestUtils.addUserReport(reportTitle, chuckNorris); reportTestUtils.addDefaultReport(reportTitle); presenter = new SearchResultReportPresenter(getAppLayerFactory(), foldersA01AndA02, folderSchemaType, zeCollection, bobGratton, reportTitle, searchQuery, Locale.FRENCH); SearchResultReportModel model = presenter.buildModel(getModelLayerFactory()); reportTestUtils.validateDefaultReport(model); } @Test public void givenReportWithMultivalueThenWrittenCorrectly() throws Exception { RMSchemasRecordsServices rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory()); RecordServices recordServices = getModelLayerFactory().newRecordServices(); SearchServices searchServices = getModelLayerFactory().newSearchServices(); Folder folder1 = rm.getFolder(records.folder_A01); Folder folder2 = rm.getFolder(records.folder_A02); folder1.setKeywords(asList("mot1", "mot2", "mot3")); folder2.setKeywords(new ArrayList<String>()); recordServices.update(folder1.getWrappedRecord()); recordServices.update(folder2.getWrappedRecord()); reportTestUtils.addDefaultReportWithMultivalue(reportTitle); presenter = new SearchResultReportPresenter(getAppLayerFactory(), foldersA01AndA02, folderSchemaType, zeCollection, admin, reportTitle, searchQuery, Locale.FRENCH); SearchResultReportModel model = presenter.buildModel(getModelLayerFactory()); reportTestUtils.validateDefaultReportWithMultivalue(model); } @Test public void givenReportWithBooleanThenWrittenCorrectly() throws Exception { RMSchemasRecordsServices rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory()); RecordServices recordServices = getModelLayerFactory().newRecordServices(); Folder folder1 = rm.getFolder(records.folder_A01); Folder folder2 = rm.getFolder(records.folder_A02); MetadataSchemasManager manager = getAppLayerFactory().getModelLayerFactory().getMetadataSchemasManager(); manager.modify(zeCollection, new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { RMSchemasRecordsServices rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory()); Folder folder1 = rm.getFolder(records.folder_A01); Folder folder2 = rm.getFolder(records.folder_A02); types.getSchema(folder2.getSchemaCode()).getMetadata(Folder.BORROWED).setEnabled(true); types.getSchema(folder1.getSchemaCode()).getMetadata(Folder.BORROWED).setEnabled(true); } }); folder1.setBorrowed(true); folder2.setBorrowed(false); recordServices.update(folder1.getWrappedRecord()); recordServices.update(folder2.getWrappedRecord()); reportTestUtils.addDefaultReportWithBoolean(reportTitle); presenter = new SearchResultReportPresenter(getAppLayerFactory(), foldersA01AndA02, folderSchemaType, zeCollection, admin, reportTitle, searchQuery, Locale.FRENCH); SearchResultReportModel model = presenter.buildModel(getModelLayerFactory()); reportTestUtils.validateDefaultReportWithBoolean(model); } @Test public void givenReportWithRichTextThenWrittenCorrectly() throws Exception { RMSchemasRecordsServices rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory()); RecordServices recordServices = getModelLayerFactory().newRecordServices(); MetadataSchemasManager manager = getAppLayerFactory().getModelLayerFactory().getMetadataSchemasManager(); final String richText = "<blockquote><blockquote><b>Ceci </b><i>est </i><u>un </u>tes<sub>t</sub> " + "pou<sup>r</sup> l'<strike>université</strike>.<br><hr><br><br><ol><li>1</li><li>2</li>" + "<ol><li>2.1</li></ol></ol><ul><li>A</li><li>B</li><ul><li>B.A<br><hr></li></ul></ul><p>" + "<br></p></blockquote></blockquote>"; manager.modify(zeCollection, new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { Map<Language, String> labels = new HashMap<>(); labels.put(Language.French, "richText"); types.getDefaultSchema(Folder.SCHEMA_TYPE).create("richText").setType(MetadataValueType.TEXT).setLabels(labels).setEnabled(true); } }); SchemasDisplayManager displayManager = getAppLayerFactory().getMetadataSchemasDisplayManager(); MetadataDisplayConfig config = displayManager.getMetadata(zeCollection, Folder.DEFAULT_SCHEMA + "_richText").withInputType(MetadataInputType.RICHTEXT); displayManager.saveMetadata(config); Folder folder1 = rm.getFolder(records.folder_A01); Folder folder2 = rm.getFolder(records.folder_A02); folder1.set("richText", richText); recordServices.update(folder1.getWrappedRecord()); recordServices.update(folder2.getWrappedRecord()); reportTestUtils.addDefaultReportWithRichText(reportTitle); presenter = new SearchResultReportPresenter(getAppLayerFactory(), foldersA01AndA02, folderSchemaType, zeCollection, admin, reportTitle, searchQuery, Locale.FRENCH); SearchResultReportModel model = presenter.buildModel(getModelLayerFactory()); reportTestUtils.validateDefaultReportWithRichText(model); } @Test public void givenReportWithReferenceThenWrittenCorrectly() throws Exception { RMSchemasRecordsServices rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory()); RecordServices recordServices = getModelLayerFactory().newRecordServices(); Folder folder1 = rm.getFolder(records.folder_A01); Folder folder2 = rm.getFolder(records.folder_A02); folder1.setParentFolder(folder2); recordServices.update(folder1.getWrappedRecord()); reportTestUtils.addDefaultReportWithReference(reportTitle); presenter = new SearchResultReportPresenter(getAppLayerFactory(), asList(records.folder_A01), folderSchemaType, zeCollection, admin, reportTitle, searchQuery, Locale.FRENCH); SearchResultReportModel model = presenter.buildModel(getModelLayerFactory()); reportTestUtils.validateDefaultReportWithReference(model); } }