Skip to content

Commit

Permalink
Legg til test for databaserepo for selvbestemt IM (#518)
Browse files Browse the repository at this point in the history
* Legg til test for databaserepo for selvbestemt IM

* Gjør test tydeligere

* Bedre navn på test
  • Loading branch information
bjerga authored May 28, 2024
1 parent 5a90640 commit cb63ed1
Show file tree
Hide file tree
Showing 5 changed files with 302 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import org.jetbrains.exposed.sql.transactions.transaction
import org.jetbrains.exposed.sql.update
import java.util.UUID

// TODO test
class SelvbestemtImRepo(private val db: Database) {

private val logger = logger()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,9 @@ class TestRepo(private val db: Database) {

class RepositoryTest : FunSpecWithDb(listOf(InntektsmeldingEntitet, ForespoerselEntitet), { db ->

val foresporselRepo = ForespoerselRepository(db.db)
val inntektsmeldingRepo = InntektsmeldingRepository(db.db)
val testRepo = TestRepo(db.db)
val foresporselRepo = ForespoerselRepository(db)
val inntektsmeldingRepo = InntektsmeldingRepository(db)
val testRepo = TestRepo(db)
val ORGNR = "orgnr-456"

test("skal lagre forespørsel") {
Expand Down Expand Up @@ -169,7 +169,7 @@ class RepositoryTest : FunSpecWithDb(listOf(InntektsmeldingEntitet, Forespoersel
// Skal kun oppdatere siste
inntektsmeldingRepo.oppdaterJournalpostId(forespoerselId, journalpostId)

val resultat = transaction(db.db) {
val resultat = transaction(db) {
InntektsmeldingEntitet.selectAll()
.orderBy(InntektsmeldingEntitet.innsendt)
.toList()
Expand Down Expand Up @@ -198,7 +198,7 @@ class RepositoryTest : FunSpecWithDb(listOf(InntektsmeldingEntitet, Forespoersel
inntektsmeldingRepo.lagreInntektsmelding(forespoerselId.toString(), INNTEKTSMELDING_DOKUMENT)
inntektsmeldingRepo.oppdaterJournalpostId(forespoerselId, gammelJournalpostId)

val resultatFoerNyJournalpostId = transaction(db.db) {
val resultatFoerNyJournalpostId = transaction(db) {
InntektsmeldingEntitet.selectAll()
.orderBy(InntektsmeldingEntitet.innsendt)
.toList()
Expand All @@ -219,7 +219,7 @@ class RepositoryTest : FunSpecWithDb(listOf(InntektsmeldingEntitet, Forespoersel
// Skal ha null effekt
inntektsmeldingRepo.oppdaterJournalpostId(forespoerselId, nyJournalpostId)

val resultsEtterNyJournalpostId = transaction(db.db) {
val resultsEtterNyJournalpostId = transaction(db) {
InntektsmeldingEntitet.selectAll()
.orderBy(InntektsmeldingEntitet.innsendt)
.toList()
Expand Down Expand Up @@ -248,7 +248,7 @@ class RepositoryTest : FunSpecWithDb(listOf(InntektsmeldingEntitet, Forespoersel

inntektsmeldingRepo.oppdaterJournalpostId(forespoerselId, journalpostId)

val resultat = transaction(db.db) {
val resultat = transaction(db) {
InntektsmeldingEntitet.selectAll()
.orderBy(InntektsmeldingEntitet.innsendt)
.toList()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,288 @@
package no.nav.helsearbeidsgiver.inntektsmelding.db

import io.kotest.assertions.throwables.shouldNotThrowAny
import io.kotest.assertions.throwables.shouldThrowExactly
import io.kotest.matchers.collections.shouldHaveSize
import io.kotest.matchers.nulls.shouldBeNull
import io.kotest.matchers.shouldBe
import io.kotest.matchers.shouldNotBe
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Inntekt
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Inntektsmelding
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Naturalytelse
import no.nav.helsearbeidsgiver.felles.db.test.exposed.FunSpecWithDb
import no.nav.helsearbeidsgiver.felles.test.mock.mockInntektsmeldingV1
import no.nav.helsearbeidsgiver.inntektsmelding.db.tabell.SelvbestemtInntektsmeldingEntitet
import no.nav.helsearbeidsgiver.utils.test.date.oktober
import no.nav.helsearbeidsgiver.utils.test.date.september
import org.jetbrains.exposed.exceptions.ExposedSQLException
import org.jetbrains.exposed.sql.Database
import org.jetbrains.exposed.sql.ResultRow
import org.jetbrains.exposed.sql.selectAll
import org.jetbrains.exposed.sql.transactions.transaction
import java.util.UUID
import kotlin.random.Random

class SelvbestemtImRepoTest : FunSpecWithDb(listOf(SelvbestemtInntektsmeldingEntitet), { db ->

val selvbestemtImRepo = SelvbestemtImRepo(db)

context(SelvbestemtImRepo::hentNyesteIm.name) {

test("henter nyeste") {
val selvbestemtId = UUID.randomUUID()
val originalInntektsmelding = mockInntektsmeldingV1().copy(
type = Inntektsmelding.Type.Selvbestemt(
id = selvbestemtId
)
)
val endretInntektsmelding = originalInntektsmelding.copy(
id = UUID.randomUUID(),
inntekt = Inntekt(
beloep = 1747.55,
inntektsdato = 22.september,
naturalytelser = listOf(
Naturalytelse(
naturalytelse = Naturalytelse.Kode.FRITRANSPORT,
verdiBeloep = 10.11,
sluttdato = 3.oktober
)
),
endringAarsak = null
)
)

selvbestemtImRepo.lagreIm(originalInntektsmelding)
selvbestemtImRepo.lagreIm(endretInntektsmelding)
selvbestemtImRepo.lagreIm(mockInntektsmeldingV1())

selvbestemtImRepo.hentNyesteIm(selvbestemtId) shouldBe endretInntektsmelding
}

test("henter eneste") {
val selvbestemtId = UUID.randomUUID()
val inntektsmelding = mockInntektsmeldingV1().copy(
type = Inntektsmelding.Type.Selvbestemt(
id = selvbestemtId
)
)

selvbestemtImRepo.lagreIm(inntektsmelding)
selvbestemtImRepo.lagreIm(mockInntektsmeldingV1())

selvbestemtImRepo.hentNyesteIm(selvbestemtId) shouldBe inntektsmelding
}

test("gir 'null' når ingen funnet") {
selvbestemtImRepo.lagreIm(mockInntektsmeldingV1())

selvbestemtImRepo.hentNyesteIm(UUID.randomUUID()).shouldBeNull()
}
}

context(SelvbestemtImRepo::lagreIm.name) {

test("inntektsmeldinger lagres") {
lesAlleRader(db) shouldHaveSize 0

repeat(3) {
selvbestemtImRepo.lagreIm(mockInntektsmeldingV1())
}

lesAlleRader(db) shouldHaveSize 3
}

test("inntektsmelding- og selvbestemt ID stammer fra inntektsmelding") {
val inntektsmelding = mockInntektsmeldingV1()

selvbestemtImRepo.lagreIm(inntektsmelding)

val alleRader = lesAlleRader(db)

alleRader shouldHaveSize 1
alleRader.first().let {
it[SelvbestemtInntektsmeldingEntitet.inntektsmeldingId] shouldBe inntektsmelding.id
it[SelvbestemtInntektsmeldingEntitet.selvbestemtId] shouldBe inntektsmelding.type.id
it[SelvbestemtInntektsmeldingEntitet.inntektsmelding] shouldBe inntektsmelding
}
}

test("inntektsmeldinger med samme selvbestemt ID lagres") {
val selvbestemtId = UUID.randomUUID()

repeat(2) {
val inntektsmelding = mockInntektsmeldingV1().copy(
type = Inntektsmelding.Type.Selvbestemt(
id = selvbestemtId
)
)

selvbestemtImRepo.lagreIm(inntektsmelding)
}

lesAlleRader(db) shouldHaveSize 2
}

test("inntektsmelding-ID må være unik") {
val inntektsmeldingId = UUID.randomUUID()
val inntektsmelding1 = mockInntektsmeldingV1().copy(id = inntektsmeldingId)
val inntektsmelding2 = mockInntektsmeldingV1().copy(id = inntektsmeldingId)

selvbestemtImRepo.lagreIm(inntektsmelding1)

shouldThrowExactly<ExposedSQLException> {
selvbestemtImRepo.lagreIm(inntektsmelding2)
}
}
}

context(SelvbestemtImRepo::oppdaterJournalpostId.name) {

test("journalpost-ID oppdateres for angitt selvbestemt ID") {
val selvbestemtId = UUID.randomUUID()
val journalpostId = randomDigitString(12)
val inntektsmelding = mockInntektsmeldingV1().copy(
type = Inntektsmelding.Type.Selvbestemt(
id = selvbestemtId
)
)

selvbestemtImRepo.lagreIm(inntektsmelding)
selvbestemtImRepo.lagreIm(mockInntektsmeldingV1())
selvbestemtImRepo.oppdaterJournalpostId(selvbestemtId, journalpostId)

val alleRader = lesAlleRader(db)

alleRader shouldHaveSize 2

alleRader.first().let {
it[SelvbestemtInntektsmeldingEntitet.inntektsmeldingId] shouldBe inntektsmelding.id
it[SelvbestemtInntektsmeldingEntitet.selvbestemtId] shouldBe selvbestemtId
it[SelvbestemtInntektsmeldingEntitet.journalpostId] shouldBe journalpostId
}

alleRader.last().let {
it[SelvbestemtInntektsmeldingEntitet.selvbestemtId] shouldNotBe selvbestemtId
it[SelvbestemtInntektsmeldingEntitet.journalpostId] shouldNotBe journalpostId
}
}

test("kun nyeste inntektsmelding oppdateres med journalpost-ID") {
val selvbestemtId = UUID.randomUUID()
val journalpostId = randomDigitString(5)
val originalInntektsmelding = mockInntektsmeldingV1().copy(
type = Inntektsmelding.Type.Selvbestemt(
id = selvbestemtId
)
)
val endretInntektsmelding = originalInntektsmelding.copy(
id = UUID.randomUUID()
)

selvbestemtImRepo.lagreIm(originalInntektsmelding)
selvbestemtImRepo.lagreIm(endretInntektsmelding)
selvbestemtImRepo.oppdaterJournalpostId(selvbestemtId, journalpostId)

val alleRader = lesAlleRader(db)

alleRader shouldHaveSize 2

alleRader.first().let {
it[SelvbestemtInntektsmeldingEntitet.inntektsmeldingId] shouldBe originalInntektsmelding.id
it[SelvbestemtInntektsmeldingEntitet.selvbestemtId] shouldBe selvbestemtId
it[SelvbestemtInntektsmeldingEntitet.journalpostId].shouldBeNull()
}

alleRader.last().let {
it[SelvbestemtInntektsmeldingEntitet.inntektsmeldingId] shouldBe endretInntektsmelding.id
it[SelvbestemtInntektsmeldingEntitet.selvbestemtId] shouldBe selvbestemtId
it[SelvbestemtInntektsmeldingEntitet.journalpostId] shouldBe journalpostId
}
}

test("oppdaterer journalpost-ID kun dersom gammel verdi er 'null'") {
val selvbestemtId = UUID.randomUUID()
val gammelJournalpostId = randomDigitString(10)
val nyJournalpostId = randomDigitString(8)
val originalInntektsmelding = mockInntektsmeldingV1().copy(
type = Inntektsmelding.Type.Selvbestemt(
id = selvbestemtId
)
)
val endretInntektsmelding = originalInntektsmelding.copy(
id = UUID.randomUUID()
)

selvbestemtImRepo.lagreIm(originalInntektsmelding)
selvbestemtImRepo.lagreIm(endretInntektsmelding)
selvbestemtImRepo.oppdaterJournalpostId(selvbestemtId, gammelJournalpostId)

val alleRaderEtterSetup = lesAlleRader(db)

alleRaderEtterSetup shouldHaveSize 2

alleRaderEtterSetup.first().let {
it[SelvbestemtInntektsmeldingEntitet.inntektsmeldingId] shouldBe originalInntektsmelding.id
it[SelvbestemtInntektsmeldingEntitet.selvbestemtId] shouldBe selvbestemtId
it[SelvbestemtInntektsmeldingEntitet.journalpostId].shouldBeNull()
}

alleRaderEtterSetup.last().let {
it[SelvbestemtInntektsmeldingEntitet.inntektsmeldingId] shouldBe endretInntektsmelding.id
it[SelvbestemtInntektsmeldingEntitet.selvbestemtId] shouldBe selvbestemtId
it[SelvbestemtInntektsmeldingEntitet.journalpostId] shouldBe gammelJournalpostId
}

// Denne skal ha ingen effekt
selvbestemtImRepo.oppdaterJournalpostId(selvbestemtId, nyJournalpostId)

val alleRaderEtterOppdatering = lesAlleRader(db)

alleRaderEtterOppdatering shouldHaveSize 2

alleRaderEtterSetup.first().let {
it[SelvbestemtInntektsmeldingEntitet.inntektsmeldingId] shouldBe originalInntektsmelding.id
it[SelvbestemtInntektsmeldingEntitet.selvbestemtId] shouldBe selvbestemtId
it[SelvbestemtInntektsmeldingEntitet.journalpostId].shouldBeNull()
}

alleRaderEtterSetup.last().let {
it[SelvbestemtInntektsmeldingEntitet.inntektsmeldingId] shouldBe endretInntektsmelding.id
it[SelvbestemtInntektsmeldingEntitet.selvbestemtId] shouldBe selvbestemtId
it[SelvbestemtInntektsmeldingEntitet.journalpostId] shouldBe gammelJournalpostId
}
}

test("kaster exception dersom journalpost-ID ikke er unik") {
val journalpostId = randomDigitString(20)
val inntektsmelding1 = mockInntektsmeldingV1()
val inntektsmelding2 = mockInntektsmeldingV1()

selvbestemtImRepo.lagreIm(inntektsmelding1)
selvbestemtImRepo.lagreIm(inntektsmelding2)

selvbestemtImRepo.oppdaterJournalpostId(inntektsmelding1.type.id, journalpostId)

shouldThrowExactly<ExposedSQLException> {
selvbestemtImRepo.oppdaterJournalpostId(inntektsmelding2.type.id, journalpostId)
}
}

test("krasjer ikke ved ingen matchende rader") {
shouldNotThrowAny {
selvbestemtImRepo.oppdaterJournalpostId(UUID.randomUUID(), randomDigitString(7))
}
}
}
})

private fun lesAlleRader(db: Database): List<ResultRow> =
transaction(db) {
SelvbestemtInntektsmeldingEntitet.selectAll()
.orderBy(SelvbestemtInntektsmeldingEntitet.opprettet)
.toList()
}

// TODO erstatt med versjon fra felles-pakke
private fun randomDigitString(length: Int): String =
List(length) { Random.nextInt(10) }
.joinToString(separator = "")
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,11 @@ import org.jetbrains.exposed.sql.Table
import org.jetbrains.exposed.sql.deleteAll
import org.jetbrains.exposed.sql.transactions.transaction
import org.testcontainers.containers.PostgreSQLContainer
import org.jetbrains.exposed.sql.Database as ExposedDatabase

abstract class FunSpecWithDb(
table: List<Table>,
body: FunSpec.(Database) -> Unit
body: FunSpec.(ExposedDatabase) -> Unit
) : FunSpec({
val db = Database(dbConfig())
.configureFlyway()
Expand All @@ -22,7 +23,7 @@ abstract class FunSpecWithDb(
}
}

body(db)
body(db.db)
})

private fun dbConfig(): HikariConfig {
Expand Down
Loading

0 comments on commit cb63ed1

Please sign in to comment.