diff options
| author | Paul-Christian Volkmer | 2026-06-02 13:59:37 +0200 |
|---|---|---|
| committer | Paul-Christian Volkmer | 2026-06-02 13:59:37 +0200 |
| commit | 7a77574432e79469fa704ac1167e3a3c9a3745d1 (patch) | |
| tree | 49998d3cdffa5a501b94d4de3cb8f8313a3ff39d /src | |
| parent | 401864411103b04b44c7ba264558716822517c2b (diff) | |
feat!: change data model librarychange-data-model
Since DNPM Datenmodell 2.1 changes from time to time,
use a (mostly) autogenerated library based on JSON schema.
Diffstat (limited to 'src')
25 files changed, 398 insertions, 307 deletions
diff --git a/src/integrationTest/kotlin/dev/dnpm/etl/processor/EtlProcessorApplicationTests.kt b/src/integrationTest/kotlin/dev/dnpm/etl/processor/EtlProcessorApplicationTests.kt index 248f889..9f1e183 100644 --- a/src/integrationTest/kotlin/dev/dnpm/etl/processor/EtlProcessorApplicationTests.kt +++ b/src/integrationTest/kotlin/dev/dnpm/etl/processor/EtlProcessorApplicationTests.kt @@ -24,7 +24,16 @@ import dev.dnpm.etl.processor.monitoring.RequestRepository import dev.dnpm.etl.processor.monitoring.RequestStatus import dev.dnpm.etl.processor.output.DnpmV2MtbFileRequest import dev.dnpm.etl.processor.output.MtbFileSender -import dev.pcvolkmer.mv64e.mtb.* +import dev.pcvolkmer.mv64e.model.Coding +import dev.pcvolkmer.mv64e.model.ConsentProvisionType +import dev.pcvolkmer.mv64e.model.ModelProjectConsentPurpose +import dev.pcvolkmer.mv64e.model.MtbDiagnosis +import dev.pcvolkmer.mv64e.model.MvhMetadata +import dev.pcvolkmer.mv64e.model.MvhMetadataModelProjectConsent +import dev.pcvolkmer.mv64e.model.MvhMetadataModelProjectConsentProvisionsInner +import dev.pcvolkmer.mv64e.model.Patient +import dev.pcvolkmer.mv64e.model.PatientRecord +import dev.pcvolkmer.mv64e.model.Reference import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Nested @@ -105,16 +114,16 @@ class EtlProcessorApplicationTests : AbstractTestcontainerTest() { .send(any<DnpmV2MtbFileRequest>()) val mtbFile = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("TEST_12345678").build()) .metadata( MvhMetadata.builder() .modelProjectConsent( - ModelProjectConsent.builder() + MvhMetadataModelProjectConsent.builder() .provisions( listOf( - Provision.builder() - .type(ConsentProvision.PERMIT) + MvhMetadataModelProjectConsentProvisionsInner.builder() + .type(ConsentProvisionType.PERMIT) .purpose(ModelProjectConsentPurpose.SEQUENCING) .build() ) diff --git a/src/integrationTest/kotlin/dev/dnpm/etl/processor/input/MtbFileRestControllerTest.kt b/src/integrationTest/kotlin/dev/dnpm/etl/processor/input/MtbFileRestControllerTest.kt index ba793f2..a9427b7 100644 --- a/src/integrationTest/kotlin/dev/dnpm/etl/processor/input/MtbFileRestControllerTest.kt +++ b/src/integrationTest/kotlin/dev/dnpm/etl/processor/input/MtbFileRestControllerTest.kt @@ -29,7 +29,11 @@ import dev.dnpm.etl.processor.consent.TtpConsentStatus import dev.dnpm.etl.processor.security.TokenRepository import dev.dnpm.etl.processor.security.UserRoleRepository import dev.dnpm.etl.processor.services.RequestProcessor -import dev.pcvolkmer.mv64e.mtb.* +import dev.pcvolkmer.mv64e.model.MtbEpisodeOfCare +import dev.pcvolkmer.mv64e.model.Patient +import dev.pcvolkmer.mv64e.model.PatientRecord +import dev.pcvolkmer.mv64e.model.PeriodDate +import dev.pcvolkmer.mv64e.model.Reference import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Nested @@ -112,7 +116,7 @@ class MtbFileRestControllerTest { ] ) fun testShouldGrantPermissionToSendMtbFile(url: String) { - whenever { requestProcessor.processMtbFile(any<Mtb>()) }.thenReturn(true) + whenever { requestProcessor.processMtbFile(any<PatientRecord>()) }.thenReturn(true) mockMvc .post(url) { @@ -122,7 +126,7 @@ class MtbFileRestControllerTest { } .andExpect { status { isAccepted() } } - verify(requestProcessor, times(1)).processMtbFile(any<Mtb>()) + verify(requestProcessor, times(1)).processMtbFile(any<PatientRecord>()) } @ParameterizedTest @@ -140,7 +144,7 @@ class MtbFileRestControllerTest { ] ) fun testShouldGrantPermissionToSendMtbFileToAdminUser(url: String) { - whenever { requestProcessor.processMtbFile(any<Mtb>()) }.thenReturn(true) + whenever { requestProcessor.processMtbFile(any<PatientRecord>()) }.thenReturn(true) mockMvc .post(url) { @@ -150,7 +154,7 @@ class MtbFileRestControllerTest { } .andExpect { status { isAccepted() } } - verify(requestProcessor, times(1)).processMtbFile(any<Mtb>()) + verify(requestProcessor, times(1)).processMtbFile(any<PatientRecord>()) } @ParameterizedTest @@ -168,7 +172,7 @@ class MtbFileRestControllerTest { ] ) fun testShouldGrantPermissionToSendMtbFileToUser(url: String) { - whenever { requestProcessor.processMtbFile(any<Mtb>()) }.thenReturn(true) + whenever { requestProcessor.processMtbFile(any<PatientRecord>()) }.thenReturn(true) mockMvc .post(url) { @@ -178,7 +182,7 @@ class MtbFileRestControllerTest { } .andExpect { status { isAccepted() } } - verify(requestProcessor, times(1)).processMtbFile(any<Mtb>()) + verify(requestProcessor, times(1)).processMtbFile(any<PatientRecord>()) } @ParameterizedTest @@ -203,7 +207,7 @@ class MtbFileRestControllerTest { } .andExpect { status { isUnauthorized() } } - verify(requestProcessor, never()).processMtbFile(any<Mtb>()) + verify(requestProcessor, never()).processMtbFile(any<PatientRecord>()) } @ParameterizedTest @@ -269,7 +273,7 @@ class MtbFileRestControllerTest { } .andExpect { status { isBadRequest() } } - val result = verify(requestProcessor, times(1)).processMtbFile(any<Mtb>()) + val result = verify(requestProcessor, times(1)).processMtbFile(any<PatientRecord>()) assertThat(result).isFalse() } @@ -301,7 +305,7 @@ class MtbFileRestControllerTest { ] ) fun testShouldGrantPermissionToSendMtbFileToAdminUser(url: String) { - whenever { requestProcessor.processMtbFile(any<Mtb>()) }.thenReturn(true) + whenever { requestProcessor.processMtbFile(any<PatientRecord>()) }.thenReturn(true) mockMvc .post(url) { @@ -311,7 +315,7 @@ class MtbFileRestControllerTest { } .andExpect { status { isAccepted() } } - verify(requestProcessor, times(1)).processMtbFile(any<Mtb>()) + verify(requestProcessor, times(1)).processMtbFile(any<PatientRecord>()) } @ParameterizedTest @@ -329,7 +333,7 @@ class MtbFileRestControllerTest { ] ) fun testShouldGrantPermissionToSendMtbFileToUser(url: String) { - whenever { requestProcessor.processMtbFile(any<Mtb>()) }.thenReturn(true) + whenever { requestProcessor.processMtbFile(any<PatientRecord>()) }.thenReturn(true) mockMvc .post(url) { @@ -339,14 +343,14 @@ class MtbFileRestControllerTest { } .andExpect { status { isAccepted() } } - verify(requestProcessor, times(1)).processMtbFile(any<Mtb>()) + verify(requestProcessor, times(1)).processMtbFile(any<PatientRecord>()) } } companion object { val mtbFile = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("PID").build()) .episodesOfCare( listOf( diff --git a/src/integrationTest/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt b/src/integrationTest/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt index 9c94c4a..2e42174 100644 --- a/src/integrationTest/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt +++ b/src/integrationTest/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt @@ -25,7 +25,12 @@ import dev.dnpm.etl.processor.config.* import dev.dnpm.etl.processor.consent.ConsentEvaluator import dev.dnpm.etl.processor.monitoring.ReportService import dev.dnpm.etl.processor.monitoring.RequestStatus -import dev.pcvolkmer.mv64e.mtb.* +import dev.pcvolkmer.mv64e.model.GenderCoding +import dev.pcvolkmer.mv64e.model.MtbEpisodeOfCare +import dev.pcvolkmer.mv64e.model.Patient +import dev.pcvolkmer.mv64e.model.PatientRecord +import dev.pcvolkmer.mv64e.model.PeriodDate +import dev.pcvolkmer.mv64e.model.Reference import org.assertj.core.api.Assertions.assertThat import org.hamcrest.CoreMatchers.not import org.hamcrest.Matchers.containsString @@ -121,13 +126,13 @@ class RestDipMtbFileSenderTest { } companion object { - fun dnpmV2MtbFile(): Mtb { - return Mtb().apply { + fun dnpmV2MtbFile(): PatientRecord { + return PatientRecord().apply { this.patient = Patient().apply { this.id = "PID" this.birthDate = Date.from(Instant.now()) - this.gender = GenderCoding().apply { this.code = GenderCodingCode.MALE } + this.gender = GenderCoding().apply { this.code = GenderCoding.CodeEnum.MALE } } this.episodesOfCare = listOf( diff --git a/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt b/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt index 3e88ffd..d780642 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt @@ -20,7 +20,6 @@ package dev.dnpm.etl.processor.config -import com.fasterxml.jackson.databind.ObjectMapper import dev.dnpm.etl.processor.consent.GicsConsentService import dev.dnpm.etl.processor.consent.GicsGetBroadConsentService import dev.dnpm.etl.processor.consent.IConsentService diff --git a/src/main/kotlin/dev/dnpm/etl/processor/consent/ConsentEvaluator.kt b/src/main/kotlin/dev/dnpm/etl/processor/consent/ConsentEvaluator.kt index a8b8fdb..1f867e8 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/consent/ConsentEvaluator.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/consent/ConsentEvaluator.kt @@ -20,9 +20,9 @@ package dev.dnpm.etl.processor.consent -import dev.pcvolkmer.mv64e.mtb.ConsentProvision -import dev.pcvolkmer.mv64e.mtb.ModelProjectConsentPurpose -import dev.pcvolkmer.mv64e.mtb.Mtb +import dev.pcvolkmer.mv64e.model.ConsentProvisionType +import dev.pcvolkmer.mv64e.model.ModelProjectConsentPurpose +import dev.pcvolkmer.mv64e.model.PatientRecord import org.springframework.stereotype.Service /** Evaluates consent using provided consent service and file based consent information */ @@ -30,8 +30,8 @@ import org.springframework.stereotype.Service class ConsentEvaluator( private val consentService: IConsentService, ) { - fun check(mtbFile: Mtb): ConsentEvaluation { - val ttpConsentStatus = consentService.getTtpBroadConsentStatus(mtbFile.patient.id) + fun check(mtbFile: PatientRecord): ConsentEvaluation { + val ttpConsentStatus = consentService.getTtpBroadConsentStatus(mtbFile.patient!!.id) val consentGiven = ttpConsentStatus == TtpConsentStatus.BROAD_CONSENT_GIVEN || ttpConsentStatus == TtpConsentStatus.GENOM_DE_CONSENT_SEQUENCING_PERMIT || @@ -39,7 +39,7 @@ class ConsentEvaluator( ttpConsentStatus == TtpConsentStatus.UNKNOWN_CHECK_FILE && mtbFile.metadata?.modelProjectConsent?.provisions?.any { it.purpose == ModelProjectConsentPurpose.SEQUENCING && - it.type == ConsentProvision.PERMIT + it.type == ConsentProvisionType.PERMIT } == true return ConsentEvaluation(ttpConsentStatus, consentGiven) diff --git a/src/main/kotlin/dev/dnpm/etl/processor/input/KafkaInputListener.kt b/src/main/kotlin/dev/dnpm/etl/processor/input/KafkaInputListener.kt index a126e07..51d093b 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/input/KafkaInputListener.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/input/KafkaInputListener.kt @@ -26,7 +26,7 @@ import dev.dnpm.etl.processor.RequestId import dev.dnpm.etl.processor.consent.ConsentEvaluator import dev.dnpm.etl.processor.consent.TtpConsentStatus import dev.dnpm.etl.processor.services.RequestProcessor -import dev.pcvolkmer.mv64e.mtb.Mtb +import dev.pcvolkmer.mv64e.model.PatientRecord import org.apache.kafka.clients.consumer.ConsumerRecord import org.slf4j.LoggerFactory import org.springframework.http.MediaType @@ -72,8 +72,8 @@ class KafkaInputListener( private fun handleDnpmV2Message(record: ConsumerRecord<String, String>) { try { - val mtbFile = jsonMapper.readValue(record.value(), Mtb::class.java) - val patientId = PatientId(mtbFile.patient.id) + val mtbFile = jsonMapper.readValue(record.value(), PatientRecord::class.java) + val patientId = PatientId(mtbFile.patient!!.id) val firstRequestIdHeader = record.headers().headers("requestId")?.firstOrNull() val requestId = if (null != firstRequestIdHeader) { @@ -106,7 +106,7 @@ class KafkaInputListener( } } catch (e: Exception) { logger.error("Error while processing MtbFile", e) - requestProcessor.processMtbFile(Mtb.builder().build()) + requestProcessor.processMtbFile(PatientRecord.builder().build()) } } } diff --git a/src/main/kotlin/dev/dnpm/etl/processor/input/MtbFileRestController.kt b/src/main/kotlin/dev/dnpm/etl/processor/input/MtbFileRestController.kt index 47f0766..7ab846a 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/input/MtbFileRestController.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/input/MtbFileRestController.kt @@ -22,10 +22,9 @@ package dev.dnpm.etl.processor.input import dev.dnpm.etl.processor.CustomMediaType import dev.dnpm.etl.processor.PatientId -import dev.dnpm.etl.processor.consent.ConsentEvaluator import dev.dnpm.etl.processor.consent.TtpConsentStatus import dev.dnpm.etl.processor.services.RequestProcessor -import dev.pcvolkmer.mv64e.mtb.Mtb +import dev.pcvolkmer.mv64e.model.PatientRecord import org.slf4j.LoggerFactory import org.springframework.http.MediaType import org.springframework.http.ResponseEntity @@ -52,7 +51,7 @@ class MtbFileRestController( CustomMediaType.APPLICATION_VND_DNPM_V2_MTB_JSON_VALUE, ], ) - fun mtbFile(@RequestBody mtbFile: Mtb): ResponseEntity<Unit> { + fun mtbFile(@RequestBody mtbFile: PatientRecord): ResponseEntity<Unit> { logger.debug("Accepted MTB File (DNPM V2) for processing") if (requestProcessor.processMtbFile(mtbFile)) { return ResponseEntity.accepted().build() @@ -80,7 +79,7 @@ class MtbFileRestControllerAdvice( @ExceptionHandler(HttpMessageNotReadableException::class) fun handleMessageNotReadableException(e: Exception): ResponseEntity<Unit> { logger.error("Error while processing MtbFile", e) - requestProcessor.processMtbFile(Mtb.builder().build()) + requestProcessor.processMtbFile(PatientRecord.builder().build()) return ResponseEntity.badRequest().build() } diff --git a/src/main/kotlin/dev/dnpm/etl/processor/output/KafkaMtbFileSender.kt b/src/main/kotlin/dev/dnpm/etl/processor/output/KafkaMtbFileSender.kt index 8c20b7c..e198952 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/output/KafkaMtbFileSender.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/output/KafkaMtbFileSender.kt @@ -23,8 +23,8 @@ package dev.dnpm.etl.processor.output import dev.dnpm.etl.processor.CustomMediaType import dev.dnpm.etl.processor.config.KafkaProperties import dev.dnpm.etl.processor.monitoring.RequestStatus -import dev.pcvolkmer.mv64e.mtb.Mtb -import dev.pcvolkmer.mv64e.mtb.MvhMetadata +import dev.pcvolkmer.mv64e.model.MvhMetadata +import dev.pcvolkmer.mv64e.model.PatientRecord import org.apache.kafka.clients.producer.ProducerRecord import org.slf4j.LoggerFactory import org.springframework.kafka.core.KafkaTemplate @@ -75,7 +75,7 @@ class KafkaMtbFileSender( } override fun send(request: DeleteRequest): MtbFileSender.Response { - val dummyMtbFile = Mtb.builder().metadata(MvhMetadata()).build() + val dummyMtbFile = PatientRecord.builder().metadata(MvhMetadata()).build() return try { return retryTemplate.execute<MtbFileSender.Response, Exception> { @@ -114,7 +114,7 @@ class KafkaMtbFileSender( private fun key(request: MtbRequest): String = when (request) { - is DnpmV2MtbFileRequest -> "{\"pid\": \"${request.content.patient.id}\"}" + is DnpmV2MtbFileRequest -> "{\"pid\": \"${request.content.patient?.id}\"}" is DeleteRequest -> "{\"pid\": \"${request.patientId.value}\"}" else -> throw IllegalArgumentException("Unsupported request type: ${request::class.simpleName}") diff --git a/src/main/kotlin/dev/dnpm/etl/processor/output/MtbRequest.kt b/src/main/kotlin/dev/dnpm/etl/processor/output/MtbRequest.kt index 75401e6..e066d54 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/output/MtbRequest.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/output/MtbRequest.kt @@ -22,7 +22,7 @@ package dev.dnpm.etl.processor.output import dev.dnpm.etl.processor.PatientPseudonym import dev.dnpm.etl.processor.RequestId -import dev.pcvolkmer.mv64e.mtb.Mtb +import dev.pcvolkmer.mv64e.model.PatientRecord interface MtbRequest { val requestId: RequestId @@ -37,9 +37,9 @@ sealed interface MtbFileRequest<out T> : MtbRequest { data class DnpmV2MtbFileRequest( override val requestId: RequestId, - override val content: Mtb, -) : MtbFileRequest<Mtb> { - override fun patientPseudonym(): PatientPseudonym = PatientPseudonym(content.patient.id) + override val content: PatientRecord, +) : MtbFileRequest<PatientRecord> { + override fun patientPseudonym(): PatientPseudonym = PatientPseudonym(content.patient!!.id) } data class DeleteRequest( 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 6615b35..21f3a7f 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/pseudonym/extensions.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/pseudonym/extensions.kt @@ -21,9 +21,9 @@ package dev.dnpm.etl.processor.pseudonym import dev.dnpm.etl.processor.PatientId -import dev.pcvolkmer.mv64e.mtb.ModelProjectConsent -import dev.pcvolkmer.mv64e.mtb.Mtb -import dev.pcvolkmer.mv64e.mtb.MvhMetadata +import dev.pcvolkmer.mv64e.model.MvhMetadata +import dev.pcvolkmer.mv64e.model.MvhMetadataModelProjectConsent +import dev.pcvolkmer.mv64e.model.PatientRecord import org.apache.commons.codec.digest.DigestUtils /** @@ -33,8 +33,8 @@ import org.apache.commons.codec.digest.DigestUtils * @return The MTB file containing patient pseudonymes * @since 0.11.0 */ -infix fun Mtb.pseudonymizeWith(pseudonymizeService: PseudonymizeService) { - val patientPseudonym = pseudonymizeService.patientPseudonym(PatientId(this.patient.id)).value +infix fun PatientRecord.pseudonymizeWith(pseudonymizeService: PseudonymizeService) { + val patientPseudonym = pseudonymizeService.patientPseudonym(PatientId(this.patient!!.id)).value this.episodesOfCare?.filterNotNull()?.forEach { it.patient?.id = patientPseudonym } this.carePlans?.filterNotNull()?.forEach { carePlan -> @@ -57,7 +57,7 @@ infix fun Mtb.pseudonymizeWith(pseudonymizeService: PseudonymizeService) { this.diagnoses?.filterNotNull()?.forEach { it.patient?.id = patientPseudonym } this.guidelineTherapies?.filterNotNull()?.forEach { it.patient?.id = patientPseudonym } this.guidelineProcedures?.filterNotNull()?.forEach { it.patient?.id = patientPseudonym } - this.patient.id = patientPseudonym + this.patient?.id = patientPseudonym this.claims?.filterNotNull()?.forEach { it.patient?.id = patientPseudonym } this.claimResponses?.filterNotNull()?.forEach { it.patient?.id = patientPseudonym } this.familyMemberHistories?.filterNotNull()?.forEach { it.patient?.id = patientPseudonym } @@ -116,7 +116,7 @@ infix fun Mtb.pseudonymizeWith(pseudonymizeService: PseudonymizeService) { * @return The MTB file containing rehashed content IDs * @since 0.11.0 */ -infix fun Mtb.anonymizeContentWith(pseudonymizeService: PseudonymizeService) { +infix fun PatientRecord.anonymizeContentWith(pseudonymizeService: PseudonymizeService) { val prefix = pseudonymizeService.prefix() fun anonymize(id: String): String { @@ -280,25 +280,25 @@ infix fun Mtb.anonymizeContentWith(pseudonymizeService: PseudonymizeService) { } } -fun Mtb.ensureMetaDataIsInitialized() { +fun PatientRecord.ensureMetaDataIsInitialized() { // init metadata if necessary if (this.metadata == null) { val mvhMetadata = MvhMetadata.builder().build() this.metadata = mvhMetadata } - if (this.metadata.researchConsents == null) { - this.metadata.researchConsents = mutableListOf() + if (this.metadata?.researchConsents == null) { + this.metadata?.researchConsents = mutableListOf() } - if (this.metadata.modelProjectConsent == null) { - this.metadata.modelProjectConsent = ModelProjectConsent() - this.metadata.modelProjectConsent.provisions = mutableListOf() - } else if (this.metadata.modelProjectConsent.provisions != null) { + if (this.metadata?.modelProjectConsent == null) { + this.metadata?.modelProjectConsent = MvhMetadataModelProjectConsent() + this.metadata?.modelProjectConsent?.provisions = mutableListOf() + } else if (this.metadata?.modelProjectConsent?.provisions != null) { // make sure list can be changed - this.metadata.modelProjectConsent.provisions = - this.metadata.modelProjectConsent.provisions.toMutableList() + this.metadata?.modelProjectConsent?.provisions = + this.metadata?.modelProjectConsent?.provisions?.toMutableList() } } -infix fun Mtb.addGenomDeTan(pseudonymizeService: PseudonymizeService) { - this.metadata?.transferTan = pseudonymizeService.genomDeTan(PatientId(this.patient.id)) +infix fun PatientRecord.addGenomDeTan(pseudonymizeService: PseudonymizeService) { + this.metadata?.transferTAN = pseudonymizeService.genomDeTan(PatientId(this.patient!!.id)) } diff --git a/src/main/kotlin/dev/dnpm/etl/processor/services/ConsentProcessor.kt b/src/main/kotlin/dev/dnpm/etl/processor/services/ConsentProcessor.kt index a95420a..15ccdc4 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/services/ConsentProcessor.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/services/ConsentProcessor.kt @@ -28,7 +28,13 @@ import dev.dnpm.etl.processor.consent.ConsentDomain import dev.dnpm.etl.processor.consent.IConsentService import dev.dnpm.etl.processor.consent.MtbFileConsentService import dev.dnpm.etl.processor.pseudonym.ensureMetaDataIsInitialized -import dev.pcvolkmer.mv64e.mtb.* +import dev.pcvolkmer.mv64e.model.ConsentProvisionType +import dev.pcvolkmer.mv64e.model.ModelProjectConsentPurpose +import dev.pcvolkmer.mv64e.model.MvhMetadata +import dev.pcvolkmer.mv64e.model.MvhMetadataModelProjectConsentProvisionsInner +import dev.pcvolkmer.mv64e.model.MvhSubmissionType +import dev.pcvolkmer.mv64e.model.PatientRecord +import dev.pcvolkmer.mv64e.model.ResearchConsent import org.apache.commons.lang3.NotImplementedException import org.hl7.fhir.r4.model.* import org.hl7.fhir.r4.model.Bundle.BundleEntryComponent @@ -65,7 +71,7 @@ class ConsentProcessor( * @param mtbFile File v2 (will be enriched with consent data) * @return true if consent is given */ - fun consentGatedCheckAndTryEmbedding(mtbFile: Mtb): Boolean { + fun consentGatedCheckAndTryEmbedding(mtbFile: PatientRecord): Boolean { mtbFile.ensureMetaDataIsInitialized() if (consentService is MtbFileConsentService) { @@ -73,7 +79,7 @@ class ConsentProcessor( return true } - val personIdentifierValue = mtbFile.patient.id + val personIdentifierValue = mtbFile.patient!!.id val requestDate = Date.from(Instant.now(Clock.systemUTC())) // 1. Broad consent Entry exists? @@ -129,7 +135,7 @@ class ConsentProcessor( return false } - fun embedBroadConsentResources(mtbFile: Mtb, broadConsent: Bundle) { + fun embedBroadConsentResources(mtbFile: PatientRecord, broadConsent: Bundle) { for (entry in broadConsent.entry) { val resource = entry.resource if (resource is Consent) { @@ -137,12 +143,12 @@ class ConsentProcessor( // we need another step to back to string, before we convert to object map val asJsonString = fhirContext.newJsonParser().encodeResourceToString(resource) try { - val mapOfJson: MvhMetadata.ResearchConsent? = + val mapOfJson: ResearchConsent? = jsonMapper.readValue( asJsonString, - MvhMetadata.ResearchConsent::class.java, + ResearchConsent::class.java, ) - mtbFile.metadata.researchConsents.add(mapOfJson) + mtbFile.metadata?.researchConsents?.add(mapOfJson) } catch (e: JsonProcessingException) { throw RuntimeException(e) } @@ -150,7 +156,7 @@ class ConsentProcessor( } } - fun addGenomeDbProvisions(mtbFile: Mtb, consentGnomeDe: Bundle) { + fun addGenomeDbProvisions(mtbFile: PatientRecord, consentGnomeDe: Bundle) { for (entry in consentGnomeDe.entry) { val resource = entry.resource if (resource !is Consent) { @@ -167,22 +173,22 @@ class ConsentProcessor( val provisionCode = getProvisionCode(provisionComponent) if (provisionCode != null) { try { - val modelProjectConsentPurpose = ModelProjectConsentPurpose.forValue(provisionCode) + val modelProjectConsentPurpose = ModelProjectConsentPurpose.fromValue(provisionCode) if (ModelProjectConsentPurpose.SEQUENCING == modelProjectConsentPurpose) { // CONVENTION: wrapping date is date of SEQUENCING consent - mtbFile.metadata.modelProjectConsent.date = resource.dateTime + mtbFile.metadata?.modelProjectConsent?.date = resource.dateTime } val provision = - Provision.builder() - .type(ConsentProvision.valueOf(provisionComponent.type.name)) + MvhMetadataModelProjectConsentProvisionsInner.builder() + .type(ConsentProvisionType.valueOf(provisionComponent.type.name)) .date(provisionComponent.period.start) .purpose(modelProjectConsentPurpose) .build() - mtbFile.metadata.modelProjectConsent.provisions.add(provision) - } catch (ioe: IOException) { + mtbFile.metadata?.modelProjectConsent?.provisions?.add(provision) + } catch (ioe: IllegalArgumentException) { logger.error( "Provision code '$provisionCode' is unknown and cannot be mapped.", ioe.toString(), @@ -190,8 +196,8 @@ class ConsentProcessor( } } - if (mtbFile.metadata.modelProjectConsent.provisions.isNotEmpty()) { - mtbFile.metadata.modelProjectConsent.version = gIcsConfigProperties.genomeDeConsentVersion + if (mtbFile.metadata?.modelProjectConsent?.provisions?.isNotEmpty() == true) { + mtbFile.metadata?.modelProjectConsent?.version = gIcsConfigProperties.genomeDeConsentVersion } } } @@ -207,15 +213,15 @@ class ConsentProcessor( return provisionCode } - private fun setGenomDeSubmissionType(mtbFile: Mtb) { + private fun setGenomDeSubmissionType(mtbFile: PatientRecord) { if (appConfigProperties.genomDeTestSubmission) { - mtbFile.metadata.type = MvhSubmissionType.TEST + mtbFile.metadata?.type = MvhSubmissionType.TEST logger.info("genomeDe submission mit TEST") } else { - mtbFile.metadata.type = - when (mtbFile.metadata.type) { + mtbFile.metadata?.type = + when (mtbFile.metadata?.type) { null -> MvhSubmissionType.INITIAL - else -> mtbFile.metadata.type + else -> mtbFile.metadata?.type } } } diff --git a/src/main/kotlin/dev/dnpm/etl/processor/services/RequestProcessor.kt b/src/main/kotlin/dev/dnpm/etl/processor/services/RequestProcessor.kt index 4b7afff..c152d0f 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/services/RequestProcessor.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/services/RequestProcessor.kt @@ -32,8 +32,8 @@ import dev.dnpm.etl.processor.pseudonym.PseudonymizeService import dev.dnpm.etl.processor.pseudonym.addGenomDeTan import dev.dnpm.etl.processor.pseudonym.anonymizeContentWith import dev.dnpm.etl.processor.pseudonym.pseudonymizeWith -import dev.pcvolkmer.mv64e.mtb.Mtb -import dev.pcvolkmer.mv64e.mtb.MvhSubmissionType +import dev.pcvolkmer.mv64e.model.MvhSubmissionType +import dev.pcvolkmer.mv64e.model.PatientRecord import org.apache.commons.codec.binary.Base32 import org.apache.commons.codec.digest.DigestUtils import org.slf4j.Logger @@ -58,11 +58,11 @@ class RequestProcessor( private var logger: Logger = LoggerFactory.getLogger("RequestProcessor") - fun processMtbFile(mtbFile: Mtb): Boolean { + fun processMtbFile(mtbFile: PatientRecord): Boolean { return processMtbFile(mtbFile, randomRequestId()) } - fun processMtbFile(mtbFile: Mtb, requestId: RequestId): Boolean { + fun processMtbFile(mtbFile: PatientRecord, requestId: RequestId): Boolean { val isConsentOk = consentProcessor != null && consentProcessor.consentGatedCheckAndTryEmbedding(mtbFile) || consentProcessor == null @@ -127,7 +127,7 @@ class RequestProcessor( RequestType.MTB_FILE, submissionType, RequestStatus.BLOCKED_INITIAL, - Tan(request.content.metadata?.transferTan.orEmpty()) + Tan(request.content.metadata?.transferTAN.orEmpty()) ) ) // Exit - no further processing @@ -164,7 +164,7 @@ class RequestProcessor( RequestType.MTB_FILE, submissionType, RequestStatus.UNKNOWN, - Tan(request.content.metadata?.transferTan.orEmpty()), + Tan(request.content.metadata?.transferTAN.orEmpty()), ) ) @@ -229,7 +229,7 @@ class RequestProcessor( val patientPseudonym = when (pseudonymizedMtbFileRequest) { is DnpmV2MtbFileRequest -> - PatientPseudonym(pseudonymizedMtbFileRequest.content.patient.id) + PatientPseudonym(pseudonymizedMtbFileRequest.content.patient!!.id) } val lastMtbFileRequestForPatient = diff --git a/src/main/kotlin/dev/dnpm/etl/processor/services/TransformationService.kt b/src/main/kotlin/dev/dnpm/etl/processor/services/TransformationService.kt index 755e6b3..d6318ce 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/services/TransformationService.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/services/TransformationService.kt @@ -22,16 +22,16 @@ package dev.dnpm.etl.processor.services import com.jayway.jsonpath.JsonPath import com.jayway.jsonpath.PathNotFoundException -import dev.pcvolkmer.mv64e.mtb.Mtb +import dev.pcvolkmer.mv64e.model.PatientRecord import tools.jackson.databind.json.JsonMapper class TransformationService( private val jsonMapper: JsonMapper, private val transformations: List<Transformation>, ) { - fun transform(mtbFile: Mtb): Mtb { + fun transform(mtbFile: PatientRecord): PatientRecord { val json = transform(jsonMapper.writeValueAsString(mtbFile)) - return jsonMapper.readValue(json, Mtb::class.java) + return jsonMapper.readValue(json, PatientRecord::class.java) } private fun transform(content: String): String { diff --git a/src/test/kotlin/dev/dnpm/etl/processor/config/Jackson3ConfigTest.kt b/src/test/kotlin/dev/dnpm/etl/processor/config/Jackson3ConfigTest.kt index b940537..d543f87 100644 --- a/src/test/kotlin/dev/dnpm/etl/processor/config/Jackson3ConfigTest.kt +++ b/src/test/kotlin/dev/dnpm/etl/processor/config/Jackson3ConfigTest.kt @@ -21,8 +21,9 @@ package dev.dnpm.etl.processor.config import com.fasterxml.jackson.databind.node.ObjectNode -import dev.pcvolkmer.mv64e.mtb.Mtb -import dev.pcvolkmer.mv64e.mtb.MvhMetadata +import dev.pcvolkmer.mv64e.model.MvhMetadata +import dev.pcvolkmer.mv64e.model.PatientRecord +import dev.pcvolkmer.mv64e.model.ResearchConsent import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -78,10 +79,10 @@ class Jackson3ConfigTest { val inputConsentJson = Objects.requireNonNull(this.javaClass.classLoader.getResourceAsStream("fake_broadConsent_mii_response_permit.json"))?.readAllBytes()?.decodeToString() - val mtb = this.jacksonConfig.jsonMapper().readValue<Mtb>(inputMtbFileJson, Mtb::class.java) + val mtb = this.jacksonConfig.jsonMapper().readValue<PatientRecord>(inputMtbFileJson, PatientRecord::class.java) // Still use Jackson2 ObjectMapper since MTB DTO requires Jackson2 ObjectNode val consentJsonNode = Jackson2Config().objectMapper().readTree(inputConsentJson) - mtb.metadata = MvhMetadata.builder().researchConsents(listOf(MvhMetadata.ResearchConsent.from(consentJsonNode as ObjectNode))).build() + mtb.metadata = MvhMetadata.builder().researchConsents(listOf(ResearchConsent.from(consentJsonNode as ObjectNode))).build() val actual = this.jacksonConfig.jsonMapper().writeValueAsString(mtb) diff --git a/src/test/kotlin/dev/dnpm/etl/processor/config/JacksonConfigTest.kt b/src/test/kotlin/dev/dnpm/etl/processor/config/JacksonConfigTest.kt index e734c6f..4411e70 100644 --- a/src/test/kotlin/dev/dnpm/etl/processor/config/JacksonConfigTest.kt +++ b/src/test/kotlin/dev/dnpm/etl/processor/config/JacksonConfigTest.kt @@ -21,8 +21,9 @@ package dev.dnpm.etl.processor.config import com.fasterxml.jackson.databind.node.ObjectNode -import dev.pcvolkmer.mv64e.mtb.Mtb -import dev.pcvolkmer.mv64e.mtb.MvhMetadata +import dev.pcvolkmer.mv64e.model.MvhMetadata +import dev.pcvolkmer.mv64e.model.PatientRecord +import dev.pcvolkmer.mv64e.model.ResearchConsent import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -78,9 +79,9 @@ class JacksonConfigTest { val inputConsentJson = Objects.requireNonNull(this.javaClass.classLoader.getResourceAsStream("fake_broadConsent_mii_response_permit.json"))?.readAllBytes()?.decodeToString() - val mtb = this.jacksonConfig.objectMapper().readValue<Mtb>(inputMtbFileJson, Mtb::class.java) + val mtb = this.jacksonConfig.objectMapper().readValue<PatientRecord>(inputMtbFileJson, PatientRecord::class.java) val consentJsonNode = this.jacksonConfig.objectMapper().readTree(inputConsentJson) - mtb.metadata = MvhMetadata.builder().researchConsents(listOf(MvhMetadata.ResearchConsent.from(consentJsonNode as ObjectNode))).build() + mtb.metadata = MvhMetadata.builder().researchConsents(listOf(ResearchConsent.from(consentJsonNode as ObjectNode))).build() val actual = this.jacksonConfig.objectMapper().writeValueAsString(mtb) diff --git a/src/test/kotlin/dev/dnpm/etl/processor/consent/Dnpm21BasedConsentEvaluatorTest.kt b/src/test/kotlin/dev/dnpm/etl/processor/consent/Dnpm21BasedConsentEvaluatorTest.kt index 284c552..3cf54fe 100644 --- a/src/test/kotlin/dev/dnpm/etl/processor/consent/Dnpm21BasedConsentEvaluatorTest.kt +++ b/src/test/kotlin/dev/dnpm/etl/processor/consent/Dnpm21BasedConsentEvaluatorTest.kt @@ -21,7 +21,16 @@ package dev.dnpm.etl.processor.consent import dev.dnpm.etl.processor.ArgProvider -import dev.pcvolkmer.mv64e.mtb.* +import dev.pcvolkmer.mv64e.model.ConsentProvisionType +import dev.pcvolkmer.mv64e.model.GenderCoding +import dev.pcvolkmer.mv64e.model.ModelProjectConsentPurpose +import dev.pcvolkmer.mv64e.model.MtbEpisodeOfCare +import dev.pcvolkmer.mv64e.model.MvhMetadata +import dev.pcvolkmer.mv64e.model.MvhMetadataModelProjectConsent +import dev.pcvolkmer.mv64e.model.MvhMetadataModelProjectConsentProvisionsInner +import dev.pcvolkmer.mv64e.model.Patient +import dev.pcvolkmer.mv64e.model.PatientRecord +import dev.pcvolkmer.mv64e.model.Reference import java.time.Instant import java.util.* import org.assertj.core.api.Assertions.assertThat @@ -54,7 +63,7 @@ class Dnpm21BasedConsentEvaluatorTest { @ParameterizedTest @ArgumentsSource(WithGicsMtbFileProvider::class) fun test( - mtbFile: Mtb, + mtbFile: PatientRecord, ttpConsentStatus: TtpConsentStatus, expectedConsentEvaluation: ConsentEvaluation, ) { @@ -77,7 +86,7 @@ class Dnpm21BasedConsentEvaluatorTest { @ParameterizedTest @ArgumentsSource(MtbFileProvider::class) - fun test(mtbFile: Mtb, expectedConsentEvaluation: ConsentEvaluation) { + fun test(mtbFile: PatientRecord, expectedConsentEvaluation: ConsentEvaluation) { assertThat(consentEvaluator.check(mtbFile)).isEqualTo(expectedConsentEvaluation) } } @@ -88,120 +97,120 @@ class Dnpm21BasedConsentEvaluatorTest { ArgProvider( // Has file ModelProjectConsent and broad consent => consent given Arguments.of( - buildMtb(ConsentProvision.PERMIT), + buildMtb(ConsentProvisionType.PERMIT), TtpConsentStatus.BROAD_CONSENT_GIVEN, ConsentEvaluation(TtpConsentStatus.BROAD_CONSENT_GIVEN, true), ), // Has file ModelProjectConsent and broad consent missing => no consent given Arguments.of( - buildMtb(ConsentProvision.PERMIT), + buildMtb(ConsentProvisionType.PERMIT), TtpConsentStatus.BROAD_CONSENT_MISSING, ConsentEvaluation(TtpConsentStatus.BROAD_CONSENT_MISSING, false), ), // Has file ModelProjectConsent and broad consent missing or rejected => no consent given Arguments.of( - buildMtb(ConsentProvision.PERMIT), + buildMtb(ConsentProvisionType.PERMIT), TtpConsentStatus.BROAD_CONSENT_MISSING_OR_REJECTED, ConsentEvaluation(TtpConsentStatus.BROAD_CONSENT_MISSING_OR_REJECTED, false), ), // Has file ModelProjectConsent and MV consent => consent given Arguments.of( - buildMtb(ConsentProvision.PERMIT), + buildMtb(ConsentProvisionType.PERMIT), TtpConsentStatus.GENOM_DE_CONSENT_SEQUENCING_PERMIT, ConsentEvaluation(TtpConsentStatus.GENOM_DE_CONSENT_SEQUENCING_PERMIT, true), ), // Has file ModelProjectConsent and MV consent rejected => no consent given Arguments.of( - buildMtb(ConsentProvision.PERMIT), + buildMtb(ConsentProvisionType.PERMIT), TtpConsentStatus.GENOM_DE_SEQUENCING_REJECTED, ConsentEvaluation(TtpConsentStatus.GENOM_DE_SEQUENCING_REJECTED, false), ), // Has file ModelProjectConsent and MV consent missing => no consent given Arguments.of( - buildMtb(ConsentProvision.PERMIT), + buildMtb(ConsentProvisionType.PERMIT), TtpConsentStatus.GENOM_DE_CONSENT_MISSING, ConsentEvaluation(TtpConsentStatus.GENOM_DE_CONSENT_MISSING, false), ), // Has file ModelProjectConsent and no broad consent result => consent given Arguments.of( - buildMtb(ConsentProvision.PERMIT), + buildMtb(ConsentProvisionType.PERMIT), TtpConsentStatus.UNKNOWN_CHECK_FILE, ConsentEvaluation(TtpConsentStatus.UNKNOWN_CHECK_FILE, true), ), // Has file ModelProjectConsent and failed to ask => no consent given Arguments.of( - buildMtb(ConsentProvision.PERMIT), + buildMtb(ConsentProvisionType.PERMIT), TtpConsentStatus.FAILED_TO_ASK, ConsentEvaluation(TtpConsentStatus.FAILED_TO_ASK, false), ), // File ModelProjectConsent rejected and broad consent => consent given Arguments.of( - buildMtb(ConsentProvision.DENY), + buildMtb(ConsentProvisionType.DENY), TtpConsentStatus.BROAD_CONSENT_GIVEN, ConsentEvaluation(TtpConsentStatus.BROAD_CONSENT_GIVEN, true), ), // File ModelProjectConsent rejected and broad consent missing => no consent given Arguments.of( - buildMtb(ConsentProvision.DENY), + buildMtb(ConsentProvisionType.DENY), TtpConsentStatus.BROAD_CONSENT_MISSING, ConsentEvaluation(TtpConsentStatus.BROAD_CONSENT_MISSING, false), ), // File ModelProjectConsent rejected and broad consent missing or rejected => no consent // given Arguments.of( - buildMtb(ConsentProvision.DENY), + buildMtb(ConsentProvisionType.DENY), TtpConsentStatus.BROAD_CONSENT_MISSING_OR_REJECTED, ConsentEvaluation(TtpConsentStatus.BROAD_CONSENT_MISSING_OR_REJECTED, false), ), // File ModelProjectConsent rejected and MV consent => consent given Arguments.of( - buildMtb(ConsentProvision.DENY), + buildMtb(ConsentProvisionType.DENY), TtpConsentStatus.GENOM_DE_CONSENT_SEQUENCING_PERMIT, ConsentEvaluation(TtpConsentStatus.GENOM_DE_CONSENT_SEQUENCING_PERMIT, true), ), // File ModelProjectConsent rejected and MV consent rejected => no consent given Arguments.of( - buildMtb(ConsentProvision.DENY), + buildMtb(ConsentProvisionType.DENY), TtpConsentStatus.GENOM_DE_SEQUENCING_REJECTED, ConsentEvaluation(TtpConsentStatus.GENOM_DE_SEQUENCING_REJECTED, false), ), // File ModelProjectConsent rejected and MV consent missing => no consent given Arguments.of( - buildMtb(ConsentProvision.DENY), + buildMtb(ConsentProvisionType.DENY), TtpConsentStatus.GENOM_DE_CONSENT_MISSING, ConsentEvaluation(TtpConsentStatus.GENOM_DE_CONSENT_MISSING, false), ), // File ModelProjectConsent rejected and no broad consent result => no consent given Arguments.of( - buildMtb(ConsentProvision.DENY), + buildMtb(ConsentProvisionType.DENY), TtpConsentStatus.UNKNOWN_CHECK_FILE, ConsentEvaluation(TtpConsentStatus.UNKNOWN_CHECK_FILE, false), ), // File ModelProjectConsent rejected and failed to ask => no consent given Arguments.of( - buildMtb(ConsentProvision.DENY), + buildMtb(ConsentProvisionType.DENY), TtpConsentStatus.FAILED_TO_ASK, ConsentEvaluation(TtpConsentStatus.FAILED_TO_ASK, false), ), ) { companion object { - fun buildMtb(consentProvision: ConsentProvision): Mtb { - return Mtb.builder() + fun buildMtb(consentProvision: ConsentProvisionType): PatientRecord { + return PatientRecord.builder() .patient( Patient.builder() .id("TEST_12345678") .birthDate(Date.from(Instant.parse("2000-08-08T12:34:56Z"))) - .gender(GenderCoding.builder().code(GenderCodingCode.MALE).build()) + .gender(GenderCoding.builder().code(GenderCoding.CodeEnum.MALE).build()) .build() ) .metadata( MvhMetadata.builder() .modelProjectConsent( - ModelProjectConsent.builder() + MvhMetadataModelProjectConsent.builder() .provisions( listOf( - Provision.builder() + MvhMetadataModelProjectConsentProvisionsInner.builder() .date(Date()) .type(consentProvision) .purpose(ModelProjectConsentPurpose.SEQUENCING) @@ -229,55 +238,55 @@ class Dnpm21BasedConsentEvaluatorTest { ArgProvider( // Has file consent => consent given Arguments.of( - buildMtb(ConsentProvision.PERMIT), + buildMtb(ConsentProvisionType.PERMIT), ConsentEvaluation(TtpConsentStatus.UNKNOWN_CHECK_FILE, true), ), // File consent rejected => no consent given Arguments.of( - buildMtb(ConsentProvision.DENY), + buildMtb(ConsentProvisionType.DENY), ConsentEvaluation(TtpConsentStatus.UNKNOWN_CHECK_FILE, false), ), // policy REIDENTIFICATION has no effect on ConsentEvaluation Arguments.of( - buildMtb(ModelProjectConsentPurpose.REIDENTIFICATION, ConsentProvision.DENY), + buildMtb(ModelProjectConsentPurpose.REIDENTIFICATION, ConsentProvisionType.DENY), ConsentEvaluation(TtpConsentStatus.UNKNOWN_CHECK_FILE, false), ), Arguments.of( - buildMtb(ModelProjectConsentPurpose.REIDENTIFICATION, ConsentProvision.PERMIT), + buildMtb(ModelProjectConsentPurpose.REIDENTIFICATION, ConsentProvisionType.PERMIT), ConsentEvaluation(TtpConsentStatus.UNKNOWN_CHECK_FILE, false), ), // policy CASE_IDENTIFICATION has no effect on ConsentEvaluation Arguments.of( - buildMtb(ModelProjectConsentPurpose.CASE_IDENTIFICATION, ConsentProvision.DENY), + buildMtb(ModelProjectConsentPurpose.CASE_IDENTIFICATION, ConsentProvisionType.DENY), ConsentEvaluation(TtpConsentStatus.UNKNOWN_CHECK_FILE, false), ), Arguments.of( - buildMtb(ModelProjectConsentPurpose.CASE_IDENTIFICATION, ConsentProvision.PERMIT), + buildMtb(ModelProjectConsentPurpose.CASE_IDENTIFICATION, ConsentProvisionType.PERMIT), ConsentEvaluation(TtpConsentStatus.UNKNOWN_CHECK_FILE, false), ), ) { companion object { - fun buildMtb(consentProvision: ConsentProvision): Mtb { + fun buildMtb(consentProvision: ConsentProvisionType): PatientRecord { return buildMtb(ModelProjectConsentPurpose.SEQUENCING, consentProvision) } - fun buildMtb(policy: ModelProjectConsentPurpose, consentProvision: ConsentProvision): Mtb { - return Mtb.builder() + fun buildMtb(policy: ModelProjectConsentPurpose, consentProvision: ConsentProvisionType): PatientRecord { + return PatientRecord.builder() .patient( Patient.builder() .id("TEST_12345678") .birthDate(Date.from(Instant.parse("2000-08-08T12:34:56Z"))) - .gender(GenderCoding.builder().code(GenderCodingCode.MALE).build()) + .gender(GenderCoding.builder().code(GenderCoding.CodeEnum.MALE).build()) .build() ) .metadata( MvhMetadata.builder() .modelProjectConsent( - ModelProjectConsent.builder() + MvhMetadataModelProjectConsent.builder() .provisions( listOf( - Provision.builder() + MvhMetadataModelProjectConsentProvisionsInner.builder() .date(Date()) .type(consentProvision) .purpose(policy) diff --git a/src/test/kotlin/dev/dnpm/etl/processor/input/KafkaInputListenerTest.kt b/src/test/kotlin/dev/dnpm/etl/processor/input/KafkaInputListenerTest.kt index eeb6288..9a5a2ee 100644 --- a/src/test/kotlin/dev/dnpm/etl/processor/input/KafkaInputListenerTest.kt +++ b/src/test/kotlin/dev/dnpm/etl/processor/input/KafkaInputListenerTest.kt @@ -25,7 +25,13 @@ import dev.dnpm.etl.processor.CustomMediaType import dev.dnpm.etl.processor.consent.ConsentEvaluator import dev.dnpm.etl.processor.consent.TtpConsentStatus import dev.dnpm.etl.processor.services.RequestProcessor -import dev.pcvolkmer.mv64e.mtb.* +import dev.pcvolkmer.mv64e.model.ConsentProvisionType +import dev.pcvolkmer.mv64e.model.ModelProjectConsentPurpose +import dev.pcvolkmer.mv64e.model.MvhMetadata +import dev.pcvolkmer.mv64e.model.MvhMetadataModelProjectConsent +import dev.pcvolkmer.mv64e.model.MvhMetadataModelProjectConsentProvisionsInner +import dev.pcvolkmer.mv64e.model.Patient +import dev.pcvolkmer.mv64e.model.PatientRecord import org.apache.kafka.clients.consumer.ConsumerRecord import org.apache.kafka.common.header.internals.RecordHeader import org.apache.kafka.common.header.internals.RecordHeaders @@ -69,16 +75,16 @@ class KafkaInputListenerTest { @Test fun shouldProcessMtbFileRequest() { val mtbFile = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("DUMMY_12345678").build()) .metadata( MvhMetadata.builder() .modelProjectConsent( - ModelProjectConsent.builder() + MvhMetadataModelProjectConsent.builder() .provisions( listOf( - Provision.builder() - .type(ConsentProvision.PERMIT) + MvhMetadataModelProjectConsentProvisionsInner.builder() + .type(ConsentProvisionType.PERMIT) .purpose(ModelProjectConsentPurpose.SEQUENCING) .build() ) @@ -93,18 +99,18 @@ class KafkaInputListenerTest { ConsumerRecord("testtopic", 0, 0, "", this.jsonMapper.writeValueAsString(mtbFile)) ) - verify(requestProcessor, times(1)).processMtbFile(any<Mtb>()) + verify(requestProcessor, times(1)).processMtbFile(any<PatientRecord>()) } @Test fun shouldProcessRequestEvenIfNoConsentInformation() { val mtbFile = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("DUMMY_12345678").build()) .metadata( MvhMetadata.builder() .modelProjectConsent( - ModelProjectConsent.builder() + MvhMetadataModelProjectConsent.builder() .provisions( listOf() ) @@ -117,22 +123,22 @@ class KafkaInputListenerTest { kafkaInputListener.onMessage( ConsumerRecord("testtopic", 0, 0, "", this.jsonMapper.writeValueAsString(mtbFile)) ) - verify(requestProcessor, times(1)).processMtbFile(any<Mtb>()) + verify(requestProcessor, times(1)).processMtbFile(any<PatientRecord>()) } @Test fun shouldProcessMtbFileRequestWithExistingRequestId() { val mtbFile = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("DUMMY_12345678").build()) .metadata( MvhMetadata.builder() .modelProjectConsent( - ModelProjectConsent.builder() + MvhMetadataModelProjectConsent.builder() .provisions( listOf( - Provision.builder() - .type(ConsentProvision.PERMIT) + MvhMetadataModelProjectConsentProvisionsInner.builder() + .type(ConsentProvisionType.PERMIT) .purpose(ModelProjectConsentPurpose.SEQUENCING) .build() ) @@ -161,22 +167,22 @@ class KafkaInputListenerTest { ) ) - verify(requestProcessor, times(1)).processMtbFile(any<Mtb>(), anyValueClass()) + verify(requestProcessor, times(1)).processMtbFile(any<PatientRecord>(), anyValueClass()) } @Test fun shouldProcessRequestWithoutConsentGiven() { val mtbFile = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("DUMMY_12345678").build()) .metadata( MvhMetadata.builder() .modelProjectConsent( - ModelProjectConsent.builder() + MvhMetadataModelProjectConsent.builder() .provisions( listOf( - Provision.builder() - .type(ConsentProvision.DENY) + MvhMetadataModelProjectConsentProvisionsInner.builder() + .type(ConsentProvisionType.DENY) .purpose(ModelProjectConsentPurpose.SEQUENCING) .build() ) @@ -204,22 +210,22 @@ class KafkaInputListenerTest { Optional.empty(), ) ) - verify(requestProcessor, times(1)).processMtbFile(any<Mtb>(), anyValueClass()) + verify(requestProcessor, times(1)).processMtbFile(any<PatientRecord>(), anyValueClass()) } @Test fun shouldProcessDnpmV2Request() { val mtbFile = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("DUMMY_12345678").build()) .metadata( MvhMetadata.builder() .modelProjectConsent( - ModelProjectConsent.builder() + MvhMetadataModelProjectConsent.builder() .provisions( listOf( - Provision.builder() - .type(ConsentProvision.DENY) + MvhMetadataModelProjectConsentProvisionsInner.builder() + .type(ConsentProvisionType.DENY) .purpose(ModelProjectConsentPurpose.SEQUENCING) .build() ) @@ -255,22 +261,22 @@ class KafkaInputListenerTest { Optional.empty(), ) ) - verify(requestProcessor, times(1)).processMtbFile(any<Mtb>(), anyValueClass()) + verify(requestProcessor, times(1)).processMtbFile(any<PatientRecord>(), anyValueClass()) } @Test fun shouldProcessDnpmV2DeleteRequest() { val mtbFile = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("DUMMY_12345678").build()) .metadata( MvhMetadata.builder() .modelProjectConsent( - ModelProjectConsent.builder() + MvhMetadataModelProjectConsent.builder() .provisions( listOf( - Provision.builder() - .type(ConsentProvision.DENY) + MvhMetadataModelProjectConsentProvisionsInner.builder() + .type(ConsentProvisionType.DENY) .purpose(ModelProjectConsentPurpose.SEQUENCING) .build() ) @@ -323,7 +329,7 @@ class KafkaInputListenerTest { ConsumerRecord("testtopic", 0, 0, "", content) ) - val result = verify(requestProcessor, times(1)).processMtbFile(any<Mtb>()) + val result = verify(requestProcessor, times(1)).processMtbFile(any<PatientRecord>()) assertThat(result).isFalse() } } diff --git a/src/test/kotlin/dev/dnpm/etl/processor/input/MtbFileRestControllerTest.kt b/src/test/kotlin/dev/dnpm/etl/processor/input/MtbFileRestControllerTest.kt index 9ee4b2b..75d69dc 100644 --- a/src/test/kotlin/dev/dnpm/etl/processor/input/MtbFileRestControllerTest.kt +++ b/src/test/kotlin/dev/dnpm/etl/processor/input/MtbFileRestControllerTest.kt @@ -27,7 +27,17 @@ import dev.dnpm.etl.processor.consent.ConsentEvaluator import dev.dnpm.etl.processor.consent.TtpConsentStatus import dev.dnpm.etl.processor.input.Dnpm21MtbFile.Companion.buildMtb import dev.dnpm.etl.processor.services.RequestProcessor -import dev.pcvolkmer.mv64e.mtb.* +import dev.pcvolkmer.mv64e.model.ConsentProvisionType +import dev.pcvolkmer.mv64e.model.GenderCoding +import dev.pcvolkmer.mv64e.model.ModelProjectConsentPurpose +import dev.pcvolkmer.mv64e.model.MtbEpisodeOfCare +import dev.pcvolkmer.mv64e.model.MvhMetadata +import dev.pcvolkmer.mv64e.model.MvhMetadataModelProjectConsent +import dev.pcvolkmer.mv64e.model.MvhMetadataModelProjectConsentProvisionsInner +import dev.pcvolkmer.mv64e.model.Patient +import dev.pcvolkmer.mv64e.model.PatientRecord +import dev.pcvolkmer.mv64e.model.Reference +import org.flywaydb.core.internal.configuration.resolvers.ProvisionerMode import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Test @@ -78,7 +88,7 @@ class MtbFileRestControllerTest { .readAllBytes() .toString(Charsets.UTF_8) - whenever { requestProcessor.processMtbFile(any<Mtb>()) }.thenReturn(true) + whenever { requestProcessor.processMtbFile(any<PatientRecord>()) }.thenReturn(true) mockMvc .post("/mtb") { @@ -87,13 +97,13 @@ class MtbFileRestControllerTest { } .andExpect { status { isAccepted() } } - verify(requestProcessor, times(1)).processMtbFile(any<Mtb>()) + verify(requestProcessor, times(1)).processMtbFile(any<PatientRecord>()) } @ParameterizedTest @ArgumentsSource(Dnpm21MtbFile::class) - fun shouldProcessPostRequest(mtb: Mtb) { - whenever { requestProcessor.processMtbFile(any<Mtb>()) }.thenReturn(true) + fun shouldProcessPostRequest(mtb: PatientRecord) { + whenever { requestProcessor.processMtbFile(any<PatientRecord>()) }.thenReturn(true) mockMvc .post("/mtbfile") { @@ -132,12 +142,12 @@ class MtbFileRestControllerTest { buildMtb( MvhMetadata.builder() .modelProjectConsent( - ModelProjectConsent.builder() + MvhMetadataModelProjectConsent.builder() .provisions( listOf( - Provision.builder() + MvhMetadataModelProjectConsentProvisionsInner.builder() .date(Date()) - .type(ConsentProvision.PERMIT) + .type(ConsentProvisionType.PERMIT) .purpose(ModelProjectConsentPurpose.SEQUENCING) .build() ) @@ -147,7 +157,7 @@ class MtbFileRestControllerTest { .build() ) - whenever { requestProcessor.processMtbFile(any<Mtb>()) }.thenReturn(true) + whenever { requestProcessor.processMtbFile(any<PatientRecord>()) }.thenReturn(true) mockMvc .post(url) { @@ -200,7 +210,7 @@ class Dnpm21MtbFile : Arguments.of( buildMtb( MvhMetadata.builder() - .modelProjectConsent(ModelProjectConsent.builder().build()) + .modelProjectConsent(MvhMetadataModelProjectConsent.builder().build()) .build() ) ), @@ -209,12 +219,12 @@ class Dnpm21MtbFile : buildMtb( MvhMetadata.builder() .modelProjectConsent( - ModelProjectConsent.builder() + MvhMetadataModelProjectConsent.builder() .provisions( listOf( - Provision.builder() + MvhMetadataModelProjectConsentProvisionsInner.builder() .date(Date()) - .type(ConsentProvision.PERMIT) + .type(ConsentProvisionType.PERMIT) .purpose(ModelProjectConsentPurpose.SEQUENCING) .build() ) @@ -229,12 +239,12 @@ class Dnpm21MtbFile : buildMtb( MvhMetadata.builder() .modelProjectConsent( - ModelProjectConsent.builder() + MvhMetadataModelProjectConsent.builder() .provisions( listOf( - Provision.builder() + MvhMetadataModelProjectConsentProvisionsInner.builder() .date(Date()) - .type(ConsentProvision.PERMIT) + .type(ConsentProvisionType.PERMIT) .purpose(ModelProjectConsentPurpose.SEQUENCING) .build() ) @@ -247,13 +257,13 @@ class Dnpm21MtbFile : ) { companion object { - fun buildMtb(metadata: MvhMetadata?): Mtb { - return Mtb.builder() + fun buildMtb(metadata: MvhMetadata?): PatientRecord { + return PatientRecord.builder() .patient( Patient.builder() .id("TEST_12345678") .birthDate(Date.from(Instant.parse("2000-08-08T12:34:56Z"))) - .gender(GenderCoding.builder().code(GenderCodingCode.MALE).build()) + .gender(GenderCoding.builder().code(GenderCoding.CodeEnum.MALE).build()) .build() ) .metadata(metadata) diff --git a/src/test/kotlin/dev/dnpm/etl/processor/output/KafkaMtbFileSenderTest.kt b/src/test/kotlin/dev/dnpm/etl/processor/output/KafkaMtbFileSenderTest.kt index ee840a8..9384aae 100644 --- a/src/test/kotlin/dev/dnpm/etl/processor/output/KafkaMtbFileSenderTest.kt +++ b/src/test/kotlin/dev/dnpm/etl/processor/output/KafkaMtbFileSenderTest.kt @@ -25,7 +25,11 @@ import dev.dnpm.etl.processor.PatientPseudonym import dev.dnpm.etl.processor.RequestId import dev.dnpm.etl.processor.config.KafkaProperties import dev.dnpm.etl.processor.monitoring.RequestStatus -import dev.pcvolkmer.mv64e.mtb.* +import dev.pcvolkmer.mv64e.model.GenderCoding +import dev.pcvolkmer.mv64e.model.MtbEpisodeOfCare +import dev.pcvolkmer.mv64e.model.PatientRecord +import dev.pcvolkmer.mv64e.model.PeriodDate +import dev.pcvolkmer.mv64e.model.Reference import org.apache.kafka.clients.producer.ProducerRecord import org.apache.kafka.clients.producer.RecordMetadata import org.apache.kafka.common.TopicPartition @@ -252,13 +256,13 @@ class KafkaMtbFileSenderTest { val TEST_REQUEST_ID = RequestId("TestId") val TEST_PATIENT_PSEUDONYM = PatientPseudonym("PID") - fun dnpmV2MtbFile(): Mtb { - return Mtb().apply { + fun dnpmV2MtbFile(): PatientRecord { + return PatientRecord().apply { this.patient = - dev.pcvolkmer.mv64e.mtb.Patient().apply { + dev.pcvolkmer.mv64e.model.Patient().apply { this.id = "PID" this.birthDate = Date.from(Instant.now()) - this.gender = GenderCoding().apply { this.code = GenderCodingCode.MALE } + this.gender = GenderCoding().apply { this.code = GenderCoding.CodeEnum.MALE } } this.episodesOfCare = listOf( @@ -271,7 +275,7 @@ class KafkaMtbFileSenderTest { } } - fun dnmpV2kafkaRecordData(requestId: RequestId): Mtb { + fun dnmpV2kafkaRecordData(requestId: RequestId): PatientRecord { return DnpmV2MtbFileRequest(requestId, dnpmV2MtbFile()).content } diff --git a/src/test/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt b/src/test/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt index d95ced0..3a0b3f0 100644 --- a/src/test/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt +++ b/src/test/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt @@ -28,7 +28,12 @@ import dev.dnpm.etl.processor.config.AppConfiguration import dev.dnpm.etl.processor.config.RestTargetProperties import dev.dnpm.etl.processor.monitoring.ReportService import dev.dnpm.etl.processor.monitoring.RequestStatus -import dev.pcvolkmer.mv64e.mtb.* +import dev.pcvolkmer.mv64e.model.GenderCoding +import dev.pcvolkmer.mv64e.model.MtbEpisodeOfCare +import dev.pcvolkmer.mv64e.model.Patient +import dev.pcvolkmer.mv64e.model.PatientRecord +import dev.pcvolkmer.mv64e.model.PeriodDate +import dev.pcvolkmer.mv64e.model.Reference import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Nested @@ -194,13 +199,13 @@ class RestDipMtbFileSenderTest { val TEST_REQUEST_ID = RequestId("TestId") val TEST_PATIENT_PSEUDONYM = PatientPseudonym("PID") - fun dnpmV2MtbFile(): Mtb { - return Mtb().apply { + fun dnpmV2MtbFile(): PatientRecord { + return PatientRecord().apply { this.patient = Patient().apply { this.id = "PID" this.birthDate = Date.from(Instant.now()) - this.gender = GenderCoding().apply { this.code = GenderCodingCode.MALE } + this.gender = GenderCoding().apply { this.code = GenderCoding.CodeEnum.MALE } } this.episodesOfCare = listOf( 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 abc17c6..93c9106 100644 --- a/src/test/kotlin/dev/dnpm/etl/processor/pseudonym/ExtensionsTest.kt +++ b/src/test/kotlin/dev/dnpm/etl/processor/pseudonym/ExtensionsTest.kt @@ -27,7 +27,17 @@ import dev.dnpm.etl.processor.config.JacksonConfig import dev.dnpm.etl.processor.consent.MtbFileConsentService import dev.dnpm.etl.processor.services.ConsentProcessor import dev.dnpm.etl.processor.services.ConsentProcessorTest -import dev.pcvolkmer.mv64e.mtb.* +import dev.pcvolkmer.mv64e.model.GenderCoding +import dev.pcvolkmer.mv64e.model.Msi +import dev.pcvolkmer.mv64e.model.MtbDiagnosis +import dev.pcvolkmer.mv64e.model.MtbEpisodeOfCare +import dev.pcvolkmer.mv64e.model.MtbSystemicTherapy +import dev.pcvolkmer.mv64e.model.OncoProcedure +import dev.pcvolkmer.mv64e.model.Patient +import dev.pcvolkmer.mv64e.model.PatientRecord +import dev.pcvolkmer.mv64e.model.PeriodDate +import dev.pcvolkmer.mv64e.model.Reference +import dev.pcvolkmer.mv64e.model.TumorSpecimen import org.assertj.core.api.Assertions.assertThat import org.hl7.fhir.r4.model.Bundle import org.junit.jupiter.api.Nested @@ -56,12 +66,12 @@ class ExtensionsTest { val FAKE_MTB_FILE_PATH = "mv64e-mtb-fake-patient.json" val CLEAN_PATIENT_ID = "644bae7a-56f6-4ee8-b02f-c532e65af5b1" - private fun fakeMtbFile(): Mtb { + private fun fakeMtbFile(): PatientRecord { val mtbFile = ClassPathResource(FAKE_MTB_FILE_PATH).inputStream - return getJsonMapper().readValue(mtbFile, Mtb::class.java) + return getJsonMapper().readValue(mtbFile, PatientRecord::class.java) } - private fun Mtb.serialized(): String { + private fun PatientRecord.serialized(): String { return getJsonMapper().writeValueAsString(this) } @@ -80,11 +90,11 @@ class ExtensionsTest { mtbFile.pseudonymizeWith(pseudonymizeService) - assertThat(mtbFile.patient.id).isEqualTo("PSEUDO-ID") + assertThat(mtbFile.patient?.id).isEqualTo("PSEUDO-ID") assertThat(mtbFile.serialized()).doesNotContain(CLEAN_PATIENT_ID) } - private fun addConsentData(mtbFile: Mtb) { + private fun addConsentData(mtbFile: PatientRecord) { val gIcsConfigProperties = GIcsConfigProperties("", "", "") val appConfigProperties = AppConfigProperties(emptyList()) @@ -115,12 +125,12 @@ class ExtensionsTest { doAnswer { "TESTDOMAIN" }.whenever(pseudonymizeService).prefix() val mtbFile = - Mtb().apply { + PatientRecord().apply { this.patient = Patient().apply { this.id = "PID" this.birthDate = Date.from(Instant.now()) - this.gender = GenderCoding().apply { this.code = GenderCodingCode.MALE } + this.gender = GenderCoding().apply { this.code = GenderCoding.CodeEnum.MALE } } this.episodesOfCare = listOf( @@ -136,7 +146,7 @@ class ExtensionsTest { mtbFile.anonymizeContentWith(pseudonymizeService) assertThat(mtbFile.episodesOfCare).hasSize(1) - assertThat(mtbFile.episodesOfCare.map { it.id }).isNotNull + assertThat(mtbFile.episodesOfCare?.map { it.id }).isNotNull } @Test @@ -153,20 +163,20 @@ class ExtensionsTest { val mtbFile = fakeMtbFile() /** replace hex values with random long, so our test does not match false positives */ - mtbFile.ngsReports.forEach { report -> - report.results.simpleVariants.forEach { simpleVariant -> - simpleVariant.externalIds.forEach { extIdValue -> + mtbFile.ngsReports?.forEach { report -> + report.results.simpleVariants?.forEach { simpleVariant -> + simpleVariant.externalIds?.forEach { extIdValue -> extIdValue.value = Math.random().toLong().toString() } } } - mtbFile.ngsReports.forEach { report -> - report.results.rnaFusions.forEach { simpleVariant -> - simpleVariant.externalIds.forEach { extIdValue -> + mtbFile.ngsReports?.forEach { report -> + report.results.rnaFusions?.forEach { simpleVariant -> + simpleVariant.externalIds?.forEach { extIdValue -> extIdValue.value = Math.random().toLong().toString() } - simpleVariant.fusionPartner3Prime?.transcriptId?.value = Math.random().toLong().toString() - simpleVariant.fusionPartner5Prime?.transcriptId?.value = Math.random().toLong().toString() + simpleVariant.fusionPartner3prime?.transcriptId?.value = Math.random().toLong().toString() + simpleVariant.fusionPartner5prime?.transcriptId?.value = Math.random().toLong().toString() simpleVariant.externalIds?.forEach { it?.value = Math.random().toLong().toString() } } } @@ -203,12 +213,12 @@ class ExtensionsTest { doAnswer { "TESTDOMAIN" }.whenever(pseudonymizeService).prefix() val mtbFile = - Mtb().apply { + PatientRecord().apply { this.patient = Patient().apply { this.id = "PID" this.birthDate = Date.from(Instant.now()) - this.gender = GenderCoding().apply { this.code = GenderCodingCode.MALE } + this.gender = GenderCoding().apply { this.code = GenderCoding.CodeEnum.MALE } } this.diagnoses = listOf(MtbDiagnosis().apply { this.id = "Diagnosis-1" }) this.episodesOfCare = @@ -244,12 +254,12 @@ class ExtensionsTest { mtbFile.pseudonymizeWith(pseudonymizeService) mtbFile.anonymizeContentWith(pseudonymizeService) - assertThat(mtbFile.diagnoses.first().id) - .isEqualTo(mtbFile.episodesOfCare.first().diagnoses.first().id) - assertThat(mtbFile.diagnoses.first().id).isEqualTo(mtbFile.guidelineTherapies.first().reason.id) - assertThat(mtbFile.diagnoses.first().id) - .isEqualTo(mtbFile.guidelineProcedures.first().reason.id) - assertThat(mtbFile.diagnoses.first().id).isEqualTo(mtbFile.specimens.first().diagnosis.id) + assertThat(mtbFile.diagnoses?.first()?.id) + .isEqualTo(mtbFile.episodesOfCare?.first()?.diagnoses?.first()?.id) + assertThat(mtbFile.diagnoses?.first()?.id).isEqualTo(mtbFile.guidelineTherapies?.first()?.reason?.id) + assertThat(mtbFile.diagnoses?.first()?.id) + .isEqualTo(mtbFile.guidelineProcedures?.first()?.reason?.id) + assertThat(mtbFile.diagnoses?.first()?.id).isEqualTo(mtbFile.specimens?.first()?.diagnosis?.id) } @Test @@ -265,12 +275,12 @@ class ExtensionsTest { doAnswer { "TESTDOMAIN" }.whenever(pseudonymizeService).prefix() val mtbFile = - Mtb().apply { + PatientRecord().apply { this.patient = Patient().apply { this.id = "PID" this.birthDate = Date.from(Instant.now()) - this.gender = GenderCoding().apply { this.code = GenderCodingCode.MALE } + this.gender = GenderCoding().apply { this.code = GenderCoding.CodeEnum.MALE } } this.msiFindings = listOf( @@ -286,10 +296,10 @@ class ExtensionsTest { mtbFile.anonymizeContentWith(pseudonymizeService) assertThat(mtbFile.msiFindings).isNotNull - assertThat(mtbFile.msiFindings[1]) + assertThat(mtbFile.msiFindings?.get(1)) .satisfiesAnyOf( - { assertThat(it.id).isNull() }, - { assertThat(it.id).isEqualTo("TESTDOMAIN44e20a53bbbf9f3ae39626d05df7014dcd77d6098") }, + { assertThat(it?.id).isNull() }, + { assertThat(it?.id).isEqualTo("TESTDOMAIN44e20a53bbbf9f3ae39626d05df7014dcd77d6098") }, ) } } diff --git a/src/test/kotlin/dev/dnpm/etl/processor/pseudonym/PseudonymizeServiceTest.kt b/src/test/kotlin/dev/dnpm/etl/processor/pseudonym/PseudonymizeServiceTest.kt index 7c6d6c9..00487d0 100644 --- a/src/test/kotlin/dev/dnpm/etl/processor/pseudonym/PseudonymizeServiceTest.kt +++ b/src/test/kotlin/dev/dnpm/etl/processor/pseudonym/PseudonymizeServiceTest.kt @@ -21,7 +21,11 @@ package dev.dnpm.etl.processor.pseudonym import dev.dnpm.etl.processor.config.PseudonymizeConfigProperties -import dev.pcvolkmer.mv64e.mtb.* +import dev.pcvolkmer.mv64e.model.MtbEpisodeOfCare +import dev.pcvolkmer.mv64e.model.Patient +import dev.pcvolkmer.mv64e.model.PatientRecord +import dev.pcvolkmer.mv64e.model.PeriodDate +import dev.pcvolkmer.mv64e.model.Reference import java.time.Instant import java.util.* import org.assertj.core.api.Assertions.assertThat @@ -37,7 +41,7 @@ import org.mockito.kotlin.whenever class PseudonymizeServiceTest { private val mtbFile = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("123").build()) .episodesOfCare( listOf( @@ -62,7 +66,7 @@ class PseudonymizeServiceTest { mtbFile.pseudonymizeWith(pseudonymizeService) - assertThat(mtbFile.patient.id).isEqualTo("123") + assertThat(mtbFile.patient?.id).isEqualTo("123") } @Test @@ -80,7 +84,7 @@ class PseudonymizeServiceTest { mtbFile.pseudonymizeWith(pseudonymizeService) - assertThat(mtbFile.patient.id).isEqualTo("UNKNOWN_123") + assertThat(mtbFile.patient?.id).isEqualTo("UNKNOWN_123") } @Test diff --git a/src/test/kotlin/dev/dnpm/etl/processor/services/ConsentProcessorTest.kt b/src/test/kotlin/dev/dnpm/etl/processor/services/ConsentProcessorTest.kt index a85d555..1f1024f 100644 --- a/src/test/kotlin/dev/dnpm/etl/processor/services/ConsentProcessorTest.kt +++ b/src/test/kotlin/dev/dnpm/etl/processor/services/ConsentProcessorTest.kt @@ -27,9 +27,9 @@ import dev.dnpm.etl.processor.config.JacksonConfig import dev.dnpm.etl.processor.consent.ConsentDomain import dev.dnpm.etl.processor.consent.GicsConsentService import dev.dnpm.etl.processor.consent.MtbFileConsentService -import dev.pcvolkmer.mv64e.mtb.Mtb -import dev.pcvolkmer.mv64e.mtb.MvhSubmissionType -import dev.pcvolkmer.mv64e.mtb.Patient +import dev.pcvolkmer.mv64e.model.MvhSubmissionType +import dev.pcvolkmer.mv64e.model.Patient +import dev.pcvolkmer.mv64e.model.PatientRecord import org.assertj.core.api.Assertions.assertThat import org.hl7.fhir.r4.model.Bundle import org.hl7.fhir.r4.model.CodeableConcept @@ -99,13 +99,13 @@ class ConsentProcessorTest { .getConsent(any(), any(), eq(ConsentDomain.MODELLVORHABEN_64E)) val inputMtb = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("d611d429-5003-11f0-a144-661e92ac9503").build()) .build() val checkResult = consentProcessor.consentGatedCheckAndTryEmbedding(inputMtb) assertThat(checkResult).isTrue - assertThat(inputMtb.metadata.researchConsents).isNotEmpty + assertThat(inputMtb.metadata?.researchConsents).isNotEmpty } @Test @@ -122,7 +122,7 @@ class ConsentProcessorTest { assertThat(consentProcessor.toString()).isNotNull val inputMtb = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("d611d429-5003-11f0-a144-661e92ac9503").build()) .build() val checkResult = consentProcessor.consentGatedCheckAndTryEmbedding(inputMtb) @@ -256,15 +256,15 @@ class ConsentProcessorTest { .getConsent(any(), any(), eq(ConsentDomain.MODELLVORHABEN_64E)) val inputMtb = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("d611d429-5003-11f0-a144-661e92ac9503").build()) .build() val checkResult = fixture.consentGatedCheckAndTryEmbedding(inputMtb) assertThat(checkResult).isNotNull - if (isTestSubmission) assertThat(inputMtb.metadata.type).isEqualTo(MvhSubmissionType.TEST) + if (isTestSubmission) assertThat(inputMtb.metadata?.type).isEqualTo(MvhSubmissionType.TEST) else { - assertThat(inputMtb.metadata.type).isEqualTo(MvhSubmissionType.INITIAL) + assertThat(inputMtb.metadata?.type).isEqualTo(MvhSubmissionType.INITIAL) } } } diff --git a/src/test/kotlin/dev/dnpm/etl/processor/services/RequestProcessorTest.kt b/src/test/kotlin/dev/dnpm/etl/processor/services/RequestProcessorTest.kt index 6827a4f..0010bf0 100644 --- a/src/test/kotlin/dev/dnpm/etl/processor/services/RequestProcessorTest.kt +++ b/src/test/kotlin/dev/dnpm/etl/processor/services/RequestProcessorTest.kt @@ -33,7 +33,18 @@ import dev.dnpm.etl.processor.output.DnpmV2MtbFileRequest import dev.dnpm.etl.processor.output.MtbFileSender import dev.dnpm.etl.processor.output.RestMtbFileSender import dev.dnpm.etl.processor.pseudonym.PseudonymizeService -import dev.pcvolkmer.mv64e.mtb.* +import dev.pcvolkmer.mv64e.model.ConsentProvisionType +import dev.pcvolkmer.mv64e.model.FollowUp +import dev.pcvolkmer.mv64e.model.ModelProjectConsentPurpose +import dev.pcvolkmer.mv64e.model.MtbEpisodeOfCare +import dev.pcvolkmer.mv64e.model.MvhMetadata +import dev.pcvolkmer.mv64e.model.MvhMetadataModelProjectConsent +import dev.pcvolkmer.mv64e.model.MvhMetadataModelProjectConsentProvisionsInner +import dev.pcvolkmer.mv64e.model.MvhSubmissionType +import dev.pcvolkmer.mv64e.model.Patient +import dev.pcvolkmer.mv64e.model.PatientRecord +import dev.pcvolkmer.mv64e.model.PeriodDate +import dev.pcvolkmer.mv64e.model.Reference import org.assertj.core.api.Assertions.assertThat import org.hl7.fhir.r4.model.Consent import org.junit.jupiter.api.BeforeEach @@ -123,12 +134,12 @@ class RequestProcessorTest { .whenever(pseudonymizeService) .patientPseudonym(anyValueClass()) - doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<Mtb>()) + doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<PatientRecord>()) whenever(consentProcessor.consentGatedCheckAndTryEmbedding(any())).thenReturn(true) val mtbFile = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("123").build()) .episodesOfCare( listOf( @@ -180,12 +191,12 @@ class RequestProcessorTest { .whenever(pseudonymizeService) .patientPseudonym(anyValueClass()) - doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<Mtb>()) + doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<PatientRecord>()) whenever(consentProcessor.consentGatedCheckAndTryEmbedding(any())).thenReturn(true) val mtbFile = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("123").build()) .episodesOfCare( listOf( @@ -241,12 +252,12 @@ class RequestProcessorTest { .whenever(pseudonymizeService) .patientPseudonym(anyValueClass()) - doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<Mtb>()) + doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<PatientRecord>()) whenever(consentProcessor.consentGatedCheckAndTryEmbedding(any())).thenReturn(true) val mtbFile = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("123").build()) .episodesOfCare( listOf( @@ -306,21 +317,21 @@ class RequestProcessorTest { .whenever(pseudonymizeService) .genomDeTan(anyValueClass()) - doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<Mtb>()) + doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<PatientRecord>()) whenever(consentProcessor.consentGatedCheckAndTryEmbedding(any())).thenReturn(true) val mtbFile = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("123").build()) .metadata( MvhMetadata.builder() .modelProjectConsent( - ModelProjectConsent.builder() + MvhMetadataModelProjectConsent.builder() .provisions( listOf( - Provision.builder() - .type(ConsentProvision.PERMIT) + MvhMetadataModelProjectConsentProvisionsInner.builder() + .type(ConsentProvisionType.PERMIT) .purpose(ModelProjectConsentPurpose.SEQUENCING) .build() ) @@ -406,7 +417,7 @@ class RequestProcessorTest { .whenever(pseudonymizeService) .genomDeTan(anyValueClass()) - doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<Mtb>()) + doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<PatientRecord>()) whenever(consentProcessor.consentGatedCheckAndTryEmbedding(any())).thenReturn(true) @@ -423,7 +434,7 @@ class RequestProcessorTest { ) val mtbFile = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("123").build()) .metadata(MvhMetadata()) .episodesOfCare( @@ -446,8 +457,8 @@ class RequestProcessorTest { val requestCaptor = argumentCaptor<DnpmV2MtbFileRequest>() verify(sender, times(1)).send(requestCaptor.capture()) assertThat(requestCaptor.firstValue).isNotNull - assertThat(requestCaptor.firstValue.content.metadata.type).isEqualTo(MvhSubmissionType.ADDITION) - assertThat(requestCaptor.firstValue.content.metadata.transferTan).isEqualTo("f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2") + assertThat(requestCaptor.firstValue.content.metadata?.type).isEqualTo(MvhSubmissionType.ADDITION) + assertThat(requestCaptor.firstValue.content.metadata?.transferTAN).isEqualTo("f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2") val eventCaptor = argumentCaptor<ResponseEvent>() verify(applicationEventPublisher, times(1)).publishEvent(eventCaptor.capture()) @@ -503,10 +514,10 @@ class RequestProcessorTest { doAnswer { it.arguments.first() } .whenever(transformationService) - .transform(any<Mtb>()) + .transform(any<PatientRecord>()) val mtbFile = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("123").build()) .metadata(MvhMetadata()) .episodesOfCare( @@ -577,7 +588,7 @@ class RequestProcessorTest { .whenever(pseudonymizeService) .patientPseudonym(anyValueClass()) - doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<Mtb>()) + doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<PatientRecord>()) doAnswer { MtbFileSender.Response(status = RequestStatus.SUCCESS) } .whenever(sender) @@ -586,7 +597,7 @@ class RequestProcessorTest { whenever(consentProcessor.consentGatedCheckAndTryEmbedding(any())).thenReturn(true) val mtbFile = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("123").build()) .episodesOfCare( listOf( @@ -630,7 +641,7 @@ class RequestProcessorTest { .whenever(pseudonymizeService) .genomDeTan(anyValueClass()) - doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<Mtb>()) + doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<PatientRecord>()) whenever(consentProcessor.consentGatedCheckAndTryEmbedding(any())).thenReturn(true) @@ -647,7 +658,7 @@ class RequestProcessorTest { ) val mtbFile = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("123").build()) .metadata(MvhMetadata()) .episodesOfCare( @@ -772,7 +783,7 @@ class RequestProcessorTest { .whenever(pseudonymizeService) .patientPseudonym(anyValueClass()) - doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<Mtb>()) + doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<PatientRecord>()) whenever(consentProcessor.consentGatedCheckAndTryEmbedding(any())).thenReturn(true) @@ -789,7 +800,7 @@ class RequestProcessorTest { ) val mtbFile = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("123").build()) .episodesOfCare( listOf( @@ -872,7 +883,7 @@ class RequestProcessorTest { .whenever(pseudonymizeService) .patientPseudonym(anyValueClass()) - doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<Mtb>()) + doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<PatientRecord>()) doAnswer { MtbFileSender.Response(status = RequestStatus.SUCCESS) } .whenever(sender) @@ -893,7 +904,7 @@ class RequestProcessorTest { ) val mtbFile = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("123").build()) .metadata(MvhMetadata.builder().type(MvhSubmissionType.INITIAL).build()) .episodesOfCare( @@ -925,7 +936,7 @@ class RequestProcessorTest { val sendRequestCaptor = argumentCaptor<DnpmV2MtbFileRequest>() verify(sender, times(1)).send(sendRequestCaptor.capture()) - assertThat(sendRequestCaptor.firstValue.content.metadata.type).isEqualTo(MvhSubmissionType.ADDITION) + assertThat(sendRequestCaptor.firstValue.content.metadata?.type).isEqualTo(MvhSubmissionType.ADDITION) } @Test @@ -983,7 +994,7 @@ class RequestProcessorTest { .whenever(pseudonymizeService) .patientPseudonym(anyValueClass()) - doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<Mtb>()) + doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<PatientRecord>()) doAnswer { MtbFileSender.Response(status = RequestStatus.SUCCESS) } .whenever(sender) @@ -1004,7 +1015,7 @@ class RequestProcessorTest { ) val mtbFile = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("123").build()) .metadata(MvhMetadata.builder().type(MvhSubmissionType.INITIAL).build()) .episodesOfCare( @@ -1036,7 +1047,7 @@ class RequestProcessorTest { val sendRequestCaptor = argumentCaptor<DnpmV2MtbFileRequest>() verify(sender, times(1)).send(sendRequestCaptor.capture()) - assertThat(sendRequestCaptor.firstValue.content.metadata.type).isEqualTo(MvhSubmissionType.ADDITION) + assertThat(sendRequestCaptor.firstValue.content.metadata?.type).isEqualTo(MvhSubmissionType.ADDITION) } @Test @@ -1081,7 +1092,7 @@ class RequestProcessorTest { .whenever(pseudonymizeService) .patientPseudonym(anyValueClass()) - doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<Mtb>()) + doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<PatientRecord>()) doAnswer { MtbFileSender.Response(status = RequestStatus.SUCCESS) } .whenever(sender) @@ -1102,7 +1113,7 @@ class RequestProcessorTest { ) val mtbFile = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("123").build()) .metadata(MvhMetadata.builder().type(MvhSubmissionType.INITIAL).build()) .episodesOfCare( @@ -1134,7 +1145,7 @@ class RequestProcessorTest { val sendRequestCaptor = argumentCaptor<DnpmV2MtbFileRequest>() verify(sender, times(1)).send(sendRequestCaptor.capture()) - assertThat(sendRequestCaptor.firstValue.content.metadata.type).isEqualTo(MvhSubmissionType.INITIAL) + assertThat(sendRequestCaptor.firstValue.content.metadata?.type).isEqualTo(MvhSubmissionType.INITIAL) } @Test @@ -1192,7 +1203,7 @@ class RequestProcessorTest { .whenever(pseudonymizeService) .patientPseudonym(anyValueClass()) - doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<Mtb>()) + doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<PatientRecord>()) doAnswer { MtbFileSender.Response(status = RequestStatus.SUCCESS) } .whenever(sender) @@ -1213,7 +1224,7 @@ class RequestProcessorTest { ) val mtbFile = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("123").build()) .metadata(MvhMetadata.builder().type(MvhSubmissionType.INITIAL).build()) .episodesOfCare( @@ -1254,7 +1265,7 @@ class RequestProcessorTest { val sendRequestCaptor = argumentCaptor<DnpmV2MtbFileRequest>() verify(sender, times(1)).send(sendRequestCaptor.capture()) - assertThat(sendRequestCaptor.firstValue.content.metadata.type).isEqualTo(MvhSubmissionType.FOLLOWUP) + assertThat(sendRequestCaptor.firstValue.content.metadata?.type).isEqualTo(MvhSubmissionType.FOLLOWUP) } @@ -1313,7 +1324,7 @@ class RequestProcessorTest { .whenever(pseudonymizeService) .patientPseudonym(anyValueClass()) - doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<Mtb>()) + doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<PatientRecord>()) doAnswer { MtbFileSender.Response(status = RequestStatus.SUCCESS) } .whenever(sender) @@ -1334,7 +1345,7 @@ class RequestProcessorTest { ) val mtbFile = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("123").build()) .metadata(MvhMetadata.builder().type(MvhSubmissionType.INITIAL).build()) .episodesOfCare( @@ -1375,7 +1386,7 @@ class RequestProcessorTest { val sendRequestCaptor = argumentCaptor<DnpmV2MtbFileRequest>() verify(sender, times(1)).send(sendRequestCaptor.capture()) - assertThat(sendRequestCaptor.firstValue.content.metadata.type).isEqualTo(MvhSubmissionType.FOLLOWUP) + assertThat(sendRequestCaptor.firstValue.content.metadata?.type).isEqualTo(MvhSubmissionType.FOLLOWUP) } } @@ -1434,7 +1445,7 @@ class RequestProcessorTest { .whenever(pseudonymizeService) .patientPseudonym(anyValueClass()) - doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<Mtb>()) + doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<PatientRecord>()) doAnswer { MtbFileSender.Response(status = RequestStatus.SUCCESS) } .whenever(sender) @@ -1455,7 +1466,7 @@ class RequestProcessorTest { ) val mtbFile = - Mtb.builder() + PatientRecord.builder() .patient(Patient.builder().id("123").build()) .metadata(MvhMetadata.builder().type(MvhSubmissionType.INITIAL).build()) .episodesOfCare( @@ -1496,12 +1507,12 @@ class RequestProcessorTest { val sendRequestCaptor = argumentCaptor<DnpmV2MtbFileRequest>() verify(sender, times(1)).send(sendRequestCaptor.capture()) - assertThat(sendRequestCaptor.firstValue.content.metadata.type).isEqualTo(MvhSubmissionType.ADDITION) + assertThat(sendRequestCaptor.firstValue.content.metadata?.type).isEqualTo(MvhSubmissionType.ADDITION) } @Test fun shouldCatchExceptionsWhenProcessingMtbFileAndSaveError() { - val invalidMtbFile = Mtb.builder().build() + val invalidMtbFile = PatientRecord.builder().build() val success = this.requestProcessor.processMtbFile(invalidMtbFile) diff --git a/src/test/kotlin/dev/dnpm/etl/processor/services/TransformationServiceTest.kt b/src/test/kotlin/dev/dnpm/etl/processor/services/TransformationServiceTest.kt index 66e45f8..cbca4f7 100644 --- a/src/test/kotlin/dev/dnpm/etl/processor/services/TransformationServiceTest.kt +++ b/src/test/kotlin/dev/dnpm/etl/processor/services/TransformationServiceTest.kt @@ -24,7 +24,15 @@ import ca.uhn.fhir.context.FhirContext import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.node.ObjectNode import dev.dnpm.etl.processor.config.JacksonConfig -import dev.pcvolkmer.mv64e.mtb.* +import dev.pcvolkmer.mv64e.model.Coding +import dev.pcvolkmer.mv64e.model.ConsentProvisionType +import dev.pcvolkmer.mv64e.model.ModelProjectConsentPurpose +import dev.pcvolkmer.mv64e.model.MtbDiagnosis +import dev.pcvolkmer.mv64e.model.MvhMetadata +import dev.pcvolkmer.mv64e.model.MvhMetadataModelProjectConsent +import dev.pcvolkmer.mv64e.model.MvhMetadataModelProjectConsentProvisionsInner +import dev.pcvolkmer.mv64e.model.PatientRecord +import dev.pcvolkmer.mv64e.model.ResearchConsent import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -49,7 +57,7 @@ class TransformationServiceTest { @Test fun shouldTransformMtbFile() { val mtbFile = - Mtb.builder() + PatientRecord.builder() .diagnoses( listOf( MtbDiagnosis.builder() @@ -63,13 +71,13 @@ class TransformationServiceTest { val actual = this.service.transform(mtbFile) assertThat(actual).isNotNull - assertThat(actual.diagnoses[0].code.version).isEqualTo("2014") + assertThat(actual.diagnoses!![0].code.version).isEqualTo("2014") } @Test fun shouldOnlyTransformGivenValues() { val mtbFile = - Mtb.builder() + PatientRecord.builder() .diagnoses( listOf( MtbDiagnosis.builder() @@ -87,16 +95,16 @@ class TransformationServiceTest { val actual = this.service.transform(mtbFile) assertThat(actual).isNotNull - assertThat(actual.diagnoses[0].code.code).isEqualTo("F79.9") - assertThat(actual.diagnoses[0].code.version).isEqualTo("2014") - assertThat(actual.diagnoses[1].code.code).isEqualTo("F79.8") - assertThat(actual.diagnoses[1].code.version).isEqualTo("2019") + assertThat(actual.diagnoses!![0].code.code).isEqualTo("F79.9") + assertThat(actual.diagnoses!![0].code.version).isEqualTo("2014") + assertThat(actual.diagnoses!![1].code.code).isEqualTo("F79.8") + assertThat(actual.diagnoses!![1].code.version).isEqualTo("2019") } @Test fun shouldTransformConsentValues() { val mtbFile = - Mtb.builder() + PatientRecord.builder() .diagnoses( listOf( MtbDiagnosis.builder() @@ -114,35 +122,35 @@ class TransformationServiceTest { val actual = this.service.transform(mtbFile) assertThat(actual).isNotNull - assertThat(actual.diagnoses[0].code.code).isEqualTo("F79.9") - assertThat(actual.diagnoses[0].code.version).isEqualTo("2014") - assertThat(actual.diagnoses[1].code.code).isEqualTo("F79.8") - assertThat(actual.diagnoses[1].code.version).isEqualTo("2019") + assertThat(actual.diagnoses!![0].code.code).isEqualTo("F79.9") + assertThat(actual.diagnoses!![0].code.version).isEqualTo("2014") + assertThat(actual.diagnoses!![1].code.code).isEqualTo("F79.8") + assertThat(actual.diagnoses!![1].code.version).isEqualTo("2019") } @Test fun shouldTransformConsent() { - val mvhMetadata = MvhMetadata.builder().transferTan("transfertan12345").build() + val mvhMetadata = MvhMetadata.builder().transferTAN("transfertan12345").build() assertThat(mvhMetadata).isNotNull mvhMetadata.modelProjectConsent = - ModelProjectConsent.builder() + MvhMetadataModelProjectConsent.builder() .date(Date.from(Instant.parse("2025-08-15T00:00:00.00Z"))) .version("1") .provisions( listOf( - Provision.builder() - .type(ConsentProvision.PERMIT) + MvhMetadataModelProjectConsentProvisionsInner.builder() + .type(ConsentProvisionType.PERMIT) .purpose(ModelProjectConsentPurpose.SEQUENCING) .date(Date.from(Instant.parse("2025-08-15T00:00:00.00Z"))) .build(), - Provision.builder() - .type(ConsentProvision.PERMIT) + MvhMetadataModelProjectConsentProvisionsInner.builder() + .type(ConsentProvisionType.PERMIT) .purpose(ModelProjectConsentPurpose.REIDENTIFICATION) .date(Date.from(Instant.parse("2025-08-15T00:00:00.00Z"))) .build(), - Provision.builder() - .type(ConsentProvision.DENY) + MvhMetadataModelProjectConsentProvisionsInner.builder() + .type(ConsentProvisionType.DENY) .purpose(ModelProjectConsentPurpose.CASE_IDENTIFICATION) .date(Date.from(Instant.parse("2025-08-15T00:00:00.00Z"))) .build(), @@ -158,11 +166,11 @@ class TransformationServiceTest { ) mvhMetadata.researchConsents = mutableListOf() - mvhMetadata.researchConsents.add(MvhMetadata.ResearchConsent.from(jsonNode)) + mvhMetadata.researchConsents?.add(ResearchConsent.from(jsonNode)) - val mtbFile = Mtb.builder().metadata(mvhMetadata).build() + val mtbFile = PatientRecord.builder().metadata(mvhMetadata).build() val transformed = service.transform(mtbFile) - assertThat(transformed.metadata.modelProjectConsent.date).isNotNull + assertThat(transformed.metadata?.modelProjectConsent?.date).isNotNull } } |
