From c922e27758186d410a3c5e2148d3a1b6018cfa29 Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Mon, 6 May 2024 10:43:03 +0200 Subject: [PATCH] fix: handle null values in MtbFile This should not occur but if, it should not result in NPE except for * Patient * Consent * Episode --- .../etl/processor/pseudonym/extensions.kt | 46 +++++++------- .../etl/processor/pseudonym/ExtensionsTest.kt | 61 +++++++++++++++++++ 2 files changed, 84 insertions(+), 23 deletions(-) diff --git a/src/main/kotlin/dev/dnpm/etl/processor/pseudonym/extensions.kt b/src/main/kotlin/dev/dnpm/etl/processor/pseudonym/extensions.kt index b0221bc..ef25787 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/pseudonym/extensions.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/pseudonym/extensions.kt @@ -1,7 +1,7 @@ /* * This file is part of ETL-Processor * - * Copyright (c) 2023 Comprehensive Cancer Center Mainfranken, Datenintegrationszentrum Philipps-Universität Marburg and Contributors + * Copyright (c) 2024 Comprehensive Cancer Center Mainfranken, Datenintegrationszentrum Philipps-Universität Marburg and Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published @@ -31,31 +31,31 @@ import org.apache.commons.codec.digest.DigestUtils infix fun MtbFile.pseudonymizeWith(pseudonymizeService: PseudonymizeService) { val patientPseudonym = pseudonymizeService.patientPseudonym(this.patient.id) - this.episode.patient = patientPseudonym - this.carePlans.forEach { it.patient = patientPseudonym } + this.episode?.patient = patientPseudonym + this.carePlans?.forEach { it.patient = patientPseudonym } this.patient.id = patientPseudonym - this.claims.forEach { it.patient = patientPseudonym } - this.consent.patient = patientPseudonym - this.claimResponses.forEach { it.patient = patientPseudonym } - this.diagnoses.forEach { it.patient = patientPseudonym } - this.ecogStatus.forEach { it.patient = patientPseudonym } - this.familyMemberDiagnoses.forEach { it.patient = patientPseudonym } - this.geneticCounsellingRequests.forEach { it.patient = patientPseudonym } - this.histologyReevaluationRequests.forEach { it.patient = patientPseudonym } - this.histologyReports.forEach { + this.claims?.forEach { it.patient = patientPseudonym } + this.consent?.patient = patientPseudonym + this.claimResponses?.forEach { it.patient = patientPseudonym } + this.diagnoses?.forEach { it.patient = patientPseudonym } + this.ecogStatus?.forEach { it.patient = patientPseudonym } + this.familyMemberDiagnoses?.forEach { it.patient = patientPseudonym } + this.geneticCounsellingRequests?.forEach { it.patient = patientPseudonym } + this.histologyReevaluationRequests?.forEach { it.patient = patientPseudonym } + this.histologyReports?.forEach { it.patient = patientPseudonym - it.tumorMorphology.patient = patientPseudonym + it.tumorMorphology?.patient = patientPseudonym } - this.lastGuidelineTherapies.forEach { it.patient = patientPseudonym } - this.molecularPathologyFindings.forEach { it.patient = patientPseudonym } - this.molecularTherapies.forEach { molecularTherapy -> molecularTherapy.history.forEach { it.patient = patientPseudonym } } - this.ngsReports.forEach { it.patient = patientPseudonym } - this.previousGuidelineTherapies.forEach { it.patient = patientPseudonym } - this.rebiopsyRequests.forEach { it.patient = patientPseudonym } - this.recommendations.forEach { it.patient = patientPseudonym } - this.responses.forEach { it.patient = patientPseudonym } - this.studyInclusionRequests.forEach { it.patient = patientPseudonym } - this.specimens.forEach { it.patient = patientPseudonym } + this.lastGuidelineTherapies?.forEach { it.patient = patientPseudonym } + this.molecularPathologyFindings?.forEach { it.patient = patientPseudonym } + this.molecularTherapies?.forEach { molecularTherapy -> molecularTherapy.history.forEach { it.patient = patientPseudonym } } + this.ngsReports?.forEach { it.patient = patientPseudonym } + this.previousGuidelineTherapies?.forEach { it.patient = patientPseudonym } + this.rebiopsyRequests?.forEach { it.patient = patientPseudonym } + this.recommendations?.forEach { it.patient = patientPseudonym } + this.responses?.forEach { it.patient = patientPseudonym } + this.studyInclusionRequests?.forEach { it.patient = patientPseudonym } + this.specimens?.forEach { it.patient = patientPseudonym } } /** diff --git a/src/test/kotlin/dev/dnpm/etl/processor/pseudonym/ExtensionsTest.kt b/src/test/kotlin/dev/dnpm/etl/processor/pseudonym/ExtensionsTest.kt index c980635..d8c7813 100644 --- a/src/test/kotlin/dev/dnpm/etl/processor/pseudonym/ExtensionsTest.kt +++ b/src/test/kotlin/dev/dnpm/etl/processor/pseudonym/ExtensionsTest.kt @@ -134,4 +134,65 @@ class ExtensionsTest { .isEqualTo("TESTDOMAIN44e20a53bbbf9f3ae39626d05df7014dcd77d6098") } + @Test + fun shouldNotThrowExceptionOnNullValues(@Mock pseudonymizeService: PseudonymizeService) { + doAnswer { + it.arguments[0] + "PSEUDO-ID" + }.whenever(pseudonymizeService).patientPseudonym(ArgumentMatchers.anyString()) + + doAnswer { + "TESTDOMAIN" + }.whenever(pseudonymizeService).prefix() + + val mtbFile = MtbFile.builder() + .withPatient( + Patient.builder() + .withId("1") + .withBirthDate("2000-08-08") + .withGender(Patient.Gender.MALE) + .build() + ) + .withConsent( + Consent.builder() + .withId("1") + .withStatus(Consent.Status.ACTIVE) + .withPatient("123") + .build() + ) + .withEpisode( + Episode.builder() + .withId("1") + .withPatient("1") + .withPeriod(PeriodStart("2023-08-08")) + .build() + ) + .withClaims(null) + .withDiagnoses(null) + .withCarePlans(null) + .withClaimResponses(null) + .withEcogStatus(null) + .withFamilyMemberDiagnoses(null) + .withGeneticCounsellingRequests(null) + .withHistologyReevaluationRequests(null) + .withHistologyReports(null) + .withLastGuidelineTherapies(null) + .withMolecularPathologyFindings(null) + .withMolecularTherapies(null) + .withNgsReports(null) + .withPreviousGuidelineTherapies(null) + .withRebiopsyRequests(null) + .withRecommendations(null) + .withResponses(null) + .withStudyInclusionRequests(null) + .withSpecimens(null) + .build() + + mtbFile.pseudonymizeWith(pseudonymizeService) + mtbFile.anonymizeContentWith(pseudonymizeService) + + + assertThat(mtbFile.episode.id).isNotNull() + } + } \ No newline at end of file