diff --git a/token-checker-server/src/main/java/de/ozgcloud/token/TokenCheckGrpcService.java b/token-checker-server/src/main/java/de/ozgcloud/token/TokenCheckGrpcService.java index 7027ae1cbbbbd4e3ec5f0ca52e4da574f305e90a..bfc048400caf019595943e0a24cc1da8ca5376f9 100644 --- a/token-checker-server/src/main/java/de/ozgcloud/token/TokenCheckGrpcService.java +++ b/token-checker-server/src/main/java/de/ozgcloud/token/TokenCheckGrpcService.java @@ -32,7 +32,7 @@ import net.devh.boot.grpc.server.service.GrpcService; public class TokenCheckGrpcService extends TokenCheckServiceGrpc.TokenCheckServiceImplBase { private final SamlTokenService samlTokenService; - private final CheckTokenResultMapper tokenCheckMapper; + private final TokenValidationResultMapper tokenCheckMapper; @Override public void checkToken(GrpcCheckTokenRequest request, StreamObserver<GrpcCheckTokenResponse> responseStreamObserver) { @@ -54,7 +54,7 @@ public class TokenCheckGrpcService extends TokenCheckServiceGrpc.TokenCheckServi GrpcCheckTokenResponse buildInvalidCheckTokenResponse(TokenValidationResult result) { return GrpcCheckTokenResponse.newBuilder() .setTokenValid(false) - .setCheckError(tokenCheckMapper.toCheckError(result)) + .setCheckErrors(tokenCheckMapper.toCheckErrors(result)) .build(); } } diff --git a/token-checker-server/src/main/java/de/ozgcloud/token/CheckTokenResultMapper.java b/token-checker-server/src/main/java/de/ozgcloud/token/TokenValidationResultMapper.java similarity index 59% rename from token-checker-server/src/main/java/de/ozgcloud/token/CheckTokenResultMapper.java rename to token-checker-server/src/main/java/de/ozgcloud/token/TokenValidationResultMapper.java index c842f44cf79d6341542faf0d283f6d656cbe1b3e..8fcc946550056bcc08d1f2d7b1075da4c4630ff2 100644 --- a/token-checker-server/src/main/java/de/ozgcloud/token/CheckTokenResultMapper.java +++ b/token-checker-server/src/main/java/de/ozgcloud/token/TokenValidationResultMapper.java @@ -23,10 +23,17 @@ package de.ozgcloud.token; import org.mapstruct.CollectionMappingStrategy; import org.mapstruct.Mapper; import org.mapstruct.Mapping; +import org.mapstruct.NullValueCheckStrategy; +import org.mapstruct.NullValueMappingStrategy; +import org.mapstruct.NullValuePropertyMappingStrategy; import org.mapstruct.ReportingPolicy; -@Mapper(unmappedTargetPolicy = ReportingPolicy.WARN, collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED) -interface CheckTokenResultMapper { +import de.ozgcloud.token.common.errorhandling.ValidationError; + +@Mapper(unmappedTargetPolicy = ReportingPolicy.WARN, collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED, // + nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, + nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT) +interface TokenValidationResultMapper { @Mapping(target = "unknownFields", ignore = true) @Mapping(target = "trustLevelBytes", ignore = true) @@ -40,9 +47,24 @@ interface CheckTokenResultMapper { @Mapping(target = "clearOneof", ignore = true) @Mapping(target = "clearField", ignore = true) @Mapping(target = "allFields", ignore = true) - @Mapping(target = "otherFieldsList", source = "attributes") + @Mapping(target = "postfachId", source = "attributes.postfachId") + @Mapping(target = "trustLevel", source = "attributes.trustLevel") + @Mapping(target = "otherFieldsList", source = "attributes.otherAttributes") GrpcTokenAttributes toTokenAttributes(TokenValidationResult validationResult); + @Mapping(target = "unknownFields", ignore = true) + @Mapping(target = "removeCheckError", ignore = true) + @Mapping(target = "mergeUnknownFields", ignore = true) + @Mapping(target = "mergeFrom", ignore = true) + @Mapping(target = "defaultInstanceForType", ignore = true) + @Mapping(target = "clearOneof", ignore = true) + @Mapping(target = "clearField", ignore = true) + @Mapping(target = "checkErrorOrBuilderList", ignore = true) + @Mapping(target = "checkErrorBuilderList", ignore = true) + @Mapping(target = "allFields", ignore = true) + @Mapping(target = "checkErrorList", source = "validationErrors") + GrpcCheckErrors toCheckErrors(TokenValidationResult validationResult); + @Mapping(target = "unknownFields", ignore = true) @Mapping(target = "messageBytes", ignore = true) @Mapping(target = "mergeUnknownFields", ignore = true) @@ -51,6 +73,5 @@ interface CheckTokenResultMapper { @Mapping(target = "clearOneof", ignore = true) @Mapping(target = "clearField", ignore = true) @Mapping(target = "allFields", ignore = true) - @Mapping(target = "message", source = "errorMesssage") - GrpcCheckError toCheckError(TokenValidationResult validationResult); + GrpcCheckError toCheckError(ValidationError validationError); } diff --git a/token-checker-server/src/test/java/de/ozgcloud/token/CheckTokenResultMapperTest.java b/token-checker-server/src/test/java/de/ozgcloud/token/CheckTokenResultMapperTest.java deleted file mode 100644 index eccb9b50e9f42ff90b575ec4fe30d7839659a188..0000000000000000000000000000000000000000 --- a/token-checker-server/src/test/java/de/ozgcloud/token/CheckTokenResultMapperTest.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2024. - * 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.token; - -import static org.assertj.core.api.Assertions.*; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mapstruct.factory.Mappers; - -class CheckTokenResultMapperTest { - - private final CheckTokenResultMapper mapper = Mappers.getMapper(CheckTokenResultMapper.class); - - @Nested - class TestToTokenAttributes { - - @Test - void shouldMapPostfachHandle() { - var result = toTokenCheckResult(); - - assertThat(result.getPostfachId()).isEqualTo(CheckTokenResultTestFactory.POSTFACH_ID); - } - - @Test - void shouldMapTrustLevel() { - var result = toTokenCheckResult(); - - assertThat(result.getTrustLevel()).isEqualTo(CheckTokenResultTestFactory.TRUST_LEVEL); - } - - @Test - void shouldMapOtherFields() { - var result = toTokenCheckResult(); - - assertThat(result.getOtherFieldsList()).containsExactly(GrpcTokenCheckResultTestFactory.TOKEN_ATTRIBUTE); - } - - private GrpcTokenAttributes toTokenCheckResult() { - return mapper.toTokenAttributes(CheckTokenResultTestFactory.createValid()); - } - } - - @Nested - class TestToCheckError { - - @Test - void shouldMapErrorMessage() { - var result = toCheckError(); - - assertThat(result.getMessage()).isEqualTo(CheckTokenResultTestFactory.ERROR_MESSAGE); - } - - private GrpcCheckError toCheckError() { - return mapper.toCheckError(CheckTokenResultTestFactory.createInvalid()); - } - } -} \ No newline at end of file diff --git a/token-checker-server/src/test/java/de/ozgcloud/token/GrpcCheckErrorTestFactory.java b/token-checker-server/src/test/java/de/ozgcloud/token/GrpcCheckErrorTestFactory.java index 99db208a6f616d148ead1be17c9fd4dbc10979b1..58e1a2a69a08fe050948e8e32d6f4ebdc1552a13 100644 --- a/token-checker-server/src/test/java/de/ozgcloud/token/GrpcCheckErrorTestFactory.java +++ b/token-checker-server/src/test/java/de/ozgcloud/token/GrpcCheckErrorTestFactory.java @@ -1,10 +1,11 @@ package de.ozgcloud.token; import de.ozgcloud.token.GrpcCheckError.Builder; +import de.ozgcloud.token.common.errorHandler.ValidationErrorTestFactory; public class GrpcCheckErrorTestFactory { - public static final String ERROR_MESSAGE = CheckTokenResultTestFactory.ERROR_MESSAGE; + public static final String ERROR_MESSAGE = ValidationErrorTestFactory.ERROR_MESSAGE; public static GrpcCheckError create() { return createBuilder().build(); diff --git a/token-checker-server/src/test/java/de/ozgcloud/token/GrpcCheckErrorsTestFactory.java b/token-checker-server/src/test/java/de/ozgcloud/token/GrpcCheckErrorsTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..b04386bc696719c0669b73f526c61b4f10bec675 --- /dev/null +++ b/token-checker-server/src/test/java/de/ozgcloud/token/GrpcCheckErrorsTestFactory.java @@ -0,0 +1,17 @@ +package de.ozgcloud.token; + +import de.ozgcloud.token.GrpcCheckErrors.Builder; + +public class GrpcCheckErrorsTestFactory { + + public static final GrpcCheckError CHECK_ERROR = GrpcCheckErrorTestFactory.create(); + + public static GrpcCheckErrors create() { + return createBuilder().build(); + } + + public static Builder createBuilder() { + return GrpcCheckErrors.newBuilder().addCheckError(CHECK_ERROR); + } + +} diff --git a/token-checker-server/src/test/java/de/ozgcloud/token/GrpcCheckTokenRequestTestFactory.java b/token-checker-server/src/test/java/de/ozgcloud/token/GrpcCheckTokenRequestTestFactory.java index 7aec9a784fa50cdc3af715b28f2c0f33cac8955c..5395cc3f2510221c82fda518652884e400e5d785 100644 --- a/token-checker-server/src/test/java/de/ozgcloud/token/GrpcCheckTokenRequestTestFactory.java +++ b/token-checker-server/src/test/java/de/ozgcloud/token/GrpcCheckTokenRequestTestFactory.java @@ -21,11 +21,9 @@ package de.ozgcloud.token; import de.ozgcloud.common.test.TestUtils; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -@NoArgsConstructor(access = AccessLevel.PRIVATE) -class GrpcCheckTokenRequestTestFactory { +public class GrpcCheckTokenRequestTestFactory { + static final String TOKEN = TestUtils.loadTextFile("SamlResponseMuk.xml"); static GrpcCheckTokenRequest create() { diff --git a/token-checker-server/src/test/java/de/ozgcloud/token/GrpcCheckTokenResponseTestFactory.java b/token-checker-server/src/test/java/de/ozgcloud/token/GrpcCheckTokenResponseTestFactory.java index aadcc22f9b0d4afa249343b518e883d171e10764..c358b23705a819ab6f89495f8f3a43c570732a50 100644 --- a/token-checker-server/src/test/java/de/ozgcloud/token/GrpcCheckTokenResponseTestFactory.java +++ b/token-checker-server/src/test/java/de/ozgcloud/token/GrpcCheckTokenResponseTestFactory.java @@ -20,13 +20,10 @@ package de.ozgcloud.token; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) class GrpcCheckTokenResponseTestFactory { - public static final GrpcTokenAttributes CHECK_TOKEN_RESULT = GrpcTokenCheckResultTestFactory.create(); + public static final GrpcTokenAttributes GRPC_TOKEN_ATTRIBUTE = GrpcTokenAttributesTestFactory.create(); + public static final GrpcCheckErrors GRPC_CHECK_ERRORS = GrpcCheckErrorsTestFactory.create(); public static GrpcCheckTokenResponse createValid() { return createValidBuilder().build(); @@ -35,7 +32,7 @@ class GrpcCheckTokenResponseTestFactory { public static GrpcCheckTokenResponse.Builder createValidBuilder() { return GrpcCheckTokenResponse.newBuilder() .setTokenValid(true) - .setTokenAttributes(CHECK_TOKEN_RESULT); + .setTokenAttributes(GRPC_TOKEN_ATTRIBUTE); } public static GrpcCheckTokenResponse createInvalid() { @@ -45,6 +42,6 @@ class GrpcCheckTokenResponseTestFactory { public static GrpcCheckTokenResponse.Builder createInvalidBuilder() { return GrpcCheckTokenResponse.newBuilder() .setTokenValid(false) - .setCheckError(GrpcCheckErrorTestFactory.create()); + .setCheckErrors(GRPC_CHECK_ERRORS); } } diff --git a/token-checker-server/src/test/java/de/ozgcloud/token/GrpcOtherFieldsTestFactory.java b/token-checker-server/src/test/java/de/ozgcloud/token/GrpcOtherFieldsTestFactory.java index 6423feafe8a76897de97bf598f0176769c34b963..e9dcd4587a6c23cf37b04c5f1a0d6b2a9b09a383 100644 --- a/token-checker-server/src/test/java/de/ozgcloud/token/GrpcOtherFieldsTestFactory.java +++ b/token-checker-server/src/test/java/de/ozgcloud/token/GrpcOtherFieldsTestFactory.java @@ -2,8 +2,8 @@ package de.ozgcloud.token; public class GrpcOtherFieldsTestFactory { - private static final String VALUE = TokenAttributeTestFactory.VALUE; - private static final String NAME = TokenAttributeTestFactory.NAME; + public static final String VALUE = TokenAttributeTestFactory.VALUE; + public static final String NAME = TokenAttributeTestFactory.NAME; public static GrpcOtherField create() { return createBuilder().build(); diff --git a/token-checker-server/src/test/java/de/ozgcloud/token/GrpcTokenCheckResultTestFactory.java b/token-checker-server/src/test/java/de/ozgcloud/token/GrpcTokenAttributesTestFactory.java similarity index 78% rename from token-checker-server/src/test/java/de/ozgcloud/token/GrpcTokenCheckResultTestFactory.java rename to token-checker-server/src/test/java/de/ozgcloud/token/GrpcTokenAttributesTestFactory.java index b4c8bd8c3bf2573955aa07b48aeb545a6a5464d9..d967e6b2e1503b09964d09a712a960b69d050f87 100644 --- a/token-checker-server/src/test/java/de/ozgcloud/token/GrpcTokenCheckResultTestFactory.java +++ b/token-checker-server/src/test/java/de/ozgcloud/token/GrpcTokenAttributesTestFactory.java @@ -20,14 +20,10 @@ package de.ozgcloud.token; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; +class GrpcTokenAttributesTestFactory { -@NoArgsConstructor(access = AccessLevel.PRIVATE) -class GrpcTokenCheckResultTestFactory { - - public static final String POSTFACH_ID = CheckTokenResultTestFactory.POSTFACH_ID; - public static final String TRUST_LEVEL = CheckTokenResultTestFactory.TRUST_LEVEL; + public static final String POSTFACH_ID = TokenAttributesTestFactory.POSTFACH_ID; + public static final String TRUST_LEVEL = TokenAttributesTestFactory.TRUST_LEVEL; public static final GrpcOtherField TOKEN_ATTRIBUTE = GrpcOtherFieldsTestFactory.create(); public static GrpcTokenAttributes create() { diff --git a/token-checker-server/src/test/java/de/ozgcloud/token/TokenCheckGrpcServiceTest.java b/token-checker-server/src/test/java/de/ozgcloud/token/TokenCheckGrpcServiceTest.java index 34960d42cfea7bb625aede1d8830b449cb410b7d..1783dd2bd1945fd46d0f32de0220e6a590c764f8 100644 --- a/token-checker-server/src/test/java/de/ozgcloud/token/TokenCheckGrpcServiceTest.java +++ b/token-checker-server/src/test/java/de/ozgcloud/token/TokenCheckGrpcServiceTest.java @@ -44,7 +44,7 @@ class TokenCheckGrpcServiceTest { private SamlTokenService samlTokenService; @Mock - private CheckTokenResultMapper tokenCheckMapper; + private TokenValidationResultMapper tokenCheckMapper; @Mock private StreamObserver<GrpcCheckTokenResponse> tokenStreamObserver; @@ -102,7 +102,7 @@ class TokenCheckGrpcServiceTest { @Nested class TestValidToken { - private final TokenValidationResult tokenCheckResult = CheckTokenResultTestFactory.createValid(); + private final TokenValidationResult tokenCheckResult = TokenValidationResultTestFactory.createValid(); @BeforeEach void mock() { @@ -128,7 +128,7 @@ class TokenCheckGrpcServiceTest { @Nested class TestInvalidToken { - private final TokenValidationResult tokenCheckResult = CheckTokenResultTestFactory.createInvalid(); + private final TokenValidationResult tokenCheckResult = TokenValidationResultTestFactory.createInvalid(); @BeforeEach void mock() { @@ -155,11 +155,11 @@ class TokenCheckGrpcServiceTest { @Nested class TestBuildValidCheckTokenResponse { - private final TokenValidationResult tokenCheckResult = CheckTokenResultTestFactory.createValid(); + private final TokenValidationResult tokenCheckResult = TokenValidationResultTestFactory.createValid(); @BeforeEach void mock() { - when(tokenCheckMapper.toTokenAttributes(any())).thenReturn(GrpcCheckTokenResponseTestFactory.CHECK_TOKEN_RESULT); + when(tokenCheckMapper.toTokenAttributes(any())).thenReturn(GrpcCheckTokenResponseTestFactory.GRPC_TOKEN_ATTRIBUTE); } @Test @@ -173,7 +173,7 @@ class TokenCheckGrpcServiceTest { void shouldReturnResponse() { var response = buildCheckTokenResponse(); - assertThat(response).isEqualTo(GrpcCheckTokenResponseTestFactory.createValid()); + assertThat(response).usingRecursiveComparison().isEqualTo(GrpcCheckTokenResponseTestFactory.createValid()); } private GrpcCheckTokenResponse buildCheckTokenResponse() { @@ -184,18 +184,18 @@ class TokenCheckGrpcServiceTest { @Nested class TestBuildInvalidCheckTokenResponse { - private final TokenValidationResult tokenCheckResult = CheckTokenResultTestFactory.createInvalid(); + private final TokenValidationResult tokenCheckResult = TokenValidationResultTestFactory.createInvalid(); @BeforeEach void mock() { - when(tokenCheckMapper.toCheckError(any())).thenReturn(GrpcCheckErrorTestFactory.create()); + when(tokenCheckMapper.toCheckErrors(any())).thenReturn(GrpcCheckTokenResponseTestFactory.GRPC_CHECK_ERRORS); } @Test void shouldCallMapper() { buildCheckTokenResponse(); - verify(tokenCheckMapper).toCheckError(tokenCheckResult); + verify(tokenCheckMapper).toCheckErrors(tokenCheckResult); } @Test diff --git a/token-checker-server/src/test/java/de/ozgcloud/token/TokenValidationResultMapperTest.java b/token-checker-server/src/test/java/de/ozgcloud/token/TokenValidationResultMapperTest.java new file mode 100644 index 0000000000000000000000000000000000000000..d03b398bcbf640c870c6ef10513c7dd6dfe3bdc3 --- /dev/null +++ b/token-checker-server/src/test/java/de/ozgcloud/token/TokenValidationResultMapperTest.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2024. + * 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.token; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mapstruct.factory.Mappers; + +import de.ozgcloud.token.common.errorHandler.ValidationErrorTestFactory; + +class TokenValidationResultMapperTest { + + private final TokenValidationResultMapper mapper = spy(Mappers.getMapper(TokenValidationResultMapper.class)); + + @Nested + class TestToTokenAttributes { + + @Test + void shouldMapTokenAttributes() { + var result = mapper.toTokenAttributes(TokenValidationResultTestFactory.createValid()); + + assertThat(result).usingRecursiveComparison().isEqualTo(GrpcTokenAttributesTestFactory.create()); + } + } + + @Nested + class TestToCheckErrors { + + @BeforeEach + void init() { + doReturn(GrpcCheckErrorTestFactory.create()).when(mapper).toCheckError(any()); + } + + @Test + void shouldMapCheckErrors() { + var result = mapper.toCheckErrors(TokenValidationResultTestFactory.createInvalid()); + + assertThat(result).usingRecursiveComparison().isEqualTo(GrpcCheckErrorsTestFactory.create()); + } + } + + @Nested + class TestToCheckError { + + @Test + void shouldMapCheckError() { + var result = mapper.toCheckError(ValidationErrorTestFactory.create()); + + assertThat(result).usingRecursiveComparison().isEqualTo(GrpcCheckErrorTestFactory.create()); + } + } +} \ No newline at end of file diff --git a/token-checker-server/src/test/java/de/ozgcloud/token/common/errorHandler/ValidationErrorTestFactory.java b/token-checker-server/src/test/java/de/ozgcloud/token/common/errorHandler/ValidationErrorTestFactory.java index d2da3914d5513bedaf4940318ccbca846c62d763..bdb3374e1e3b8c9901b8717c0b3bca39deddf871 100644 --- a/token-checker-server/src/test/java/de/ozgcloud/token/common/errorHandler/ValidationErrorTestFactory.java +++ b/token-checker-server/src/test/java/de/ozgcloud/token/common/errorHandler/ValidationErrorTestFactory.java @@ -30,8 +30,8 @@ import de.ozgcloud.token.common.errorhandling.ValidationError; public class ValidationErrorTestFactory { - private static final String ERROR_MESSAGE = LoremIpsum.getInstance().getWords(4); - private static final Exception CAUSE = new Exception(); + public static final String ERROR_MESSAGE = LoremIpsum.getInstance().getWords(4); + public static final Exception CAUSE = new Exception(); public static ValidationError create() { return createBuilder().build();