package com.constellio.model.services.records;
import static java.util.Arrays.asList;
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.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
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.Transaction;
import com.constellio.sdk.tests.ConstellioTest;
public class RecordProviderTest extends ConstellioTest {
@Mock Record firstRecord;
String firstRecordId = aString();
@Mock Record secondRecord;
String secondRecordId = aString();
@Mock RecordServices recordServices;
@Mock Transaction transaction;
@Before
public void setUp()
throws Exception {
when(firstRecord.getId()).thenReturn(firstRecordId);
when(secondRecord.getId()).thenReturn(secondRecordId);
when(recordServices.getDocumentById(firstRecordId)).thenReturn(firstRecord);
when(recordServices.getDocumentById(secondRecordId)).thenReturn(secondRecord);
}
@Test
public void givenRecordProviderWithMetadatasWhenGettingOnOfTheseMetadataThenReturnDoNotCallService()
throws Exception {
RecordProvider recordProvider = new RecordProvider(recordServices, null, asList(firstRecord), null);
assertThat(recordProvider.getRecord(firstRecordId)).isEqualTo(firstRecord);
verifyZeroInteractions(recordServices);
}
@Test
public void givenRecordProviderWithMetadatasWhenGettingAnotherMetadataThenReturnCallService()
throws Exception {
RecordProvider recordProvider = new RecordProvider(recordServices, null, asList(firstRecord), null);
assertThat(recordProvider.getRecord(secondRecordId)).isEqualTo(secondRecord);
verify(recordServices).getDocumentById(secondRecordId);
}
@Test
public void givenRecordProviderCreatedFromAnotherOneWithMetadatasWhenGettingOnOfTheseMetadataThenReturnDoNotCallService()
throws Exception {
RecordProvider nestedRecordProvider = new RecordProvider(recordServices, null, asList(firstRecord), null);
RecordProvider recordProvider = new RecordProvider(recordServices, nestedRecordProvider, asList(secondRecord), null);
assertThat(recordProvider.getRecord(firstRecordId)).isEqualTo(firstRecord);
assertThat(recordProvider.getRecord(secondRecordId)).isEqualTo(secondRecord);
verifyZeroInteractions(recordServices);
}
@Test
public void givenRecordInMemoryListWhenCheckingSingleValueInMemoryListThenTrue() {
RecordProvider recordProvider = new RecordProvider(recordServices, null, asList(firstRecord), null);
assertThat(recordProvider.hasRecordInMemoryList(firstRecordId)).isTrue();
}
@Test
public void givenRecordInMemoryListWhenCheckingMultiValueInMemoryListThenTrue() {
RecordProvider recordProvider = new RecordProvider(recordServices, null, asList(firstRecord), null);
assertThat(recordProvider.hasRecordInMemoryList(asList(firstRecordId))).isTrue();
}
@Test
public void givenRecordNotInMemoryListWhenCheckingSingleValueInMemoryListThenFalse() {
RecordProvider recordProvider = new RecordProvider(recordServices, null, asList(firstRecord), null);
assertThat(recordProvider.hasRecordInMemoryList(secondRecordId)).isFalse();
}
@Test
public void givenRecordNotMemoryListWhenCheckingMultiValueInMemoryListThenFalse() {
RecordProvider recordProvider = new RecordProvider(recordServices, null, asList(firstRecord), null);
assertThat(recordProvider.hasRecordInMemoryList(asList(secondRecordId))).isFalse();
}
@Test
public void givenTransactionWithReferencedRecordThenCopiedInMemoryList() {
Map<String, Record> referencedRecords = new HashMap<>();
referencedRecords.put(firstRecordId, firstRecord);
referencedRecords.put(secondRecordId, secondRecord);
when(transaction.getReferencedRecords()).thenReturn(referencedRecords);
RecordProvider recordProvider = new RecordProvider(recordServices, null, new ArrayList<Record>(), transaction);
assertThat(recordProvider.hasRecordInMemoryList(asList(firstRecordId))).isTrue();
assertThat(recordProvider.hasRecordInMemoryList(asList(secondRecordId))).isTrue();
assertThat(recordProvider.getRecord(firstRecordId)).isEqualTo(firstRecord);
assertThat(recordProvider.getRecord(secondRecordId)).isEqualTo(secondRecord);
}
@Test
public void givenSameRecordReferencedInTransactionAndModifiedThenModifiedInstanceInMemoryList() {
Map<String, Record> referencedRecords = new HashMap<>();
referencedRecords.put(firstRecordId, firstRecord);
referencedRecords.put(secondRecordId, secondRecord);
when(transaction.getReferencedRecords()).thenReturn(referencedRecords);
Record modifiedSecondRecord = mock(Record.class);
when(modifiedSecondRecord.getId()).thenReturn(secondRecordId);
RecordProvider recordProvider = new RecordProvider(recordServices, null, Arrays.asList(modifiedSecondRecord),
transaction);
assertThat(recordProvider.hasRecordInMemoryList(asList(firstRecordId))).isTrue();
assertThat(recordProvider.hasRecordInMemoryList(asList(secondRecordId))).isTrue();
assertThat(recordProvider.getRecord(firstRecordId)).isEqualTo(firstRecord);
assertThat(recordProvider.getRecord(secondRecordId)).isEqualTo(modifiedSecondRecord);
}
}