package com.constellio.model.services.records; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.spy; import org.joda.time.LocalDateTime; import org.junit.Before; import org.junit.Test; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.records.Transaction; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.entities.schemas.Schemas; import com.constellio.model.services.batch.manager.BatchProcessesManager; import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder; import com.constellio.sdk.tests.ConstellioTest; import com.constellio.sdk.tests.TestRecord; import com.constellio.sdk.tests.setups.Users; public class RecordServicesCreatedAndModifiedByAndOnAcceptanceTest extends ConstellioTest { RecordServicesTestSchemaSetup schemas = new RecordServicesTestSchemaSetup(); RecordServicesTestSchemaSetup.ZeSchemaMetadatas zeSchema = schemas.new ZeSchemaMetadatas(); Record record; Users users = new Users(); BatchProcessesManager batchProcessesManager; LocalDateTime now = new LocalDateTime(); LocalDateTime shishOClock = new LocalDateTime(); LocalDateTime tockOClock = new LocalDateTime(); User alice, bob, dakota; private RecordServices recordServices; @Before public void setup() throws Exception { recordServices = spy(getModelLayerFactory().newRecordServices()); batchProcessesManager = getModelLayerFactory().getBatchProcessesManager(); defineSchemasManager().using(schemas.withADateTimeMetadata()); givenTimeIs(now); record = new TestRecord(zeSchema); users.setUp(getModelLayerFactory().newUserServices()); getModelLayerFactory().newUserServices().addUserToCollection(users.alice(), zeCollection); getModelLayerFactory().newUserServices().addUserToCollection(users.bob(), zeCollection); getModelLayerFactory().newUserServices().addUserToCollection(users.dakotaLIndien(), zeCollection); alice = users.aliceIn(zeCollection); bob = users.bobIn(zeCollection); dakota = users.dakotaLIndienIn(zeCollection); recordServices.update(alice.setCollectionWriteAccess(true)); recordServices.update(bob.setCollectionWriteAccess(true)); recordServices.update(dakota.setCollectionWriteAccess(true)); } @Test public void whenCreateRecordThenCreatedOnIsNowAndModifiedOnIsNow() throws Exception { Record record = recordServices.newRecordWithSchema(schemas.zeDefaultSchema()); recordServices.execute(new Transaction(record).setUser(alice)); assertThat(record.get(Schemas.CREATED_BY)).isEqualTo(alice.getId()); assertThat(record.get(Schemas.CREATED_ON)).isEqualTo(now); assertThat(record.get(Schemas.MODIFIED_BY)).isEqualTo(alice.getId()); assertThat(record.get(Schemas.MODIFIED_ON)).isEqualTo(now); } @Test public void whenCreateRecordWithCustomCreationDatesAndUsersThenCorrectValuesAreSet() throws Exception { User alice = users.aliceIn(zeCollection); record = recordServices.newRecordWithSchema(schemas.zeDefaultSchema()); record.set(Schemas.CREATED_BY, bob.getId()); record.set(Schemas.CREATED_ON, shishOClock); record.set(Schemas.TITLE, "firstTitle"); recordServices.execute(new Transaction(record).setUser(alice)); assertThat(record.get(Schemas.CREATED_BY)).isEqualTo(bob.getId()); assertThat(record.get(Schemas.CREATED_ON)).isEqualTo(shishOClock); assertThat(record.get(Schemas.MODIFIED_BY)).isEqualTo(bob.getId()); assertThat(record.get(Schemas.MODIFIED_ON)).isEqualTo(shishOClock); assertThat(record.get(Schemas.TITLE)).isEqualTo("firstTitle"); } @Test public void whenCreateRecordWithCustomCreationAndModificationDatesAndUsersThenCorrectValuesAreSet() throws Exception { User alice = users.aliceIn(zeCollection); record = recordServices.newRecordWithSchema(schemas.zeDefaultSchema()); record.set(Schemas.CREATED_BY, bob.getId()); record.set(Schemas.CREATED_ON, shishOClock); record.set(Schemas.MODIFIED_BY, dakota.getId()); record.set(Schemas.MODIFIED_ON, tockOClock); recordServices.execute(new Transaction(record).setUser(alice)); assertThat(record.get(Schemas.CREATED_BY)).isEqualTo(bob.getId()); assertThat(record.get(Schemas.CREATED_ON)).isEqualTo(shishOClock); assertThat(record.get(Schemas.MODIFIED_BY)).isEqualTo(dakota.getId()); assertThat(record.get(Schemas.MODIFIED_ON)).isEqualTo(tockOClock); } @Test public void whenUpdateRecordWithCustomCreationDatesAndUsersThenCorrectValuesAreSet() throws Exception { User alice = users.aliceIn(zeCollection); record = recordServices.newRecordWithSchema(schemas.zeDefaultSchema()); record.set(Schemas.TITLE, "firstTitle"); recordServices.execute(new Transaction(record).setUser(alice)); givenTimeIs(shishOClock); record.set(Schemas.TITLE, "newTitle"); recordServices.execute(new Transaction(record).setUser(bob)); assertThat(record.get(Schemas.CREATED_BY)).isEqualTo(alice.getId()); assertThat(record.get(Schemas.CREATED_ON)).isEqualTo(now); assertThat(record.get(Schemas.MODIFIED_BY)).isEqualTo(bob.getId()); assertThat(record.get(Schemas.MODIFIED_ON)).isEqualTo(shishOClock); assertThat(record.get(Schemas.TITLE)).isEqualTo("newTitle"); } @Test public void whenUpdateRecordWithCustomCreationAndModificationDatesAndUsersThenCorrectValuesAreSet() throws Exception { User alice = users.aliceIn(zeCollection); record = recordServices.newRecordWithSchema(schemas.zeDefaultSchema()); recordServices.execute(new Transaction(record).setUser(alice)); record.set(Schemas.CREATED_BY, bob.getId()); record.set(Schemas.CREATED_ON, shishOClock); record.set(Schemas.MODIFIED_BY, dakota.getId()); record.set(Schemas.MODIFIED_ON, tockOClock); recordServices.execute(new Transaction(record).setUser(alice)); assertThat(record.get(Schemas.CREATED_BY)).isEqualTo(bob.getId()); assertThat(record.get(Schemas.CREATED_ON)).isEqualTo(shishOClock); assertThat(record.get(Schemas.MODIFIED_BY)).isEqualTo(dakota.getId()); assertThat(record.get(Schemas.MODIFIED_ON)).isEqualTo(tockOClock); } @Test public void whenUpdateAsyncRecordWithCustomCreationAndModificationDatesAndUsersThenCorrectValuesAreSet() throws Exception { User alice = users.aliceIn(zeCollection); record = recordServices.newRecordWithSchema(schemas.zeDefaultSchema()); recordServices.executeHandlingImpactsAsync(new Transaction(record).setUser(alice)); record.set(Schemas.CREATED_BY, bob.getId()); record.set(Schemas.CREATED_ON, shishOClock); record.set(Schemas.MODIFIED_BY, dakota.getId()); record.set(Schemas.MODIFIED_ON, tockOClock); recordServices.executeHandlingImpactsAsync(new Transaction(record).setUser(alice)); assertThat(record.get(Schemas.CREATED_BY)).isEqualTo(bob.getId()); assertThat(record.get(Schemas.CREATED_ON)).isEqualTo(shishOClock); assertThat(record.get(Schemas.MODIFIED_BY)).isEqualTo(dakota.getId()); assertThat(record.get(Schemas.MODIFIED_ON)).isEqualTo(tockOClock); } @Test public void whenCreateWithoutUserThenLastModificationUserIsNull() throws Exception { User alice = users.aliceIn(zeCollection); record = recordServices.newRecordWithSchema(schemas.zeDefaultSchema()); record.set(Schemas.TITLE, "firstTitle"); recordServices.execute(new Transaction(record)); assertThat(record.get(Schemas.MODIFIED_BY)).isNull(); assertThat(record.get(Schemas.CREATED_ON)).isEqualTo(now); assertThat(record.get(Schemas.MODIFIED_BY)).isNull(); assertThat(record.get(Schemas.MODIFIED_ON)).isEqualTo(now); } @Test public void whenAddWithoutUserThenLastModificationUserIsNull() throws Exception { User alice = users.aliceIn(zeCollection); record = recordServices.newRecordWithSchema(schemas.zeDefaultSchema()); record.set(Schemas.TITLE, "firstTitle"); recordServices.add(record); givenTimeIs(shishOClock); record.set(Schemas.TITLE, "newTitle"); recordServices.update(record); assertThat(record.get(Schemas.MODIFIED_BY)).isNull(); assertThat(record.get(Schemas.CREATED_ON)).isEqualTo(now); assertThat(record.get(Schemas.MODIFIED_BY)).isNull(); assertThat(record.get(Schemas.MODIFIED_ON)).isEqualTo(shishOClock); } @Test public void whenUpdateWithoutUserThenLastModificationUserIsNull() throws Exception { User alice = users.aliceIn(zeCollection); record = recordServices.newRecordWithSchema(schemas.zeDefaultSchema()); record.set(Schemas.TITLE, "firstTitle"); recordServices.execute(new Transaction(record).setUser(alice)); givenTimeIs(shishOClock); record.set(Schemas.TITLE, "newTitle"); recordServices.execute(new Transaction(record)); assertThat(record.get(Schemas.CREATED_BY)).isEqualTo(alice.getId()); assertThat(record.get(Schemas.CREATED_ON)).isEqualTo(now); assertThat(record.get(Schemas.MODIFIED_BY)).isNull(); assertThat(record.get(Schemas.MODIFIED_ON)).isEqualTo(shishOClock); } @Test public void whenMergingRecordThenMergeAndKeepLatestModificationInfos() throws Exception { User alice = users.aliceIn(zeCollection); record = recordServices.newRecordWithSchema(schemas.zeDefaultSchema()); record.set(Schemas.TITLE, "firstTitle"); recordServices.execute(new Transaction(record).setUser(alice)); givenTimeIs(shishOClock); Record anotherRecord = recordServices.getDocumentById(record.getId()); anotherRecord.set(Schemas.TITLE, "newTitle"); recordServices.execute(new Transaction(anotherRecord).setUser(bob)); givenTimeIs(tockOClock); record.set(zeSchema.dateTimeMetadata(), now); recordServices.execute(new Transaction(record).setUser(dakota)); assertThat(record.get(zeSchema.dateTimeMetadata())).isEqualTo(now); assertThat(record.get(Schemas.TITLE)).isEqualTo("newTitle"); assertThat(record.get(Schemas.CREATED_BY)).isEqualTo(alice.getId()); assertThat(record.get(Schemas.CREATED_ON)).isEqualTo(now); assertThat(record.get(Schemas.MODIFIED_BY)).isEqualTo(dakota.getId()); assertThat(record.get(Schemas.MODIFIED_ON)).isEqualTo(tockOClock); } @Test public void whenRecordIsNotModifiedThenKeepModificationInfos() throws Exception { User alice = users.aliceIn(zeCollection); record = recordServices.newRecordWithSchema(schemas.zeDefaultSchema()); record.set(Schemas.TITLE, "firstTitle"); recordServices.execute(new Transaction(record).setUser(alice)); givenTimeIs(shishOClock); recordServices.execute(new Transaction(record).setUser(bob)); recordServices.refresh(record); assertThat(record.get(Schemas.TITLE)).isEqualTo("firstTitle"); assertThat(record.get(Schemas.CREATED_BY)).isEqualTo(alice.getId()); assertThat(record.get(Schemas.CREATED_ON)).isEqualTo(now); assertThat(record.get(Schemas.MODIFIED_BY)).isEqualTo(alice.getId()); assertThat(record.get(Schemas.MODIFIED_ON)).isEqualTo(now); } @Test public void givenCreatedByIsRequiredWhenCreatingRecordWithCreatorThenOk() throws Exception { MetadataSchemaTypesBuilder typesBuilder = getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection); typesBuilder.getSchema(zeSchema.code()).getMetadata(Schemas.CREATED_BY.getLocalCode()).setDefaultRequirement(true); getModelLayerFactory().getMetadataSchemasManager().saveUpdateSchemaTypes(typesBuilder); User alice = users.aliceIn(zeCollection); record = recordServices.newRecordWithSchema(schemas.zeDefaultSchema()); record.set(Schemas.TITLE, "firstTitle"); recordServices.execute(new Transaction(record).setUser(alice)); } @Test public void givenModifiedByIsRequiredWhenUpdatingRecordWithModifierThenOk() throws Exception { MetadataSchemaTypesBuilder typesBuilder = getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection); typesBuilder.getSchema(zeSchema.code()).getMetadata(Schemas.MODIFIED_BY.getLocalCode()).setDefaultRequirement(true); getModelLayerFactory().getMetadataSchemasManager().saveUpdateSchemaTypes(typesBuilder); User alice = users.aliceIn(zeCollection); record = recordServices.newRecordWithSchema(schemas.zeDefaultSchema()); record.set(Schemas.TITLE, "firstTitle"); recordServices.execute(new Transaction(record).setUser(alice)); recordServices.execute(new Transaction(record).setUser(alice)); } }