Skip to content

Commit

Permalink
parallelliserer mediatortestene
Browse files Browse the repository at this point in the history
hver enkelt test får i praksis sin egen database slik at ulike tester ikke går i beina på hverandre
  • Loading branch information
davidsteinsland committed Jan 25, 2024
1 parent 18939e1 commit a7fa94b
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 58 deletions.
7 changes: 7 additions & 0 deletions sykepenger-mediators/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,13 @@ tasks {
}
finalizedBy(":sykepenger-mediators:remove_spleis_mediators_db_container")
}

withType<Test> {
systemProperty("junit.jupiter.execution.parallel.enabled", "true")
systemProperty("junit.jupiter.execution.parallel.mode.default", "concurrent")
systemProperty("junit.jupiter.execution.parallel.config.strategy", "fixed")
systemProperty("junit.jupiter.execution.parallel.config.fixed.parallelism", "4")
}
}

tasks.create("remove_spleis_mediators_db_container", DockerRemoveContainer::class) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,35 +2,31 @@ package no.nav.helse.spleis.mediator.db

import java.time.LocalDateTime
import java.util.UUID
import javax.sql.DataSource
import no.nav.helse.rapids_rivers.JsonMessage
import no.nav.helse.rapids_rivers.MessageProblems
import no.nav.helse.somPersonidentifikator
import no.nav.helse.spleis.db.HendelseRepository
import no.nav.helse.spleis.mediator.e2e.SpleisDataSource.migratedDb
import no.nav.helse.spleis.mediator.e2e.resetDatabase
import no.nav.helse.spleis.mediator.e2e.PostgresContainer
import no.nav.helse.spleis.mediator.e2e.SpleisDataSource
import no.nav.helse.spleis.meldinger.model.HendelseMessage
import no.nav.helse.spleis.meldinger.model.NySøknadMessage
import org.intellij.lang.annotations.Language
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.BeforeAll
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.TestInstance

