package com.constellio.app.modules.rm.services.borrowingServices;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.List;
import org.joda.time.LocalDate;
import org.junit.Before;
import org.junit.Test;
import com.constellio.app.modules.rm.RMTestRecords;
import com.constellio.app.modules.rm.model.enums.FolderStatus;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
import com.constellio.app.modules.rm.services.borrowingServices.BorrowingServicesRunTimeException.BorrowingServicesRunTimeException_FolderIsAlreadyBorrowed;
import com.constellio.app.modules.rm.services.borrowingServices.BorrowingServicesRunTimeException.BorrowingServicesRunTimeException_FolderIsInDecommissioningList;
import com.constellio.app.modules.rm.services.borrowingServices.BorrowingServicesRunTimeException.BorrowingServicesRunTimeException_FolderIsNotBorrowed;
import com.constellio.app.modules.rm.services.borrowingServices.BorrowingServicesRunTimeException.BorrowingServicesRunTimeException_InvalidBorrowingDate;
import com.constellio.app.modules.rm.services.borrowingServices.BorrowingServicesRunTimeException.BorrowingServicesRunTimeException_UserNotAllowedToReturnFolder;
import com.constellio.app.modules.rm.services.events.RMEventsSearchServices;
import com.constellio.app.modules.rm.wrappers.Folder;
import com.constellio.app.modules.tasks.model.wrappers.Task;
import com.constellio.app.modules.tasks.services.TasksSchemasRecordsServices;
import com.constellio.data.utils.TimeProvider;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.Event;
import com.constellio.model.entities.records.wrappers.EventType;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.services.records.RecordPhysicalDeleteOptions;
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 com.constellio.sdk.tests.setups.Users;
public class BorrowingServicesAcceptTest extends ConstellioTest {
RMSchemasRecordsServices rm;
RMTestRecords records = new RMTestRecords(zeCollection);
BorrowingServices borrowingServices;
LocalDate nowDate = TimeProvider.getLocalDate();
RMEventsSearchServices rmEventsSearchServices;
SearchServices searchServices;
RecordServices recordServices;
Users users = new Users();
private Task zeTask;
private TasksSchemasRecordsServices tasksSchemas;
private MetadataSchema emailToSendSchema;
@Before
public void setUp()
throws Exception {
prepareSystem(
withZeCollection().withConstellioRMModule().withAllTestUsers().withRMTest(records)
.withFoldersAndContainersOfEveryStatus().withAllTest(users)
);
rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory());
borrowingServices = new BorrowingServices(zeCollection, getModelLayerFactory());
rmEventsSearchServices = new RMEventsSearchServices(getModelLayerFactory(), zeCollection);
searchServices = getModelLayerFactory().newSearchServices();
recordServices = getModelLayerFactory().newRecordServices();
tasksSchemas = new TasksSchemasRecordsServices(zeCollection, getAppLayerFactory());
emailToSendSchema = tasksSchemas.emailToSend();
givenTimeIs(nowDate);
}
@Test
public void givenSemiActiveFolderWhenBorrowItThenOk()
throws Exception {
givenBorrowedFolderC30ByAdmin();
Folder folderC30 = records.getFolder_C30();
assertThat(folderC30.getArchivisticStatus()).isEqualTo(FolderStatus.SEMI_ACTIVE);
assertThat(folderC30.getBorrowed()).isTrue();
assertThat(folderC30.getBorrowDate().toLocalDate()).isEqualTo(nowDate);
assertThat(folderC30.getBorrowReturnDate()).isNull();
assertThat(folderC30.getBorrowUser()).isEqualTo(records.getAdmin().getId());
assertThat(folderC30.getBorrowUserEntered()).isEqualTo(records.getAdmin().getId());
assertThat(folderC30.getBorrowType()).isEqualTo(BorrowingType.BORROW);
assertThat(
searchServices.getResultsCount(rmEventsSearchServices.newFindCurrentlyBorrowedFoldersQuery(records.getAdmin())))
.isEqualTo(1);
}
@Test(expected = BorrowingServicesRunTimeException_InvalidBorrowingDate.class)
public void givenSemiActiveFolderWithAFutureBorrowingDateWhenBorrowItThenCannotBorrow()
throws Exception {
LocalDate previewReturnDate = nowDate.plusDays(15);
Folder folderC30 = records.getFolder_C30();
try {
borrowingServices
.borrowFolder(folderC30.getId(), nowDate.plusDays(1), previewReturnDate,
records.getAdmin(),
records.getAdmin(),
BorrowingType.BORROW, true);
} finally {
folderC30 = records.getFolder_C30();
assertThat(folderC30.getArchivisticStatus()).isEqualTo(FolderStatus.SEMI_ACTIVE);
assertThat(folderC30.getBorrowed()).isNull();
assertThat(folderC30.getBorrowDate()).isNull();
assertThat(folderC30.getBorrowReturnDate()).isNull();
assertThat(folderC30.getBorrowUser()).isNull();
assertThat(folderC30.getBorrowUserEntered()).isNull();
assertThat(folderC30.getBorrowType()).isNull();
assertThat(searchServices
.getResultsCount(rmEventsSearchServices.newFindCurrentlyBorrowedFoldersQuery(records.getAdmin())))
.isEqualTo(0);
}
}
@Test
public void givenInactiveFolderWhenBorrowItThenOk()
throws Exception {
LocalDate previewReturnDate = nowDate.plusDays(15);
Folder folderA94 = records.getFolder_A94();
borrowingServices
.borrowFolder(folderA94.getId(), nowDate, previewReturnDate, records.getAdmin(),
records.getAlice(),
BorrowingType.CONSULTATION, true);
folderA94 = records.getFolder_A94();
assertThat(folderA94.getArchivisticStatus()).isEqualTo(FolderStatus.INACTIVE_DEPOSITED);
assertThat(folderA94.getBorrowed()).isTrue();
assertThat(folderA94.getBorrowDate().toLocalDate()).isEqualTo(nowDate);
assertThat(folderA94.getBorrowReturnDate()).isNull();
assertThat(folderA94.getBorrowUser()).isEqualTo(records.getAdmin().getId());
assertThat(folderA94.getBorrowUserEntered()).isEqualTo(records.getAlice().getId());
assertThat(folderA94.getBorrowType()).isEqualTo(BorrowingType.CONSULTATION);
assertThat(
searchServices.getResultsCount(rmEventsSearchServices.newFindCurrentlyBorrowedFoldersQuery(records.getAdmin())))
.isEqualTo(0);
}
@Test
public void givenActiveFolderWhenBorrowItThenCannotBorrow()
throws Exception {
LocalDate previewReturnDate = nowDate.plusDays(15);
Folder folderA16 = records.getFolder_A16();
borrowingServices.borrowFolder(folderA16.getId(), nowDate, previewReturnDate, records.getAdmin(),
records.getAdmin(),
BorrowingType.BORROW, true);
folderA16 = records.getFolder_A16();
assertThat(folderA16.getArchivisticStatus()).isEqualTo(FolderStatus.ACTIVE);
assertThat(folderA16.getBorrowed()).isTrue();
assertThat(folderA16.getBorrowDate().toLocalDate()).isEqualTo(nowDate);
assertThat(folderA16.getBorrowReturnDate()).isNull();
assertThat(folderA16.getBorrowUser()).isEqualTo(records.getAdmin().getId());
assertThat(folderA16.getBorrowUserEntered()).isEqualTo(records.getAdmin().getId());
assertThat(folderA16.getBorrowType()).isEqualTo(BorrowingType.BORROW);
assertThat(searchServices
.getResultsCount(rmEventsSearchServices.newFindCurrentlyBorrowedFoldersQuery(records.getAdmin())))
.isEqualTo(1);
}
@Test(expected = BorrowingServicesRunTimeException_FolderIsAlreadyBorrowed.class)
public void givenBorrowedFolderWhenBorrowItThenCannotBorrow()
throws Exception {
LocalDate previewReturnDate = nowDate.plusDays(15);
Folder folderC30 = records.getFolder_C30();
borrowingServices
.borrowFolder(folderC30.getId(), nowDate, previewReturnDate, records.getAdmin(),
records.getAdmin(),
BorrowingType.BORROW, true);
try {
borrowingServices.borrowFolder(folderC30.getId(), nowDate, previewReturnDate, records.getAdmin(),
records.getAdmin(),
BorrowingType.BORROW, true);
} finally {
folderC30 = records.getFolder_C30();
assertThat(folderC30.getArchivisticStatus()).isEqualTo(FolderStatus.SEMI_ACTIVE);
assertThat(folderC30.getBorrowed()).isTrue();
assertThat(folderC30.getBorrowDate().toLocalDate()).isEqualTo(nowDate);
assertThat(folderC30.getBorrowReturnDate()).isNull();
assertThat(folderC30.getBorrowUser()).isEqualTo(records.getAdmin().getId());
assertThat(folderC30.getBorrowUserEntered()).isEqualTo(records.getAdmin().getId());
assertThat(folderC30.getBorrowType()).isEqualTo(BorrowingType.BORROW);
assertThat(searchServices
.getResultsCount(rmEventsSearchServices.newFindCurrentlyBorrowedFoldersQuery(records.getAdmin())))
.isEqualTo(1);
}
}
//
@Test
public void givenSemiActiveFolderWhenBorrowItWithAPastDateThenOk()
throws Exception {
LocalDate previewReturnDate = nowDate.plusDays(15);
LocalDate borrowDate = nowDate.minusDays(5);
borrowingServices
.borrowFolder(records.getFolder_C30().getId(), borrowDate, previewReturnDate, records.getAdmin(),
records.getAdmin(),
BorrowingType.BORROW, true);
Folder folderC30 = records.getFolder_C30();
assertThat(folderC30.getArchivisticStatus()).isEqualTo(FolderStatus.SEMI_ACTIVE);
assertThat(folderC30.getBorrowed()).isTrue();
assertThat(folderC30.getBorrowDate().toLocalDate()).isEqualTo(borrowDate);
assertThat(folderC30.getBorrowReturnDate()).isNull();
assertThat(folderC30.getBorrowUser()).isEqualTo(records.getAdmin().getId());
assertThat(folderC30.getBorrowUserEntered()).isEqualTo(records.getAdmin().getId());
assertThat(folderC30.getBorrowType()).isEqualTo(BorrowingType.BORROW);
assertThat(
searchServices.getResultsCount(rmEventsSearchServices.newFindCurrentlyBorrowedFoldersQuery(records.getAdmin())))
.isEqualTo(1);
}
//Return folder
@Test
public void whenReturnFolderThenOk()
throws Exception {
givenBorrowedFolderC30ByAdmin();
Folder folderC30 = records.getFolder_C30();
nowDate = nowDate.plusDays(1);
givenTimeIs(nowDate);
borrowingServices.returnFolder(folderC30.getId(), records.getAdmin(), nowDate, true);
folderC30 = records.getFolder_C30();
assertThat(folderC30.getArchivisticStatus()).isEqualTo(FolderStatus.SEMI_ACTIVE);
assertThat(folderC30.getBorrowed()).isNull();
assertThat(folderC30.getBorrowDate()).isNull();
assertThat(folderC30.getBorrowReturnDate()).isNull();
assertThat(folderC30.getBorrowUser()).isNull();
assertThat(folderC30.getBorrowUserEntered()).isNull();
assertThat(folderC30.getBorrowType()).isNull();
assertThat(
searchServices.getResultsCount(rmEventsSearchServices.newFindCurrentlyBorrowedFoldersQuery(records.getAdmin())))
.isEqualTo(0);
recordServices.flush();
List<Record> records = searchServices.search(rmEventsSearchServices.newFindReturnedFoldersByDateRangeQuery(
this.records.getAdmin(),
TimeProvider.getLocalDateTime().minusDays(1), TimeProvider.getLocalDateTime().plusDays(1)));
assertThat(records).hasSize(1);
Event event = new Event(records.get(0), getSchemaTypes());
assertThat(event.getUsername()).isEqualTo(this.records.getAdmin().getUsername());
assertThat(event.getType()).isEqualTo(EventType.RETURN_FOLDER);
assertThat(event.getCreatedOn().toLocalDate()).isEqualTo(nowDate);
}
@Test
public void givenAdminUserBorrowFolderToUserWhenHeReturnsFolderThenOk()
throws Exception {
LocalDate previewReturnDate = nowDate.plusDays(15);
borrowingServices
.borrowFolder(records.getFolder_C30().getId(), nowDate, previewReturnDate, records.getAdmin(),
records.getBob_userInAC(),
BorrowingType.BORROW, true);
Folder folderC30 = records.getFolder_C30();
nowDate = nowDate.plusDays(1);
givenTimeIs(nowDate);
borrowingServices.returnFolder(folderC30.getId(), records.getBob_userInAC(), nowDate, true);
folderC30 = records.getFolder_C30();
assertThat(folderC30.getArchivisticStatus()).isEqualTo(FolderStatus.SEMI_ACTIVE);
assertThat(folderC30.getBorrowed()).isNull();
assertThat(folderC30.getBorrowDate()).isNull();
assertThat(folderC30.getBorrowReturnDate()).isNull();
assertThat(folderC30.getBorrowUser()).isNull();
assertThat(folderC30.getBorrowUserEntered()).isNull();
assertThat(folderC30.getBorrowType()).isNull();
assertThat(
searchServices.getResultsCount(rmEventsSearchServices.newFindCurrentlyBorrowedFoldersQuery(records.getAdmin())))
.isEqualTo(0);
recordServices.flush();
List<Record> records = searchServices.search(rmEventsSearchServices.newFindReturnedFoldersByDateRangeQuery(
this.records.getAdmin(),
TimeProvider.getLocalDateTime().minusDays(1), TimeProvider.getLocalDateTime().plusDays(1)));
assertThat(records).hasSize(1);
Event event = new Event(records.get(0), getSchemaTypes());
assertThat(event.getUsername()).isEqualTo(this.records.getBob_userInAC().getUsername());
assertThat(event.getType()).isEqualTo(EventType.RETURN_FOLDER);
assertThat(event.getCreatedOn().toLocalDate()).isEqualTo(nowDate);
}
@Test
public void givenAdminUserBorrowFolderToBobWhenAdminReturnsFolderThenOk()
throws Exception {
LocalDate previewReturnDate = nowDate.plusDays(15);
borrowingServices
.borrowFolder(records.getFolder_C30().getId(), nowDate, previewReturnDate, records.getAdmin(),
records.getBob_userInAC(),
BorrowingType.BORROW, true);
Folder folderC30 = records.getFolder_C30();
nowDate = nowDate.plusDays(1);
givenTimeIs(nowDate);
borrowingServices.returnFolder(folderC30.getId(), records.getAdmin(), nowDate, true);
folderC30 = records.getFolder_C30();
assertThat(folderC30.getArchivisticStatus()).isEqualTo(FolderStatus.SEMI_ACTIVE);
assertThat(folderC30.getBorrowed()).isNull();
assertThat(folderC30.getBorrowDate()).isNull();
assertThat(folderC30.getBorrowReturnDate()).isNull();
assertThat(folderC30.getBorrowUser()).isNull();
assertThat(folderC30.getBorrowUserEntered()).isNull();
assertThat(
searchServices.getResultsCount(rmEventsSearchServices.newFindCurrentlyBorrowedFoldersQuery(records.getAdmin())))
.isEqualTo(0);
recordServices.flush();
List<Record> records = searchServices.search(rmEventsSearchServices.newFindReturnedFoldersByDateRangeQuery(
this.records.getAdmin(),
TimeProvider.getLocalDateTime().minusDays(1), TimeProvider.getLocalDateTime().plusDays(1)));
assertThat(records).hasSize(1);
Event event = new Event(records.get(0), getSchemaTypes());
assertThat(event.getUsername()).isEqualTo(this.records.getAdmin().getUsername());
assertThat(event.getType()).isEqualTo(EventType.RETURN_FOLDER);
assertThat(event.getCreatedOn().toLocalDate()).isEqualTo(nowDate);
}
@Test(expected = BorrowingServicesRunTimeException_FolderIsInDecommissioningList.class)
public void givenFolderInNonProcessedDecommissioningListThenExceptionIsThrown()
throws Exception {
nowDate = nowDate.plusDays(1);
givenTimeIs(nowDate);
borrowingServices.validateCanBorrow(records.getAdmin(), records.getFolder_A48(), nowDate);
}
@Test
public void givenFolderOnlyInProcessedDecommissioningListThenNoExceptionThrown()
throws Exception {
RecordServices recordServices = getModelLayerFactory().newRecordServices();
recordServices.physicallyDeleteNoMatterTheStatus(records.getList10().getWrappedRecord(), User.GOD,
new RecordPhysicalDeleteOptions());
recordServices.physicallyDeleteNoMatterTheStatus(records.getList17().getWrappedRecord(), User.GOD,
new RecordPhysicalDeleteOptions());
nowDate = nowDate.plusDays(1);
givenTimeIs(nowDate);
borrowingServices.validateCanBorrow(records.getAdmin(), records.getFolder_A48(), nowDate);
}
@Test(expected = BorrowingServicesRunTimeException_UserNotAllowedToReturnFolder.class)
public void whenReturnFolderWithDifferentUserWithoutRGDRoleThenException()
throws Exception {
givenBorrowedFolderC30ByAdmin();
Folder folderC30 = records.getFolder_C30();
nowDate = nowDate.plusDays(1);
givenTimeIs(nowDate);
borrowingServices.returnFolder(folderC30.getId(), records.getBob_userInAC(), nowDate, true);
assertThat(
searchServices.getResultsCount(rmEventsSearchServices.newFindCurrentlyBorrowedFoldersQuery(records.getAdmin())))
.isEqualTo(0);
recordServices.flush();
List<Record> records = searchServices.search(rmEventsSearchServices.newFindReturnedFoldersByDateRangeQuery(
this.records.getAdmin(),
TimeProvider.getLocalDateTime().minusDays(1), TimeProvider.getLocalDateTime().plusDays(1)));
assertThat(records).isEmpty();
}
@Test(expected = BorrowingServicesRunTimeException_FolderIsNotBorrowed.class)
public void givenNotBorrowedFolderWhenReturnItThenException()
throws Exception {
Folder folderC30 = records.getFolder_C30();
borrowingServices.returnFolder(folderC30.getId(), records.getAdmin(), nowDate, true);
assertThat(
searchServices.getResultsCount(rmEventsSearchServices.newFindCurrentlyBorrowedFoldersQuery(records.getAdmin())))
.isEqualTo(0);
recordServices.flush();
List<Record> records = searchServices.search(rmEventsSearchServices.newFindReturnedFoldersByDateRangeQuery(
this.records.getAdmin(),
TimeProvider.getLocalDateTime().minusDays(1), TimeProvider.getLocalDateTime().plusDays(1)));
assertThat(records).isEmpty();
}
@Test(expected = BorrowingServicesRunTimeException_FolderIsNotBorrowed.class)
public void givenFalseInBorrowedStatusFolderWhenReturnItThenException()
throws Exception {
Folder folderC30 = records.getFolder_C30();
recordServices.update(folderC30.setBorrowed(false));
borrowingServices.returnFolder(folderC30.getId(), records.getAdmin(), nowDate, true);
assertThat(
searchServices.getResultsCount(rmEventsSearchServices.newFindCurrentlyBorrowedFoldersQuery(records.getAdmin())))
.isEqualTo(0);
recordServices.flush();
List<Record> records = searchServices.search(rmEventsSearchServices.newFindReturnedFoldersByDateRangeQuery(
this.records.getAdmin(),
TimeProvider.getLocalDateTime().minusDays(1), TimeProvider.getLocalDateTime().plusDays(1)));
assertThat(records).isEmpty();
}
private void givenBorrowedFolderC30ByAdmin()
throws RecordServicesException {
LocalDate previewReturnDate = nowDate.plusDays(15);
borrowingServices
.borrowFolder(records.getFolder_C30().getId(), nowDate, previewReturnDate, records.getAdmin(),
records.getAdmin(),
BorrowingType.BORROW, true);
}
private MetadataSchemaTypes getSchemaTypes() {
return getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(zeCollection);
}
}