diff --git a/api-lib-core/pom.xml b/api-lib-core/pom.xml index 09c99aa535fd39e164adf5ab46765c903426964d..fbc5a67d512c6027728cb680388cf6ad8cbee3c1 100644 --- a/api-lib-core/pom.xml +++ b/api-lib-core/pom.xml @@ -11,11 +11,9 @@ <artifactId>api-lib-core</artifactId> <properties> - <lombok.version>1.18.30</lombok.version> - <mapstruct.version>1.5.5.Final</mapstruct.version> + <lombok.version>1.18.34</lombok.version> <!-- plugins --> <maven-surefire-plugin.version>3.2.5</maven-surefire-plugin.version> - <maven-failsafe-plugin.version>3.2.5</maven-failsafe-plugin.version> <jacoco.plugin.version>0.8.11</jacoco.plugin.version> </properties> @@ -50,9 +48,11 @@ <!--spring --> <dependency> + <!-- FIXME letzte Version von dieser Dependency ist 2.15.0.RELEASE. --> + <!-- Kann es durch ein adneres Dependency ersetz werden? --> <groupId>net.devh</groupId> <artifactId>grpc-client-spring-boot-autoconfigure</artifactId> - <version>2.14.0.RELEASE</version> + <version>2.15.0.RELEASE</version> </dependency> <dependency> @@ -155,7 +155,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> - <version>${maven-failsafe-plugin.version}</version> + <version>${failsafe-plugin.version}</version> <configuration> <argLine> ${surefire.jacoco.args} diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/GrpcOzgCloudFileService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/GrpcOzgCloudFileService.java index a3a6af6ba7375e0ef74b9e6b208a120f3f160dab..6223653f6f0333fdb86e0374cec8c02ac42e602c 100644 --- a/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/GrpcOzgCloudFileService.java +++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/GrpcOzgCloudFileService.java @@ -9,8 +9,6 @@ import java.util.concurrent.TimeoutException; import java.util.logging.Level; import org.apache.commons.io.IOUtils; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.stereotype.Service; import com.google.protobuf.ByteString; @@ -40,8 +38,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.java.Log; import net.devh.boot.grpc.client.inject.GrpcClient; -@Service -@ConditionalOnProperty("ozgcloud.file-manager.address") @RequiredArgsConstructor @Log public class GrpcOzgCloudFileService implements OzgCloudFileService { diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangQueryMapper.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangQueryMapper.java index 96a696ee9ce7847154863b1c39043a4d5a733440..5a57685451e9e4dba22c7f71370cd9e7370cefa8 100644 --- a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangQueryMapper.java +++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangQueryMapper.java @@ -23,31 +23,31 @@ import de.ozgcloud.vorgang.vorgang.GrpcVorgangQueryExpression.Builder; @Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED, nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, unmappedTargetPolicy = ReportingPolicy.WARN) public interface OzgCloudVorgangQueryMapper { - static final String FORM_ENGINE_NAME_PATH = "eingangs.header.formEngineName"; - static final String STATUS_PATH = "status"; - static final String ORGANISATIONS_EINHEIT_ID_PATH = "eingangs.zustaendigeStelle.organisationseinheitenId"; - static final String AKTENZEICHEN_PATH = "aktenzeichen"; - static final String FORM_ID_PATH = "eingangs.header.formId"; + String FORM_ENGINE_NAME_PATH = "eingangs.header.formEngineName"; + String STATUS_PATH = "status"; + String ORGANISATIONS_EINHEIT_ID_PATH = "eingangs.zustaendigeStelle.organisationseinheitenId"; + String AKTENZEICHEN_PATH = "aktenzeichen"; + String FORM_ID_PATH = "eingangs.header.formId"; default GrpcQuery toGrpc(OzgCloudVorgangQuery ozgCloudVorgangQuery) { - var queryBuilder = mapPropertiesToQuery(ozgCloudVorgangQuery); - - if (queryBuilder.getExpressionsList().isEmpty()) { - return ozgCloudVorgangQuery.getQuery().map(this::toQuery) - .orElseGet(GrpcQuery::getDefaultInstance); - } + return hasPropertyExpressions(ozgCloudVorgangQuery) + ? mapAllToQuery(ozgCloudVorgangQuery) + : ozgCloudVorgangQuery.getQuery().map(this::toQuery).orElseGet(GrpcQuery::getDefaultInstance); + } - ozgCloudVorgangQuery.getQuery().map(this::toQuery).ifPresent(queryBuilder::setNestedQuery); - return queryBuilder.build(); + default boolean hasPropertyExpressions(OzgCloudVorgangQuery query) { + return query.getAktenzeichen().isPresent() || query.getForm().isPresent() || query.getStatus().isPresent() + || query.getOrganisationsEinheitId().isPresent(); } - default GrpcQuery.Builder mapPropertiesToQuery(OzgCloudVorgangQuery query) { + default GrpcQuery mapAllToQuery(OzgCloudVorgangQuery query) { var queryBuilder = GrpcQuery.newBuilder().setLogicalOperator(GrpcLogicalOperator.AND); query.getAktenzeichen().map(this::toAktenzeichenExpression).ifPresent(queryBuilder::addExpressions); query.getForm().map(this::toFormExpressions).ifPresent(queryBuilder::addAllExpressions); query.getStatus().map(this::toStatusExpression).ifPresent(queryBuilder::addExpressions); query.getOrganisationsEinheitId().map(this::toOrganisationsEinheitIdExpression).ifPresent(queryBuilder::addExpressions); - return queryBuilder; + query.getQuery().map(this::toQuery).ifPresent(queryBuilder::setNestedQuery); + return queryBuilder.build(); } default GrpcVorgangQueryExpression toAktenzeichenExpression(String aktenzeichen) { @@ -72,24 +72,20 @@ public interface OzgCloudVorgangQueryMapper { } default Set<GrpcVorgangQueryExpression> toFormExpressions(FormIdentification formIdentification) { - var expressions = new HashSet<GrpcVorgangQueryExpression>(2); - Optional.ofNullable(formIdentification.getFormEngineName()) - .map(this::toFormEngineNameExpression) - .ifPresent(expressions::add); - Optional.ofNullable(formIdentification.getFormId()) - .map(this::toFormIdExpression) - .ifPresent(expressions::add); + var expressions = HashSet.<GrpcVorgangQueryExpression>newHashSet(2); + Optional.ofNullable(formIdentification.getFormEngineName()).map(this::toFormEngineNameExpression).ifPresent(expressions::add); + Optional.ofNullable(formIdentification.getFormId()).map(this::toFormIdExpression).ifPresent(expressions::add); return Collections.unmodifiableSet(expressions); } - private GrpcVorgangQueryExpression toFormEngineNameExpression(String formEngineName) { + default GrpcVorgangQueryExpression toFormEngineNameExpression(String formEngineName) { return getEqualExpressionBuilder() .setPath(FORM_ENGINE_NAME_PATH) .setOperandStringValue(formEngineName) .build(); } - private GrpcVorgangQueryExpression toFormIdExpression(String formId) { + default GrpcVorgangQueryExpression toFormIdExpression(String formId) { return getEqualExpressionBuilder() .setPath(FORM_ID_PATH) .setOperandStringValue(formId) diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangQueryMapperTest.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangQueryMapperTest.java index bcdc22ee4286ea121954f3772080085a2d38279c..ead98a31352e6fffc49162d52da65ccce9a22699 100644 --- a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangQueryMapperTest.java +++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangQueryMapperTest.java @@ -1,10 +1,10 @@ package de.ozgcloud.apilib.vorgang.grpc; import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import java.util.Collections; import java.util.Optional; import java.util.Set; @@ -12,10 +12,12 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mapstruct.factory.Mappers; +import org.mockito.Mock; import org.mockito.Spy; import de.ozgcloud.apilib.vorgang.FormIdentificationTestFactory; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangQuery; +import de.ozgcloud.apilib.vorgang.OzgCloudVorgangQuery.FormIdentification; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangQuery.Query; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangQueryTestFactory; import de.ozgcloud.apilib.vorgang.QueryTestFactory; @@ -31,111 +33,132 @@ class OzgCloudVorgangQueryMapperTest { @Nested class TestToGrpc { + @Mock + private GrpcQuery grpcQuery; + @Test - void shouldCallMapProperetiesToQuery() { - var query = OzgCloudVorgangQueryTestFactory.create(); + void shouldCallHasPropertyExpressions() { + var ozgCloudVorgangQuery = OzgCloudVorgangQueryTestFactory.create(); - mapper.toGrpc(query); + mapper.toGrpc(ozgCloudVorgangQuery); - verify(mapper).mapPropertiesToQuery(query); + verify(mapper).hasPropertyExpressions(ozgCloudVorgangQuery); } @Nested - class OnNoNestedQuery { + class TestHasPropertyExpressions { - private final OzgCloudVorgangQuery query = OzgCloudVorgangQueryTestFactory.createBuilder() - .query(Optional.empty()) - .build(); + @BeforeEach + void init() { + doReturn(true).when(mapper).hasPropertyExpressions(any()); + } + + @Test + void shouldCallMapToQuery() { + var ozgCloudVorgangQuery = OzgCloudVorgangQueryTestFactory.create(); - private final GrpcQuery.Builder queryBuilder = GrpcQueryTestFactory.createBuilder(); + mapper.toGrpc(ozgCloudVorgangQuery); - @BeforeEach - void mock() { - doReturn(queryBuilder).when(mapper).mapPropertiesToQuery(query); + verify(mapper).mapAllToQuery(ozgCloudVorgangQuery); } @Test - void shouldReturnBuiltQuery() { - var grpcQuery = mapper.toGrpc(query); + void shouldReturnResult() { + doReturn(grpcQuery).when(mapper).mapAllToQuery(any()); + + var result = mapper.toGrpc(OzgCloudVorgangQueryTestFactory.create()); - assertThat(grpcQuery).usingRecursiveComparison().isEqualTo(GrpcQueryTestFactory.create()); + assertThat(result).isSameAs(grpcQuery); } } @Nested - class OnNoProperties { - private final OzgCloudVorgangQuery query = OzgCloudVorgangQueryTestFactory.create(); + class TestHasNoPropertyExpressions { @BeforeEach - void mock() { - doReturn(queryBuilder).when(mapper).mapPropertiesToQuery(query); + void init() { + doReturn(false).when(mapper).hasPropertyExpressions(any()); } - private final GrpcQuery.Builder queryBuilder = GrpcQueryTestFactory.createBuilder() - .clearExpressions(); - @Test - void shouldMapQueryToGrpcQuery() { - mapper.toGrpc(query); + void shouldCallToQuery() { + var ozgCloudVorgangQuery = OzgCloudVorgangQueryTestFactory.create(); + + mapper.toGrpc(ozgCloudVorgangQuery); verify(mapper).toQuery(OzgCloudVorgangQueryTestFactory.QUERY); } @Test - void shouldReturnMappedQuery() { - var mappedQuery = GrpcQueryTestFactory.create(); - doReturn(mappedQuery).when(mapper).toQuery(OzgCloudVorgangQueryTestFactory.QUERY); + void shouldReturnResult() { + doReturn(grpcQuery).when(mapper).toQuery(any(Query.class)); - var grpcQuery = mapper.toGrpc(query); + var result = mapper.toGrpc(OzgCloudVorgangQueryTestFactory.create()); - assertThat(grpcQuery).isEqualTo(mappedQuery); + assertThat(result).isSameAs(grpcQuery); + } + + @Test + void shouldReturnDefaultInstance() { + var ozgCloudQuery = OzgCloudVorgangQueryTestFactory.createBuilder().query(Optional.empty()).build(); + + var result = mapper.toGrpc(ozgCloudQuery); + + assertThat(result).isEqualTo(GrpcQuery.getDefaultInstance()); } } + } - @Nested - class OnNestedQueryAndProperties { + @Nested + class TestHasPropertyExpressions { - private final OzgCloudVorgangQuery query = OzgCloudVorgangQueryTestFactory.create(); + @Test + void shouldReturnFalse() { + var query = OzgCloudVorgangQuery.builder().query(Optional.of(OzgCloudVorgangQueryTestFactory.QUERY)).build(); - private final GrpcQuery.Builder queryBuilder = GrpcQueryTestFactory.createBuilder(); + var result = mapper.hasPropertyExpressions(query); - @BeforeEach - void mock() { - doReturn(queryBuilder).when(mapper).mapPropertiesToQuery(query); - } + assertThat(result).isFalse(); + } + + @Nested + class TestOnPropertySet { @Test - void shouldCallMapQuery() { - mapper.toGrpc(query); + void shouldReturnTrueWithAktenzeichen() { + var query = OzgCloudVorgangQuery.builder().aktenzeichen(Optional.of(OzgCloudVorgangQueryTestFactory.AKTENZEICHEN)).build(); - verify(mapper).toQuery(OzgCloudVorgangQueryTestFactory.QUERY); + var result = mapper.hasPropertyExpressions(query); + + assertThat(result).isTrue(); } @Test - void shouldReturnGrpcQuery() { - var nestedQuery = GrpcQueryTestFactory.create(); - var expectedQuery = GrpcQueryTestFactory.createBuilder() - .setNestedQuery(nestedQuery) - .build(); - doReturn(nestedQuery).when(mapper).toQuery(OzgCloudVorgangQueryTestFactory.QUERY); + void shouldReturnTrueWithOrganisationsEinheitId() { + var query = OzgCloudVorgangQuery.builder() + .organisationsEinheitId(Optional.of(OzgCloudVorgangQueryTestFactory.ORGANISATIONS_EINHEIT_ID)).build(); - var grpcQuery = mapper.toGrpc(query); + var result = mapper.hasPropertyExpressions(query); - assertThat(grpcQuery).usingRecursiveComparison().isEqualTo(expectedQuery); + assertThat(result).isTrue(); } - } + @Test + void shouldReturnTrueWithForm() { + var query = OzgCloudVorgangQuery.builder().form(Optional.of(FormIdentificationTestFactory.create())).build(); - @Nested - class OnEmptyQuery { + var result = mapper.hasPropertyExpressions(query); - private final OzgCloudVorgangQuery query = OzgCloudVorgangQuery.builder().build(); + assertThat(result).isTrue(); + } @Test - void shouldMapToDefaultGrpcQuery() { - var grpcQuery = mapper.toGrpc(query); + void shouldReturnTrueWithStatus() { + var query = OzgCloudVorgangQuery.builder().status(Optional.of(OzgCloudVorgangQueryTestFactory.STATUS)).build(); + + var result = mapper.hasPropertyExpressions(query); - assertThat(grpcQuery).usingRecursiveComparison().isEqualTo(GrpcQuery.getDefaultInstance()); + assertThat(result).isTrue(); } } } @@ -154,7 +177,7 @@ class OzgCloudVorgangQueryMapperTest { @Test void shouldCallToAktenzeichenExpression() { - mapper.mapPropertiesToQuery(OzgCloudVorgangQueryTestFactory.create()); + mapper.mapAllToQuery(OzgCloudVorgangQueryTestFactory.create()); verify(mapper).toAktenzeichenExpression(OzgCloudVorgangQueryTestFactory.AKTENZEICHEN); } @@ -163,14 +186,14 @@ class OzgCloudVorgangQueryMapperTest { void shouldSetAktenzeichenExpression() { doReturn(aktenzeichenExpression).when(mapper).toAktenzeichenExpression(OzgCloudVorgangQueryTestFactory.AKTENZEICHEN); - var queryBuidler = mapper.mapPropertiesToQuery(OzgCloudVorgangQueryTestFactory.create()); + var queryBuidler = mapper.mapAllToQuery(OzgCloudVorgangQueryTestFactory.create()); assertThat(queryBuidler.getExpressionsList()).contains(aktenzeichenExpression); } @Test void shouldNotCallToAktenzeichenExpression() { - mapper.mapPropertiesToQuery(OzgCloudVorgangQueryTestFactory.createBuilder().aktenzeichen(Optional.empty()).build()); + mapper.mapAllToQuery(OzgCloudVorgangQueryTestFactory.createBuilder().aktenzeichen(Optional.empty()).build()); verify(mapper, never()).toAktenzeichenExpression(any()); } @@ -187,7 +210,7 @@ class OzgCloudVorgangQueryMapperTest { @Test void shouldCallToOrganisationsEinheitIdExpression() { - mapper.mapPropertiesToQuery(OzgCloudVorgangQueryTestFactory.create()); + mapper.mapAllToQuery(OzgCloudVorgangQueryTestFactory.create()); verify(mapper).toOrganisationsEinheitIdExpression(OzgCloudVorgangQueryTestFactory.ORGANISATIONS_EINHEIT_ID); } @@ -197,14 +220,14 @@ class OzgCloudVorgangQueryMapperTest { doReturn(organisationsEinheitIdExpression).when(mapper) .toOrganisationsEinheitIdExpression(OzgCloudVorgangQueryTestFactory.ORGANISATIONS_EINHEIT_ID); - var queryBuidler = mapper.mapPropertiesToQuery(OzgCloudVorgangQueryTestFactory.create()); + var queryBuidler = mapper.mapAllToQuery(OzgCloudVorgangQueryTestFactory.create()); assertThat(queryBuidler.getExpressionsList()).contains(organisationsEinheitIdExpression); } @Test void shouldNotCallToOrganisationsEinheitIdExpression() { - mapper.mapPropertiesToQuery(OzgCloudVorgangQueryTestFactory.createBuilder().organisationsEinheitId(Optional.empty()).build()); + mapper.mapAllToQuery(OzgCloudVorgangQueryTestFactory.createBuilder().organisationsEinheitId(Optional.empty()).build()); verify(mapper, never()).toOrganisationsEinheitIdExpression(any()); } @@ -223,7 +246,7 @@ class OzgCloudVorgangQueryMapperTest { @Test void shouldCallToFormExpression() { - mapper.mapPropertiesToQuery(OzgCloudVorgangQueryTestFactory.create()); + mapper.mapAllToQuery(OzgCloudVorgangQueryTestFactory.create()); verify(mapper).toFormExpressions(OzgCloudVorgangQueryTestFactory.FORM); } @@ -232,17 +255,27 @@ class OzgCloudVorgangQueryMapperTest { void shouldSetFormExpression() { doReturn(formExpressions).when(mapper).toFormExpressions(OzgCloudVorgangQueryTestFactory.FORM); - var queryBuidler = mapper.mapPropertiesToQuery(OzgCloudVorgangQueryTestFactory.create()); + var queryBuidler = mapper.mapAllToQuery(OzgCloudVorgangQueryTestFactory.create()); assertThat(queryBuidler.getExpressionsList()).containsAll(formExpressions); } @Test void shouldNotCallToFormExpression() { - mapper.mapPropertiesToQuery(OzgCloudVorgangQueryTestFactory.createBuilder().form(Optional.empty()).build()); + mapper.mapAllToQuery(OzgCloudVorgangQueryTestFactory.createBuilder().form(Optional.empty()).build()); verify(mapper, never()).toFormExpressions(any()); } + + @Test + void shouldNotSetEmptyFormExpressions() { + doReturn(Collections.emptySet()).when(mapper).toFormExpressions(any()); + var ozgCloudVorgangQuery = OzgCloudVorgangQuery.builder().form(Optional.of(FormIdentification.builder().build())).build(); + + var result = mapper.mapAllToQuery(ozgCloudVorgangQuery); + + assertThat(result.getExpressionsList()).isEmpty(); + } } @Nested @@ -256,7 +289,7 @@ class OzgCloudVorgangQueryMapperTest { @Test void shouldCallToStatusExpression() { - mapper.mapPropertiesToQuery(OzgCloudVorgangQueryTestFactory.create()); + mapper.mapAllToQuery(OzgCloudVorgangQueryTestFactory.create()); verify(mapper).toStatusExpression(OzgCloudVorgangQueryTestFactory.STATUS); } @@ -266,14 +299,14 @@ class OzgCloudVorgangQueryMapperTest { doReturn(statusExpression).when(mapper) .toStatusExpression(OzgCloudVorgangQueryTestFactory.STATUS); - var queryBuidler = mapper.mapPropertiesToQuery(OzgCloudVorgangQueryTestFactory.create()); + var queryBuidler = mapper.mapAllToQuery(OzgCloudVorgangQueryTestFactory.create()); assertThat(queryBuidler.getExpressionsList()).contains(statusExpression); } @Test void shouldNotCallToStatusExpression() { - mapper.mapPropertiesToQuery(OzgCloudVorgangQueryTestFactory.createBuilder().status(Optional.empty()).build()); + mapper.mapAllToQuery(OzgCloudVorgangQueryTestFactory.createBuilder().status(Optional.empty()).build()); verify(mapper, never()).toStatusExpression(any()); } @@ -335,47 +368,96 @@ class OzgCloudVorgangQueryMapperTest { @Nested class TestToFormExpressions { - private final GrpcVorgangQueryExpression formEngineNameExpression = GrpcVorgangQueryExpressionTestFactory.createBuilder() - .setPath(OzgCloudVorgangQueryMapper.FORM_ENGINE_NAME_PATH) - .setOperator(GrpcQueryOperator.EQUAL) - .setOperandStringValue(FormIdentificationTestFactory.FORM_ENGINE_NAME) - .build(); + @Mock + private GrpcVorgangQueryExpression formEngineNameExpression; - private final GrpcVorgangQueryExpression formIdExpression = GrpcVorgangQueryExpressionTestFactory.createBuilder() - .setPath(OzgCloudVorgangQueryMapper.FORM_ID_PATH) - .setOperator(GrpcQueryOperator.EQUAL) - .setOperandStringValue(FormIdentificationTestFactory.FORM_ID) - .build(); + @Mock + private GrpcVorgangQueryExpression formIdExpression; + + @Test + void shouldCallToFormEngineNameExpression() { + toFormExpressions(); + + verify(mapper).toFormEngineNameExpression(FormIdentificationTestFactory.FORM_ENGINE_NAME); + } + + @Test + void shouldSetFormEngineNameExpression() { + doReturn(formEngineNameExpression).when(mapper).toFormEngineNameExpression(any()); + + var expressions = toFormExpressions(); + + assertThat(expressions).contains(formEngineNameExpression); + } @Test - void shouldReturnFormEngineNameExpression() { - var expressions = mapper.toFormExpressions(FormIdentificationTestFactory.createBuilder().formId(null).build()); + void shouldCallToFormIdExpression() { + toFormExpressions(); - assertThat(expressions).usingRecursiveFieldByFieldElementComparator().containsExactly(formEngineNameExpression); + verify(mapper).toFormIdExpression(FormIdentificationTestFactory.FORM_ID); } @Test void shouldReturnFormIdExpression() { - var expressions = mapper.toFormExpressions(FormIdentificationTestFactory.createBuilder().formEngineName(null).build()); + doReturn(formIdExpression).when(mapper).toFormIdExpression(any()); + + var expressions = toFormExpressions(); + + assertThat(expressions).contains(formIdExpression); + } + + private Set<GrpcVorgangQueryExpression> toFormExpressions() { + return mapper.toFormExpressions(FormIdentificationTestFactory.create()); + } + } - assertThat(expressions).usingRecursiveFieldByFieldElementComparator().containsExactly(formIdExpression); + @Nested + class TestToFormEngineNameExpression { + + @Test + void shouldSetPath() { + var expression = mapper.toFormEngineNameExpression(FormIdentificationTestFactory.FORM_ENGINE_NAME); + + assertThat(expression.getPath()).isEqualTo(OzgCloudVorgangQueryMapper.FORM_ENGINE_NAME_PATH); + } + + @Test + void shouldSetOperandStringValue() { + var expression = mapper.toFormEngineNameExpression(FormIdentificationTestFactory.FORM_ENGINE_NAME); + + assertThat(expression.getOperandStringValue()).isEqualTo(FormIdentificationTestFactory.FORM_ENGINE_NAME); + } + + @Test + void shouldSetOperator() { + var expression = mapper.toFormEngineNameExpression(FormIdentificationTestFactory.FORM_ENGINE_NAME); + + assertThat(expression.getOperator()).isEqualTo(GrpcQueryOperator.EQUAL); } + } + + @Nested + class TestToFormIdExpression { @Test - void shouldReturnBothExpressions() { - var expressions = mapper.toFormExpressions(FormIdentificationTestFactory.create()); + void shouldSetPath() { + var expression = mapper.toFormIdExpression(FormIdentificationTestFactory.FORM_ID); - assertThat(expressions).usingRecursiveFieldByFieldElementComparator().containsExactlyInAnyOrder(formEngineNameExpression, - formIdExpression); + assertThat(expression.getPath()).isEqualTo(OzgCloudVorgangQueryMapper.FORM_ID_PATH); } @Test - void shouldReturnUnmodifiableSet() { - var newExpression = GrpcVorgangQueryExpressionTestFactory.create(); + void shouldSetOperandStringValue() { + var expression = mapper.toFormIdExpression(FormIdentificationTestFactory.FORM_ID); + + assertThat(expression.getOperandStringValue()).isEqualTo(FormIdentificationTestFactory.FORM_ID); + } - var expressions = mapper.toFormExpressions(FormIdentificationTestFactory.create()); + @Test + void shouldSetOperator() { + var expression = mapper.toFormIdExpression(FormIdentificationTestFactory.FORM_ID); - assertThrows(UnsupportedOperationException.class, () -> expressions.add(newExpression)); + assertThat(expression.getOperator()).isEqualTo(GrpcQueryOperator.EQUAL); } } diff --git a/ozg-cloud-spring-boot-starter/pom.xml b/ozg-cloud-spring-boot-starter/pom.xml index 8a33f2d6c8bcc72a057fa5310a3f00ed9055868b..c6777f7504e28eb61e24ab1efbf17adc9d2951b6 100644 --- a/ozg-cloud-spring-boot-starter/pom.xml +++ b/ozg-cloud-spring-boot-starter/pom.xml @@ -56,6 +56,11 @@ <artifactId>lombok</artifactId> <optional>true</optional> </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-validation</artifactId> + <scope>test</scope> + </dependency> </dependencies> diff --git a/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudClientAutoConfiguration.java b/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudClientAutoConfiguration.java index bf15fa70790994a26f3886f65701d80af4ab32cb..34de53db945841ebd5580d5e056fcb9a86375063 100644 --- a/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudClientAutoConfiguration.java +++ b/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudClientAutoConfiguration.java @@ -4,27 +4,26 @@ import java.util.Collection; import java.util.Map; import org.mapstruct.factory.Mappers; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Import; import de.ozgcloud.apilib.alfa.AlfaService; import de.ozgcloud.apilib.alfa.CommandAlfaService; import de.ozgcloud.apilib.alfa.dummy.DummyAlfaService; import de.ozgcloud.apilib.common.callcontext.DefaultOzgCloudCallContextProvider; -import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextAttachingInterceptor; import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextProvider; import de.ozgcloud.apilib.common.command.OzgCloudCommandService; import de.ozgcloud.apilib.common.command.grpc.CommandMapper; import de.ozgcloud.apilib.common.command.grpc.GrpcOzgCloudCommandService; -import de.ozgcloud.apilib.file.dummy.DummyOzgCloudFileService; +import de.ozgcloud.apilib.file.OzgCloudFileService; import de.ozgcloud.apilib.file.grpc.GrpcOzgCloudFileService; import de.ozgcloud.apilib.file.grpc.OzgCloudFileMapper; +import de.ozgcloud.apilib.user.GrpcOzgCloudUserProfileService; +import de.ozgcloud.apilib.user.OzgCloudUserProfileService; import de.ozgcloud.apilib.user.UserProfileMapper; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangIdMapper; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangService; @@ -33,20 +32,19 @@ import de.ozgcloud.apilib.vorgang.grpc.GrpcOzgCloudVorgangService; import de.ozgcloud.apilib.vorgang.grpc.OzgCloudVorgangMapper; import de.ozgcloud.apilib.vorgang.grpc.OzgCloudVorgangQueryMapper; import de.ozgcloud.apilib.vorgang.grpc.OzgCloudVorgangStubMapper; +import de.ozgcloud.user.grpc.userprofile.UserProfileServiceGrpc; +import de.ozgcloud.vorgang.grpc.binaryFile.BinaryFileServiceGrpc; import de.ozgcloud.vorgang.grpc.command.CommandServiceGrpc; -import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub; +import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc; import io.grpc.ManagedChannelBuilder; +import lombok.RequiredArgsConstructor; import net.devh.boot.grpc.client.autoconfigure.GrpcClientAutoConfiguration; import net.devh.boot.grpc.client.config.GrpcChannelProperties; import net.devh.boot.grpc.client.config.GrpcChannelsProperties; @AutoConfiguration(before = GrpcClientAutoConfiguration.class) @ComponentScan("de.ozgcloud.client.autoconfigure") -@Import({ - GrpcOzgCloudFileService.class, DummyOzgCloudFileService.class, - OzgCloudCallContextAttachingInterceptor.class -}) - +@RequiredArgsConstructor public class OzgCloudClientAutoConfiguration { private static final String CLIENT_NAME_VORGANG_MANAGER = "vorgang-manager"; @@ -54,14 +52,10 @@ public class OzgCloudClientAutoConfiguration { private static final String CLIENT_NAME_COMMAND_MANAGER = "ozgcloud-command-manager"; private static final String CLIENT_NAME_USER_MANAGER = "ozgcloud-user-manager"; - @Autowired - private OzgCloudVorgangManagerProperties vorgangManagerProperties; - @Autowired - private OzgCloudFileManagerProperties fileManagerProperties; - @Autowired - private OzgCloudCommandManagerProperties commandManagerProperties; - @Autowired - private OzgCloudUserManagerProperties userManagerProperties; + private final OzgCloudVorgangManagerProperties vorgangManagerProperties; + private final OzgCloudFileManagerProperties fileManagerProperties; + private final OzgCloudCommandManagerProperties commandManagerProperties; + private final OzgCloudUserManagerProperties userManagerProperties; // @Bean // @ConditionalOnProperty("ozgcloud.vorgang-manager.address") @@ -99,7 +93,7 @@ public class OzgCloudClientAutoConfiguration { @Bean GrpcChannelsProperties clientProperties(Collection<GrpcChannelConfigurator> configurators) { var properties = new GrpcChannelsProperties(); - configurators.stream().forEach(configurator -> configurator.addToProperties(properties)); + configurators.forEach(configurator -> configurator.addToProperties(properties)); return properties; } @@ -136,10 +130,11 @@ public class OzgCloudClientAutoConfiguration { @Bean("ozgCloudVorgangService") @ConditionalOnProperty("ozgcloud.vorgang-manager.address") - OzgCloudVorgangService grpcOzgCloudVorgangService(VorgangServiceBlockingStub vorgangServiceStub, - OzgCloudVorgangMapper mapper, OzgCloudVorgangStubMapper stubMapper, OzgCloudVorgangQueryMapper queryMapper, - OzgCloudCallContextProvider contextProvider) { - + @ConditionalOnMissingBean(OzgCloudVorgangService.class) + OzgCloudVorgangService grpcOzgCloudVorgangService(OzgCloudVorgangMapper mapper, OzgCloudVorgangStubMapper stubMapper, + OzgCloudVorgangQueryMapper queryMapper, OzgCloudCallContextProvider contextProvider) { + var channel = ManagedChannelBuilder.forTarget(vorgangManagerProperties.getAddress()).usePlaintext().build(); + var vorgangServiceStub = VorgangServiceGrpc.newBlockingStub(channel); return new GrpcOzgCloudVorgangService(vorgangServiceStub, mapper, stubMapper, queryMapper, contextProvider); } @@ -210,13 +205,22 @@ public class OzgCloudClientAutoConfiguration { return Mappers.getMapper(OzgCloudFileMapper.class); } - // @Bean - // @ConditionalOnProperty("ozgcloud.user-manager.address") - // OzgCloudUserProfileService - // grpcOzgCloudUserProfileService(@GrpcClient("ozgcloud-user-manager") - // UserProfileServiceBlockingStub grpcStub, - // UserProfileMapper mapper) { - // System.out.println("#### building UM-ProfileService"); - // return new GrpcOzgCloudUserProfileService(grpcStub, mapper); - // } + @Bean + @ConditionalOnMissingBean + @ConditionalOnProperty("ozgcloud.user-manager.address") + OzgCloudUserProfileService grpcOzgCloudUserProfileService(UserProfileMapper mapper, OzgCloudCallContextProvider contextProvider) { + var channel = ManagedChannelBuilder.forTarget(userManagerProperties.getAddress()).usePlaintext().build(); + var userServiceStub = UserProfileServiceGrpc.newBlockingStub(channel); + return new GrpcOzgCloudUserProfileService(userServiceStub, mapper, contextProvider); + } + + @Bean + @ConditionalOnProperty("ozgcloud.file-manager.address") + @ConditionalOnMissingBean + OzgCloudFileService grpcOzgCloudFileService(OzgCloudFileMapper mapper, OzgCloudCallContextProvider contextProvider) { + var channel = ManagedChannelBuilder.forTarget(fileManagerProperties.getAddress()).usePlaintext().build(); + var blockingStub = BinaryFileServiceGrpc.newBlockingStub(channel); + var asyncStub = BinaryFileServiceGrpc.newStub(channel); + return new GrpcOzgCloudFileService(blockingStub, asyncStub, contextProvider, mapper); + } } diff --git a/ozg-cloud-spring-boot-starter/src/test/java/de/ozgcloud/client/autoconfigure/OzgCloudFileServiceStarterITCase.java b/ozg-cloud-spring-boot-starter/src/test/java/de/ozgcloud/client/autoconfigure/OzgCloudFileServiceStarterITCase.java new file mode 100644 index 0000000000000000000000000000000000000000..0581131a576eb0164e25074b68084a423d2808b7 --- /dev/null +++ b/ozg-cloud-spring-boot-starter/src/test/java/de/ozgcloud/client/autoconfigure/OzgCloudFileServiceStarterITCase.java @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.client.autoconfigure; + +import static org.assertj.core.api.Assertions.*; + +import java.util.Optional; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; +import org.springframework.test.annotation.DirtiesContext; + +import de.ozgcloud.apilib.autoconfig.ApiLibTestApplication; +import de.ozgcloud.apilib.file.OzgCloudFileService; +import de.ozgcloud.apilib.file.dummy.DummyOzgCloudFileService; +import de.ozgcloud.apilib.file.grpc.GrpcOzgCloudFileService; + +public class OzgCloudFileServiceStarterITCase { + + @Nested + @SpringBootTest(classes = ApiLibTestApplication.class) + @DirtiesContext() + class TestWithoutOzgCloudFileService { + + @Autowired + private Optional<OzgCloudFileService> ozgCloudFileService; + + @Test + void shouldStart() { + assertThat(ozgCloudFileService).isEmpty(); + } + } + + @Nested + @SpringBootTest(classes = ApiLibTestApplication.class, properties = { + "ozgcloud.file-manager.address=address" + }) + @DirtiesContext + class TestWithOzgCloudFileService { + + @Autowired + private OzgCloudFileService ozgCloudFileService; + + @Test + void shouldStart() { + assertThat(ozgCloudFileService).isInstanceOf(GrpcOzgCloudFileService.class); + } + } + + @Nested + @SpringBootTest(classes = ApiLibTestApplication.class, properties = { + "ozgcloud.file-manager.address=address" + }) + @Import(TestWithExistingOzgCloudFileService.Config.class) + class TestWithExistingOzgCloudFileService { + + @Autowired + private OzgCloudFileService ozgCloudFileService; + + @Test + void shouldStart() { // NOSONAR + assertThat(ozgCloudFileService).isInstanceOf(DummyOzgCloudFileService.class); + } + + static class Config { + + @Bean + OzgCloudFileService ozgCloudFileService() { + return new DummyOzgCloudFileService(); + } + } + } +} diff --git a/ozg-cloud-spring-boot-starter/src/test/java/de/ozgcloud/client/autoconfigure/OzgCloudUserProfileServiceStarterITCase.java b/ozg-cloud-spring-boot-starter/src/test/java/de/ozgcloud/client/autoconfigure/OzgCloudUserProfileServiceStarterITCase.java new file mode 100644 index 0000000000000000000000000000000000000000..a3b6aaf8d1a2daff89db50d6c6f2d457020e12e3 --- /dev/null +++ b/ozg-cloud-spring-boot-starter/src/test/java/de/ozgcloud/client/autoconfigure/OzgCloudUserProfileServiceStarterITCase.java @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.client.autoconfigure; + +import static org.assertj.core.api.Assertions.*; + +import java.util.Optional; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; +import org.springframework.test.annotation.DirtiesContext; + +import de.ozgcloud.apilib.autoconfig.ApiLibTestApplication; +import de.ozgcloud.apilib.user.GrpcOzgCloudUserProfileService; +import de.ozgcloud.apilib.user.OzgCloudUserId; +import de.ozgcloud.apilib.user.OzgCloudUserProfile; +import de.ozgcloud.apilib.user.OzgCloudUserProfileService; + +public class OzgCloudUserProfileServiceStarterITCase { + + @Nested + @SpringBootTest(classes = ApiLibTestApplication.class) + @DirtiesContext() + class TestNoOzgCloudUserProfileService { + + @Autowired + private Optional<OzgCloudUserProfileService> ozgCloudUserProfileService; + + @Test + void shouldStart() { + assertThat(ozgCloudUserProfileService).isEmpty(); + } + } + + @Nested + @SpringBootTest(classes = ApiLibTestApplication.class, properties = { + "ozgcloud.user-manager.address=address" + }) + @DirtiesContext + class TestWithOzgCloudUserProfileService { + + @Autowired + private OzgCloudUserProfileService ozgCloudUserProfileService; + + @Test + void shouldStart() { + assertThat(ozgCloudUserProfileService).isInstanceOf(GrpcOzgCloudUserProfileService.class); + } + } + + @Nested + @SpringBootTest(classes = ApiLibTestApplication.class, properties = { + "ozgcloud.file-manager.address=address" + }) + @Import(TestWithExistingOzgCloudFileService.Config.class) + class TestWithExistingOzgCloudFileService { + + @Autowired + private OzgCloudUserProfileService ozgCloudUserProfileService; + + @Test + void shouldStart() { // NOSONAR + assertThat(ozgCloudUserProfileService).isInstanceOf(DummyOzgCloudUserProfileService.class); + } + + record DummyOzgCloudUserProfileService() implements OzgCloudUserProfileService { + + @Override + public OzgCloudUserProfile getById(final OzgCloudUserId userId) { + return OzgCloudUserProfile.builder().build(); + } + } + + static class Config { + + @Bean + OzgCloudUserProfileService zgCloudUserProfileService() { + return new DummyOzgCloudUserProfileService(); + } + } + } +} diff --git a/ozg-cloud-spring-boot-starter/src/test/java/de/ozgcloud/client/autoconfigure/OzgCloudVorgangServiceStarterITCase.java b/ozg-cloud-spring-boot-starter/src/test/java/de/ozgcloud/client/autoconfigure/OzgCloudVorgangServiceStarterITCase.java new file mode 100644 index 0000000000000000000000000000000000000000..6618638e38515e2dbbc4424c66029aae7fed3f82 --- /dev/null +++ b/ozg-cloud-spring-boot-starter/src/test/java/de/ozgcloud/client/autoconfigure/OzgCloudVorgangServiceStarterITCase.java @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.client.autoconfigure; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import de.ozgcloud.apilib.autoconfig.ApiLibTestApplication; +import de.ozgcloud.apilib.vorgang.OzgCloudVorgangService; +import de.ozgcloud.apilib.vorgang.dummy.DummyVorgangService; +import de.ozgcloud.apilib.vorgang.grpc.GrpcOzgCloudVorgangService; + +public class OzgCloudVorgangServiceStarterITCase { + + @Nested + @SpringBootTest(classes = ApiLibTestApplication.class, properties = { + "ozgcloud.vorgang-manager.address=address" + }) + class TestWithOzgCloudVorgangService { + + @Autowired + private OzgCloudVorgangService ozgCloudVorgangService; + + @Test + void shouldStart() { + assertThat(ozgCloudVorgangService).isInstanceOf(GrpcOzgCloudVorgangService.class); + } + } + + @Nested + @SpringBootTest(classes = ApiLibTestApplication.class) + class TestWithExistingOzgCloudVorgangService { + + @Autowired + private OzgCloudVorgangService ozgCloudVorgangService; + + @Test + void shouldStart() { // NOSONAR + assertThat(ozgCloudVorgangService).isInstanceOf(DummyVorgangService.class); + } + + } +} diff --git a/pom.xml b/pom.xml index 29f8833af80c7c03d28212f8921abbde86f300e9..87ba347588a5fbcc04fe68788a26787b14862cec 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ <parent> <groupId>de.ozgcloud.common</groupId> <artifactId>ozgcloud-common-dependencies</artifactId> - <version>4.3.1</version> + <version>4.5.0-SNAPSHOT</version> <relativePath /> <!-- lookup parent from repository --> </parent> @@ -25,10 +25,10 @@ <properties> <source-plugin.version>3.3.0</source-plugin.version> - <failsafe-plugin.version>3.2.2</failsafe-plugin.version> + <failsafe-plugin.version>3.2.5</failsafe-plugin.version> <maven-jar-plugin.version>3.3.0</maven-jar-plugin.version> - <vorgang-manager.version>2.11.0</vorgang-manager.version> + <vorgang-manager.version>2.17.0-SNAPSHOT</vorgang-manager.version> <user-manager.version>2.1.0</user-manager.version> </properties>