private val fnr = "01011012345".somPersonidentifikator()
// primært for å slutte å ha teite sql-feil
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
internal class HendelseRepositoryTest {
private lateinit var dataSource: DataSource
private lateinit var dataSource: SpleisDataSource

@BeforeAll
internal fun setupAll() {
dataSource = migratedDb
}
@BeforeEach
internal fun setupEach() {
resetDatabase()
internal fun setup() {
dataSource = PostgresContainer.nyTilkobling()
}
@AfterEach
internal fun tearDown() {
PostgresContainer.droppTilkobling(dataSource)
}

@Test
Expand All @@ -42,7 +38,7 @@ internal class HendelseRepositoryTest {
}

private fun lagre(hendeleMessage: HendelseMessage): Pair<UUID, String> {
val repo = HendelseRepository(dataSource)
val repo = HendelseRepository(dataSource.ds)
val ingenHendelser = repo.hentAlleHendelser(fnr)
assertEquals(0, ingenHendelser.size)
repo.lagreMelding(hendeleMessage)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import java.time.LocalDate
import java.time.LocalDateTime
import java.time.YearMonth
import java.util.UUID
import javax.sql.DataSource
import kotliquery.queryOf
import kotliquery.sessionOf
import no.nav.helse.februar
Expand Down Expand Up @@ -53,22 +52,19 @@ import no.nav.helse.spleis.mediator.TestMessageFactory.SkjønnsmessigFastsatt
import no.nav.helse.spleis.mediator.TestMessageFactory.UtbetalingshistorikkForFeriepengerTestdata
import no.nav.helse.spleis.mediator.TestMessageFactory.UtbetalingshistorikkTestdata
import no.nav.helse.spleis.mediator.VarseloppsamlerTest.Companion.Varsel
import no.nav.helse.spleis.mediator.e2e.SpleisDataSource.migratedDb
import no.nav.helse.spleis.mediator.meldinger.TestRapid
import no.nav.helse.spleis.meldinger.model.SimuleringMessage
import no.nav.helse.utbetalingslinjer.Utbetalingstatus
import no.nav.inntektsmeldingkontrakt.AvsenderSystem
import no.nav.inntektsmeldingkontrakt.OpphoerAvNaturalytelse
import no.nav.inntektsmeldingkontrakt.Periode
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertNotNull
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.BeforeAll
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.TestInstance

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
internal abstract class AbstractEndToEndMediatorTest() {
internal companion object {
internal const val UNG_PERSON_FNR_2018 = "12029240045"
Expand All @@ -79,40 +75,46 @@ internal abstract class AbstractEndToEndMediatorTest() {
}

protected val meldingsfabrikk = TestMessageFactory(UNG_PERSON_FNR_2018, AKTØRID, ORGNUMMER, INNTEKT, UNG_PERSON_FØDSELSDATO)
protected val testRapid = TestRapid()
private lateinit var dataSource: DataSource
protected lateinit var testRapid: TestRapid
private lateinit var hendelseMediator: HendelseMediator
private lateinit var messageMediator: MessageMediator

@BeforeAll
internal fun setupAll() {
dataSource = migratedDb
private lateinit var dataSource: SpleisDataSource

@BeforeEach
fun setupDatabase() {
dataSource = PostgresContainer.nyTilkobling()

testRapid = TestRapid()
hendelseMediator = HendelseMediator(
rapidsConnection = testRapid,
hendelseRepository = HendelseRepository(dataSource),
personDao = PersonDao(dataSource, STØTTER_IDENTBYTTE = true),
hendelseRepository = HendelseRepository(dataSource.ds),
personDao = PersonDao(dataSource.ds, STØTTER_IDENTBYTTE = true),
versjonAvKode = "test-versjon",
støtterIdentbytte = true
)

messageMediator = MessageMediator(
rapidsConnection = testRapid,
hendelseMediator = hendelseMediator,
hendelseRepository = HendelseRepository(dataSource)
hendelseRepository = HendelseRepository(dataSource.ds)
)
}

@AfterEach
fun tearDown() {
PostgresContainer.droppTilkobling(dataSource)
}

@BeforeEach
internal fun setupEach() {
resetDatabase()
testRapid.reset()
}

protected fun antallPersoner() = sessionOf(dataSource).use {
protected fun antallPersoner() = sessionOf(dataSource.ds).use {
it.run(queryOf("SELECT COUNT(1) FROM person").map { it.long(1) }.asSingle) ?: 0
}
protected fun antallPersonalias(fnr: String? = null) = sessionOf(dataSource).use {
protected fun antallPersonalias(fnr: String? = null) = sessionOf(dataSource.ds).use {
it.run(queryOf("SELECT COUNT(1) FROM person_alias ${fnr?.let { "WHERE fnr=${fnr.toLong()}" } ?: "" }").map { it.long(1) }.asSingle) ?: 0
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,51 +1,88 @@
package no.nav.helse.spleis.mediator.e2e

import com.zaxxer.hikari.HikariConfig
import com.zaxxer.hikari.HikariDataSource
import java.time.Duration
import kotliquery.queryOf
import kotliquery.sessionOf
import no.nav.helse.spleis.mediator.e2e.SpleisDataSource.migratedDb
import org.flywaydb.core.Flyway
import org.testcontainers.containers.PostgreSQLContainer

object PostgresContainer {
val instance by lazy {
private val instance by lazy {
PostgreSQLContainer<Nothing>("postgres:15").apply {
withCreateContainerCmdModifier { command -> command.withName("spleis-mediators") }
withReuse(true)
withLabel("app-navn", "spleis-mediators")
start()
}
}
}

object SpleisDataSource {
private val instance: HikariDataSource by lazy {
HikariDataSource().apply {
initializationFailTimeout = 5000
username = PostgresContainer.instance.username
password = PostgresContainer.instance.password
jdbcUrl = PostgresContainer.instance.jdbcUrl
connectionTimeout = 1000L
}
private val systemtilkobling by lazy { instance.createConnection("") }

fun nyTilkobling(dbnavn: String = "spleis_${kotlin.random.Random.nextInt(from = 0, until = 999999)}"): SpleisDataSource {
opprettDatabase(dbnavn)
instance.withDatabaseName(dbnavn)
return SpleisDataSource(dbnavn, HikariConfig().apply {
username = instance.username
password = instance.password
jdbcUrl = instance.jdbcUrl
})
}

val migratedDb = instance.also { migrate(it) }
}
private fun opprettDatabase(dbnavn: String) {
println("Oppretter databasen $dbnavn")
systemtilkobling.createStatement().execute("create database $dbnavn")
}

private val tabeller = listOf("person", "person_alias", "melding")
fun resetDatabase() {
//migrate(migratedDb)
sessionOf(migratedDb).use { session ->
tabeller.forEach { table ->
session.run(queryOf("truncate table $table cascade").asExecute)
fun droppTilkobling(spleisDataSource: SpleisDataSource) {
spleisDataSource.teardown { dbnavn ->
println("Dropper databasen $dbnavn")
systemtilkobling.createStatement().execute("drop database $dbnavn")
}
}
}

private fun migrate(dataSource: HikariDataSource) =
Flyway.configure()
.dataSource(dataSource)
.cleanDisabled(false)
.load()
.also { it.clean() }
.migrate()
class SpleisDataSource(
private val dbnavn: String,
config: HikariConfig
) {
private val migrationConfig = HikariConfig()
private val spleisConfig = HikariConfig()
private val dataSource: HikariDataSource by lazy { HikariDataSource(spleisConfig) }
private val migrationDataSource: HikariDataSource by lazy { HikariDataSource(migrationConfig) }

private val flyway by lazy {
Flyway.configure()
.dataSource(migrationDataSource)
.validateMigrationNaming(true)
.load()
}

init {
println("Oppretter datasource med dbnavn=$dbnavn")
config.copyStateTo(migrationConfig)
config.copyStateTo(spleisConfig)

migrationConfig.maximumPoolSize = 2 // flyway klarer seg ikke med én connection visstnok
migrationConfig.initializationFailTimeout = Duration.ofSeconds(10).toMillis()

spleisConfig.maximumPoolSize = 2 // spleis bruker to connections ved håndtering av en melding (replay av IM tar en tilkobling)
}

val ds: HikariDataSource by lazy {
migrate()
dataSource
}

private fun migrate() {
println("Migrerer dbnavn=$dbnavn")
flyway.migrate()
migrationDataSource.close()
}

fun teardown(dropDatabase: (String) -> Unit) {
dataSource.close()
dropDatabase(dbnavn)
}
}

0 comments on commit a7fa94b

Please sign in to comment.