package com.constellio.app.modules.es.sdk;
import static java.util.Arrays.asList;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import org.assertj.core.api.ListAssert;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.schemas.Metadata;
public class ESTestUtils {
public static ObservedEventsAssert assertThatEventsObservedBy(TestConnectorEventObserver observer) {
return new ObservedEventsAssert(observer.getEvents());
}
public static class ObservedEventsAssert extends ListAssert<TestConnectorEvent> {
List<Metadata> toStringMetadatas = new ArrayList<>();
List<TestConnectorEvent> events;
public ObservedEventsAssert(List<TestConnectorEvent> events) {
super(events);
this.events = events;
}
public ObservedEventsAssert comparingRecordsUsing(List<Metadata> metadatas) {
super.usingElementComparator(new ObservedEventsComparator(metadatas));
return this;
}
public ObservedEventsAssert comparingRecordsUsing(Metadata... metadatas) {
this.toStringMetadatas = asList(metadatas);
for (TestConnectorEvent event : events) {
event.setToStringMetadatas(toStringMetadatas);
}
super.usingElementComparator(new ObservedEventsComparator(asList(metadatas)));
return this;
}
private void applyTOStringMetadatasToArray(TestConnectorEvent... values) {
for (TestConnectorEvent value : values) {
value.setToStringMetadatas(toStringMetadatas);
}
}
private void applyTOStringMetadatasToIterable(Iterable<? extends TestConnectorEvent> values) {
for (TestConnectorEvent value : values) {
value.setToStringMetadatas(toStringMetadatas);
}
}
@Override
public ListAssert<TestConnectorEvent> contains(TestConnectorEvent... values) {
applyTOStringMetadatasToArray(values);
return super.contains(values);
}
@Override
public ListAssert<TestConnectorEvent> containsOnly(TestConnectorEvent... values) {
applyTOStringMetadatasToArray(values);
return super.containsOnly(values);
}
@Override
public ListAssert<TestConnectorEvent> containsOnlyOnce(TestConnectorEvent... values) {
applyTOStringMetadatasToArray(values);
return super.containsOnlyOnce(values);
}
@Override
public ListAssert<TestConnectorEvent> containsExactly(TestConnectorEvent... values) {
applyTOStringMetadatasToArray(values);
return super.containsExactly(values);
}
@Override
public ListAssert<TestConnectorEvent> containsSequence(TestConnectorEvent... sequence) {
applyTOStringMetadatasToArray(sequence);
return super.containsSequence(sequence);
}
@Override
public ListAssert<TestConnectorEvent> containsSubsequence(TestConnectorEvent... sequence) {
applyTOStringMetadatasToArray(sequence);
return super.containsSubsequence(sequence);
}
@Override
public ListAssert<TestConnectorEvent> doesNotContain(TestConnectorEvent... values) {
applyTOStringMetadatasToArray(values);
return super.doesNotContain(values);
}
@Override
public ListAssert<TestConnectorEvent> startsWith(TestConnectorEvent... sequence) {
applyTOStringMetadatasToArray(sequence);
return super.startsWith(sequence);
}
@Override
public ListAssert<TestConnectorEvent> endsWith(TestConnectorEvent... sequence) {
applyTOStringMetadatasToArray(sequence);
return super.endsWith(sequence);
}
}
private static class ObservedEventsComparator implements Comparator<TestConnectorEvent> {
List<Metadata> metadatas;
private ObservedEventsComparator(List<Metadata> metadatas) {
this.metadatas = metadatas;
}
@Override
public int compare(TestConnectorEvent event1, TestConnectorEvent event2) {
if (!event1.eventType.equals(event2.eventType)) {
return 1;
}
List<Object> event1Values = getMetadatasValues(event1.record);
List<Object> event2Values = getMetadatasValues(event2.record);
return event1Values.equals(event2Values) ? 0 : 1;
}
private List<Object> getMetadatasValues(Record record) {
List<Object> values = new ArrayList<>();
for (Metadata metadata : metadatas) {
if (metadata.isMultivalue()) {
values.add(record.getList(metadata));
} else {
values.add(record.get(metadata));
}
}
return values;
}
}
}