summaryrefslogtreecommitdiff
path: root/src/test/kotlin
diff options
context:
space:
mode:
authorPaul-Christian Volkmer2026-09-21 11:43:03 +0200
committerGitHub2026-09-21 11:43:03 +0200
commitd9961a9baccaff511662b1aa1de18bdd02f94f5e (patch)
treeb4d47b8eed6aaceebaead375e8265e5f245bff82 /src/test/kotlin
parentb0fb01d12fcadf86cabbe71b16cce60fb88b0ca4 (diff)
feat: add switch/routing to send dedicated data to nNGM (#322)
Diffstat (limited to 'src/test/kotlin')
-rw-r--r--src/test/kotlin/dev/dnpm/etl/processor/monitoring/ConnectionCheckServiceTest.kt1
-rw-r--r--src/test/kotlin/dev/dnpm/etl/processor/services/ReportServiceTest.kt12
-rw-r--r--src/test/kotlin/dev/dnpm/etl/processor/services/RequestProcessorTest.kt338
3 files changed, 343 insertions, 8 deletions
diff --git a/src/test/kotlin/dev/dnpm/etl/processor/monitoring/ConnectionCheckServiceTest.kt b/src/test/kotlin/dev/dnpm/etl/processor/monitoring/ConnectionCheckServiceTest.kt
index 62ece6c..c5cc839 100644
--- a/src/test/kotlin/dev/dnpm/etl/processor/monitoring/ConnectionCheckServiceTest.kt
+++ b/src/test/kotlin/dev/dnpm/etl/processor/monitoring/ConnectionCheckServiceTest.kt
@@ -56,6 +56,7 @@ class ConnectionCheckServiceTest {
"http://localhost/api",
"user",
"password",
+ null,
)
this.sink = Sinks.many().multicast().onBackpressureBuffer()
this.mockRestServiceServer = MockRestServiceServer.createServer(restTemplate)
diff --git a/src/test/kotlin/dev/dnpm/etl/processor/services/ReportServiceTest.kt b/src/test/kotlin/dev/dnpm/etl/processor/services/ReportServiceTest.kt
index e9c3107..c45dd95 100644
--- a/src/test/kotlin/dev/dnpm/etl/processor/services/ReportServiceTest.kt
+++ b/src/test/kotlin/dev/dnpm/etl/processor/services/ReportServiceTest.kt
@@ -60,13 +60,13 @@ class ReportServiceTest {
assertThat(actual).hasSize(4)
assertThat(actual[0].severity).isEqualTo(ReportService.Severity.FATAL)
- assertThat(actual[0].getMessage()).isEqualTo("Fatal Message")
+ assertThat(actual[0].getMessageText()).isEqualTo("Fatal Message")
assertThat(actual[1].severity).isEqualTo(ReportService.Severity.ERROR)
- assertThat(actual[1].getMessage()).isEqualTo("Error Message")
+ assertThat(actual[1].getMessageText()).isEqualTo("Error Message")
assertThat(actual[2].severity).isEqualTo(ReportService.Severity.WARNING)
- assertThat(actual[2].getMessage()).isEqualTo("Warning Message")
+ assertThat(actual[2].getMessageText()).isEqualTo("Warning Message")
assertThat(actual[3].severity).isEqualTo(ReportService.Severity.INFO)
- assertThat(actual[3].getMessage()).isEqualTo("Info Message")
+ assertThat(actual[3].getMessageText()).isEqualTo("Info Message")
assertThat(actual.asRequestStatus()).isEqualTo(RequestStatus.ERROR)
}
@@ -87,7 +87,7 @@ class ReportServiceTest {
assertThat(actual).hasSize(1)
assertThat(actual[0].severity).isEqualTo(ReportService.Severity.ERROR)
- assertThat(actual[0].getMessage()).isEqualTo("/specimens(0)/type/code: error.path.missing")
+ assertThat(actual[0].getMessageText()).isEqualTo("/specimens(0)/type/code: error.path.missing")
assertThat(actual.asRequestStatus()).isEqualTo(RequestStatus.ERROR)
}
@@ -110,7 +110,7 @@ class ReportServiceTest {
assertThat(actual).hasSize(1)
assertThat(actual[0].severity).isEqualTo(ReportService.Severity.ERROR)
- assertThat(actual[0].getMessage()).isEqualTo("Not parsable data quality report '$invalidResponse'")
+ assertThat(actual[0].getMessageText()).isEqualTo("Not parsable data quality report '$invalidResponse'")
}
companion object {
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 3edb480..8433e93 100644
--- a/src/test/kotlin/dev/dnpm/etl/processor/services/RequestProcessorTest.kt
+++ b/src/test/kotlin/dev/dnpm/etl/processor/services/RequestProcessorTest.kt
@@ -29,11 +29,15 @@ import dev.dnpm.etl.processor.monitoring.RequestType
import dev.dnpm.etl.processor.monitoring.SubmissionType
import dev.dnpm.etl.processor.output.DeleteRequest
import dev.dnpm.etl.processor.output.DnpmV2MtbFileRequest
+import dev.dnpm.etl.processor.output.MtbFileRequest
import dev.dnpm.etl.processor.output.MtbFileSender
+import dev.dnpm.etl.processor.output.RoutedMtbFileSender
import dev.dnpm.etl.processor.pseudonym.PseudonymizeService
+import dev.pcvolkmer.mv64e.model.Coding
import dev.pcvolkmer.mv64e.model.ConsentProvisionType
import dev.pcvolkmer.mv64e.model.FollowUp
import dev.pcvolkmer.mv64e.model.ModelProjectConsentPurpose
+import dev.pcvolkmer.mv64e.model.MtbDiagnosis
import dev.pcvolkmer.mv64e.model.MtbEpisodeOfCare
import dev.pcvolkmer.mv64e.model.MvhMetadata
import dev.pcvolkmer.mv64e.model.MvhMetadataModelProjectConsent
@@ -66,6 +70,7 @@ class RequestProcessorTest {
private lateinit var pseudonymizeService: PseudonymizeService
private lateinit var transformationService: TransformationService
private lateinit var sender: MtbFileSender
+ private lateinit var routedMtbFileSender: RoutedMtbFileSender
private lateinit var requestService: RequestService
private lateinit var applicationEventPublisher: ApplicationEventPublisher
private lateinit var appConfigProperties: AppConfigProperties
@@ -78,6 +83,7 @@ class RequestProcessorTest {
@Mock pseudonymizeService: PseudonymizeService,
@Mock transformationService: TransformationService,
@Mock sender: MtbFileSender,
+ @Mock routedMtbFileSender: RoutedMtbFileSender,
@Mock requestService: RequestService,
@Mock applicationEventPublisher: ApplicationEventPublisher,
@Mock consentProcessor: ConsentProcessor,
@@ -85,6 +91,7 @@ class RequestProcessorTest {
this.pseudonymizeService = pseudonymizeService
this.transformationService = transformationService
this.sender = sender
+ this.routedMtbFileSender = routedMtbFileSender
this.requestService = requestService
this.applicationEventPublisher = applicationEventPublisher
this.appConfigProperties = AppConfigProperties()
@@ -96,6 +103,7 @@ class RequestProcessorTest {
pseudonymizeService,
transformationService,
sender,
+ listOf(routedMtbFileSender),
requestService,
jsonMapper,
applicationEventPublisher,
@@ -112,7 +120,7 @@ class RequestProcessorTest {
randomRequestId(),
PatientPseudonym("TEST_12345678901"),
PatientId("P1"),
- Fingerprint("syehahte4oyqd5m2rbd5imnth4rx6md32g2msb7sztnayxoc4kaq"),
+ Fingerprint("tyfimuuc7okhnoholo6jx5o5os3n7haelezphr4477uxbzlotvra"),
RequestType.MTB_FILE,
SubmissionType.TEST,
RequestStatus.SUCCESS,
@@ -138,6 +146,12 @@ class RequestProcessorTest {
val mtbFile =
PatientRecord.builder()
.patient(Patient.builder().id("123").build())
+ .diagnoses(
+ listOf(
+ MtbDiagnosis().code(Coding().code("C80.9"))
+ .recordedOn(Date.from(Instant.parse("2020-01-01T02:00:00.00Z")))
+ )
+ )
.episodesOfCare(
listOf(
MtbEpisodeOfCare.builder()
@@ -169,7 +183,7 @@ class RequestProcessorTest {
randomRequestId(),
PatientPseudonym("TEST_12345678901"),
PatientId("P1"),
- Fingerprint("me6ockoru4boi4ypghfia5myfqtuffwlbszwhtop2rtltb3ycjva"),
+ Fingerprint("q3qfwecsw3tcmdsg4kg5ki4ob3qw3warnwi4qc54nptjgzft53nq"),
RequestType.MTB_FILE,
SubmissionType.TEST,
RequestStatus.SUCCESS,
@@ -195,6 +209,12 @@ class RequestProcessorTest {
val mtbFile =
PatientRecord.builder()
.patient(Patient.builder().id("123").build())
+ .diagnoses(
+ listOf(
+ MtbDiagnosis().code(Coding().code("C80.9"))
+ .recordedOn(Date.from(Instant.parse("2020-01-01T02:00:00.00Z")))
+ )
+ )
.episodesOfCare(
listOf(
MtbEpisodeOfCare.builder()
@@ -256,6 +276,12 @@ class RequestProcessorTest {
val mtbFile =
PatientRecord.builder()
.patient(Patient.builder().id("123").build())
+ .diagnoses(
+ listOf(
+ MtbDiagnosis().code(Coding().code("C80.9"))
+ .recordedOn(Date.from(Instant.parse("2020-01-01T02:00:00.00Z")))
+ )
+ )
.episodesOfCare(
listOf(
MtbEpisodeOfCare.builder()
@@ -321,6 +347,12 @@ class RequestProcessorTest {
val mtbFile =
PatientRecord.builder()
.patient(Patient.builder().id("123").build())
+ .diagnoses(
+ listOf(
+ MtbDiagnosis().code(Coding().code("C80.9"))
+ .recordedOn(Date.from(Instant.parse("2020-01-01T02:00:00.00Z")))
+ )
+ )
.metadata(
MvhMetadata.builder()
.modelProjectConsent(
@@ -423,6 +455,7 @@ class RequestProcessorTest {
pseudonymizeService,
transformationService,
sender,
+ listOf(routedMtbFileSender),
requestService,
jsonMapper,
applicationEventPublisher,
@@ -433,6 +466,12 @@ class RequestProcessorTest {
val mtbFile =
PatientRecord.builder()
.patient(Patient.builder().id("123").build())
+ .diagnoses(
+ listOf(
+ MtbDiagnosis().code(Coding().code("C80.9"))
+ .recordedOn(Date.from(Instant.parse("2020-01-01T02:00:00.00Z")))
+ )
+ )
.metadata(MvhMetadata())
.episodesOfCare(
listOf(
@@ -516,6 +555,12 @@ class RequestProcessorTest {
val mtbFile =
PatientRecord.builder()
.patient(Patient.builder().id("123").build())
+ .diagnoses(
+ listOf(
+ MtbDiagnosis().code(Coding().code("C80.9"))
+ .recordedOn(Date.from(Instant.parse("2020-01-01T02:00:00.00Z")))
+ )
+ )
.metadata(MvhMetadata())
.episodesOfCare(
listOf(
@@ -596,6 +641,12 @@ class RequestProcessorTest {
val mtbFile =
PatientRecord.builder()
.patient(Patient.builder().id("123").build())
+ .diagnoses(
+ listOf(
+ MtbDiagnosis().code(Coding().code("C80.9"))
+ .recordedOn(Date.from(Instant.parse("2020-01-01T02:00:00.00Z")))
+ )
+ )
.episodesOfCare(
listOf(
MtbEpisodeOfCare.builder()
@@ -647,6 +698,7 @@ class RequestProcessorTest {
pseudonymizeService,
transformationService,
sender,
+ listOf(routedMtbFileSender),
requestService,
jsonMapper,
applicationEventPublisher,
@@ -657,6 +709,12 @@ class RequestProcessorTest {
val mtbFile =
PatientRecord.builder()
.patient(Patient.builder().id("123").build())
+ .diagnoses(
+ listOf(
+ MtbDiagnosis().code(Coding().code("C80.9"))
+ .recordedOn(Date.from(Instant.parse("2023-01-01T02:00:00.00Z")))
+ )
+ )
.metadata(MvhMetadata())
.episodesOfCare(
listOf(
@@ -717,6 +775,7 @@ class RequestProcessorTest {
pseudonymizeService,
transformationService,
sender,
+ listOf(routedMtbFileSender),
requestService,
jsonMapper,
applicationEventPublisher,
@@ -789,6 +848,7 @@ class RequestProcessorTest {
pseudonymizeService,
transformationService,
sender,
+ listOf(routedMtbFileSender),
requestService,
jsonMapper,
applicationEventPublisher,
@@ -799,6 +859,7 @@ class RequestProcessorTest {
val mtbFile =
PatientRecord.builder()
.patient(Patient.builder().id("123").build())
+ .diagnoses(listOf(MtbDiagnosis().code(Coding().code("C80.9")).recordedOn(Date())))
.episodesOfCare(
listOf(
MtbEpisodeOfCare.builder()
@@ -894,6 +955,7 @@ class RequestProcessorTest {
pseudonymizeService,
transformationService,
sender,
+ listOf(routedMtbFileSender),
requestService,
jsonMapper,
applicationEventPublisher,
@@ -904,6 +966,12 @@ class RequestProcessorTest {
val mtbFile =
PatientRecord.builder()
.patient(Patient.builder().id("123").build())
+ .diagnoses(
+ listOf(
+ MtbDiagnosis().code(Coding().code("C80.9"))
+ .recordedOn(Date.from(Instant.parse("2020-01-01T02:00:00.00Z")))
+ )
+ )
.metadata(MvhMetadata.builder().type(MvhSubmissionType.INITIAL).build())
.episodesOfCare(
listOf(
@@ -1006,6 +1074,7 @@ class RequestProcessorTest {
pseudonymizeService,
transformationService,
sender,
+ listOf(routedMtbFileSender),
requestService,
jsonMapper,
applicationEventPublisher,
@@ -1016,6 +1085,12 @@ class RequestProcessorTest {
val mtbFile =
PatientRecord.builder()
.patient(Patient.builder().id("123").build())
+ .diagnoses(
+ listOf(
+ MtbDiagnosis().code(Coding().code("C80.9"))
+ .recordedOn(Date.from(Instant.parse("2020-01-01T02:00:00.00Z")))
+ )
+ )
.metadata(MvhMetadata.builder().type(MvhSubmissionType.INITIAL).build())
.episodesOfCare(
listOf(
@@ -1105,6 +1180,7 @@ class RequestProcessorTest {
pseudonymizeService,
transformationService,
sender,
+ listOf(routedMtbFileSender),
requestService,
jsonMapper,
applicationEventPublisher,
@@ -1115,6 +1191,7 @@ class RequestProcessorTest {
val mtbFile =
PatientRecord.builder()
.patient(Patient.builder().id("123").build())
+ .diagnoses(listOf(MtbDiagnosis().code(Coding().code("C80.9"))))
.metadata(MvhMetadata.builder().type(MvhSubmissionType.INITIAL).build())
.episodesOfCare(
listOf(
@@ -1187,6 +1264,7 @@ class RequestProcessorTest {
pseudonymizeService,
transformationService,
sender,
+ listOf(routedMtbFileSender),
requestService,
jsonMapper,
applicationEventPublisher,
@@ -1262,6 +1340,7 @@ class RequestProcessorTest {
pseudonymizeService,
transformationService,
sender,
+ listOf(routedMtbFileSender),
requestService,
jsonMapper,
applicationEventPublisher,
@@ -1273,6 +1352,12 @@ class RequestProcessorTest {
PatientRecord.builder()
.patient(Patient.builder().id("123").build())
.metadata(MvhMetadata.builder().type(MvhSubmissionType.INITIAL).build())
+ .diagnoses(
+ listOf(
+ MtbDiagnosis().code(Coding().code("C80.9"))
+ .recordedOn(Date.from(Instant.parse("2020-01-01T02:00:00.00Z")))
+ )
+ )
.episodesOfCare(
listOf(
MtbEpisodeOfCare.builder()
@@ -1384,6 +1469,7 @@ class RequestProcessorTest {
pseudonymizeService,
transformationService,
sender,
+ listOf(routedMtbFileSender),
requestService,
jsonMapper,
applicationEventPublisher,
@@ -1394,6 +1480,12 @@ class RequestProcessorTest {
val mtbFile =
PatientRecord.builder()
.patient(Patient.builder().id("123").build())
+ .diagnoses(
+ listOf(
+ MtbDiagnosis().code(Coding().code("C80.9"))
+ .recordedOn(Date.from(Instant.parse("2020-01-01T02:00:00.00Z")))
+ )
+ )
.metadata(MvhMetadata.builder().type(MvhSubmissionType.INITIAL).build())
.episodesOfCare(
listOf(
@@ -1492,6 +1584,7 @@ class RequestProcessorTest {
pseudonymizeService,
transformationService,
sender,
+ listOf(routedMtbFileSender),
requestService,
jsonMapper,
applicationEventPublisher,
@@ -1502,6 +1595,12 @@ class RequestProcessorTest {
val mtbFile =
PatientRecord.builder()
.patient(Patient.builder().id("123").build())
+ .diagnoses(
+ listOf(
+ MtbDiagnosis().code(Coding().code("C80.9"))
+ .recordedOn(Date.from(Instant.parse("2020-01-01T02:00:00.00Z")))
+ )
+ )
.metadata(MvhMetadata.builder().type(MvhSubmissionType.INITIAL).build())
.episodesOfCare(
listOf(
@@ -1616,6 +1715,7 @@ class RequestProcessorTest {
pseudonymizeService,
transformationService,
sender,
+ listOf(routedMtbFileSender),
requestService,
jsonMapper,
applicationEventPublisher,
@@ -1626,6 +1726,12 @@ class RequestProcessorTest {
val mtbFile =
PatientRecord.builder()
.patient(Patient.builder().id("123").build())
+ .diagnoses(
+ listOf(
+ MtbDiagnosis().code(Coding().code("C80.9"))
+ .recordedOn(Date.from(Instant.parse("2020-01-01T02:00:00.00Z")))
+ )
+ )
.metadata(MvhMetadata.builder().type(MvhSubmissionType.INITIAL).build())
.episodesOfCare(
listOf(
@@ -1754,6 +1860,7 @@ class RequestProcessorTest {
pseudonymizeService,
transformationService,
sender,
+ listOf(routedMtbFileSender),
requestService,
jsonMapper,
applicationEventPublisher,
@@ -1764,6 +1871,12 @@ class RequestProcessorTest {
val mtbFile =
PatientRecord.builder()
.patient(Patient.builder().id("123").build())
+ .diagnoses(
+ listOf(
+ MtbDiagnosis().code(Coding().code("C80.9"))
+ .recordedOn(Date.from(Instant.parse("2020-01-01T02:00:00.00Z")))
+ )
+ )
.metadata(MvhMetadata.builder().type(MvhSubmissionType.INITIAL).build())
.episodesOfCare(
listOf(
@@ -1883,6 +1996,7 @@ class RequestProcessorTest {
pseudonymizeService,
transformationService,
sender,
+ listOf(routedMtbFileSender),
requestService,
jsonMapper,
applicationEventPublisher,
@@ -1893,6 +2007,12 @@ class RequestProcessorTest {
val mtbFile =
PatientRecord.builder()
.patient(Patient.builder().id("123").build())
+ .diagnoses(
+ listOf(
+ MtbDiagnosis().code(Coding().code("C80.9"))
+ .recordedOn(Date.from(Instant.parse("2020-01-01T02:00:00.00Z")))
+ )
+ )
.metadata(MvhMetadata.builder().type(MvhSubmissionType.INITIAL).build())
.episodesOfCare(
listOf(
@@ -1979,6 +2099,7 @@ class RequestProcessorTest {
pseudonymizeService,
transformationService,
sender,
+ listOf(routedMtbFileSender),
requestService,
jsonMapper,
applicationEventPublisher,
@@ -1989,6 +2110,12 @@ class RequestProcessorTest {
val mtbFile =
PatientRecord.builder()
.patient(Patient.builder().id("123").build())
+ .diagnoses(
+ listOf(
+ MtbDiagnosis().code(Coding().code("C80.9"))
+ .recordedOn(Date.from(Instant.parse("2020-01-01T02:00:00.00Z")))
+ )
+ )
.metadata(MvhMetadata.builder().type(MvhSubmissionType.INITIAL).build())
.episodesOfCare(
listOf(
@@ -2089,6 +2216,7 @@ class RequestProcessorTest {
pseudonymizeService,
transformationService,
sender,
+ listOf(routedMtbFileSender),
requestService,
jsonMapper,
applicationEventPublisher,
@@ -2099,6 +2227,12 @@ class RequestProcessorTest {
val mtbFile =
PatientRecord.builder()
.patient(Patient.builder().id("123").build())
+ .diagnoses(
+ listOf(
+ MtbDiagnosis().code(Coding().code("C80.9"))
+ .recordedOn(Date.from(Instant.parse("2020-01-01T02:00:00.00Z")))
+ )
+ )
.metadata(MvhMetadata.builder().type(MvhSubmissionType.INITIAL).build())
.episodesOfCare(
listOf(
@@ -2135,6 +2269,206 @@ class RequestProcessorTest {
}
}
+ @Nested
+ inner class SwitchedSenders {
+
+ private lateinit var pseudonymizeService: PseudonymizeService
+ private lateinit var transformationService: TransformationService
+ private lateinit var sender: MtbFileSender
+ private lateinit var routedMtbFileSender: RoutedMtbFileSender
+ private lateinit var requestService: RequestService
+ private lateinit var applicationEventPublisher: ApplicationEventPublisher
+ private lateinit var appConfigProperties: AppConfigProperties
+ private lateinit var consentProcessor: ConsentProcessor
+ private lateinit var requestProcessor: RequestProcessor
+ private lateinit var jsonMapper: JsonMapper
+
+ @BeforeEach
+ fun setup(
+ @Mock pseudonymizeService: PseudonymizeService,
+ @Mock transformationService: TransformationService,
+ @Mock sender: MtbFileSender,
+ @Mock routedMtbFileSender: RoutedMtbFileSender,
+ @Mock requestService: RequestService,
+ @Mock applicationEventPublisher: ApplicationEventPublisher,
+ @Mock consentProcessor: ConsentProcessor,
+ ) {
+ this.pseudonymizeService = pseudonymizeService
+ this.transformationService = transformationService
+ this.sender = sender
+ this.routedMtbFileSender = routedMtbFileSender
+ this.requestService = requestService
+ this.applicationEventPublisher = applicationEventPublisher
+ this.appConfigProperties = AppConfigProperties()
+ this.consentProcessor = consentProcessor
+ this.jsonMapper = JsonMapper()
+
+ requestProcessor =
+ RequestProcessor(
+ pseudonymizeService,
+ transformationService,
+ sender,
+ listOf(routedMtbFileSender),
+ requestService,
+ jsonMapper,
+ applicationEventPublisher,
+ appConfigProperties,
+ consentProcessor,
+ )
+
+ doAnswer {
+ val diagnosis = it.arguments[0] as MtbDiagnosis
+ diagnosis.code.code.equals("C34.9")
+ }.whenever(routedMtbFileSender).supportsDiagnosis(any<MtbDiagnosis>())
+ }
+
+ @Test
+ fun testShouldSendMtbFileUsingSwitchedSenderAndSendSuccessEvent() {
+ doAnswer {
+ Request(
+ 1L,
+ randomRequestId(),
+ PatientPseudonym("TEST_12345678901"),
+ PatientId("P1"),
+ Fingerprint("different"),
+ RequestType.MTB_FILE,
+ SubmissionType.TEST,
+ RequestStatus.SUCCESS,
+ Tan.empty(),
+ Instant.parse("2023-08-08T02:00:00Z"),
+ )
+ }
+ .whenever(requestService)
+ .lastMtbFileRequestForPatientPseudonym(anyValueClass())
+
+ doAnswer { false }
+ .whenever(requestService)
+ .isLastRequestWithKnownStatusDeletion(anyValueClass())
+
+ doAnswer { MtbFileSender.Response(status = RequestStatus.SUCCESS) }
+ .whenever(routedMtbFileSender)
+ .send(any<DnpmV2MtbFileRequest>())
+
+ doAnswer { it.arguments[0] as String }
+ .whenever(pseudonymizeService)
+ .patientPseudonym(anyValueClass())
+
+ doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<PatientRecord>())
+
+ whenever(consentProcessor.consentGatedCheckAndTryEmbedding(any())).thenReturn(true)
+
+ val mtbFile =
+ PatientRecord.builder()
+ .patient(Patient.builder().id("123").build())
+ .diagnoses(
+ listOf(
+ MtbDiagnosis().code(Coding().code("C34.9"))
+ .recordedOn(Date.from(Instant.parse("2020-01-01T02:00:00.00Z")))
+ )
+ )
+ .episodesOfCare(
+ listOf(
+ MtbEpisodeOfCare.builder()
+ .id("1")
+ .patient(Reference.builder().id("123").build())
+ .period(
+ PeriodDate.builder()
+ .start(Date.from(Instant.parse("2021-01-01T00:00:00.00Z")))
+ .build()
+ )
+ .build()
+ )
+ )
+ .build()
+
+ this.requestProcessor.processMtbFile(mtbFile)
+
+ // Do not use DNPM:DIP sender
+ verify(sender, never()).send(any<MtbFileRequest<PatientRecord>>())
+ // Use switched sender instead
+ verify(routedMtbFileSender, times(1)).send(any<MtbFileRequest<PatientRecord>>())
+
+ val eventCaptor = argumentCaptor<ResponseEvent>()
+ verify(applicationEventPublisher, times(1)).publishEvent(eventCaptor.capture())
+ assertThat(eventCaptor.firstValue).isNotNull
+ assertThat(eventCaptor.firstValue.status).isEqualTo(RequestStatus.SUCCESS)
+ }
+
+ @Test
+ fun testShouldNotSendMtbFileUsingSwitchedSenderAndSendSuccessEvent() {
+ doAnswer {
+ Request(
+ 1L,
+ randomRequestId(),
+ PatientPseudonym("TEST_12345678901"),
+ PatientId("P1"),
+ Fingerprint("different"),
+ RequestType.MTB_FILE,
+ SubmissionType.TEST,
+ RequestStatus.SUCCESS,
+ Tan.empty(),
+ Instant.parse("2023-08-08T02:00:00Z"),
+ )
+ }
+ .whenever(requestService)
+ .lastMtbFileRequestForPatientPseudonym(anyValueClass())
+
+ doAnswer { false }
+ .whenever(requestService)
+ .isLastRequestWithKnownStatusDeletion(anyValueClass())
+
+ doAnswer { MtbFileSender.Response(status = RequestStatus.SUCCESS) }
+ .whenever(sender)
+ .send(any<DnpmV2MtbFileRequest>())
+
+ doAnswer { it.arguments[0] as String }
+ .whenever(pseudonymizeService)
+ .patientPseudonym(anyValueClass())
+
+ doAnswer { it.arguments[0] }.whenever(transformationService).transform(any<PatientRecord>())
+
+ whenever(consentProcessor.consentGatedCheckAndTryEmbedding(any())).thenReturn(true)
+
+ val mtbFile =
+ PatientRecord.builder()
+ .patient(Patient.builder().id("123").build())
+ .diagnoses(
+ listOf(
+ MtbDiagnosis().code(Coding().code("C80.9"))
+ .recordedOn(Date.from(Instant.parse("2020-01-01T02:00:00.00Z")))
+ )
+ )
+ .episodesOfCare(
+ listOf(
+ MtbEpisodeOfCare.builder()
+ .id("1")
+ .patient(Reference.builder().id("123").build())
+ .period(
+ PeriodDate.builder()
+ .start(Date.from(Instant.parse("2021-01-01T00:00:00.00Z")))
+ .build()
+ )
+ .build()
+ )
+ )
+ .build()
+
+ this.requestProcessor.processMtbFile(mtbFile)
+
+ // Use DNPM:DIP sender
+ verify(sender, times(1)).send(any<MtbFileRequest<PatientRecord>>())
+ // Not switched sender
+ verify(routedMtbFileSender, never()).send(any<MtbFileRequest<PatientRecord>>())
+
+ val eventCaptor = argumentCaptor<ResponseEvent>()
+ verify(applicationEventPublisher, times(1)).publishEvent(eventCaptor.capture())
+ assertThat(eventCaptor.firstValue).isNotNull
+ assertThat(eventCaptor.firstValue.status).isEqualTo(RequestStatus.SUCCESS)
+ }
+
+ }
+
+
@Test
fun shouldCatchExceptionsWhenProcessingMtbFileAndSaveError() {
val invalidMtbFile = PatientRecord.builder().build()