package com.constellio.app.modules.rm.model.calculators.container;
import com.constellio.app.modules.rm.RMTestRecords;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
import com.constellio.app.modules.rm.wrappers.ContainerRecord;
import com.constellio.model.entities.calculators.CalculatorParameters;
import com.constellio.model.entities.records.Record;
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.SearchServices;
import com.constellio.sdk.tests.ConstellioTest;
import org.joda.time.LocalDate;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
/**
* Created by Constellio on 2016-12-19.
*/
public class ContainerRecordLinearSizeCalculatorAcceptanceTest extends ConstellioTest {
RMTestRecords records = new RMTestRecords(zeCollection);
ContainerRecordLinearSizeCalculator calculator;
RMSchemasRecordsServices rm;
RecordServices recordServices;
SearchServices searchServices;
@Mock CalculatorParameters parameters;
@Before
public void setUp() {
givenBackgroundThreadsEnabled();
calculator = spy(new ContainerRecordLinearSizeCalculator());
prepareSystem(
withZeCollection().withConstellioRMModule().withAllTestUsers()
.withRMTest(records).withFoldersAndContainersOfEveryStatus().withDocumentsDecommissioningList()
);
rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory());
recordServices = getModelLayerFactory().newRecordServices();
searchServices = getModelLayerFactory().newSearchServices();
}
@Test
public void givenParametersThenCalculatorReturnsGoodValue() {
when(parameters.get(calculator.enteredLinearSizeParam)).thenReturn(new Double(5));
assertThat(calculator.calculate(parameters)).isEqualTo(5);
when(parameters.get(calculator.linearSizeSumParam)).thenReturn(new Double(9001));
assertThat(calculator.calculate(parameters)).isEqualTo(5);
when(parameters.get(calculator.enteredLinearSizeParam)).thenReturn(null);
assertThat(calculator.calculate(parameters)).isEqualTo(9001);
when(parameters.get(calculator.linearSizeSumParam)).thenReturn(null);
assertThat(calculator.calculate(parameters)).isNull();
when(parameters.get(calculator.isFullParam)).thenReturn(Boolean.TRUE);
when(parameters.get(calculator.capacityParam)).thenReturn(42.0);
assertThat(calculator.calculate(parameters)).isEqualTo(42);
when(parameters.get(calculator.capacityParam)).thenReturn(null);
assertThat(calculator.calculate(parameters)).isNull();
}
@Test
public void givenFolderWithLinearSizeLinkedToContainerWithoutLinearSizeEnteredThenLinearSizeIsEqualToSum()
throws RecordServicesException {
ContainerRecord containerRecord = buildDefaultContainer();
recordServices.add(containerRecord);
addFoldersLinkedToContainer(containerRecord.getId());
getModelLayerFactory().getBatchProcessesManager().waitUntilAllFinished();
Record record = searchServices.searchSingleResult(from(rm.containerRecord.schemaType()).where(Schemas.IDENTIFIER).isEqualTo("containerTest"));
assertThat(rm.wrapContainerRecord(record).getLinearSizeEntered()).isNull();
assertThat(rm.wrapContainerRecord(record).getLinearSizeSum()).isEqualTo(new Double(6));
assertThat(rm.wrapContainerRecord(record).getLinearSize()).isEqualTo(new Double(6));
}
@Test
public void givenFolderWithLinearSizeLinkedToContainerWithLinearSizeEnteredThenLinearSizeIsEqualToEnteredValue()
throws RecordServicesException {
ContainerRecord containerRecord = buildDefaultContainer().setLinearSizeEntered(2);
recordServices.add(containerRecord);
addFoldersLinkedToContainer(containerRecord.getId());
getModelLayerFactory().getBatchProcessesManager().waitUntilAllFinished();
Record record = searchServices.searchSingleResult(from(rm.containerRecord.schemaType()).where(Schemas.IDENTIFIER).isEqualTo("containerTest"));
assertThat(rm.wrapContainerRecord(record).getLinearSizeEntered()).isEqualTo(new Double(2));
assertThat(rm.wrapContainerRecord(record).getLinearSizeSum()).isEqualTo(new Double(6));
assertThat(rm.wrapContainerRecord(record).getLinearSize()).isEqualTo(new Double(2));
}
@Test
public void givenContainerWithLinearSizeEnteredWithoutLinkedFolderThenLinearSizeIsEqualToEnteredValue()
throws RecordServicesException {
ContainerRecord containerRecord = buildDefaultContainer().setLinearSizeEntered(2);
recordServices.add(containerRecord);
getModelLayerFactory().getBatchProcessesManager().waitUntilAllFinished();
Record record = searchServices.searchSingleResult(from(rm.containerRecord.schemaType()).where(Schemas.IDENTIFIER).isEqualTo("containerTest"));
assertThat(rm.wrapContainerRecord(record).getLinearSizeEntered()).isEqualTo(new Double(2));
assertThat(rm.wrapContainerRecord(record).getLinearSizeSum()).isEqualTo(new Double(0));
assertThat(rm.wrapContainerRecord(record).getLinearSize()).isEqualTo(new Double(2));
}
@Test
public void givenContainerWithoutLinearSizeEnteredAndWithoutLinkedFolderThenLinearSizeIsEqualToZero()
throws RecordServicesException {
ContainerRecord containerRecord = buildDefaultContainer();
recordServices.add(containerRecord);
getModelLayerFactory().getBatchProcessesManager().waitUntilAllFinished();
Record record = searchServices.searchSingleResult(from(rm.containerRecord.schemaType()).where(Schemas.IDENTIFIER).isEqualTo("containerTest"));
assertThat(rm.wrapContainerRecord(record).getLinearSizeEntered()).isNull();
assertThat(rm.wrapContainerRecord(record).getLinearSizeSum()).isEqualTo(new Double(0));
assertThat(rm.wrapContainerRecord(record).getLinearSize()).isEqualTo(new Double(0));
}
@Test
public void givenContainerWithFullMetadataSetToTrueThenLinearSizeIsEqualToCapacity()
throws RecordServicesException {
ContainerRecord containerRecord = buildDefaultContainer();
containerRecord.setFull(Boolean.TRUE);
recordServices.add(containerRecord);
getModelLayerFactory().getBatchProcessesManager().waitUntilAllFinished();
Record record = searchServices.searchSingleResult(from(rm.containerRecord.schemaType()).where(Schemas.IDENTIFIER).isEqualTo("containerTest"));
assertThat(rm.wrapContainerRecord(record).getLinearSizeEntered()).isNull();
assertThat(rm.wrapContainerRecord(record).getLinearSizeSum()).isEqualTo(new Double(0));
assertThat(rm.wrapContainerRecord(record).getLinearSize()).isEqualTo(new Double(42));
containerRecord.setCapacity(null);
recordServices.add(containerRecord);
getModelLayerFactory().getBatchProcessesManager().waitUntilAllFinished();
record = searchServices.searchSingleResult(from(rm.containerRecord.schemaType()).where(Schemas.IDENTIFIER).isEqualTo("containerTest"));
assertThat(rm.wrapContainerRecord(record).getLinearSizeEntered()).isNull();
assertThat(rm.wrapContainerRecord(record).getLinearSizeSum()).isEqualTo(new Double(0));
assertThat(rm.wrapContainerRecord(record).getLinearSize()).isNull();
}
public ContainerRecord buildDefaultContainer() {
return rm.newContainerRecordWithId("containerTest").setType(records.containerTypeId_boite22x22).setTemporaryIdentifier("containerTestTemporary")
.setCapacity(42);
}
public void addFoldersLinkedToContainer(String containerID)
throws RecordServicesException {
recordServices.add(rm.newFolderWithId("parentFolder").setTitle("title").setLinearSize(new Double(2)).setContainer(containerID)
.setAdministrativeUnitEntered(records.unitId_10).setCategoryEntered(records.categoryId_X)
.setRetentionRuleEntered(records.ruleId_1).setMediumTypes(records.PA).setOpenDate(new LocalDate())
);
recordServices.add(rm.newFolder().setTitle("title").setLinearSize(new Double(2)).setContainer(containerID)
.setAdministrativeUnitEntered(records.unitId_10).setCategoryEntered(records.categoryId_X)
.setRetentionRuleEntered(records.ruleId_1).setMediumTypes(records.PA).setOpenDate(new LocalDate())
);
recordServices.add(rm.newFolder().setTitle("title").setLinearSize(new Double(2)).setContainer(containerID).setParentFolder("parentFolder")
.setAdministrativeUnitEntered(records.unitId_10).setCategoryEntered(records.categoryId_X)
.setRetentionRuleEntered(records.ruleId_1).setMediumTypes(records.PA).setOpenDate(new LocalDate())
);
recordServices.add(rm.newFolder().setTitle("title").setLinearSize(new Double(2)).setParentFolder("parentFolder")
.setAdministrativeUnitEntered(records.unitId_10).setCategoryEntered(records.categoryId_X)
.setRetentionRuleEntered(records.ruleId_1).setMediumTypes(records.PA).setOpenDate(new LocalDate())
);
}
}