package com.constellio.app.modules.rm.extensions;
import com.constellio.app.modules.rm.RMEmailTemplateConstants;
import com.constellio.app.modules.rm.RMTestRecords;
import com.constellio.app.modules.rm.model.enums.DecommissioningListType;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
import com.constellio.app.modules.rm.wrappers.DecommissioningList;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.EmailToSend;
import com.constellio.model.entities.structures.EmailAddress;
import com.constellio.model.services.migrations.ConstellioEIMConfigs;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.records.RecordServicesException;
import com.constellio.model.services.search.SearchServices;
import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition;
import com.constellio.model.services.users.UserServices;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.setups.Users;
import org.joda.time.LocalDate;
import org.joda.time.LocalDateTime;
import org.junit.Before;
import org.junit.Test;
import java.util.HashSet;
import java.util.Set;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.where;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;
public class RMCreateDecommissioningListExtensionAcceptanceTest extends ConstellioTest {
private RMCreateDecommissioningListExtension rmCreateDecommissioningListExtension;
Users users = new Users();
RecordServices recordServices;
UserServices userServices;
ConstellioEIMConfigs eimConfigs;
String constellioUrl;
RMSchemasRecordsServices rm;
private SearchServices searchServices;
private LocalDateTime now = LocalDateTime.now();
private DecommissioningList decommissioningList;
private DecommissioningList documentDecommissioningList;
private LocalDate newStartDate = LocalDate.now().minusDays(2);
RMTestRecords records = new RMTestRecords(zeCollection);
@Before
public void setUp()
throws Exception {
givenTimeIs(now);
prepareSystem(
withZeCollection().withConstellioRMModule().withAllTestUsers()
.withRMTest(records).withFoldersAndContainersOfEveryStatus().withDocumentsDecommissioningList()
);
recordServices = getModelLayerFactory().newRecordServices();
searchServices = getModelLayerFactory().newSearchServices();
rmCreateDecommissioningListExtension = new RMCreateDecommissioningListExtension(zeCollection, getModelLayerFactory());
userServices = getModelLayerFactory().newUserServices();
eimConfigs = new ConstellioEIMConfigs(getModelLayerFactory().getSystemConfigurationsManager());
constellioUrl = eimConfigs.getConstellioUrl();
rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory());
initTasks();
}
private void initTasks()
throws RecordServicesException {
decommissioningList = rm.newDecommissioningListWithId("decommissioningListTest").setTitle("decommissioningListTest").setDecommissioningListType(DecommissioningListType.FOLDERS_TO_TRANSFER);
documentDecommissioningList = rm.newDecommissioningListWithId("documentDecommissioningListTest").setTitle("documentDecommissioningListTest").setDecommissioningListType(DecommissioningListType.DOCUMENTS_TO_TRANSFER);
}
@Test
public void givenFolderDecommissioningListThenEmailToSendParametersAreOk()
throws RecordServicesException {
recordServices.add(decommissioningList);
recordServices.flush();
EmailToSend emailToSend = getEmailToSendForFolderDecommissioningList();
assertThat(getEmailToSendForDocumentDecommissioningList()).isNull();
assertThat(emailToSend).isNotNull();
assertThat(emailToSend.getTemplate()).isEqualTo(RMEmailTemplateConstants.DECOMMISSIONING_LIST_CREATION_TEMPLATE_ID);
assertThat(emailToSend.getFrom()).isNull();
assertThat(emailToSend.getSendOn()).isEqualTo(now);
assertThat(emailToSend.getTo().size()).isEqualTo(2);
final Set<String> expectedRecipients = new HashSet<>();
for (EmailAddress emailAddress : emailToSend.getTo()) {
expectedRecipients.add(emailAddress.getEmail());
}
}
@Test
public void givenDocumentDecommissioningListThenEmailToSendParametersAreOk()
throws RecordServicesException {
recordServices.add(documentDecommissioningList);
recordServices.flush();
EmailToSend emailToSend = getEmailToSendForDocumentDecommissioningList();
assertThat(getEmailToSendForFolderDecommissioningList()).isNull();
assertThat(emailToSend).isNotNull();
assertThat(emailToSend.getTemplate()).isEqualTo(RMEmailTemplateConstants.DECOMMISSIONING_LIST_CREATION_TEMPLATE_ID);
assertThat(emailToSend.getFrom()).isNull();
assertThat(emailToSend.getSendOn()).isEqualTo(now);
assertThat(emailToSend.getTo().size()).isEqualTo(2);
final Set<String> expectedRecipients = new HashSet<>();
for (EmailAddress emailAddress : emailToSend.getTo()) {
expectedRecipients.add(emailAddress.getEmail());
}
}
private EmailToSend getEmailToSendForFolderDecommissioningList() {
LogicalSearchCondition condition = from(rm.emailToSend())
.whereAllConditions(
where(rm.emailToSend().getMetadata(EmailToSend.TEMPLATE)).isEqualTo(RMEmailTemplateConstants.DECOMMISSIONING_LIST_CREATION_TEMPLATE_ID),
where(rm.emailToSend().getMetadata(EmailToSend.PARAMETERS)).isContaining(asList("title" + EmailToSend.PARAMETER_SEPARATOR + "decommissioningListTest"))
);
Record emailRecord = searchServices.searchSingleResult(condition);
if (emailRecord != null) {
return rm.wrapEmailToSend(emailRecord);
} else {
return null;
}
}
private EmailToSend getEmailToSendForDocumentDecommissioningList() {
LogicalSearchCondition condition = from(rm.emailToSend())
.whereAllConditions(
where(rm.emailToSend().getMetadata(EmailToSend.TEMPLATE)).isEqualTo(RMEmailTemplateConstants.DECOMMISSIONING_LIST_CREATION_TEMPLATE_ID),
where(rm.emailToSend().getMetadata(EmailToSend.PARAMETERS)).isContaining(asList("title" + EmailToSend.PARAMETER_SEPARATOR + "documentDecommissioningListTest"))
);
Record emailRecord = searchServices.searchSingleResult(condition);
if (emailRecord != null) {
return rm.wrapEmailToSend(emailRecord);
} else {
return null;
}
}
}