diff --git a/apps/bekreftelse-tjeneste/src/main/kotlin/no/nav/paw/bekreftelsetjeneste/tilstand/InternTilstand.kt b/apps/bekreftelse-tjeneste/src/main/kotlin/no/nav/paw/bekreftelsetjeneste/tilstand/InternTilstand.kt index cd76c666..793e0c39 100644 --- a/apps/bekreftelse-tjeneste/src/main/kotlin/no/nav/paw/bekreftelsetjeneste/tilstand/InternTilstand.kt +++ b/apps/bekreftelse-tjeneste/src/main/kotlin/no/nav/paw/bekreftelsetjeneste/tilstand/InternTilstand.kt @@ -34,7 +34,7 @@ fun InternTilstand.oppdaterBekreftelse(ny: Bekreftelse): InternTilstand { return copy(bekreftelser = nyBekreftelser) } -fun InternTilstand.leggTilNyBekreftelse(ny: Bekreftelse): InternTilstand { +fun InternTilstand.leggTilNyEllerOppdaterBekreftelse(ny: Bekreftelse): InternTilstand { val nyBekreftelser = bekreftelser .filter { it.bekreftelseId != ny.bekreftelseId } .plus(ny) diff --git a/apps/bekreftelse-tjeneste/src/main/kotlin/no/nav/paw/bekreftelsetjeneste/topology/BekreftelseStream.kt b/apps/bekreftelse-tjeneste/src/main/kotlin/no/nav/paw/bekreftelsetjeneste/topology/BekreftelseStream.kt index 26f5c334..b2bd4477 100644 --- a/apps/bekreftelse-tjeneste/src/main/kotlin/no/nav/paw/bekreftelsetjeneste/topology/BekreftelseStream.kt +++ b/apps/bekreftelse-tjeneste/src/main/kotlin/no/nav/paw/bekreftelsetjeneste/topology/BekreftelseStream.kt @@ -7,10 +7,7 @@ import io.opentelemetry.api.trace.Span import io.opentelemetry.api.trace.SpanKind import io.opentelemetry.api.trace.StatusCode import io.opentelemetry.instrumentation.annotations.WithSpan -import no.nav.paw.bekreftelse.internehendelser.BaOmAaAvsluttePeriode -import no.nav.paw.bekreftelse.internehendelser.BekreftelseHendelse -import no.nav.paw.bekreftelse.internehendelser.BekreftelseHendelseSerde -import no.nav.paw.bekreftelse.internehendelser.BekreftelseMeldingMottatt +import no.nav.paw.bekreftelse.internehendelser.* import no.nav.paw.bekreftelsetjeneste.config.ApplicationConfig import no.nav.paw.bekreftelsetjeneste.tilstand.* import no.nav.paw.config.kafka.streams.Punctuation @@ -96,7 +93,9 @@ fun processPawNamespace( } return when (val sisteTilstand = bekreftelse.sisteTilstand()) { - is VenterSvar, is KlarForUtfylling -> { + is VenterSvar, + is KlarForUtfylling, + is AnsvarOvertattAvAndre -> { val (hendelser, oppdatertBekreftelse) = behandleGyldigSvar(gjeldeneTilstand, hendelse, bekreftelse) Span.current().setAttribute("bekreftelse.tilstand", sisteTilstand.toString()) gjeldeneTilstand.oppdaterBekreftelse(oppdatertBekreftelse) to hendelser diff --git a/apps/bekreftelse-tjeneste/src/test/kotlin/no/nav/paw/bekreftelsetjeneste/TestUtils.kt b/apps/bekreftelse-tjeneste/src/test/kotlin/no/nav/paw/bekreftelsetjeneste/TestUtils.kt new file mode 100644 index 00000000..6b249bc2 --- /dev/null +++ b/apps/bekreftelse-tjeneste/src/test/kotlin/no/nav/paw/bekreftelsetjeneste/TestUtils.kt @@ -0,0 +1,74 @@ +package no.nav.paw.bekreftelsetjeneste + +import io.kotest.assertions.withClue +import io.kotest.matchers.shouldBe +import no.nav.paw.bekreftelsetjeneste.config.BekreftelseIntervals +import no.nav.paw.bekreftelsetjeneste.tilstand.* +import java.time.Instant +import java.util.* + +inline fun List.assertExactlyOne(f: T2.() -> Unit) = + filterIsInstance() + .let { + withClue("Expected exactly one ${T2::class.simpleName} but found ${it.size}") { + it.size shouldBe 1 + } + it.first() + }.apply(f) + +fun internTilstand( + periodeStart: Instant, + periodeId: UUID = UUID.randomUUID(), + identitetsnummer: String = "12345678901", + arbeidsoekerId: Long = 1L, + recordKey: Long = 1L, + avsluttet: Instant? = null, + bekreftelser: List = emptyList() +) = InternTilstand( + periode = PeriodeInfo( + periodeId = periodeId, + identitetsnummer = identitetsnummer, + arbeidsoekerId = arbeidsoekerId, + recordKey = recordKey, + startet = periodeStart, + avsluttet = avsluttet + ), + bekreftelser = bekreftelser +) + +fun BekreftelseIntervals.bekreftelse( + gjelderFra: Instant = Instant.now(), + gjelderTil: Instant = gjelderFra + interval, + ikkeKlarForUtfylling: IkkeKlarForUtfylling? = IkkeKlarForUtfylling(gjelderFra), + klarForUtfylling: KlarForUtfylling? = KlarForUtfylling(gjelderFra + interval - tilgjengeligOffset), + venterSvar: VenterSvar? = VenterSvar(gjelderFra + interval), + gracePeriodeVarselet: GracePeriodeVarselet? = GracePeriodeVarselet(gjelderFra + interval + varselFoerGraceperiodeUtloept), + gracePeriodeUtloept: GracePeriodeUtloept? = GracePeriodeUtloept(gjelderFra + interval + graceperiode) +): Bekreftelse = Bekreftelse( + tilstandsLogg = listOfNotNull( + ikkeKlarForUtfylling, + klarForUtfylling, + venterSvar, + gracePeriodeVarselet, + gracePeriodeUtloept + ).sortedBy { it.timestamp } + .let { + BekreftelseTilstandsLogg( + siste = it.last(), + tidligere = it.dropLast(1) + ) + }, + bekreftelseId = UUID.randomUUID(), + gjelderFra = gjelderFra, + gjelderTil = gjelderTil +) + +fun BekreftelseIntervals.gracePeriodeVarsel(startTid: Instant): Instant = + startTid.plus(interval).plus(graceperiode).minus(varselFoerGraceperiodeUtloept) + +fun BekreftelseIntervals.gracePeriodeUtloeper(startTid: Instant): Instant = + startTid.plus(interval).plus(graceperiode) + +fun BekreftelseIntervals.tilgjengelig(startTid: Instant): Instant = startTid.plus(interval).plus(tilgjengeligOffset) + +fun BekreftelseIntervals.frist(startTid: Instant): Instant = startTid.plus(interval) \ No newline at end of file diff --git a/apps/bekreftelse-tjeneste/src/test/kotlin/no/nav/paw/bekreftelsetjeneste/ansvar/DagpengerTarAnsvar1DagFoerGraceperiodenUtloeper.kt b/apps/bekreftelse-tjeneste/src/test/kotlin/no/nav/paw/bekreftelsetjeneste/ansvar/DagpengerTarAnsvar1DagFoerGraceperiodenUtloeper.kt index d14f1222..f8c069e8 100644 --- a/apps/bekreftelse-tjeneste/src/test/kotlin/no/nav/paw/bekreftelsetjeneste/ansvar/DagpengerTarAnsvar1DagFoerGraceperiodenUtloeper.kt +++ b/apps/bekreftelse-tjeneste/src/test/kotlin/no/nav/paw/bekreftelsetjeneste/ansvar/DagpengerTarAnsvar1DagFoerGraceperiodenUtloeper.kt @@ -6,11 +6,11 @@ import io.kotest.matchers.shouldBe import io.kotest.matchers.types.shouldBeInstanceOf import no.nav.paw.bekreftelse.ansvar.v1.vo.TarAnsvar import no.nav.paw.bekreftelse.internehendelser.AndreHarOvertattAnsvar +import no.nav.paw.bekreftelsetjeneste.* import no.nav.paw.bekreftelsetjeneste.config.BekreftelseIntervals import no.nav.paw.bekreftelsetjeneste.tilstand.* import java.time.Duration import java.time.Instant -import java.util.* class DagpengerTarAnsvar1DagFoerGraceperiodenUtloeper : FreeSpec({ val intervaller = BekreftelseIntervals( @@ -24,18 +24,10 @@ class DagpengerTarAnsvar1DagFoerGraceperiodenUtloeper : FreeSpec({ val initiellTilstand = internTilstand(periodeStart) "${Loesning.DAGPENGER} tar ansvar 1 dag før grace perioden utøper" - { - val tilstand = initiellTilstand.leggTilNyBekreftelse( - ny = Bekreftelse( - tilstandsLogg = BekreftelseTilstandsLogg( - siste = GracePeriodeVarselet(intervaller.gracePeriodeVarsel(periodeStart)), - tidligere = listOf( - KlarForUtfylling(intervaller.tilgjengelig(periodeStart)), - VenterSvar(intervaller.frist(periodeStart)) - ) - ), - bekreftelseId = UUID.randomUUID(), + val tilstand = initiellTilstand.leggTilNyEllerOppdaterBekreftelse( + ny = intervaller.bekreftelse( gjelderFra = periodeStart, - gjelderTil = periodeStart.plus(intervaller.interval) + gracePeriodeUtloept = null ) ) val dagpengerTarAnsvar = no.nav.paw.arbeidssoekerregisteret.testdata.bekreftelse.tarAnsvar( @@ -43,13 +35,13 @@ class DagpengerTarAnsvar1DagFoerGraceperiodenUtloeper : FreeSpec({ bekreftelsesloesning = no.nav.paw.bekreftelse.ansvar.v1.vo.Bekreftelsesloesning.DAGPENGER, ) val handlinger = haandterAnsvarEndret( - wallclock = WallClock(periodeStart.plus(intervaller.graceperiode).minus(1.days)), + wallclock = WallClock(intervaller.gracePeriodeUtloeper(periodeStart) - 1.days), tilstand = tilstand, ansvar = null, ansvarEndret = dagpengerTarAnsvar ) "Ansvar skal skrives til key-value store" { - handlinger.handling { + handlinger.assertExactlyOne { id shouldBe tilstand.periode.periodeId value shouldBe Ansvar( periodeId = tilstand.periode.periodeId, @@ -64,52 +56,22 @@ class DagpengerTarAnsvar1DagFoerGraceperiodenUtloeper : FreeSpec({ } } "AndreHarOvertattAnsvar hendelse skal sendes" { - handlinger.handling { + handlinger.assertExactlyOne { hendelse.shouldBeInstanceOf() hendelse.periodeId shouldBe tilstand.periode.periodeId } } "Åpne bekreftelser settes til AnsvarOvertattAvAndre" { - handlinger.handling { - id shouldBe tilstand.periode.periodeId - value.bekreftelser.size shouldBe 1 - value.bekreftelser.first().sisteTilstand().shouldBeInstanceOf() + withClue("Handlinger inneholdt ikke skriving av intern tilstand med forventet status: ${handlinger.filterIsInstance()}") { + handlinger.assertExactlyOne { + id shouldBe tilstand.periode.periodeId + value.bekreftelser.size shouldBe 1 + value.bekreftelser.first().sisteTilstand().shouldBeInstanceOf() + } } } "Ingen andre handlinger skal utføres" { handlinger.size shouldBe 3 } } - }) - -inline fun List.handling(f: T.() -> Unit = { }): T = - filterIsInstance() - .let { - withClue("Expected exactly one ${T::class.simpleName} but found ${it.size}") { - it.size shouldBe 1 - } - it.first() - } - -fun internTilstand(periodeStart: Instant) = InternTilstand( - periode = PeriodeInfo( - periodeId = UUID.randomUUID(), - identitetsnummer = "12345678901", - arbeidsoekerId = 1L, - recordKey = 1L, - startet = periodeStart, - avsluttet = null - ), - bekreftelser = emptyList() -) - -fun BekreftelseIntervals.gracePeriodeVarsel(startTid: Instant): Instant = - startTid.plus(interval).plus(graceperiode).minus(varselFoerGraceperiodeUtloept) - -fun BekreftelseIntervals.gracePeriodeUtloeper(startTid: Instant): Instant = - startTid.plus(interval).plus(graceperiode) - -fun BekreftelseIntervals.tilgjengelig(startTid: Instant): Instant = startTid.plus(interval).plus(tilgjengeligOffset) - -fun BekreftelseIntervals.frist(startTid: Instant): Instant = startTid.plus(interval) \ No newline at end of file