From 3fe4ab710951fe2d9f11324d6f940fdcef256f18 Mon Sep 17 00:00:00 2001 From: david steinsland Date: Sat, 16 Nov 2024 16:41:31 +0100 Subject: [PATCH] bruker postgres-testdatabaser --- build.gradle.kts | 16 ++- .../nav/helse/sporbar/BehandlingstatusTest.kt | 85 ++++++------ .../helse/sporbar/NyttDokumentRiverTest.kt | 55 ++++---- .../no/nav/helse/sporbar/TestDatabase.kt | 32 +---- .../no/nav/helse/sporbar/UtbetalingTest.kt | 131 +++++++++--------- .../helse/sporbar/VedtakFattetRiverTest.kt | 109 ++++++++------- 6 files changed, 208 insertions(+), 220 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index a71e9ba..5c85d4f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,10 +1,9 @@ val mainClass = "no.nav.helse.sporbar.AppKt" val rapidsAndRiversVersion = "2024111509181731658731.11009b44c672" -val tbdLibsVersion = "2024.11.15-09.09-08ca346b" +val tbdLibsVersion = "2024.11.16-11.06-2a807bca" val ktorVersion = "3.0.1" val junitJupiterVersion = "5.11.3" -val testcontainersVersion = "1.20.3" val mockkVersion = "1.13.13" val postgresqlVersion = "42.7.4" val kotliqueryVersion = "1.9.0" @@ -38,14 +37,13 @@ dependencies { implementation("com.github.seratch:kotliquery:$kotliqueryVersion") testImplementation("com.github.navikt.tbd-libs:rapids-and-rivers-test:$tbdLibsVersion") - testImplementation("org.junit.jupiter:junit-jupiter:$junitJupiterVersion") - testRuntimeOnly("org.junit.platform:junit-platform-launcher") - - testImplementation("org.testcontainers:postgresql:$testcontainersVersion") + testImplementation("com.github.navikt.tbd-libs:postgres-testdatabaser:$tbdLibsVersion") testImplementation("io.mockk:mockk:$mockkVersion") testImplementation("com.networknt:json-schema-validator:$jsonSchemaValidatorVersion") testImplementation("org.skyscreamer:jsonassert:$jsonassertVersion") + testImplementation("org.junit.jupiter:junit-jupiter:$junitJupiterVersion") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") } repositories { @@ -77,6 +75,12 @@ tasks { testLogging { events("skipped", "failed") } + + val parallellDisabled = System.getenv("CI" ) == "true" + systemProperty("junit.jupiter.execution.parallel.enabled", parallellDisabled.not().toString()) + systemProperty("junit.jupiter.execution.parallel.mode.default", "concurrent") + systemProperty("junit.jupiter.execution.parallel.config.strategy", "fixed") + systemProperty("junit.jupiter.execution.parallel.config.fixed.parallelism", "8") } withType { diff --git a/src/test/kotlin/no/nav/helse/sporbar/BehandlingstatusTest.kt b/src/test/kotlin/no/nav/helse/sporbar/BehandlingstatusTest.kt index 16020f6..fc12314 100644 --- a/src/test/kotlin/no/nav/helse/sporbar/BehandlingstatusTest.kt +++ b/src/test/kotlin/no/nav/helse/sporbar/BehandlingstatusTest.kt @@ -1,47 +1,19 @@ package no.nav.helse.sporbar import com.github.navikt.tbd_libs.rapids_and_rivers.test_support.TestRapid -import java.time.LocalDateTime -import java.util.UUID -import no.nav.helse.sporbar.sis.BehandlingForkastetRiver -import no.nav.helse.sporbar.sis.BehandlingLukketRiver -import no.nav.helse.sporbar.sis.BehandlingOpprettetRiver -import no.nav.helse.sporbar.sis.Behandlingstatusmelding -import no.nav.helse.sporbar.sis.Behandlingstatusmelding.Behandlingstatustype.BEHANDLES_UTENFOR_SPEIL -import no.nav.helse.sporbar.sis.Behandlingstatusmelding.Behandlingstatustype.FERDIG -import no.nav.helse.sporbar.sis.Behandlingstatusmelding.Behandlingstatustype.OPPRETTET -import no.nav.helse.sporbar.sis.Behandlingstatusmelding.Behandlingstatustype.VENTER_PÅ_ANNEN_PERIODE -import no.nav.helse.sporbar.sis.Behandlingstatusmelding.Behandlingstatustype.VENTER_PÅ_ARBEIDSGIVER -import no.nav.helse.sporbar.sis.Behandlingstatusmelding.Behandlingstatustype.VENTER_PÅ_SAKSBEHANDLER -import no.nav.helse.sporbar.sis.SisPublisher -import no.nav.helse.sporbar.sis.VedtaksperiodeVenterRiver +import no.nav.helse.sporbar.sis.* +import no.nav.helse.sporbar.sis.Behandlingstatusmelding.Behandlingstatustype.* import org.intellij.lang.annotations.Language import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test +import java.time.LocalDateTime +import java.util.* class BehandlingstatusTest { - private val testRapid = TestRapid() - private val dokumentDao = DokumentDao { TestDatabase.dataSource } - - private val sisPublisher = TestSisPublisher() - - init { - NyttDokumentRiver(testRapid, dokumentDao) - BehandlingOpprettetRiver(testRapid, dokumentDao, sisPublisher) - VedtaksperiodeVenterRiver(testRapid, dokumentDao, sisPublisher) - BehandlingLukketRiver(testRapid, sisPublisher) - BehandlingForkastetRiver(testRapid, sisPublisher) - } - - @BeforeEach - fun reset() { - testRapid.reset() - } @Test - fun `Ny behandling som avsluttes`() { + fun `Ny behandling som avsluttes`() = e2e { val søknadId = UUID.randomUUID() val eksternSøknadId = UUID.randomUUID() val vedtaksperiodeId = UUID.randomUUID() @@ -56,7 +28,7 @@ class BehandlingstatusTest { } @Test - fun `Behandles utenfor Speil`() { + fun `Behandles utenfor Speil`() = e2e { val søknadId = UUID.randomUUID() val vedtaksperiodeId = UUID.randomUUID() sendSøknad(søknadId) @@ -68,7 +40,7 @@ class BehandlingstatusTest { } @Test - fun `Out of order søknad`() { + fun `Out of order søknad`() = e2e { val søknadIdMars = UUID.randomUUID() val eksternSøknadIdMars = UUID.randomUUID() val vedtaksperiodeIdMars = UUID.randomUUID() @@ -97,7 +69,7 @@ class BehandlingstatusTest { } @Test - fun `Overlappende søknader fra to arbeidsgivere`() { + fun `Overlappende søknader fra to arbeidsgivere`() = e2e { val søknadIdAG1 = UUID.randomUUID() val eksternSøknadIdAG1 = UUID.randomUUID() val vedtaksperiodeIdAG1 = UUID.randomUUID() @@ -118,7 +90,7 @@ class BehandlingstatusTest { } @Test - fun `Venter på søknad på annen arbeidsgiver`() { + fun `Venter på søknad på annen arbeidsgiver`() = e2e { val søknadId = UUID.randomUUID() val vedtaksperiodeId = UUID.randomUUID() @@ -130,7 +102,7 @@ class BehandlingstatusTest { } @Test - fun `Venter selv på inntektsmelding skal ikke gi ny status`() { + fun `Venter selv på inntektsmelding skal ikke gi ny status`() = e2e { val søknadId = UUID.randomUUID() val vedtaksperiodeId = UUID.randomUUID() @@ -142,7 +114,32 @@ class BehandlingstatusTest { assertEquals(listOf(OPPRETTET, VENTER_PÅ_ARBEIDSGIVER), sisPublisher.sendteStatuser(vedtaksperiodeId)) } - private fun sendSøknad(søknadId: UUID, eksternSøknadId: UUID = UUID.randomUUID()) { + private data class E2ETestContext( + val testRapid: TestRapid, + val dokumentDao: DokumentDao, + val sisPublisher: TestSisPublisher + ) { + init { + NyttDokumentRiver(testRapid, dokumentDao) + BehandlingOpprettetRiver(testRapid, dokumentDao, sisPublisher) + VedtaksperiodeVenterRiver(testRapid, dokumentDao, sisPublisher) + BehandlingLukketRiver(testRapid, sisPublisher) + BehandlingForkastetRiver(testRapid, sisPublisher) + } + } + private fun e2e(testblokk: E2ETestContext.() -> Unit) { + val testDataSource = databaseContainer.nyTilkobling() + try { + val testRapid = TestRapid() + val dokumentDao = DokumentDao(testDataSource::ds) + val sisPublisher = TestSisPublisher() + testblokk(E2ETestContext(testRapid, dokumentDao, sisPublisher)) + } finally { + databaseContainer.droppTilkobling(testDataSource) + } + } + + private fun E2ETestContext.sendSøknad(søknadId: UUID, eksternSøknadId: UUID = UUID.randomUUID()) { @Language("JSON") val melding = """{ "@event_name": "sendt_søknad_nav", @@ -153,7 +150,7 @@ class BehandlingstatusTest { }""".trimIndent() testRapid.sendTestMessage(melding) } - private fun sendBehandlingOpprettet(vedtaksperiodeId: UUID, søknadId: UUID) { + private fun E2ETestContext.sendBehandlingOpprettet(vedtaksperiodeId: UUID, søknadId: UUID) { @Language("JSON") val melding = """{ "@event_name": "behandling_opprettet", @@ -165,7 +162,7 @@ class BehandlingstatusTest { }""".trimIndent() testRapid.sendTestMessage(melding) } - private fun sendVedtaksperiodeVenter(vedtaksperiodeId: UUID, hva: String, venterPåVedtaksperiodeId: UUID = vedtaksperiodeId, venterPåOrganisasjonsnummer: String = "999999999", søknadId: UUID) { + private fun E2ETestContext.sendVedtaksperiodeVenter(vedtaksperiodeId: UUID, hva: String, venterPåVedtaksperiodeId: UUID = vedtaksperiodeId, venterPåOrganisasjonsnummer: String = "999999999", søknadId: UUID) { @Language("JSON") val melding = """{ "@event_name": "vedtaksperiode_venter", @@ -185,8 +182,8 @@ class BehandlingstatusTest { }""".trimIndent() testRapid.sendTestMessage(melding) } - private fun sendVedtaksperiodeVenterPåGodkjenning(vedtaksperiodeId: UUID, søknadId: UUID) = sendVedtaksperiodeVenter(vedtaksperiodeId, "GODKJENNING", søknadId = søknadId) - private fun sendBehandlingLukket(vedtaksperiodeId: UUID) { + private fun E2ETestContext.sendVedtaksperiodeVenterPåGodkjenning(vedtaksperiodeId: UUID, søknadId: UUID) = sendVedtaksperiodeVenter(vedtaksperiodeId, "GODKJENNING", søknadId = søknadId) + private fun E2ETestContext.sendBehandlingLukket(vedtaksperiodeId: UUID) { @Language("JSON") val melding = """{ "@event_name": "behandling_lukket", @@ -197,7 +194,7 @@ class BehandlingstatusTest { }""".trimIndent() testRapid.sendTestMessage(melding) } - private fun sendBehandlingForkastet(vedtaksperiodeId: UUID) { + private fun E2ETestContext.sendBehandlingForkastet(vedtaksperiodeId: UUID) { @Language("JSON") val melding = """{ "@event_name": "behandling_forkastet", diff --git a/src/test/kotlin/no/nav/helse/sporbar/NyttDokumentRiverTest.kt b/src/test/kotlin/no/nav/helse/sporbar/NyttDokumentRiverTest.kt index 3e8faa6..92b028c 100644 --- a/src/test/kotlin/no/nav/helse/sporbar/NyttDokumentRiverTest.kt +++ b/src/test/kotlin/no/nav/helse/sporbar/NyttDokumentRiverTest.kt @@ -4,28 +4,13 @@ import com.github.navikt.tbd_libs.rapids_and_rivers.test_support.TestRapid import org.intellij.lang.annotations.Language import org.junit.jupiter.api.Assertions.assertDoesNotThrow import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test -import org.junit.jupiter.api.TestInstance import java.util.* -@TestInstance(TestInstance.Lifecycle.PER_CLASS) internal class NyttDokumentRiverTest { - private val testRapid = TestRapid() - private val dokumentDao = DokumentDao { TestDatabase.dataSource } - - init { - NyttDokumentRiver(testRapid, dokumentDao) - } - - @BeforeEach - fun setup() { - testRapid.reset() - } - @Test - fun `ny søknad hendelse`() { + fun `ny søknad hendelse`() = e2e { val nySøknadHendelseId = UUID.randomUUID() val sykmeldingId = UUID.randomUUID() val søknadId = UUID.randomUUID() @@ -37,7 +22,7 @@ internal class NyttDokumentRiverTest { } @Test - fun `sendt søknad arbeidsledig`() { + fun `sendt søknad arbeidsledig`() = e2e { val nySøknadHendelseId = UUID.randomUUID() val sykmeldingId = UUID.randomUUID() val søknadId = UUID.randomUUID() @@ -49,7 +34,7 @@ internal class NyttDokumentRiverTest { } @Test - fun `duplikate hendelser for ny søknad hendelse og en sendt søknad hendelse`() { + fun `duplikate hendelser for ny søknad hendelse og en sendt søknad hendelse`() = e2e { val nySøknadHendelseId = UUID.randomUUID() val sendtSøknadHendelseId = UUID.randomUUID() val sykmeldingId = UUID.randomUUID() @@ -66,7 +51,7 @@ internal class NyttDokumentRiverTest { } @Test - fun `ny søknad hendelse med hendelseId som ikke er gyldig UUID-format`() { + fun `ny søknad hendelse med hendelseId som ikke er gyldig UUID-format`() = e2e { val nySøknadHendelseId = "1234-1234-1234-1234" val sykmeldingId = UUID.randomUUID().toString() val søknadId = UUID.randomUUID().toString() @@ -76,7 +61,7 @@ internal class NyttDokumentRiverTest { } @Test - fun `ny søknad hendelse med sykmeldingId som ikke er gyldig UUID-format`() { + fun `ny søknad hendelse med sykmeldingId som ikke er gyldig UUID-format`() = e2e { val nySøknadHendelseId = UUID.randomUUID().toString() val sykmeldingId = "3456-3456-3456-3456" val søknadId = UUID.randomUUID().toString() @@ -86,7 +71,7 @@ internal class NyttDokumentRiverTest { } @Test - fun `ny søknad hendelse med søknadId som ikke er gyldig UUID-format`() { + fun `ny søknad hendelse med søknadId som ikke er gyldig UUID-format`() = e2e { val nySøknadHendelseId = UUID.randomUUID().toString() val sykmeldingId = UUID.randomUUID().toString() val søknadId = "5678-5678-5678-5678" @@ -95,15 +80,35 @@ internal class NyttDokumentRiverTest { } } + private data class E2ETestContext( + val testRapid: TestRapid, + val dokumentDao: DokumentDao + ) { + init { + NyttDokumentRiver(testRapid, dokumentDao) + } + } + private fun e2e(testblokk: E2ETestContext.() -> Unit) { + val testDataSource = databaseContainer.nyTilkobling() + try { + val testRapid = TestRapid() + val ds = testDataSource.ds + val dokumentDao = DokumentDao { ds } + testblokk(E2ETestContext(testRapid, dokumentDao)) + } finally { + databaseContainer.droppTilkobling(testDataSource) + } + } + @Language("JSON") - private fun nySøknadMessage( + private fun E2ETestContext.nySøknadMessage( nySøknadHendelseId: UUID, sykmeldingDokumentId: UUID, søknadDokumentId: UUID ) = nySøknadMessage(nySøknadHendelseId.toString(), sykmeldingDokumentId.toString(), søknadDokumentId.toString()) @Language("JSON") - private fun nySøknadMessage( + private fun E2ETestContext.nySøknadMessage( nySøknadHendelseId: String, sykmeldingDokumentId: String, søknadDokumentId: String @@ -117,7 +122,7 @@ internal class NyttDokumentRiverTest { }""" @Language("JSON") - private fun sendtSøknadMessage( + private fun E2ETestContext.sendtSøknadMessage( nySøknadHendelseId: UUID, sykmeldingDokumentId: UUID, søknadDokumentId: UUID @@ -131,7 +136,7 @@ internal class NyttDokumentRiverTest { }""" @Language("JSON") - private fun sendtSøknadArbeidsledigMessage( + private fun E2ETestContext.sendtSøknadArbeidsledigMessage( nySøknadHendelseId: UUID, sykmeldingDokumentId: UUID, søknadDokumentId: UUID diff --git a/src/test/kotlin/no/nav/helse/sporbar/TestDatabase.kt b/src/test/kotlin/no/nav/helse/sporbar/TestDatabase.kt index ac63026..d0b7045 100644 --- a/src/test/kotlin/no/nav/helse/sporbar/TestDatabase.kt +++ b/src/test/kotlin/no/nav/helse/sporbar/TestDatabase.kt @@ -1,35 +1,11 @@ package no.nav.helse.sporbar +import com.github.navikt.tbd_libs.test_support.CleanupStrategy +import com.github.navikt.tbd_libs.test_support.DatabaseContainers import com.zaxxer.hikari.HikariConfig import com.zaxxer.hikari.HikariDataSource import org.flywaydb.core.Flyway import org.testcontainers.containers.PostgreSQLContainer -object TestDatabase { - private val postgres = PostgreSQLContainer("postgres:13").also { it.start() } - - val dataSource by lazy { - HikariDataSource(HikariConfig().apply { - jdbcUrl = postgres.jdbcUrl - username = postgres.username - password = postgres.password - maximumPoolSize = 3 - minimumIdle = 1 - idleTimeout = 10001 - connectionTimeout = 1000 - maxLifetime = 30001 - initializationFailTimeout = 5000 - }) - } - - init { - Flyway.configure() - .dataSource(dataSource) - .load() - .migrate() - - Runtime.getRuntime().addShutdownHook(Thread { - dataSource.close() - }) - } -} +private val cleanupStrategy = CleanupStrategy.tables("dokument, flyway_schema_history, hendelse, hendelse_dokument, oppdrag, utbetaling, vedtak, vedtak_hendelse, vedtak_tilstand, vedtaksperiode, vedtaksperiode_hendelse") +val databaseContainer = DatabaseContainers.container("sporbar", cleanupStrategy) \ No newline at end of file diff --git a/src/test/kotlin/no/nav/helse/sporbar/UtbetalingTest.kt b/src/test/kotlin/no/nav/helse/sporbar/UtbetalingTest.kt index 3f43ef2..b96a4b9 100644 --- a/src/test/kotlin/no/nav/helse/sporbar/UtbetalingTest.kt +++ b/src/test/kotlin/no/nav/helse/sporbar/UtbetalingTest.kt @@ -5,25 +5,20 @@ import com.github.navikt.tbd_libs.rapids_and_rivers.test_support.TestRapid import com.github.navikt.tbd_libs.result_object.ok import com.github.navikt.tbd_libs.speed.IdentResponse import com.github.navikt.tbd_libs.speed.SpeedClient -import io.mockk.clearAllMocks import io.mockk.every import io.mockk.mockk import io.mockk.verify -import java.time.LocalDate -import java.time.LocalDateTime -import java.util.UUID import no.nav.helse.sporbar.JsonSchemaValidator.validertJson import org.apache.kafka.clients.producer.KafkaProducer import org.apache.kafka.clients.producer.ProducerRecord import org.intellij.lang.annotations.Language -import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertTrue -import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test -import org.junit.jupiter.api.TestInstance +import java.time.LocalDate +import java.time.LocalDateTime +import java.util.* -@TestInstance(TestInstance.Lifecycle.PER_CLASS) internal class UtbetalingTest { companion object { @@ -48,45 +43,8 @@ internal class UtbetalingTest { val VEDTAK_FATTET_TIDSPUNKT = LocalDateTime.now() } - private val testRapid = TestRapid() - private val producerMock = mockk>(relaxed = true) - private val dokumentDao = DokumentDao { TestDatabase.dataSource } - - private val vedtakFattetMediator = VedtakFattetMediator( - dokumentDao = dokumentDao, - producer = producerMock - ) - - private val utbetalingMediator = UtbetalingMediator( - producer = producerMock - ) - private val speedClient = mockk() - - init { - NyttDokumentRiver(testRapid, dokumentDao) - VedtakFattetRiver(testRapid, vedtakFattetMediator, speedClient) - UtbetalingUtbetaltRiver(testRapid, utbetalingMediator, speedClient) - UtbetalingUtenUtbetalingRiver(testRapid, utbetalingMediator, speedClient) - } - - @BeforeEach - fun setup() { - every { speedClient.hentFødselsnummerOgAktørId(any(), any()) } returns IdentResponse( - fødselsnummer = FØDSELSNUMMER, - aktørId = AKTØRID, - npid = null, - kilde = IdentResponse.KildeResponse.PDL - ).ok() - } - - @AfterEach - fun after() { - testRapid.reset() - clearAllMocks() - } - @Test - fun `vedtakFattet med tilhørende utbetalingUtbetalt`() { + fun `vedtakFattet med tilhørende utbetalingUtbetalt`() = e2e { val captureSlot = mutableListOf>() val idSett = IdSett() @@ -128,7 +86,7 @@ internal class UtbetalingTest { } @Test - fun `utbetaling - mapper ut begrunnelser på avviste dager `() { + fun `utbetaling - mapper ut begrunnelser på avviste dager `() = e2e { val captureSlot = mutableListOf>() testRapid.sendTestMessage(utbetalingUtbetaltEnAvvistDag()) verify { producerMock.send( capture(captureSlot) ) } @@ -158,7 +116,7 @@ internal class UtbetalingTest { } @Test - fun `utbetaling_utbetalt - mapper AndreYtelserDag hele veien ut`() { + fun `utbetaling_utbetalt - mapper AndreYtelserDag hele veien ut`() = e2e { val captureSlot = mutableListOf>() testRapid.sendTestMessage(utbetalingUtbetaltMedAndreYtelserDag()) verify { producerMock.send( capture(captureSlot) ) } @@ -176,7 +134,7 @@ internal class UtbetalingTest { } @Test - fun `utbetaling_utbetalt - mapper ArbeidIkkeGjenopptattDag hele veien ut`() { + fun `utbetaling_utbetalt - mapper ArbeidIkkeGjenopptattDag hele veien ut`() = e2e { val captureSlot = mutableListOf>() testRapid.sendTestMessage(utbetalingUtbetaltMedArbeidIkkeGjenopptattDag()) verify { producerMock.send( capture(captureSlot) ) } @@ -194,7 +152,7 @@ internal class UtbetalingTest { } @Test - fun `utbetaling_uten_utbetaling - mapper ArbeidIkkeGjenopptattDag hele veien ut`() { + fun `utbetaling_uten_utbetaling - mapper ArbeidIkkeGjenopptattDag hele veien ut`() = e2e { val captureSlot = mutableListOf>() testRapid.sendTestMessage(utbetalingUtenUtbetalingMedArbeidIkkeGjenopptattDag()) verify { producerMock.send( capture(captureSlot) ) } @@ -212,7 +170,7 @@ internal class UtbetalingTest { } @Test - fun `vedtakFattet med tilhørende utbetalingUtenUtbetaling`() { + fun `vedtakFattet med tilhørende utbetalingUtenUtbetaling`() = e2e { val captureSlot = mutableListOf>() val idSett = IdSett() @@ -231,7 +189,48 @@ internal class UtbetalingTest { assertEquals("utbetaling_uten_utbetaling", utbetalingUtbetaltJson["event"].textValue()) } - private fun sykmeldingSendt( + private data class E2ETestContext( + val testRapid: TestRapid, + val dokumentDao: DokumentDao + ) { + val producerMock = mockk>(relaxed = true) + val vedtakFattetMediator = VedtakFattetMediator( + dokumentDao = dokumentDao, + producer = producerMock + ) + + val utbetalingMediator = UtbetalingMediator( + producer = producerMock + ) + val speedClient = mockk() + + init { + NyttDokumentRiver(testRapid, dokumentDao) + VedtakFattetRiver(testRapid, vedtakFattetMediator, speedClient) + UtbetalingUtbetaltRiver(testRapid, utbetalingMediator, speedClient) + UtbetalingUtenUtbetalingRiver(testRapid, utbetalingMediator, speedClient) + + every { speedClient.hentFødselsnummerOgAktørId(any(), any()) } returns IdentResponse( + fødselsnummer = FØDSELSNUMMER, + aktørId = AKTØRID, + npid = null, + kilde = IdentResponse.KildeResponse.PDL + ).ok() + } + } + private fun e2e(testblokk: E2ETestContext.() -> Unit) { + val testDataSource = databaseContainer.nyTilkobling() + try { + val testRapid = TestRapid() + val ds = testDataSource.ds + val dokumentDao = DokumentDao { ds } + testblokk(E2ETestContext(testRapid, dokumentDao)) + } finally { + databaseContainer.droppTilkobling(testDataSource) + } + } + + private fun E2ETestContext.sykmeldingSendt( idSett: IdSett, hendelseIder: List = listOf(idSett.nySøknadHendelseId) ) { @@ -252,7 +251,7 @@ internal class UtbetalingTest { ) } - private fun søknadSendt( + private fun E2ETestContext.søknadSendt( idSett: IdSett, hendelseIder: List = listOf(idSett.nySøknadHendelseId, idSett.sendtSøknadHendelseId) ) { @@ -273,7 +272,7 @@ internal class UtbetalingTest { ) } - private fun inntektsmeldingSendt( + private fun E2ETestContext.inntektsmeldingSendt( idSett: IdSett, hendelseIder: List = listOf(idSett.nySøknadHendelseId, idSett.inntektsmeldingHendelseId) ) { @@ -293,7 +292,7 @@ internal class UtbetalingTest { ) } - private fun vedtakFattetMedUtbetalingSendt( + private fun E2ETestContext.vedtakFattetMedUtbetalingSendt( idSett: IdSett, hendelseIder: List = listOf( idSett.nySøknadHendelseId, @@ -311,12 +310,12 @@ internal class UtbetalingTest { testRapid.sendTestMessage(vedtakFattetMedUtbetaling(idSett)) } - private fun utbetalingUtbetaltSendt(idSett: IdSett, event: String = "utbetaling_utbetalt") { + private fun E2ETestContext.utbetalingUtbetaltSendt(idSett: IdSett, event: String = "utbetaling_utbetalt") { testRapid.sendTestMessage(utbetalingUtbetalt(idSett, event)) } @Language("json") - private fun vedtakFattetMedUtbetaling( + private fun E2ETestContext.vedtakFattetMedUtbetaling( idSett: IdSett, hendelser: List = listOf( idSett.nySøknadHendelseId, @@ -362,7 +361,7 @@ internal class UtbetalingTest { @Language("json") - private fun utbetalingUtbetalt(idSett: IdSett, event: String, utbetalingId: UUID = idSett.utbetalingId) = """{ + private fun E2ETestContext.utbetalingUtbetalt(idSett: IdSett, event: String, utbetalingId: UUID = idSett.utbetalingId) = """{ "utbetalingId": "$utbetalingId", "korrelasjonsId": "${idSett.korrelasjonsId}", "fom": "$FOM", @@ -462,7 +461,7 @@ internal class UtbetalingTest { """ @Language("json") - private fun utbetalingUtbetaltEnAvvistDag( + private fun E2ETestContext.utbetalingUtbetaltEnAvvistDag( id: UUID = UUID.randomUUID(), utbetalingId: UUID = UUID.randomUUID() ) = """{ @@ -583,7 +582,7 @@ internal class UtbetalingTest { @Language("json") - private fun utbetalingUtbetaltMedArbeidIkkeGjenopptattDag() = """{ + private fun E2ETestContext.utbetalingUtbetaltMedArbeidIkkeGjenopptattDag() = """{ "@id": "${UUID.randomUUID()}", "fødselsnummer": "12345678910", "utbetalingId": "${UUID.randomUUID()}", @@ -656,7 +655,7 @@ internal class UtbetalingTest { } """ @Language("json") - private fun utbetalingUtenUtbetalingMedArbeidIkkeGjenopptattDag() = """{ + private fun E2ETestContext.utbetalingUtenUtbetalingMedArbeidIkkeGjenopptattDag() = """{ "@id": "${UUID.randomUUID()}", "fødselsnummer": "12345678910", "utbetalingId": "${UUID.randomUUID()}", @@ -721,7 +720,7 @@ internal class UtbetalingTest { """ @Language("json") - private fun utbetalingUtbetaltMedAndreYtelserDag() = """{ + private fun E2ETestContext.utbetalingUtbetaltMedAndreYtelserDag() = """{ "@id": "${UUID.randomUUID()}", "fødselsnummer": "12345678910", "utbetalingId": "${UUID.randomUUID()}", @@ -787,7 +786,7 @@ internal class UtbetalingTest { """ @Language("JSON") - private fun nySøknadMessage( + private fun E2ETestContext.nySøknadMessage( nySøknadHendelseId: UUID, sykmeldingDokumentId: UUID, søknadDokumentId: UUID @@ -801,7 +800,7 @@ internal class UtbetalingTest { }""" @Language("JSON") - private fun sendtSøknadMessage( + private fun E2ETestContext.sendtSøknadMessage( sendtSøknadHendelseId: UUID, sykmeldingDokumentId: UUID, søknadDokumentId: UUID @@ -815,7 +814,7 @@ internal class UtbetalingTest { }""" @Language("JSON") - private fun inntektsmeldingMessage( + private fun E2ETestContext.inntektsmeldingMessage( inntektsmeldingHendelseId: UUID, inntektsmeldingDokumentId: UUID ) = @@ -827,7 +826,7 @@ internal class UtbetalingTest { }""" @Language("JSON") - private fun vedtaksperiodeEndret( + private fun E2ETestContext.vedtaksperiodeEndret( forrige: String, gjeldendeTilstand: String, vedtaksperiodeId: UUID, diff --git a/src/test/kotlin/no/nav/helse/sporbar/VedtakFattetRiverTest.kt b/src/test/kotlin/no/nav/helse/sporbar/VedtakFattetRiverTest.kt index f0f1b7f..a4976b4 100644 --- a/src/test/kotlin/no/nav/helse/sporbar/VedtakFattetRiverTest.kt +++ b/src/test/kotlin/no/nav/helse/sporbar/VedtakFattetRiverTest.kt @@ -10,6 +10,7 @@ import io.mockk.clearAllMocks import io.mockk.every import io.mockk.mockk import io.mockk.verify +import no.nav.helse.sporbar.BehandlingstatusTest.TestSisPublisher import org.apache.kafka.clients.producer.KafkaProducer import org.apache.kafka.clients.producer.ProducerRecord import org.intellij.lang.annotations.Language @@ -22,9 +23,12 @@ import java.time.LocalDate import java.time.LocalDateTime import java.util.* import no.nav.helse.sporbar.JsonSchemaValidator.validertJson +import no.nav.helse.sporbar.sis.BehandlingForkastetRiver +import no.nav.helse.sporbar.sis.BehandlingLukketRiver +import no.nav.helse.sporbar.sis.BehandlingOpprettetRiver +import no.nav.helse.sporbar.sis.VedtaksperiodeVenterRiver import org.junit.jupiter.api.AfterEach -@TestInstance(TestInstance.Lifecycle.PER_CLASS) internal class VedtakFattetRiverTest { companion object { @@ -43,43 +47,8 @@ internal class VedtakFattetRiverTest { val VEDTAK_FATTET_TIDSPUNKT = LocalDateTime.now() } - private val testRapid = TestRapid() - private val producerMock = mockk>(relaxed = true) - private val dokumentDao = DokumentDao { TestDatabase.dataSource } - - private val vedtakFattetMediator = VedtakFattetMediator( - dokumentDao = dokumentDao, - producer = producerMock - ) - private val utbetalingMediator = UtbetalingMediator( - producer = producerMock - ) - private val speedClient = mockk() - - init { - NyttDokumentRiver(testRapid, dokumentDao) - VedtakFattetRiver(testRapid, vedtakFattetMediator, speedClient) - UtbetalingUtbetaltRiver(testRapid, utbetalingMediator, speedClient) - } - - @BeforeEach - fun setup() { - every { speedClient.hentFødselsnummerOgAktørId(any(), any()) } returns IdentResponse( - fødselsnummer = FØDSELSNUMMER, - aktørId = AKTØRID, - npid = null, - kilde = IdentResponse.KildeResponse.PDL - ).ok() - } - - @AfterEach - fun after() { - testRapid.reset() - clearAllMocks() - } - @Test - fun `vedtakFattet uten utbetaling`() { + fun `vedtakFattet uten utbetaling`() = e2e { val captureSlot = mutableListOf>() val idSett = IdSett() @@ -113,7 +82,7 @@ internal class VedtakFattetRiverTest { } @Test - fun `vedtakFattet med utbetaling`() { + fun `vedtakFattet med utbetaling`() = e2e { val captureSlot = mutableListOf>() val idSett = IdSett() @@ -140,7 +109,7 @@ internal class VedtakFattetRiverTest { } @Test - fun `vedtakFattet med begrunnelser`() { + fun `vedtakFattet med begrunnelser`() = e2e { val captureSlot = mutableListOf>() val idSett = IdSett() @@ -170,7 +139,7 @@ internal class VedtakFattetRiverTest { } @Test - fun `vedtakFattet med tags`() { + fun `vedtakFattet med tags`() = e2e { val captureSlot = mutableListOf>() val idSett = IdSett() @@ -198,7 +167,45 @@ internal class VedtakFattetRiverTest { assertEquals(listOf("IngenNyArbeidsgiverperiode", "SykepengegrunnlagUnder2G"), vedtakFattetJson["tags"].map { it.asText() }) } - private fun sykmeldingSendt( + private data class E2ETestContext( + val testRapid: TestRapid, + val dokumentDao: DokumentDao + ) { + val producerMock = mockk>(relaxed = true) + val vedtakFattetMediator = VedtakFattetMediator( + dokumentDao = dokumentDao, + producer = producerMock + ) + val utbetalingMediator = UtbetalingMediator( + producer = producerMock + ) + val speedClient = mockk() + + init { + NyttDokumentRiver(testRapid, dokumentDao) + VedtakFattetRiver(testRapid, vedtakFattetMediator, speedClient) + UtbetalingUtbetaltRiver(testRapid, utbetalingMediator, speedClient) + + every { speedClient.hentFødselsnummerOgAktørId(any(), any()) } returns IdentResponse( + fødselsnummer = FØDSELSNUMMER, + aktørId = AKTØRID, + npid = null, + kilde = IdentResponse.KildeResponse.PDL + ).ok() + } + } + private fun e2e(testblokk: E2ETestContext.() -> Unit) { + val testDataSource = databaseContainer.nyTilkobling() + try { + val testRapid = TestRapid() + val dokumentDao = DokumentDao(testDataSource::ds) + testblokk(E2ETestContext(testRapid, dokumentDao)) + } finally { + databaseContainer.droppTilkobling(testDataSource) + } + } + + private fun E2ETestContext.sykmeldingSendt( idSett: IdSett, hendelseIder: List = listOf(idSett.nySøknadHendelseId) ) { @@ -219,7 +226,7 @@ internal class VedtakFattetRiverTest { ) } - private fun søknadSendt( + private fun E2ETestContext.søknadSendt( idSett: IdSett, hendelseIder: List = listOf(idSett.nySøknadHendelseId, idSett.sendtSøknadHendelseId) ) { @@ -240,7 +247,7 @@ internal class VedtakFattetRiverTest { ) } - private fun inntektsmeldingSendt( + private fun E2ETestContext.inntektsmeldingSendt( idSett: IdSett, hendelseIder: List = listOf(idSett.nySøknadHendelseId, idSett.inntektsmeldingHendelseId) ) { @@ -260,7 +267,7 @@ internal class VedtakFattetRiverTest { ) } - private fun vedtakFattetMedUtbetalingSendt( + private fun E2ETestContext.vedtakFattetMedUtbetalingSendt( idSett: IdSett, hendelseIder: List = listOf( idSett.nySøknadHendelseId, @@ -281,7 +288,7 @@ internal class VedtakFattetRiverTest { testRapid.sendTestMessage(vedtakFattetMedUtbetaling(idSett, begrunnelser = begrunnelser, tags = tags)) } - private fun vedtakFattetUtenUtbetalingSendt( + private fun E2ETestContext.vedtakFattetUtenUtbetalingSendt( idSett: IdSett, hendelseIder: List = listOf( idSett.nySøknadHendelseId, @@ -300,7 +307,7 @@ internal class VedtakFattetRiverTest { } @Language("json") - private fun vedtakFattetUtenUtbetaling( + private fun E2ETestContext.vedtakFattetUtenUtbetaling( idSett: IdSett, hendelser: List = listOf( idSett.nySøknadHendelseId, @@ -329,7 +336,7 @@ internal class VedtakFattetRiverTest { """ @Language("json") - private fun vedtakFattetMedUtbetaling( + private fun E2ETestContext.vedtakFattetMedUtbetaling( idSett: IdSett, hendelser: List = listOf( idSett.nySøknadHendelseId, @@ -383,7 +390,7 @@ internal class VedtakFattetRiverTest { } @Language("JSON") - private fun nySøknadMessage( + private fun E2ETestContext.nySøknadMessage( nySøknadHendelseId: UUID, sykmeldingDokumentId: UUID, søknadDokumentId: UUID @@ -397,7 +404,7 @@ internal class VedtakFattetRiverTest { }""" @Language("JSON") - private fun sendtSøknadMessage( + private fun E2ETestContext.sendtSøknadMessage( sendtSøknadHendelseId: UUID, sykmeldingDokumentId: UUID, søknadDokumentId: UUID @@ -411,7 +418,7 @@ internal class VedtakFattetRiverTest { }""" @Language("JSON") - private fun inntektsmeldingMessage( + private fun E2ETestContext.inntektsmeldingMessage( inntektsmeldingHendelseId: UUID, inntektsmeldingDokumentId: UUID ) = @@ -423,7 +430,7 @@ internal class VedtakFattetRiverTest { }""" @Language("JSON") - private fun vedtaksperiodeEndret( + private fun E2ETestContext.vedtaksperiodeEndret( forrige: String, gjeldendeTilstand: String, vedtaksperiodeId: UUID,