Skip to content

Commit

Permalink
bruker postgres-testdatabaser
Browse files Browse the repository at this point in the history
  • Loading branch information
davidsteinsland committed Nov 16, 2024
1 parent 4423727 commit 3fe4ab7
Show file tree
Hide file tree
Showing 6 changed files with 208 additions and 220 deletions.
16 changes: 10 additions & 6 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -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"
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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<Jar> {
Expand Down
85 changes: 41 additions & 44 deletions src/test/kotlin/no/nav/helse/sporbar/BehandlingstatusTest.kt
Original file line number Diff line number Diff line change
@@ -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()
Expand All @@ -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)
Expand All @@ -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()
Expand Down Expand Up @@ -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()
Expand All @@ -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()

Expand All @@ -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()

Expand All @@ -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",
Expand All @@ -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",
Expand All @@ -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",
Expand All @@ -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",
Expand All @@ -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",
Expand Down
55 changes: 30 additions & 25 deletions src/test/kotlin/no/nav/helse/sporbar/NyttDokumentRiverTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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()
Expand All @@ -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()
Expand All @@ -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()
Expand All @@ -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()
Expand All @@ -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"
Expand All @@ -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,
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,
knadDokumentId: String
Expand All @@ -117,7 +122,7 @@ internal class NyttDokumentRiverTest {
}"""

@Language("JSON")
private fun sendtSøknadMessage(
private fun E2ETestContext.sendtSøknadMessage(
nySøknadHendelseId: UUID,
sykmeldingDokumentId: UUID,
knadDokumentId: UUID
Expand All @@ -131,7 +136,7 @@ internal class NyttDokumentRiverTest {
}"""

@Language("JSON")
private fun sendtSøknadArbeidsledigMessage(
private fun E2ETestContext.sendtSøknadArbeidsledigMessage(
nySøknadHendelseId: UUID,
sykmeldingDokumentId: UUID,
knadDokumentId: UUID
Expand Down
32 changes: 4 additions & 28 deletions src/test/kotlin/no/nav/helse/sporbar/TestDatabase.kt
Original file line number Diff line number Diff line change
@@ -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<Nothing>("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)
Loading

0 comments on commit 3fe4ab7

Please sign in to comment.