package com.constellio.model.entities.records.wrappers; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import org.apache.commons.lang3.SerializationUtils; import org.joda.time.LocalDateTime; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.records.wrappers.RecordWrapperRuntimeException.RecordWrapperRuntimeException_CannotUseDisconnectedRecordWrapper; 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.entities.schemas.Schemas; import com.constellio.model.entities.schemas.entries.ManualDataEntry; import com.constellio.model.services.records.RecordImpl; import com.constellio.sdk.tests.ConstellioTest; import com.constellio.sdk.tests.TestRecord; public class RecordWrapperTest extends ConstellioTest { String zeMetadataLocalCode = "zeMetadata"; String zeMetadataCode = "folder_default_zeMetadata"; LocalDateTime shishOClock = new LocalDateTime(); @Mock MetadataSchemaTypes metadataSchemaTypes; @Mock Record wrappedRecord; @Mock Metadata zeMetadata; @Mock MetadataSchema folderSchema; String type = "type"; String schema = "type_custom"; RecordWrapper wrapper; @Before public void setUp() throws Exception { when(metadataSchemaTypes.getMetadata("folder_default_zeMetadata")).thenReturn(zeMetadata); when(metadataSchemaTypes.getSchema("folder_default")).thenReturn(folderSchema); when(metadataSchemaTypes.getSchema(schema)).thenReturn(folderSchema); when(folderSchema.get("zeMetadata")).thenReturn(zeMetadata); when(folderSchema.getMetadata("zeMetadata")).thenReturn(zeMetadata); when(wrappedRecord.getSchemaCode()).thenReturn(schema); when(zeMetadata.getCode()).thenReturn(zeMetadataCode); when(zeMetadata.getLocalCode()).thenReturn(zeMetadataLocalCode); when(zeMetadata.getDataEntry()).thenReturn(new ManualDataEntry()); wrapper = new RecordWrapper(wrappedRecord, metadataSchemaTypes, type); } @Test(expected = RecordWrapperRuntimeException.WrappedRecordMustBeNotNull.class) public void givenRecordWrapperWithNullWrappedRecordThenException() throws Exception { new RecordWrapper(null, metadataSchemaTypes, type); } @Test(expected = RecordWrapperRuntimeException.MetadataSchemaTypesMustBeNotNull.class) public void givenRecordWrapperWithNullMetadataSchemaTypesThenException() throws Exception { new RecordWrapper(wrappedRecord, null, type); } @Test(expected = RecordWrapperRuntimeException.WrappedRecordMustMeetRequirements.class) public void givenRecordWrapperWithRecordOfInvalidTypeThenException() throws Exception { new RecordWrapper(wrappedRecord, metadataSchemaTypes, "othertype"); } @Test(expected = RecordWrapperRuntimeException.WrappedRecordMustMeetRequirements.class) public void givenRecordWrapperWithRecordOfInvalidSchemaThenException() throws Exception { new RecordWrapper(wrappedRecord, metadataSchemaTypes, "type_default"); } @Test public void whenSetPropertyThenGetMetadataAndCallRecordWithIt() throws Exception { when(metadataSchemaTypes.getMetadata("type_custom_zeMeta")).thenReturn(zeMetadata); wrapper.set("zeMeta", "42"); verify(wrappedRecord).set(zeMetadata, "42"); } @Test public void whenSerializingThenCorrectlySerialized() { RecordImpl wrappedRecord = new TestRecord("folder_default", "zeUltimateCollection", "42"); wrappedRecord.set(Schemas.TITLE, "zeTitle"); wrappedRecord.set(Schemas.MODIFIED_BY, shishOClock); wrapper = new RecordWrapper(wrappedRecord, metadataSchemaTypes, "folder"); byte[] bytes = SerializationUtils.serialize(wrapper); RecordWrapper unserializedRecordWrapper = (RecordWrapper) SerializationUtils.deserialize(bytes); assertThat(unserializedRecordWrapper.getWrappedRecord()).isEqualTo(wrappedRecord); assertThat(unserializedRecordWrapper.getMetadataSchemaTypes()).isNull(); } @Test(expected = RecordWrapperRuntimeException_CannotUseDisconnectedRecordWrapper.class) public void givenDisconnectedUnserializedRecordWrapperWhenSetMetadataThenException() { RecordImpl wrappedRecord = new TestRecord("folder_default", "zeUltimateCollection", "42"); wrappedRecord.set(Schemas.TITLE, "zeTitle"); wrappedRecord.set(Schemas.MODIFIED_BY, shishOClock); wrapper = new RecordWrapper(wrappedRecord, metadataSchemaTypes, "folder"); byte[] bytes = SerializationUtils.serialize(wrapper); RecordWrapper unserializedRecordWrapper = (RecordWrapper) SerializationUtils.deserialize(bytes); unserializedRecordWrapper.set(zeMetadataLocalCode, "aTitle"); } @Test(expected = RecordWrapperRuntimeException_CannotUseDisconnectedRecordWrapper.class) public void givenDisconnectedUnserializedRecordWrapperWhenGetMetadataThenException() { RecordImpl wrappedRecord = new TestRecord("folder_default", "zeUltimateCollection", "42"); wrappedRecord.set(Schemas.TITLE, "zeTitle"); wrappedRecord.set(Schemas.MODIFIED_BY, shishOClock); wrapper = new RecordWrapper(wrappedRecord, metadataSchemaTypes, "folder"); byte[] bytes = SerializationUtils.serialize(wrapper); RecordWrapper unserializedRecordWrapper = (RecordWrapper) SerializationUtils.deserialize(bytes); unserializedRecordWrapper.get(zeMetadataLocalCode); } @Test(expected = RecordWrapperRuntimeException_CannotUseDisconnectedRecordWrapper.class) public void givenDisconnectedUnserializedRecordWrapperWhenGetListMetadataThenException() { RecordImpl wrappedRecord = new TestRecord("folder_default", "zeUltimateCollection", "42"); wrappedRecord.set(Schemas.TITLE, "zeTitle"); wrappedRecord.set(Schemas.MODIFIED_BY, shishOClock); wrapper = new RecordWrapper(wrappedRecord, metadataSchemaTypes, "folder"); byte[] bytes = SerializationUtils.serialize(wrapper); RecordWrapper unserializedRecordWrapper = (RecordWrapper) SerializationUtils.deserialize(bytes); unserializedRecordWrapper.getList(zeMetadataLocalCode); } @Test(expected = RecordWrapperRuntimeException_CannotUseDisconnectedRecordWrapper.class) public void givenDisconnectedUnserializedRecordWrapperWhenGetSchemaThenException() { RecordImpl wrappedRecord = new TestRecord("folder_default", "zeUltimateCollection", "42"); wrappedRecord.set(Schemas.TITLE, "zeTitle"); wrappedRecord.set(Schemas.MODIFIED_BY, shishOClock); wrapper = new RecordWrapper(wrappedRecord, metadataSchemaTypes, "folder"); byte[] bytes = SerializationUtils.serialize(wrapper); RecordWrapper unserializedRecordWrapper = (RecordWrapper) SerializationUtils.deserialize(bytes); unserializedRecordWrapper.getSchema(); } @Test public void givenReconnectgivenDisconnectedUnserializedRecordWrapperWhenGetOrSetMetadataThenOK() { RecordImpl wrappedRecord = new TestRecord("folder_default", "zeUltimateCollection", "42"); wrappedRecord.set(Schemas.TITLE, "zeTitle"); wrappedRecord.set(Schemas.MODIFIED_BY, shishOClock); wrapper = new RecordWrapper(wrappedRecord, metadataSchemaTypes, "folder"); byte[] bytes = SerializationUtils.serialize(wrapper); RecordWrapper unserializedRecordWrapper = (RecordWrapper) SerializationUtils.deserialize(bytes); unserializedRecordWrapper.reconnect(metadataSchemaTypes); unserializedRecordWrapper.get(zeMetadataLocalCode); unserializedRecordWrapper.set(zeMetadataLocalCode, "newTitle"); } }