package io.katharsis.repository; import io.katharsis.queryParams.QueryParams; import io.katharsis.repository.annotated.AnnotatedRepositoryAdapter; import io.katharsis.repository.annotated.AnnotatedResourceRepositoryAdapter; import io.katharsis.repository.annotations.JsonApiLinks; import io.katharsis.repository.annotations.JsonApiMeta; import io.katharsis.repository.annotations.JsonApiResourceRepository; import io.katharsis.repository.exception.RepositoryAnnotationNotFoundException; import io.katharsis.repository.exception.RepositoryMethodException; import io.katharsis.repository.mock.NewInstanceRepositoryMethodParameterProvider; import io.katharsis.resource.mock.models.Project; import io.katharsis.response.LinksInformation; import io.katharsis.response.MetaInformation; import org.junit.Before; import org.junit.Test; import java.util.Collections; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; public class RepositoryAdapterTest { private QueryParams queryParams; private ParametersFactory parameterFactory; @Before public void setUp() throws Exception { queryParams = new QueryParams(); parameterFactory = new ParametersFactory(new NewInstanceRepositoryMethodParameterProvider()); } @Test public void onClassWithNoGetLinksInformationShouldReturnFalse() throws Exception { // GIVEN ResourceRepositoryWithoutAnyMethods repository = new ResourceRepositoryWithoutAnyMethods(); SimpleRepositoryAdapter sut = new SimpleRepositoryAdapter(repository, parameterFactory); // WHEN boolean result = sut.linksRepositoryAvailable(); // THEN assertThat(result).isFalse(); } @Test(expected = RepositoryAnnotationNotFoundException.class) public void onClassWithNoGetLinksInformationShouldThrowException() throws Exception { // GIVEN ResourceRepositoryWithoutAnyMethods repository = new ResourceRepositoryWithoutAnyMethods(); SimpleRepositoryAdapter sut = new SimpleRepositoryAdapter(repository, parameterFactory); // WHEN sut.getLinksInformation(Collections.singletonList(new Project()), queryParams); } @Test(expected = RepositoryMethodException.class) public void onClassWithInvalidGetLinksInformationShouldThrowException() throws Exception { // GIVEN ResourceRepositoryWithEmptyGetLinksInformation repo = new ResourceRepositoryWithEmptyGetLinksInformation(); AnnotatedResourceRepositoryAdapter<Project, Long> sut = new AnnotatedResourceRepositoryAdapter<>(repo, parameterFactory); // WHEN sut.getLinksInformation(Collections.singletonList(new Project()), queryParams); } @Test public void onClassWithGetLinksInformationShouldReturnTrue() throws Exception { // GIVEN ResourceRepositoryWithGetLinksInformation repo = spy(ResourceRepositoryWithGetLinksInformation.class); AnnotatedResourceRepositoryAdapter<Project, Long> sut = new AnnotatedResourceRepositoryAdapter<>(repo, parameterFactory); // WHEN boolean result = sut.linksRepositoryAvailable(); // THEN assertThat(result).isTrue(); } @Test public void onClassWithGetLinksInformationShouldInvokeMethod() throws Exception { // GIVEN ResourceRepositoryWithGetLinksInformation repo = spy(ResourceRepositoryWithGetLinksInformation.class); AnnotatedResourceRepositoryAdapter<Project, Long> sut = new AnnotatedResourceRepositoryAdapter<>(repo, parameterFactory); List<Project> resources = Collections.singletonList(new Project()); // WHEN sut.getLinksInformation(resources, queryParams); // THEN verify(repo).getLinksInformation(resources, queryParams, ""); } @Test public void onClassWithNoGetMetaInformationShouldReturnFalse() throws Exception { // GIVEN ResourceRepositoryWithoutAnyMethods repository = new ResourceRepositoryWithoutAnyMethods(); SimpleRepositoryAdapter sut = new SimpleRepositoryAdapter(repository, parameterFactory); // WHEN boolean result = sut.metaRepositoryAvailable(); // THEN assertThat(result).isFalse(); } @Test(expected = RepositoryAnnotationNotFoundException.class) public void onClassWithNoGetMetaInformationShouldThrowException() throws Exception { // GIVEN ResourceRepositoryWithoutAnyMethods repository = new ResourceRepositoryWithoutAnyMethods(); SimpleRepositoryAdapter sut = new SimpleRepositoryAdapter(repository, parameterFactory); // WHEN sut.getMetaInformation(Collections.singletonList(new Project()), queryParams); } @Test(expected = RepositoryMethodException.class) public void onClassWithInvalidGetMetaInformationShouldThrowException() throws Exception { // GIVEN ResourceRepositoryWithEmptyGetMetaInformation repo = new ResourceRepositoryWithEmptyGetMetaInformation(); AnnotatedResourceRepositoryAdapter<Project, Long> sut = new AnnotatedResourceRepositoryAdapter<>(repo, parameterFactory); // WHEN sut.getMetaInformation(Collections.singletonList(new Project()), queryParams); } @Test public void onClassWithGetMetaInformationShouldReturnTrue() throws Exception { // GIVEN ResourceRepositoryWithGetMetaInformation repo = spy(ResourceRepositoryWithGetMetaInformation.class); AnnotatedResourceRepositoryAdapter<Project, Long> sut = new AnnotatedResourceRepositoryAdapter<>(repo, parameterFactory); // WHEN boolean result = sut.metaRepositoryAvailable(); // THEN assertThat(result).isTrue(); } @Test public void onClassWithGetMetaInformationShouldInvokeMethod() throws Exception { // GIVEN ResourceRepositoryWithGetMetaInformation repo = spy(ResourceRepositoryWithGetMetaInformation.class); AnnotatedResourceRepositoryAdapter<Project, Long> sut = new AnnotatedResourceRepositoryAdapter<>(repo, parameterFactory); List<Project> resources = Collections.singletonList(new Project()); // WHEN sut.getMetaInformation(resources, queryParams); // THEN verify(repo).getMetaInformation(resources, queryParams, ""); } @JsonApiResourceRepository(Project.class) public static class ResourceRepositoryWithoutAnyMethods { } @JsonApiResourceRepository(Project.class) public static class ResourceRepositoryWithEmptyGetLinksInformation { @JsonApiLinks public LinksData getLinksInformation() { return new LinksData(); } } @JsonApiResourceRepository(Project.class) public static class ResourceRepositoryWithGetLinksInformation { @JsonApiLinks public LinksData getLinksInformation(Iterable<Project> entities, QueryParams queryParams, String someString) { return new LinksData(); } } @JsonApiResourceRepository(Project.class) public static class ResourceRepositoryWithEmptyGetMetaInformation { @JsonApiMeta public MetaData getMetaInformation() { return new MetaData(); } } @JsonApiResourceRepository(Project.class) public static class ResourceRepositoryWithGetMetaInformation { @JsonApiMeta public MetaData getMetaInformation(Iterable<Project> entities, QueryParams queryParams, String someString) { return new MetaData(); } } public static class SimpleRepositoryAdapter extends AnnotatedRepositoryAdapter { public SimpleRepositoryAdapter(Object implementationObject, ParametersFactory parametersFactory) { super(implementationObject, parametersFactory); } } public static class LinksData implements LinksInformation { } public static class MetaData implements MetaInformation { } }