package io.katharsis.repository; import io.katharsis.queryParams.QueryParams; import io.katharsis.repository.annotated.AnnotatedResourceRepositoryAdapter; import io.katharsis.repository.annotations.JsonApiDelete; import io.katharsis.repository.annotations.JsonApiFindAll; import io.katharsis.repository.annotations.JsonApiFindAllWithIds; import io.katharsis.repository.annotations.JsonApiFindOne; import io.katharsis.repository.annotations.JsonApiResourceRepository; import io.katharsis.repository.annotations.JsonApiSave; 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 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.Matchers.eq; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; public class AnnotatedResourceRepositoryAdapterTest { private QueryParams queryParams; private ParametersFactory parameterProvider; @Before public void setUp() throws Exception { queryParams = new QueryParams(); parameterProvider = new ParametersFactory(new NewInstanceRepositoryMethodParameterProvider()); } @Test(expected = RepositoryAnnotationNotFoundException.class) public void onClassWithoutFindOneShouldThrowException() throws Exception { // GIVEN ResourceRepositoryWithoutAnyMethods repo = new ResourceRepositoryWithoutAnyMethods(); AnnotatedResourceRepositoryAdapter<Project, Long> sut = new AnnotatedResourceRepositoryAdapter<>(repo, parameterProvider); // WHEN sut.findOne(1L, queryParams); } @Test(expected = RepositoryMethodException.class) public void onClassWithInvalidFindOneShouldThrowException() throws Exception { // GIVEN ResourceRepositoryWithEmptyFindOne repo = new ResourceRepositoryWithEmptyFindOne(); AnnotatedResourceRepositoryAdapter<Project, Long> sut = new AnnotatedResourceRepositoryAdapter<>(repo, parameterProvider); // WHEN sut.findOne(1L, queryParams); } @Test public void onClassWithFindOneShouldReturnValue() throws Exception { // GIVEN ResourceRepositoryWithFindOne repo = spy(ResourceRepositoryWithFindOne.class); AnnotatedResourceRepositoryAdapter<Project, Long> sut = new AnnotatedResourceRepositoryAdapter<>(repo, parameterProvider); // WHEN Object result = sut.findOne(1L, queryParams); // THEN verify(repo).findOne(eq(1L), eq(queryParams), eq("")); assertThat(result).isNotNull(); assertThat(((Project)result).getId()).isEqualTo(1L); } @Test(expected = RepositoryAnnotationNotFoundException.class) public void onClassWithoutFindAllShouldThrowException() throws Exception { // GIVEN ResourceRepositoryWithoutAnyMethods repo = new ResourceRepositoryWithoutAnyMethods(); AnnotatedResourceRepositoryAdapter<Project, Long> sut = new AnnotatedResourceRepositoryAdapter<>(repo, parameterProvider); // WHEN sut.findAll(queryParams); } @Test public void onClassWithFindAllShouldReturnValue() throws Exception { // GIVEN ResourceRepositoryWithFindAll repo = spy(ResourceRepositoryWithFindAll.class); AnnotatedResourceRepositoryAdapter<Project, Long> sut = new AnnotatedResourceRepositoryAdapter<>(repo, parameterProvider); // WHEN Object result = sut.findAll(queryParams); // THEN verify(repo).findAll(eq(queryParams), eq("")); assertThat(((Iterable<Project>)result)).hasSize(1); assertThat(((Iterable<Project>)result).iterator().next()).isNotNull(); assertThat(((Iterable<Project>)result).iterator().next().getId()).isEqualTo(1L); } @Test(expected = RepositoryAnnotationNotFoundException.class) public void onClassWithoutFindAllWithIdsShouldThrowException() throws Exception { // GIVEN ResourceRepositoryWithoutAnyMethods repo = new ResourceRepositoryWithoutAnyMethods(); AnnotatedResourceRepositoryAdapter<Project, Long> sut = new AnnotatedResourceRepositoryAdapter<>(repo, parameterProvider); // WHEN sut.findAll(Collections.singletonList(1L), queryParams); } @Test(expected = RepositoryMethodException.class) public void onClassWithInvalidFindAllWithIdsShouldThrowException() throws Exception { // GIVEN ResourceRepositoryWithEmptyFindAllWithIds repo = new ResourceRepositoryWithEmptyFindAllWithIds(); AnnotatedResourceRepositoryAdapter<Project, Long> sut = new AnnotatedResourceRepositoryAdapter<>(repo, parameterProvider); // WHEN sut.findAll(Collections.singletonList(1L), queryParams); } @Test public void onClassWithFindAllWithIdsShouldReturnValue() throws Exception { // GIVEN ResourceRepositoryWithFindAllWithIds repo = spy(ResourceRepositoryWithFindAllWithIds.class); AnnotatedResourceRepositoryAdapter<Project, Long> sut = new AnnotatedResourceRepositoryAdapter<>(repo, parameterProvider); List<Long> ids = Collections.singletonList(1L); // WHEN Object result = sut.findAll(ids, queryParams); // THEN verify(repo).findAll(eq(ids), eq(queryParams), eq("")); assertThat(((Iterable<Project>)result)).hasSize(1); assertThat(((Iterable<Project>)result).iterator().next().getId()).isEqualTo(1L); } @Test(expected = RepositoryAnnotationNotFoundException.class) public void onClassWithoutSaveShouldThrowException() throws Exception { // GIVEN ResourceRepositoryWithoutAnyMethods repo = new ResourceRepositoryWithoutAnyMethods(); AnnotatedResourceRepositoryAdapter<Project, Long> sut = new AnnotatedResourceRepositoryAdapter<>(repo, parameterProvider); // WHEN sut.save(new Project()); } @Test(expected = RepositoryMethodException.class) public void onClassWithInvalidSaveShouldThrowException() throws Exception { // GIVEN ResourceRepositoryWithEmptySave repo = new ResourceRepositoryWithEmptySave(); AnnotatedResourceRepositoryAdapter<Project, Long> sut = new AnnotatedResourceRepositoryAdapter<>(repo, parameterProvider); // WHEN sut.save(new Project()); } @Test public void onClassWithSaveShouldReturnValue() throws Exception { // GIVEN ResourceRepositoryWithSave repo = spy(ResourceRepositoryWithSave.class); AnnotatedResourceRepositoryAdapter<Project, Long> sut = new AnnotatedResourceRepositoryAdapter<>(repo, parameterProvider); // WHEN Project entity = new Project(); Object result = sut.save(entity); // THEN verify(repo).save(eq(entity), eq("")); assertThat(result).isNotNull(); assertThat(((Project)(result)).getId()).isEqualTo(1L); } @Test(expected = RepositoryAnnotationNotFoundException.class) public void onClassWithoutDeleteShouldThrowException() throws Exception { // GIVEN ResourceRepositoryWithoutAnyMethods repo = new ResourceRepositoryWithoutAnyMethods(); AnnotatedResourceRepositoryAdapter<Project, Long> sut = new AnnotatedResourceRepositoryAdapter<>(repo, parameterProvider); // WHEN sut.delete(1L, queryParams); } @Test(expected = RepositoryMethodException.class) public void onClassWithInvalidDeleteShouldThrowException() throws Exception { // GIVEN ResourceRepositoryWithEmptyDelete repo = new ResourceRepositoryWithEmptyDelete(); AnnotatedResourceRepositoryAdapter<Project, Long> sut = new AnnotatedResourceRepositoryAdapter<>(repo, parameterProvider); // WHEN sut.delete(1L, queryParams); } @Test public void onClassWithDeleteShouldInvokeMethod() throws Exception { // GIVEN ResourceRepositoryWithDelete repo = spy(ResourceRepositoryWithDelete.class); AnnotatedResourceRepositoryAdapter<Project, Long> sut = new AnnotatedResourceRepositoryAdapter<>(repo, parameterProvider); // WHEN sut.delete(1L, queryParams); // THEN verify(repo).delete(eq(1L), eq("")); } @JsonApiResourceRepository(Project.class) public static class ResourceRepositoryWithoutAnyMethods { } @JsonApiResourceRepository(Project.class) public static class ResourceRepositoryWithEmptyFindOne { @JsonApiFindOne public Project findOne() { return new Project(); } } @JsonApiResourceRepository(Project.class) public static class ResourceRepositoryWithFindOne { @JsonApiFindOne public Project findOne(Long id, QueryParams queryParams, String someString) { return new Project() .setId(id); } } @JsonApiResourceRepository(Project.class) public static class ResourceRepositoryWithFindAll { @JsonApiFindAll public Iterable<Project> findAll(QueryParams queryParams, String s) { return Collections.singletonList(new Project().setId(1L)); } } @JsonApiResourceRepository(Project.class) public static class ResourceRepositoryWithEmptyFindAllWithIds { @JsonApiFindAllWithIds public Iterable<Project> findAll() { return Collections.singletonList(new Project().setId(1L)); } } @JsonApiResourceRepository(Project.class) public static class ResourceRepositoryWithFindAllWithIds { @JsonApiFindAllWithIds public Iterable<Project> findAll(Iterable<Long> id, QueryParams queryParams, String someString) { return Collections.singletonList(new Project().setId(1L)); } } @JsonApiResourceRepository(Project.class) public static class ResourceRepositoryWithEmptySave { @JsonApiSave public Project save() { return new Project(); } } @JsonApiResourceRepository(Project.class) public static class ResourceRepositoryWithSave { @JsonApiSave public Project save(Project project, String s) { return project .setId(1L); } } @JsonApiResourceRepository(Project.class) public static class ResourceRepositoryWithEmptyDelete { @JsonApiDelete public void delete() { } } @JsonApiResourceRepository(Project.class) public static class ResourceRepositoryWithDelete { @JsonApiDelete public void delete(Long id, String s) { } } }