From eebe2022d96fca4a1feaf91baeac6446588541c5 Mon Sep 17 00:00:00 2001 From: Otavio Santana Date: Sun, 31 Mar 2024 18:15:14 +0100 Subject: [PATCH] test: create scenarios at Repository proxy Signed-off-by: Otavio Santana --- ...AbstractSemistructuredRepositoryProxy.java | 14 +++++++ .../query/BaseSemistructuredRepository.java | 10 ++--- .../query/SemistructuredRepositoryProxy.java | 2 +- .../query/RepositoryProxyPageRequestTest.java | 42 ++++++++++++++++--- .../query/RepositoryProxyTest.java | 2 + 5 files changed, 57 insertions(+), 13 deletions(-) diff --git a/jnosql-mapping/jnosql-mapping-semistructured/src/main/java/org/eclipse/jnosql/mapping/semistructured/query/AbstractSemistructuredRepositoryProxy.java b/jnosql-mapping/jnosql-mapping-semistructured/src/main/java/org/eclipse/jnosql/mapping/semistructured/query/AbstractSemistructuredRepositoryProxy.java index ecc32480e..48f9f5c07 100644 --- a/jnosql-mapping/jnosql-mapping-semistructured/src/main/java/org/eclipse/jnosql/mapping/semistructured/query/AbstractSemistructuredRepositoryProxy.java +++ b/jnosql-mapping/jnosql-mapping-semistructured/src/main/java/org/eclipse/jnosql/mapping/semistructured/query/AbstractSemistructuredRepositoryProxy.java @@ -14,9 +14,13 @@ */ package org.eclipse.jnosql.mapping.semistructured.query; +import jakarta.data.page.PageRequest; import org.eclipse.jnosql.communication.semistructured.DeleteQuery; +import org.eclipse.jnosql.communication.semistructured.SelectQuery; import org.eclipse.jnosql.mapping.core.repository.DynamicQueryMethodReturn; +import org.eclipse.jnosql.mapping.core.repository.DynamicReturn; import org.eclipse.jnosql.mapping.core.repository.RepositoryReflectionUtils; +import org.eclipse.jnosql.mapping.core.repository.SpecialParameters; import java.lang.reflect.Method; import java.util.Map; @@ -41,6 +45,16 @@ protected Object executeQuery(Object instance, Method method, Object[] params) { return methodReturn.execute(); } + @Override + protected Object executeCursorPagination(Object instance, Method method, Object[] params) { + SelectQuery query = query(method, params); + SpecialParameters special = DynamicReturn.findSpecialParameters(params); + PageRequest pageRequest = special.pageRequest() + .orElseThrow(() -> new IllegalArgumentException("Pageable is required in the method signature as parameter at " + method)); + return this.template().selectCursor(query, pageRequest); + } + + @Override protected Object executeDeleteByAll(Object instance, Method method, Object[] params) { DeleteQuery deleteQuery = deleteQuery(method, params); diff --git a/jnosql-mapping/jnosql-mapping-semistructured/src/main/java/org/eclipse/jnosql/mapping/semistructured/query/BaseSemistructuredRepository.java b/jnosql-mapping/jnosql-mapping-semistructured/src/main/java/org/eclipse/jnosql/mapping/semistructured/query/BaseSemistructuredRepository.java index 0068a8c76..87a34070d 100644 --- a/jnosql-mapping/jnosql-mapping-semistructured/src/main/java/org/eclipse/jnosql/mapping/semistructured/query/BaseSemistructuredRepository.java +++ b/jnosql-mapping/jnosql-mapping-semistructured/src/main/java/org/eclipse/jnosql/mapping/semistructured/query/BaseSemistructuredRepository.java @@ -20,27 +20,25 @@ import jakarta.data.page.Page; import jakarta.data.page.PageRequest; import org.eclipse.jnosql.communication.Params; -import org.eclipse.jnosql.communication.query.DeleteQuery; import org.eclipse.jnosql.communication.query.SelectQuery; import org.eclipse.jnosql.communication.query.method.DeleteMethodProvider; import org.eclipse.jnosql.communication.query.method.SelectMethodProvider; import org.eclipse.jnosql.communication.semistructured.CommunicationObserverParser; import org.eclipse.jnosql.communication.semistructured.CriteriaCondition; -import org.eclipse.jnosql.communication.semistructured.DeleteQueryParams; import org.eclipse.jnosql.communication.semistructured.DeleteQueryParser; import org.eclipse.jnosql.communication.semistructured.Element; import org.eclipse.jnosql.communication.semistructured.QueryParams; import org.eclipse.jnosql.communication.semistructured.SelectQueryParser; -import org.eclipse.jnosql.mapping.semistructured.MappingQuery; import org.eclipse.jnosql.mapping.core.Converters; import org.eclipse.jnosql.mapping.core.NoSQLPage; -import org.eclipse.jnosql.mapping.semistructured.SemistructuredTemplate; import org.eclipse.jnosql.mapping.core.query.AbstractRepositoryProxy; -import org.eclipse.jnosql.mapping.core.repository.SpecialParameters; -import org.eclipse.jnosql.mapping.metadata.EntityMetadata; import org.eclipse.jnosql.mapping.core.repository.DynamicReturn; +import org.eclipse.jnosql.mapping.core.repository.SpecialParameters; import org.eclipse.jnosql.mapping.core.util.ParamsBinder; +import org.eclipse.jnosql.mapping.metadata.EntityMetadata; import org.eclipse.jnosql.mapping.metadata.InheritanceMetadata; +import org.eclipse.jnosql.mapping.semistructured.MappingQuery; +import org.eclipse.jnosql.mapping.semistructured.SemistructuredTemplate; import java.lang.reflect.Method; import java.util.ArrayList; diff --git a/jnosql-mapping/jnosql-mapping-semistructured/src/main/java/org/eclipse/jnosql/mapping/semistructured/query/SemistructuredRepositoryProxy.java b/jnosql-mapping/jnosql-mapping-semistructured/src/main/java/org/eclipse/jnosql/mapping/semistructured/query/SemistructuredRepositoryProxy.java index f056b73ec..fa09ac0ce 100644 --- a/jnosql-mapping/jnosql-mapping-semistructured/src/main/java/org/eclipse/jnosql/mapping/semistructured/query/SemistructuredRepositoryProxy.java +++ b/jnosql-mapping/jnosql-mapping-semistructured/src/main/java/org/eclipse/jnosql/mapping/semistructured/query/SemistructuredRepositoryProxy.java @@ -26,7 +26,7 @@ /** - * Proxy handler to generate {@link org.eclipse.jnosql.mapping.NoSQLRepository} for column-based repositories. + * Proxy handler to generate {@link org.eclipse.jnosql.mapping.NoSQLRepository} for Semistructure database repositories. * * @param The entity type managed by the repository. * @param The key type used for column-based operations. diff --git a/jnosql-mapping/jnosql-mapping-semistructured/src/test/java/org/eclipse/jnosql/mapping/semistructured/query/RepositoryProxyPageRequestTest.java b/jnosql-mapping/jnosql-mapping-semistructured/src/test/java/org/eclipse/jnosql/mapping/semistructured/query/RepositoryProxyPageRequestTest.java index 998b318e8..cab0da068 100644 --- a/jnosql-mapping/jnosql-mapping-semistructured/src/test/java/org/eclipse/jnosql/mapping/semistructured/query/RepositoryProxyPageRequestTest.java +++ b/jnosql-mapping/jnosql-mapping-semistructured/src/test/java/org/eclipse/jnosql/mapping/semistructured/query/RepositoryProxyPageRequestTest.java @@ -20,7 +20,11 @@ import jakarta.data.page.PageRequest; import jakarta.data.repository.BasicRepository; import jakarta.data.Sort; +import jakarta.data.repository.By; +import jakarta.data.repository.Find; +import jakarta.data.repository.Param; import jakarta.inject.Inject; +import org.assertj.core.api.SoftAssertions; import org.eclipse.jnosql.communication.Condition; import org.eclipse.jnosql.communication.TypeReference; import org.eclipse.jnosql.communication.Value; @@ -615,18 +619,41 @@ public void shouldFindByNameOrderByName() { CursoredPage page = personRepository.findByNameOrderByName("name", PageRequest.ofSize(10).afterKey("Ada")); + SoftAssertions.assertSoftly(s -> { + s.assertThat(page).isEqualTo(mock); + }); + + } + + @Test + public void shouldMachParameter() { + when(template.singleResult(any(SelectQuery.class))).thenReturn(Optional + .of(Person.builder().build())); + + personRepository.parameter("name", 10); ArgumentCaptor captor = ArgumentCaptor.forClass(SelectQuery.class); verify(template).select(captor.capture()); SelectQuery query = captor.getValue(); - CriteriaCondition condition = query.condition().get(); - assertEquals("Person", query.name()); - assertEquals(EQUALS, condition.condition()); - assertThat(query.sorts()).hasSize(1) - .containsExactly(Sort.asc("name")); - assertEquals(Element.of("name", "name"), condition.element()); + + SoftAssertions.assertSoftly(soft ->{ + soft.assertThat(query.name()).isEqualTo("Person"); + soft.assertThat(query.skip()).isEqualTo(0); + soft.assertThat(query.limit()).isEqualTo(0); + soft.assertThat(query.condition().isPresent()).isTrue(); + soft.assertThat(query.sorts()).hasSize(0); + CriteriaCondition condition = query.condition().orElseThrow(); + soft.assertThat(condition.condition()).isEqualTo(AND); + List conditions = condition.element().get(new TypeReference<>() { + }); + soft.assertThat(conditions).hasSize(2); + soft.assertThat(conditions.get(0)).isEqualTo(CriteriaCondition.eq(Element.of("name", "name"))); + soft.assertThat(conditions.get(1)).isEqualTo(CriteriaCondition.eq(Element.of("age", 10))); + + }); } + private PageRequest getPageRequest() { return PageRequest.ofPage(2).size(6); } @@ -635,6 +662,9 @@ interface PersonRepository extends BasicRepository { Person findByName(String name, PageRequest pageRequest); + @Find + List parameter(@By("name") String name, @By("age") Integer age); + CursoredPage findByNameOrderByName(String name, PageRequest pageRequest); List findByName(String name, Sort sort); diff --git a/jnosql-mapping/jnosql-mapping-semistructured/src/test/java/org/eclipse/jnosql/mapping/semistructured/query/RepositoryProxyTest.java b/jnosql-mapping/jnosql-mapping-semistructured/src/test/java/org/eclipse/jnosql/mapping/semistructured/query/RepositoryProxyTest.java index 968493e85..59f10d211 100644 --- a/jnosql-mapping/jnosql-mapping-semistructured/src/test/java/org/eclipse/jnosql/mapping/semistructured/query/RepositoryProxyTest.java +++ b/jnosql-mapping/jnosql-mapping-semistructured/src/test/java/org/eclipse/jnosql/mapping/semistructured/query/RepositoryProxyTest.java @@ -17,6 +17,7 @@ import jakarta.data.exceptions.MappingException; import jakarta.data.repository.By; import jakarta.data.repository.Delete; +import jakarta.data.repository.Find; import jakarta.data.repository.Insert; import jakarta.data.repository.OrderBy; import jakarta.data.repository.BasicRepository; @@ -957,6 +958,7 @@ default Map> partcionate(String name) { @OrderBy("age") List findByException(); + @Find List find(@By("name") String name); }