package io.katharsis.resource.registry;
import io.katharsis.locator.SampleJsonServiceLocator;
import io.katharsis.repository.RepositoryInstanceBuilder;
import io.katharsis.repository.exception.RelationshipRepositoryNotFoundException;
import io.katharsis.resource.information.ResourceInformation;
import io.katharsis.resource.mock.models.Document;
import io.katharsis.resource.mock.models.Memorandum;
import io.katharsis.resource.mock.models.Project;
import io.katharsis.resource.mock.models.Task;
import io.katharsis.resource.mock.models.Thing;
import io.katharsis.resource.mock.models.User;
import io.katharsis.resource.mock.repository.TaskRepository;
import io.katharsis.resource.mock.repository.TaskToProjectRepository;
import io.katharsis.resource.registry.repository.AnnotatedResourceEntryBuilder;
import io.katharsis.resource.registry.repository.DirectResponseRelationshipEntry;
import io.katharsis.resource.registry.responseRepository.RelationshipRepositoryAdapter;
import nl.jqno.equalsverifier.EqualsVerifier;
import nl.jqno.equalsverifier.Warning;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import java.lang.reflect.Field;
import java.util.Collections;
import static org.assertj.core.api.Assertions.assertThat;
@SuppressWarnings("unchecked")
public class RegistryEntryTest {
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Test
public void onValidRelationshipClassShouldReturnRelationshipRepository() throws Exception {
// GIVEN
RegistryEntry<Task> sut = new RegistryEntry(null, new AnnotatedResourceEntryBuilder<>(
new RepositoryInstanceBuilder(new SampleJsonServiceLocator(), TaskRepository.class)),
Collections.singletonList(new DirectResponseRelationshipEntry<>(new RepositoryInstanceBuilder(new SampleJsonServiceLocator(), TaskToProjectRepository.class))));
// WHEN
RelationshipRepositoryAdapter<Task, ?, ?, ?> relationshipRepository = sut.getRelationshipRepositoryForClass(Project.class, null);
// THEN
assertThat(relationshipRepository).isExactlyInstanceOf(RelationshipRepositoryAdapter.class);
}
@Test
public void onInvalidRelationshipClassShouldThrowException() throws Exception {
// GIVEN
ResourceInformation resourceInformation = new ResourceInformation(Task.class, null, null, null);
RegistryEntry<Task> sut = new RegistryEntry(resourceInformation, null,
Collections.singletonList(new DirectResponseRelationshipEntry<>(
new RepositoryInstanceBuilder(new SampleJsonServiceLocator(), TaskToProjectRepository.class))));
// THEN
expectedException.expect(RelationshipRepositoryNotFoundException.class);
// WHEN
sut.getRelationshipRepositoryForClass(User.class, null);
}
@Test
public void onValidParentShouldReturnTrue() throws Exception {
// GIVEN
RegistryEntry<Thing> thing = new RegistryEntry<>(new ResourceInformation(Thing.class, null, null, null), null);
RegistryEntry<Document> document = new RegistryEntry<>(new ResourceInformation(Document.class, null, null, null), null);
document.setParentRegistryEntry(thing);
RegistryEntry<Memorandum> memorandum = new RegistryEntry<>(new ResourceInformation(Memorandum.class, null, null, null), null);
memorandum.setParentRegistryEntry(document);
// WHEN
boolean result = memorandum.isParent(thing);
// THEN
assertThat(result).isTrue();
}
@Test
public void onInvalidParentShouldReturnFalse() throws Exception {
// GIVEN
RegistryEntry<Document> document = new RegistryEntry<>(new ResourceInformation(Document.class, null, null, null), null);
RegistryEntry<Task> task = new RegistryEntry<>(new ResourceInformation(Task.class, null, null, null), null);
// WHEN
boolean result = document.isParent(task);
// THEN
assertThat(result).isFalse();
}
@Test
public void equalsContract() throws NoSuchFieldException {
RegistryEntry blue = new RegistryEntry(new ResourceInformation(String.class, null, null, null), null);
RegistryEntry red = new RegistryEntry(new ResourceInformation(Long.class, null, null, null), null);
EqualsVerifier.forClass(RegistryEntry.class)
.withPrefabValues(RegistryEntry.class, blue, red)
.withPrefabValues(ResourceInformation.class, new ResourceInformation(String.class, null, null, null), new ResourceInformation(Long.class, null, null, null))
.withPrefabValues(Field.class, String.class.getDeclaredField("value"), String.class.getDeclaredField("hash"))
.usingGetClass()
.suppress(Warning.NONFINAL_FIELDS)
.verify();
}
}