package com.constellio.app.modules.rm.reports.model.search;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.ArrayList;
import java.util.List;
import com.constellio.app.modules.rm.RMTestRecords;
import com.constellio.app.modules.rm.wrappers.Document;
import com.constellio.app.modules.rm.wrappers.Folder;
import com.constellio.app.ui.entities.MetadataVO;
import com.constellio.app.ui.entities.ReportVO;
import com.constellio.app.ui.entities.ReportedMetadataVO;
import com.constellio.model.entities.Language;
import com.constellio.model.entities.records.wrappers.Report;
import com.constellio.model.entities.records.wrappers.structure.ReportedMetadata;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.reports.ReportServices;
import com.constellio.model.services.schemas.MetadataSchemasManager;
import com.constellio.model.services.schemas.MetadataSchemasManagerException.OptimisticLocking;
import com.constellio.model.services.schemas.builders.MetadataSchemaTypeBuilder;
import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder;
public class ReportTestUtils {
private MetadataSchemaTypes types;
private RecordServices recordServices;
private ReportServices reportServices;
private final String folderSchemaType = Folder.SCHEMA_TYPE;
private String expectedFolderTitle_A01 = "title1";
private String expectedFolderTitle_A02 = "title2";
private String expectedFolderTitle_A03 = "title3";
private String expectedFolderDescription_A01 = "description1";
private String expectedFolderDescription_A03 = "description3";
private String expectedFolderCreator_A01;
private String expectedFolderDescription_A02 = null;
private String expectedFolderCreator_A02;
private String folderTitleMetadataCode;
private String folderCreatedByMetadataCode;
private String folderKeywordsMetadataCode;
private String folderBorrowedMetadataCode;
private String folderParentFolderMetadataCode;
private String folderDescriptionMetadataCode;
private ModelLayerFactory modelLayerFactory;
private String zeCollection;
public ReportTestUtils(ModelLayerFactory modelLayerFactory, String zeCollection, RMTestRecords records) {
this.modelLayerFactory = modelLayerFactory;
this.zeCollection = zeCollection;
reportServices = new ReportServices(modelLayerFactory, zeCollection);
recordServices = modelLayerFactory.newRecordServices();
MetadataSchemasManager metadataSchemasManager = modelLayerFactory.getMetadataSchemasManager();
types = metadataSchemasManager.getSchemaTypes(zeCollection);
expectedFolderCreator_A01 = records.getChuckNorris().getId();
expectedFolderCreator_A02 = records.getBob_userInAC().getId();
MetadataSchema defaultFolderSchema = types.getSchemaType(Folder.SCHEMA_TYPE).getDefaultSchema();
folderTitleMetadataCode = defaultFolderSchema.getMetadata(Folder.TITLE).getCode();
folderCreatedByMetadataCode = defaultFolderSchema.getMetadata(Schemas.CREATED_BY.getCode()).getCode();
folderDescriptionMetadataCode = defaultFolderSchema.getMetadata(Folder.DESCRIPTION).getCode();
folderKeywordsMetadataCode = defaultFolderSchema.getMetadata(Folder.KEYWORDS).getCode();
folderBorrowedMetadataCode = defaultFolderSchema.getMetadata(Folder.BORROWED).getCode();
folderParentFolderMetadataCode = defaultFolderSchema.getMetadata(Folder.PARENT_FOLDER).getCode();
}
public String getExpectedFolderTitle_A01() {
return expectedFolderTitle_A01;
}
public String getExpectedFolderTitle_A02() {
return expectedFolderTitle_A02;
}
public String getExpectedFolderDescription_A01() {
return expectedFolderDescription_A01;
}
public String getExpectedFolderCreator_A01() {
return expectedFolderCreator_A01;
}
public String getExpectedFolderDescription_A02() {
return expectedFolderDescription_A02;
}
public String getExpectedFolderCreator_A02() {
return expectedFolderCreator_A02;
}
public String getFolderTitleMetadataCode() {
return folderTitleMetadataCode;
}
public String getFolderCreatedByMetadataCode() {
return folderCreatedByMetadataCode;
}
public String getFolderDescriptionMetadataCode() {
return folderDescriptionMetadataCode;
}
public void addDefaultReport(String title) {
//With two metadata : title and createdBy
MetadataSchema reportSchema = types.getSchemaType(Report.SCHEMA_TYPE).getDefaultSchema();
Report report = new Report(recordServices.newRecordWithSchema(reportSchema), types);
report.setTitle(title);
report.setColumnsCount(2);
report.setLinesCount(1);
report.setSchemaTypeCode(folderSchemaType);
List<ReportedMetadata> reportedMetadataList = new ArrayList<>();
reportedMetadataList.add(new ReportedMetadata(folderTitleMetadataCode, 0));
reportedMetadataList.add(new ReportedMetadata(folderCreatedByMetadataCode, 1));
report.setReportedMetadata(reportedMetadataList);
reportServices.addUpdate(report);
}
public void addDefaultReportWithMultivalue(String title) {
MetadataSchema reportSchema = types.getSchemaType(Report.SCHEMA_TYPE).getDefaultSchema();
Report report = new Report(recordServices.newRecordWithSchema(reportSchema), types);
report.setTitle(title);
report.setColumnsCount(2);
report.setLinesCount(1);
report.setSchemaTypeCode(folderSchemaType);
List<ReportedMetadata> reportedMetadataList = new ArrayList<>();
reportedMetadataList.add(new ReportedMetadata(folderTitleMetadataCode, 0));
reportedMetadataList.add(new ReportedMetadata(folderCreatedByMetadataCode, 1));
reportedMetadataList.add(new ReportedMetadata(folderKeywordsMetadataCode, 2));
report.setReportedMetadata(reportedMetadataList);
reportServices.addUpdate(report);
}
public void addDefaultReportWithBoolean(String title) {
MetadataSchema reportSchema = types.getSchemaType(Report.SCHEMA_TYPE).getDefaultSchema();
Report report = new Report(recordServices.newRecordWithSchema(reportSchema), types);
report.setTitle(title);
report.setColumnsCount(2);
report.setLinesCount(1);
report.setSchemaTypeCode(folderSchemaType);
List<ReportedMetadata> reportedMetadataList = new ArrayList<>();
reportedMetadataList.add(new ReportedMetadata(folderTitleMetadataCode, 0));
reportedMetadataList.add(new ReportedMetadata(folderCreatedByMetadataCode, 1));
reportedMetadataList.add(new ReportedMetadata(folderBorrowedMetadataCode, 2));
report.setReportedMetadata(reportedMetadataList);
reportServices.addUpdate(report);
}
public void addDefaultReportWithRichText(String title) {
MetadataSchema reportSchema = types.getSchemaType(Report.SCHEMA_TYPE).getDefaultSchema();
Report report = new Report(recordServices.newRecordWithSchema(reportSchema), types);
report.setTitle(title);
report.setColumnsCount(2);
report.setLinesCount(1);
report.setSchemaTypeCode(folderSchemaType);
List<ReportedMetadata> reportedMetadataList = new ArrayList<>();
reportedMetadataList.add(new ReportedMetadata(folderTitleMetadataCode, 0));
reportedMetadataList.add(new ReportedMetadata(folderCreatedByMetadataCode, 1));
reportedMetadataList.add(new ReportedMetadata(reportSchema.getCode() + "_richText", 2));
report.setReportedMetadata(reportedMetadataList);
reportServices.addUpdate(report);
}
public void validateDefaultReport(SearchResultReportModel model) {
List<String> titles = model.getColumnsTitles();
assertThat(titles).containsOnly(types.getMetadata(folderTitleMetadataCode).getLabel(Language.French),
types.getMetadata(folderCreatedByMetadataCode).getLabel(Language.French));
List<List<Object>> content = model.getResults();
assertThat(content.size()).isEqualTo(2);
List<Object> result1 = content.get(0);
assertThat(result1.size()).isEqualTo(2);
assertThat(result1.get(0)).isEqualTo(expectedFolderTitle_A01);
assertThat(result1.get(1)).isEqualTo("Chuck Norris");
List<Object> result2 = content.get(1);
assertThat(result2.size()).isEqualTo(2);
assertThat(result2.get(0)).isEqualTo(expectedFolderTitle_A02);
assertThat(result2.get(1)).isEqualTo("Bob 'Elvis' Gratton");
}
public void validateDefaultReportWithMultivalue(SearchResultReportModel model) {
List<String> titles = model.getColumnsTitles();
assertThat(titles).containsOnly(types.getMetadata(folderTitleMetadataCode).getLabel(Language.French),
types.getMetadata(folderCreatedByMetadataCode).getLabel(Language.French),
"Mots-clés");
List<List<Object>> content = model.getResults();
assertThat(content.size()).isEqualTo(2);
List<Object> result1 = content.get(0);
assertThat(result1.size()).isEqualTo(3);
assertThat(result1.get(0)).isEqualTo(expectedFolderTitle_A01);
assertThat(result1.get(1)).isEqualTo("Chuck Norris");
assertThat(result1.get(2)).isEqualTo(asList("mot1", "mot2", "mot3"));
List<Object> result2 = content.get(1);
assertThat(result2.size()).isEqualTo(3);
assertThat(result2.get(0)).isEqualTo(expectedFolderTitle_A02);
assertThat(result2.get(1)).isEqualTo("Bob 'Elvis' Gratton");
assertThat(result2.get(2)).isEqualTo("");
}
public void validateDefaultReportWithRichText(SearchResultReportModel model) {
List<String> titles = model.getColumnsTitles();
assertThat(titles).containsOnly(types.getMetadata(folderTitleMetadataCode).getLabel(Language.French),
types.getMetadata(folderCreatedByMetadataCode).getLabel(Language.French),
"richText");
List<List<Object>> content = model.getResults();
assertThat(content.size()).isEqualTo(2);
List<Object> result1 = content.get(0);
assertThat(result1.size()).isEqualTo(3);
assertThat(result1.get(0)).isEqualTo(expectedFolderTitle_A01);
assertThat(result1.get(1)).isEqualTo("Chuck Norris");
assertThat(result1.get(2)).isEqualTo("Ceci est un test pour l'université.\n" +
"\n" +
"\n" +
"\n" +
"1\n" +
"2\n" +
"2.1\n" +
"A\n" +
"B\n" +
"B.A\n\n");
List<Object> result2 = content.get(1);
assertThat(result2.size()).isEqualTo(3);
assertThat(result2.get(0)).isEqualTo(expectedFolderTitle_A02);
assertThat(result2.get(1)).isEqualTo("Bob 'Elvis' Gratton");
assertThat(result2.get(2)).isEqualTo(null);
}
public void validateDefaultReportWithBoolean(SearchResultReportModel model) {
List<String> titles = model.getColumnsTitles();
assertThat(titles).containsOnly(types.getMetadata(folderTitleMetadataCode).getLabel(Language.French),
types.getMetadata(folderCreatedByMetadataCode).getLabel(Language.French),
types.getMetadata(folderBorrowedMetadataCode).getLabel(Language.French));
List<List<Object>> content = model.getResults();
assertThat(content.size()).isEqualTo(2);
List<Object> result1 = content.get(0);
assertThat(result1.size()).isEqualTo(3);
assertThat(result1.get(0)).isEqualTo(expectedFolderTitle_A01);
assertThat(result1.get(1)).isEqualTo("Chuck Norris");
assertThat(result1.get(2)).isEqualTo("Oui");
List<Object> result2 = content.get(1);
assertThat(result2.size()).isEqualTo(3);
assertThat(result2.get(0)).isEqualTo(expectedFolderTitle_A02);
assertThat(result2.get(1)).isEqualTo("Bob 'Elvis' Gratton");
assertThat(result2.get(2)).isEqualTo("Non");
}
public void validateUserReportTitles(SearchResultReportModel model) {
List<String> titles = model.getColumnsTitles();
assertThat(titles).containsOnly(types.getMetadata(folderDescriptionMetadataCode).getLabel(Language.French),
types.getMetadata(folderTitleMetadataCode).getLabel(Language.French));
}
public void addUserReport(String reportTitle, String username) {
//With two metadata : linearSize and title
MetadataSchema reportSchema = types.getSchemaType(Report.SCHEMA_TYPE).getDefaultSchema();
Report report = new Report(recordServices.newRecordWithSchema(reportSchema), types);
report.setTitle(reportTitle);
report.setUsername(username);
report.setColumnsCount(2);
report.setLinesCount(1);
report.setSchemaTypeCode(folderSchemaType);
List<ReportedMetadata> reportedMetadataList = new ArrayList<>();
reportedMetadataList.add(new ReportedMetadata(folderTitleMetadataCode, 1));
reportedMetadataList.add(new ReportedMetadata(folderDescriptionMetadataCode, 0));
report.setReportedMetadata(reportedMetadataList);
reportServices.addUpdate(report);
}
public void validateUserReportWithSelectedFolders(SearchResultReportModel model) {
validateUserReportTitles(model);
List<List<Object>> content = model.getResults();
assertThat(content.size()).isEqualTo(2);
List<Object> result1 = content.get(0);
assertThat(result1.size()).isEqualTo(2);
assertThat(result1.get(0)).isEqualTo(expectedFolderDescription_A01);
assertThat(result1.get(1)).isEqualTo(expectedFolderTitle_A01);
List<Object> result2 = content.get(1);
assertThat(result2.size()).isEqualTo(2);
assertThat(result2.get(1)).isEqualTo(expectedFolderTitle_A02);
assertThat(result2.get(0)).isEqualTo(expectedFolderDescription_A02);
}
public void validateUserReportWithAllQueryFolders(SearchResultReportModel model) {
validateUserReportTitles(model);
List<List<Object>> content = model.getResults();
assertThat(content.size()).isEqualTo(3);
List<Object> result1 = content.get(0);
assertThat(result1.size()).isEqualTo(2);
assertThat(result1.get(0)).isEqualTo(expectedFolderDescription_A01);
assertThat(result1.get(1)).isEqualTo(expectedFolderTitle_A01);
List<Object> result2 = content.get(1);
assertThat(result2.size()).isEqualTo(2);
assertThat(result2.get(1)).isEqualTo(expectedFolderTitle_A02);
assertThat(result2.get(0)).isEqualTo(expectedFolderDescription_A02);
List<Object> result3 = content.get(2);
assertThat(result3.size()).isEqualTo(2);
assertThat(result3.get(1)).isEqualTo(expectedFolderTitle_A03);
assertThat(result3.get(0)).isEqualTo(expectedFolderDescription_A03);
}
public void validateUserReport(Report report, String userName) {
assertThat(report.getUsername()).isEqualTo(userName);
assertThat(report.getLinesCount()).isEqualTo(1);
assertThat(report.getColumnsCount()).isEqualTo(2);
assertThat(report.getSchemaTypeCode()).isEqualTo(folderSchemaType);
List<ReportedMetadata> reportedMetadata = report.getReportedMetadata();
assertThat(reportedMetadata.size()).isEqualTo(2);
assertThat(reportedMetadata.get(0).getMetadataCode()).isEqualTo(folderTitleMetadataCode);
assertThat(reportedMetadata.get(0).getXPosition()).isEqualTo(1);
assertThat(reportedMetadata.get(1).getMetadataCode()).isEqualTo(folderDescriptionMetadataCode);
assertThat(reportedMetadata.get(1).getXPosition()).isEqualTo(0);
}
public void validateDefaultReport(Report report) {
assertThat(report.getUsername()).isNull();
assertThat(report.getLinesCount()).isEqualTo(1);
assertThat(report.getColumnsCount()).isEqualTo(2);
assertThat(report.getSchemaTypeCode()).isEqualTo(folderSchemaType);
List<ReportedMetadata> reportedMetadata = report.getReportedMetadata();
assertThat(reportedMetadata.size()).isEqualTo(2);
assertThat(reportedMetadata.get(0).getMetadataCode()).isEqualTo(folderTitleMetadataCode);
assertThat(reportedMetadata.get(0).getXPosition()).isEqualTo(0);
assertThat(reportedMetadata.get(1).getMetadataCode()).isEqualTo(folderCreatedByMetadataCode);
assertThat(reportedMetadata.get(1).getXPosition()).isEqualTo(1);
}
public void validateDefaultReport(ReportVO report) {
assertThat(report.getUser()).isNull();
assertThat(report.getSchemaTypeCode()).isEqualTo(folderSchemaType);
List<ReportedMetadataVO> reportedMetadata = report.getReportedMetadataVOList();
assertThat(reportedMetadata.size()).isEqualTo(2);
assertThat(reportedMetadata.get(0).getMetadataCode()).isEqualTo(folderTitleMetadataCode);
assertThat(reportedMetadata.get(0).getXPosition()).isEqualTo(0);
assertThat(reportedMetadata.get(1).getMetadataCode()).isEqualTo(folderCreatedByMetadataCode);
assertThat(reportedMetadata.get(1).getXPosition()).isEqualTo(1);
}
public void validateDefaultReport(List<MetadataVO> metadataList) {
assertThat(metadataList.size()).isEqualTo(2);
assertThat(metadataList.get(0).getCode()).isEqualTo(folderTitleMetadataCode);
assertThat(metadataList.get(1).getCode()).isEqualTo(folderCreatedByMetadataCode);
}
public void disableAUserReportMetadata() {
//disable linearSize
MetadataSchemaTypesBuilder typesBuilder = modelLayerFactory.getMetadataSchemasManager().modify(zeCollection);
MetadataSchemaTypeBuilder metadataSchemaTypeBuilder = typesBuilder.getSchemaType(folderSchemaType);
metadataSchemaTypeBuilder.getDefaultSchema().getMetadata(folderDescriptionMetadataCode).setEssentialInSummary(false)
.setEnabled(false);
try {
modelLayerFactory.getMetadataSchemasManager().saveUpdateSchemaTypes(typesBuilder);
} catch (OptimisticLocking optimistickLocking) {
throw new RuntimeException(optimistickLocking);
}
}
public void validateUserReportWithDisabledMetadata(SearchResultReportModel model) {
List<String> titles = model.getColumnsTitles();
assertThat(titles).containsOnly(types.getMetadata(folderDescriptionMetadataCode).getLabel(Language.French), types.getMetadata(folderTitleMetadataCode).getLabel(Language.French));
List<List<Object>> content = model.getResults();
assertThat(content.size()).isEqualTo(2);
List<Object> result1 = content.get(0);
assertThat(result1.size()).isEqualTo(2);
assertThat(result1.get(0)).isEqualTo(expectedFolderDescription_A01);
assertThat(result1.get(1)).isEqualTo(expectedFolderTitle_A01);
List<Object> result2 = content.get(1);
assertThat(result2.size()).isEqualTo(2);
assertThat(result2.get(0)).isEqualTo(expectedFolderDescription_A02);
assertThat(result2.get(1)).isEqualTo(expectedFolderTitle_A02);
}
public void addDocumentDefaultReport(String title) {
MetadataSchema reportSchema = types.getSchemaType(Report.SCHEMA_TYPE).getDefaultSchema();
Report report = new Report(recordServices.newRecordWithSchema(reportSchema), types);
report.setTitle(title);
report.setColumnsCount(3);
report.setLinesCount(1);
report.setSchemaTypeCode(Document.SCHEMA_TYPE);
List<ReportedMetadata> reportedMetadataList = new ArrayList<>();
reportedMetadataList.add(new ReportedMetadata(folderTitleMetadataCode, 0));
reportedMetadataList.add(new ReportedMetadata(folderCreatedByMetadataCode, 1));
report.setReportedMetadata(reportedMetadataList);
reportServices.addUpdate(report);
}
public String getExpectedFolderDescription_A03() {
return expectedFolderDescription_A03;
}
public String getExpectedFolderTitle_A03() {
return expectedFolderTitle_A03;
}
public void addDefaultReportWithReference(String title) {
MetadataSchema reportSchema = types.getSchemaType(Report.SCHEMA_TYPE).getDefaultSchema();
Report report = new Report(recordServices.newRecordWithSchema(reportSchema), types);
report.setTitle(title);
report.setColumnsCount(2);
report.setLinesCount(1);
report.setSchemaTypeCode(folderSchemaType);
List<ReportedMetadata> reportedMetadataList = new ArrayList<>();
reportedMetadataList.add(new ReportedMetadata(folderTitleMetadataCode, 0));
reportedMetadataList.add(new ReportedMetadata(folderCreatedByMetadataCode, 1));
reportedMetadataList.add(new ReportedMetadata(folderParentFolderMetadataCode, 2));
report.setReportedMetadata(reportedMetadataList);
reportServices.addUpdate(report);
}
public void validateDefaultReportWithReference(SearchResultReportModel model) {
List<String> titles = model.getColumnsTitles();
assertThat(titles).containsOnly(types.getMetadata(folderTitleMetadataCode).getLabel(Language.French),
types.getMetadata(folderCreatedByMetadataCode).getLabel(Language.French),
types.getMetadata(folderParentFolderMetadataCode).getLabel(Language.French));
List<List<Object>> content = model.getResults();
assertThat(content.size()).isEqualTo(1);
List<Object> result1 = content.get(0);
assertThat(result1.size()).isEqualTo(3);
assertThat(result1.get(0)).isEqualTo(expectedFolderTitle_A01);
assertThat(result1.get(1)).isEqualTo("Chuck Norris");
assertThat(result1.get(2)).isEqualTo("title2");
}
}