From 19f5a52de02712387bb4da0f1784310c85e8e444 Mon Sep 17 00:00:00 2001 From: Tobias Bruns <kontakt@tobias-bruns.de> Date: Fri, 11 Apr 2025 09:22:28 +0200 Subject: [PATCH] OZG-7689 check parsing json --- pom.xml | 4 +- .../ozgcloud/processor/result/Aktennotiz.java | 1 - .../processor/ProcessorServiceITCase.java | 63 +++++++++++++++---- .../resources/results/createAktennotiz.json | 10 +++ .../results/createAktennotiz_unkownField.json | 11 ++++ 5 files changed, 75 insertions(+), 14 deletions(-) create mode 100644 src/test/resources/results/createAktennotiz.json create mode 100644 src/test/resources/results/createAktennotiz_unkownField.json diff --git a/pom.xml b/pom.xml index 03299c7..5f780fa 100644 --- a/pom.xml +++ b/pom.xml @@ -31,7 +31,7 @@ <parent> <groupId>de.ozgcloud.common</groupId> <artifactId>ozgcloud-common-parent</artifactId> - <version>4.9.0</version> + <version>4.10.0</version> </parent> <groupId>de.ozgcloud.processor</groupId> @@ -43,7 +43,7 @@ <description>OZG-Cloud Processor Manager</description> <properties> - <vorgang-manager.version>2.23.0-SNAPSHOT</vorgang-manager.version> + <vorgang-manager.version>2.25.0-SNAPSHOT</vorgang-manager.version> <api-lib.version>0.13.0</api-lib.version> <tyrus-standalone-client.version>2.2.0</tyrus-standalone-client.version> <okio.version>3.9.1</okio.version> diff --git a/src/main/java/de/ozgcloud/processor/result/Aktennotiz.java b/src/main/java/de/ozgcloud/processor/result/Aktennotiz.java index 3d3f174..ae92ce5 100644 --- a/src/main/java/de/ozgcloud/processor/result/Aktennotiz.java +++ b/src/main/java/de/ozgcloud/processor/result/Aktennotiz.java @@ -37,7 +37,6 @@ import lombok.NoArgsConstructor; @Getter @NoArgsConstructor @AllArgsConstructor -//TODO default config of jackson should already ignore unkown properties @JsonIgnoreProperties(ignoreUnknown = true) public class Aktennotiz { diff --git a/src/test/java/de/ozgcloud/processor/processor/ProcessorServiceITCase.java b/src/test/java/de/ozgcloud/processor/processor/ProcessorServiceITCase.java index cf95b88..97f2fb7 100644 --- a/src/test/java/de/ozgcloud/processor/processor/ProcessorServiceITCase.java +++ b/src/test/java/de/ozgcloud/processor/processor/ProcessorServiceITCase.java @@ -29,6 +29,7 @@ import java.time.Duration; import java.util.Collections; import java.util.concurrent.TimeUnit; +import org.apache.commons.lang3.tuple.Pair; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -39,13 +40,20 @@ import org.junit.jupiter.params.provider.NullAndEmptySource; import org.junit.jupiter.params.provider.ValueSource; import org.mockito.Mock; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean; import org.springframework.test.util.ReflectionTestUtils; +import com.fasterxml.jackson.databind.DeserializationFeature; + import de.ozgcloud.common.test.ITCase; +import de.ozgcloud.common.test.TestUtils; import de.ozgcloud.processor.processor.ProcessorProperties.Processor; +import de.ozgcloud.processor.result.AktennotizTestFactory; import de.ozgcloud.processor.result.ResultService; import de.ozgcloud.processor.result.Severity; import de.ozgcloud.processor.vorgang.Vorgang; @@ -76,13 +84,6 @@ class ProcessorServiceITCase { @BeforeEach void setup() { processor = ProcessorTestFactory.createBuilder().address(mockWebServer.url("/").toString()).build(); - mockWebServer.enqueue(createMockResponse()); - } - - private MockResponse createMockResponse() { - return new MockResponse() - .addHeader("Content-Type", "application/json") - .setBody("{\"%s\": \"%s\"}".formatted(ProcessorResultTestFactory.KEY_RESULT_ACTION, ProcessorResultTestFactory.RESULT_ACTION)); } @AfterEach @@ -93,17 +94,48 @@ class ProcessorServiceITCase { @Test void shouldSendVorgangIdAsString() { + mockWebServer.enqueue(createMockResponse( + "{\"%s\": \"%s\"}".formatted(ProcessorResultTestFactory.KEY_RESULT_ACTION, ProcessorResultTestFactory.RESULT_ACTION))); var vorgang = VorgangTestFactory.create(); - var request = sendRequest(processor, vorgang); + var request = sendRequest(processor, vorgang).getLeft(); assertThat(request.getBody().readUtf8()).contains("\"vorgangId\":\"" + vorgang.getId() + "\""); } + @Test + void shouldReadResonse() { + mockWebServer.enqueue(createMockResponse( + TestUtils.loadTextFile("results/createAktennotiz.json", VorgangTestFactory.ID.toString(), VorgangTestFactory.ID.toString()))); + var vorgang = VorgangTestFactory.create(); + + var response = sendRequest(processor, vorgang).getRight(); + + assertThat(response.getBody()).usingRecursiveComparison().ignoringFields("vorgangId").isEqualTo(AktennotizTestFactory.create()); + } + + @Test + void shouldReadWithUnkownField() { + mockWebServer.enqueue(createMockResponse( + TestUtils.loadTextFile("results/createAktennotiz_unkownField.json", VorgangTestFactory.ID.toString(), + VorgangTestFactory.ID.toString()))); + + assertThat(sendRequest(processor, VorgangTestFactory.create()).getValue().getBody()).usingRecursiveComparison() + .ignoringFields("vorgangId").isEqualTo(AktennotizTestFactory.create()); + + } + + private MockResponse createMockResponse(String response) { + return new MockResponse() + .addHeader("Content-Type", "application/json") + .setBody(response); + } + @SneakyThrows - private RecordedRequest sendRequest(Processor processor, Vorgang vorgang) { - service.callProcessor(processor, vorgang).block(Duration.ofMillis(1000)); - return mockWebServer.takeRequest(100, TimeUnit.MILLISECONDS); + private Pair<RecordedRequest, ProcessorResult> sendRequest(Processor processor, Vorgang vorgang) { + var result = service.callProcessor(processor, vorgang).block(Duration.ofMillis(1000)); + + return Pair.of(mockWebServer.takeRequest(100, TimeUnit.MILLISECONDS), result); } } @@ -268,4 +300,13 @@ class ProcessorServiceITCase { assertThat(result).isEmpty(); } } + +} + +@Configuration +class JacksonConfiguration { + @Bean + Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() { + return builder -> builder.featuresToEnable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + } } \ No newline at end of file diff --git a/src/test/resources/results/createAktennotiz.json b/src/test/resources/results/createAktennotiz.json new file mode 100644 index 0000000..64cecd8 --- /dev/null +++ b/src/test/resources/results/createAktennotiz.json @@ -0,0 +1,10 @@ +{ + "vorgangId": "%s", + "action": "CREATE_AKTENNOTIZ", + "body": { + "vorgangId": "%s", + "severity": "INFO", + "headline": "Headline", + "text": "Text" + } +} \ No newline at end of file diff --git a/src/test/resources/results/createAktennotiz_unkownField.json b/src/test/resources/results/createAktennotiz_unkownField.json new file mode 100644 index 0000000..33bdc8e --- /dev/null +++ b/src/test/resources/results/createAktennotiz_unkownField.json @@ -0,0 +1,11 @@ +{ + "vorgangId": "%s", + "action": "CREATE_AKTENNOTIZ", + "body": { + "vorgangId": "%s", + "severity": "INFO", + "headline": "Headline", + "text": "Text", + "new": "unkown" + } +} \ No newline at end of file -- GitLab