package com.constellio.app.ui.pages.management.schemas.display.report;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import com.constellio.sdk.tests.MockedNavigation;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import com.constellio.app.modules.rm.RMTestRecords;
import com.constellio.app.modules.rm.reports.model.search.ReportTestUtils;
import com.constellio.app.modules.rm.wrappers.Folder;
import com.constellio.app.ui.application.CoreViews;
import com.constellio.app.ui.entities.MetadataVO;
import com.constellio.app.ui.entities.ReportVO;
import com.constellio.app.ui.entities.UserVO;
import com.constellio.app.ui.framework.builders.MetadataToVOBuilder;
import com.constellio.app.ui.pages.base.SessionContext;
import com.constellio.model.entities.records.wrappers.Report;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.services.reports.ReportServices;
import com.constellio.model.services.schemas.MetadataSchemasManager;
import com.constellio.sdk.tests.ConstellioTest;
public class ReportDisplayConfigPresenterAcceptanceTest extends ConstellioTest {
RMTestRecords records = new RMTestRecords(zeCollection);
ReportDisplayConfigPresenter presenter;
ReportTestUtils reportTestUtils;
@Mock
ReportConfigurationView view;
@Mock
SessionContext session;
@Mock
UserVO currentUser;
MockedNavigation navigator;
private String zeReportTitle = "report title";
private ReportServices reportServices;
@Before
public void setUp()
throws Exception {
prepareSystem(
withZeCollection().withConstellioRMModule().withRMTest(records)
.withFoldersAndContainersOfEveryStatus().withAllTestUsers()
);
navigator = new MockedNavigation();
when(view.getSessionContext()).thenReturn(session);
when(view.getCollection()).thenReturn(zeCollection);
when(session.getCurrentCollection()).thenReturn(zeCollection);
when(currentUser.getUsername()).thenReturn(admin);
when(session.getCurrentUser()).thenReturn(currentUser);
when(view.navigate()).thenReturn(navigator);
when(view.navigate()).thenReturn(navigator);
when(session.getCurrentLocale()).thenReturn(Locale.FRENCH);
presenter = new ReportDisplayConfigPresenter(view);
Map<String, String> params = new HashMap<>();
params.put("schemaTypeCode", Folder.SCHEMA_TYPE);
presenter.setParameters(params);
reportTestUtils = new ReportTestUtils(getModelLayerFactory(), zeCollection, records);
reportServices = new ReportServices(getModelLayerFactory(), zeCollection);
}
@Test
public void whenDefaultFolderReportAndChuckReportThenReturnDefaultReports() {
reportTestUtils.addDefaultReport(zeReportTitle);
reportTestUtils.addUserReport(zeReportTitle, chuckNorris);
List<ReportVO> reports = presenter.getReports();
assertThat(reports.size()).isEqualTo(1);
reportTestUtils.validateDefaultReport(reports.get(0));
}
@Test
public void whenNoDefaultFolderReportAndChuckReportThenNoReport() {
reportTestUtils.addUserReport(zeReportTitle, chuckNorris);
List<ReportVO> reports = presenter.getReports();
assertThat(reports).isEmpty();
}
@Test
public void whenDefaultFolderAndDefaultDocumentReportThenDefaultFolderReportForFoldersSchemaType() {
reportTestUtils.addDefaultReport(zeReportTitle);
reportTestUtils.addDocumentDefaultReport(zeReportTitle);
List<ReportVO> reports = presenter.getReports();
assertThat(reports.size()).isEqualTo(1);
reportTestUtils.validateDefaultReport(reports.get(0));
}
@Test
public void whenNewReportSavedThenSavedCorrectly() {
String newReportTitle = "newReport";
when(view.getSelectedReport()).thenReturn(newReportTitle);
Metadata folderTitleMetadata = getFolderLinearSizeMetadata();
List<MetadataVO> metadataVOList = new ArrayList();
MetadataVO firstMD = new MetadataToVOBuilder().build(folderTitleMetadata, session);
metadataVOList.add(firstMD);
presenter.saveButtonClicked(metadataVOList);
Report report = reportServices.getReport(Folder.SCHEMA_TYPE, newReportTitle);
assertThat(report).isNotNull();
assertThat(report.getReportedMetadata().size()).isEqualTo(1);
assertThat(report.getReportedMetadata().get(0).getMetadataCode()).isEqualTo(folderTitleMetadata.getCode());
}
private Metadata getFolderLinearSizeMetadata() {
MetadataSchemasManager metadataSchemasManager = getModelLayerFactory().getMetadataSchemasManager();
MetadataSchemaTypes types = metadataSchemasManager.getSchemaTypes(zeCollection);
MetadataSchema folderDefaultSchema = types.getSchemaType(Folder.SCHEMA_TYPE).getDefaultSchema();
return folderDefaultSchema.getMetadata(Folder.LINEAR_SIZE);
}
@Test
public void whenReportUpdatedThenUpdatedCorrectly() {
reportTestUtils.addDefaultReport(zeReportTitle);
when(view.getSelectedReport()).thenReturn(zeReportTitle);
Metadata folderTitleMetadata = getFolderLinearSizeMetadata();
List<MetadataVO> metadataVOList = new ArrayList();
MetadataVO firstMD = new MetadataToVOBuilder().build(folderTitleMetadata, session);
metadataVOList.add(firstMD);
presenter.saveButtonClicked(metadataVOList);
Report report = reportServices.getReport(Folder.SCHEMA_TYPE, zeReportTitle);
assertThat(report).isNotNull();
assertThat(report.getReportedMetadata().size()).isEqualTo(1);
assertThat(report.getReportedMetadata().get(0).getMetadataCode()).isEqualTo(folderTitleMetadata.getCode());
}
@Test
public void whenGetReportMetadataForNewReportThenNoMetadata() {
when(view.getSelectedReport()).thenReturn(null);
assertThat(presenter.getReportMetadatas()).isEmpty();
}
@Test
public void whenGetReportMetadataForExistingReportThenReturnExistingReportMetadata() {
reportTestUtils.addDefaultReport(zeReportTitle);
when(view.getSelectedReport()).thenReturn(zeReportTitle);
List<MetadataVO> reportMetadataList = presenter.getReportMetadatas();
reportTestUtils.validateDefaultReport(reportMetadataList);
}
@Test
public void whenGetReportMetadataThenMultivalueMetadatasAreAvailable() {
assertThat(presenter.getDataProvider().listMetadataVO()).extracting("code").contains("folder_employe_" + Folder.KEYWORDS);
}
@Test
public void whenGetReportMetadataThenThereIsNoDuplicateLocalCode() {
assertThat(presenter.getDataProvider().listMetadataVO()).extracting("localCode").containsOnlyOnce("title");
}
}