diff options
| author | Paul-Christian Volkmer | 2025-11-04 11:39:05 +0100 |
|---|---|---|
| committer | Paul-Christian Volkmer | 2025-11-04 14:46:16 +0100 |
| commit | 160222b488580f19a68600ad09ef73984b8eead1 (patch) | |
| tree | 7b98d292908b3f353a33392500420b186c6ce9af | |
| parent | c88788997d2d7487eb4460d7e5cd49d087454f2f (diff) | |
fix: errors in response parsing (#181)v0.11.4
(cherry picked from commit 24d9116e31a7d0afdfbf47aa96a0c8bd54c9508b)
4 files changed, 89 insertions, 4 deletions
diff --git a/src/main/kotlin/dev/dnpm/etl/processor/config/JacksonConfig.kt b/src/main/kotlin/dev/dnpm/etl/processor/config/JacksonConfig.kt index 2ba81b5..282f69e 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/config/JacksonConfig.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/config/JacksonConfig.kt @@ -6,6 +6,7 @@ import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.SerializationFeature +import com.fasterxml.jackson.datatype.jdk8.Jdk8Module import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule @Configuration @@ -22,8 +23,12 @@ class JacksonConfig { @Bean fun objectMapper(): ObjectMapper = ObjectMapper().registerModule(FhirResourceModule()) - .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).registerModule( + .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) + .registerModule( JavaTimeModule() ) + .registerModule( + Jdk8Module() + ) .setSerializationInclusion(JsonInclude.Include.NON_NULL) } diff --git a/src/main/kotlin/dev/dnpm/etl/processor/monitoring/ReportService.kt b/src/main/kotlin/dev/dnpm/etl/processor/monitoring/ReportService.kt index e9ea489..dd5c44a 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/monitoring/ReportService.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/monitoring/ReportService.kt @@ -21,13 +21,14 @@ package dev.dnpm.etl.processor.monitoring import com.fasterxml.jackson.annotation.JsonAlias import com.fasterxml.jackson.annotation.JsonIgnoreProperties +import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonValue import com.fasterxml.jackson.core.JsonParseException import com.fasterxml.jackson.databind.JsonMappingException import com.fasterxml.jackson.databind.ObjectMapper import dev.dnpm.etl.processor.monitoring.ReportService.Issue import dev.dnpm.etl.processor.monitoring.ReportService.Severity -import java.util.Optional +import java.util.* class ReportService( private val objectMapper: ObjectMapper @@ -55,12 +56,19 @@ class ReportService( @JsonIgnoreProperties(ignoreUnknown = true) - private data class DataQualityReport(val issues: List<Issue>) + private data class DataQualityReport( + @param:JsonProperty(value = "issues") + val issues: List<Issue> + ) @JsonIgnoreProperties(ignoreUnknown = true) data class Issue( + @param:JsonProperty(value = "severity") val severity: Severity, - @JsonAlias("details") val message: String, + @param:JsonProperty(value = "message") + @param:JsonAlias("details") + val message: String, + @param:JsonProperty(value = "path") val path: Optional<String> = Optional.empty() ) diff --git a/src/test/kotlin/dev/dnpm/etl/processor/monitoring/ReportServiceTest.kt b/src/test/kotlin/dev/dnpm/etl/processor/monitoring/ReportServiceTest.kt new file mode 100644 index 0000000..4bf1321 --- /dev/null +++ b/src/test/kotlin/dev/dnpm/etl/processor/monitoring/ReportServiceTest.kt @@ -0,0 +1,36 @@ +package dev.dnpm.etl.processor.monitoring + +import dev.dnpm.etl.processor.config.JacksonConfig +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import java.util.* + +class ReportServiceTest { + + lateinit var service: ReportService + + @BeforeEach + fun setUp() { + val jacksonConfig = JacksonConfig() + service = ReportService(jacksonConfig.objectMapper()) + } + + @Test + fun shouldParseDataQualityReport() { + val dataQualityReport = Objects.requireNonNull(this.javaClass.classLoader.getResource("dip-response.json")) + .readText() + + val actual = service.deserialize(dataQualityReport) + + assertThat(actual).isNotNull + assertThat(actual).hasSize(6) + assertThat(actual[0].severity).isEqualTo(ReportService.Severity.FATAL) + assertThat(actual[1].severity).isEqualTo(ReportService.Severity.ERROR) + assertThat(actual[2].severity).isEqualTo(ReportService.Severity.WARNING) + assertThat(actual[3].severity).isEqualTo(ReportService.Severity.WARNING) + assertThat(actual[4].severity).isEqualTo(ReportService.Severity.WARNING) + assertThat(actual[5].severity).isEqualTo(ReportService.Severity.INFO) + } + +}
\ No newline at end of file diff --git a/src/test/resources/dip-response.json b/src/test/resources/dip-response.json new file mode 100644 index 0000000..d1dacb6 --- /dev/null +++ b/src/test/resources/dip-response.json @@ -0,0 +1,36 @@ +{ + "patient": "TEST-PATIENT0123456789abcdef", + "issues": [ + { + "severity": "error", + "message": "MVH-Einschluss-Fallkonferenz darf nicht vor oder ohne Einwilligung zur Teilnahme stattgefunden haben", + "path": "/Datum der MVH-Einwilligung" + }, + { + "severity": "warning", + "message": "Fehlende Angabe 'Tumor-Grading'", + "path": "/Diagnose[0123456789abcdef]/Tumor-Grading" + }, + { + "severity": "fatal", + "message": "Nicht auflösbare Referenz-ID '0123456789abcdef' auf Objekt 'Diagnose'", + "path": "/Systemische-Therapie[0123456789abcdef]/Therapie-Grund (Diagnose)" + }, + { + "severity": "warning", + "message": "Fehlende Angabe", + "path": "/Kostenübernahme-Anträge" + }, + { + "severity": "info", + "message": "Sonstige Info", + "path": "/Kostenübernahme-Antworten" + }, + { + "severity": "warning", + "message": "Fehlende Angabe", + "path": "/MTB-Therapien" + } + ], + "createdAt": "2025-11-04T10:00:00.000000000Z" +} |
