From cf9fd875343d8340304b4ba1392ec601bd6e069d Mon Sep 17 00:00:00 2001 From: Nils Martin Sande Date: Tue, 27 Aug 2024 13:37:42 +0200 Subject: [PATCH] Oppdaterte regelsett for inngang slik at flere regler kombineres i en response --- .../ApiV2TestCaseRunner.kt | 4 +- .../NorskBrukerBosattISverigeUnder18aar.kt | 6 +- .../application/InngangsRegler.kt | 5 +- .../application/RegelExtensions.kt | 10 +- .../application/RegelId.kt | 2 +- .../application/Regler.kt | 7 +- .../application/RegelEvalTest.kt | 141 ++++++++++++++++++ 7 files changed, 164 insertions(+), 11 deletions(-) create mode 100644 domain/arbeidssoeker-regler/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/application/RegelEvalTest.kt diff --git a/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/ApiV2TestCaseRunner.kt b/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/ApiV2TestCaseRunner.kt index 772ccb6e..fb91e162 100644 --- a/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/ApiV2TestCaseRunner.kt +++ b/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/ApiV2TestCaseRunner.kt @@ -89,8 +89,8 @@ class ApiV2TestCaseRunner : FreeSpec({ if (aarsak == null) { fakitskAarsak.shouldBeNull() } else { - aarsak.detaljer shouldContainExactlyInAnyOrder fakitskAarsak?.detaljer - aarsak.regler shouldContainExactlyInAnyOrder fakitskAarsak?.regler + fakitskAarsak?.detaljer shouldContainExactlyInAnyOrder aarsak.detaljer + fakitskAarsak?.regler shouldContainExactlyInAnyOrder aarsak.regler } } expectedErrorResponse.aarsakTilAvvisning?.detaljer?.also { expectedDetails -> diff --git a/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/testdata/NorskBrukerBosattISverigeUnder18aar.kt b/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/testdata/NorskBrukerBosattISverigeUnder18aar.kt index fd144620..dca23fb1 100644 --- a/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/testdata/NorskBrukerBosattISverigeUnder18aar.kt +++ b/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/testdata/NorskBrukerBosattISverigeUnder18aar.kt @@ -7,6 +7,7 @@ import no.nav.paw.arbeidssoekerregisteret.api.startstopp.models.ApiRegelId import no.nav.paw.arbeidssoekerregisteret.api.startstopp.models.FeilV2 import no.nav.paw.arbeidssokerregisteret.* import no.nav.paw.arbeidssokerregisteret.application.IkkeBosattINorgeIHenholdTilFolkeregisterloven +import no.nav.paw.arbeidssokerregisteret.application.Under18Aar import no.nav.paw.arbeidssokerregisteret.intern.v1.Avvist import no.nav.paw.arbeidssokerregisteret.intern.v1.vo.Bruker import no.nav.paw.arbeidssokerregisteret.intern.v1.vo.BrukerType @@ -55,7 +56,10 @@ data object NorskBrukerBosattISverigeUnder18aar : TestCase { melding = IkkeBosattINorgeIHenholdTilFolkeregisterloven.beskrivelse, feilKode = FeilV2.FeilKode.AVVIST, aarsakTilAvvisning = AarsakTilAvvisningV2( - regler = listOf(IkkeBosattINorgeIHenholdTilFolkeregisterloven.apiRegel()), + regler = listOf( + Under18Aar.apiRegel(), + IkkeBosattINorgeIHenholdTilFolkeregisterloven.apiRegel() + ), detaljer = listOf( ApiOpplysning.ER_UNDER_18_AAR, ApiOpplysning.HAR_UTENLANDSK_ADRESSE, diff --git a/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/InngangsRegler.kt b/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/InngangsRegler.kt index b4eed248..4326f66f 100644 --- a/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/InngangsRegler.kt +++ b/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/InngangsRegler.kt @@ -22,7 +22,6 @@ object InngangsRegler: Regler { ), Under18Aar( ErUnder18Aar, - BosattEtterFregLoven, vedTreff = ::muligGrunnlagForAvvisning ), UkjentAlder( @@ -34,6 +33,10 @@ object InngangsRegler: Regler { ErOver18Aar, BosattEtterFregLoven, vedTreff = ::grunnlagForGodkjenning + ), + IkkeBosattINorgeIHenholdTilFolkeregisterloven( + !BosattEtterFregLoven, + vedTreff = ::muligGrunnlagForAvvisning ) ) diff --git a/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/RegelExtensions.kt b/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/RegelExtensions.kt index fe9c5882..f7c47b67 100644 --- a/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/RegelExtensions.kt +++ b/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/RegelExtensions.kt @@ -17,10 +17,10 @@ operator fun RegelId.invoke( fun Regel.evaluer(samletOpplysning: Iterable): Boolean = opplysninger - .filter { it !is Not<*> } + .filterNot { it is Not<*> } .all { samletOpplysning.contains(it) } && opplysninger - .filterIsInstance>() + .filterIsInstance>() .none { samletOpplysning.contains(it.value) } /** @@ -38,13 +38,15 @@ fun Regler.evaluer( .filterIsInstance>() .map { it.value } .let { - it.filterIsInstance() to it + it.filterIsInstance() + .firstOrNull() to it } val grunnlagForGodkjenning = results .filterIsInstance>() .map { it.value } when { - skalAvvises.isNotEmpty() -> nonEmptyListOf(skalAvvises.first(), *skalAvvises.tail().toTypedArray()).left() + skalAvvises?.regel?.id == IkkeFunnet -> nonEmptyListOf(skalAvvises).left() + skalAvvises != null -> nonEmptyListOf(skalAvvises, *(alleProblemer - skalAvvises).toTypedArray()).left() grunnlagForGodkjenning.isNotEmpty() -> grunnlagForGodkjenning.first().right() alleProblemer.isNotEmpty() -> nonEmptyListOf(alleProblemer.first(), *alleProblemer.tail().toTypedArray()).left() else -> standardRegel.vedTreff(opplysninger).mapLeft { nonEmptyListOf(it) } diff --git a/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/RegelId.kt b/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/RegelId.kt index 8056c223..fcbc2c8b 100644 --- a/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/RegelId.kt +++ b/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/RegelId.kt @@ -19,7 +19,7 @@ data object Doed : DomeneRegelId { } data object Under18Aar : DomeneRegelId { - override val beskrivelse: String = "Er bosatt i Norge i henhold Folkeregisterloven, men er under 18 år" + override val beskrivelse: String = "Er under 18 år" } data object IkkeBosattINorgeIHenholdTilFolkeregisterloven : DomeneRegelId { diff --git a/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/Regler.kt b/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/Regler.kt index 51098a52..a5669a3d 100644 --- a/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/Regler.kt +++ b/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/Regler.kt @@ -5,11 +5,14 @@ import no.nav.paw.arbeidssokerregisteret.application.opplysninger.Opplysning interface Regler { val regler: List val standardRegel: Regel - operator fun Opplysning.not(): Opplysning = HarIkke(this).value + operator fun Opplysning.not(): Opplysning = HarIkke(this) } interface Not { val value: A } -data class HarIkke(override val value: Opplysning) : Not +data class HarIkke(override val value: Opplysning) : Not, Opplysning { + override val id: String get() = "IKKE_${value.id}" + override val beskrivelse: String get() = "IKKE_${value.beskrivelse}" +} diff --git a/domain/arbeidssoeker-regler/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/application/RegelEvalTest.kt b/domain/arbeidssoeker-regler/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/application/RegelEvalTest.kt new file mode 100644 index 00000000..717201ee --- /dev/null +++ b/domain/arbeidssoeker-regler/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/application/RegelEvalTest.kt @@ -0,0 +1,141 @@ +package no.nav.paw.arbeidssokerregisteret.application + +import arrow.core.Either +import arrow.core.NonEmptyList +import io.kotest.core.spec.style.FreeSpec +import io.kotest.matchers.collections.shouldContainExactlyInAnyOrder +import io.kotest.matchers.should +import io.kotest.matchers.types.shouldBeInstanceOf +import no.nav.paw.arbeidssokerregisteret.application.opplysninger.DomeneOpplysning + +typealias Avvist = Either.Left> +typealias Godkjent = Either.Right + +class RegelEvalTest : FreeSpec({ + "Verifiser regel evaluering" - { + "Person under 18 år" - { + "og forhåndsgodkjent" - { + "skal avvises når" - { + "er doed" { + InngangsRegler.evaluer( + listOf( + DomeneOpplysning.ErDoed, + DomeneOpplysning.ErForhaandsgodkjent, + DomeneOpplysning.ErUnder18Aar + ) + ) should { result -> + result.shouldBeInstanceOf() + result.value.map { problem -> problem.regel.id } shouldContainExactlyInAnyOrder listOf( + Doed, + Under18Aar, + IkkeBosattINorgeIHenholdTilFolkeregisterloven + ) + } + } + "er savnet" { + InngangsRegler.evaluer( + listOf( + DomeneOpplysning.ErSavnet, + DomeneOpplysning.ErForhaandsgodkjent, + DomeneOpplysning.ErUnder18Aar + ) + ) should { result -> + result.shouldBeInstanceOf() + result.value.map { problem -> problem.regel.id } shouldContainExactlyInAnyOrder listOf( + Savnet, + Under18Aar, + IkkeBosattINorgeIHenholdTilFolkeregisterloven + ) + } + } + "ikke funnet i PDL" { + InngangsRegler.evaluer( + listOf( + DomeneOpplysning.PersonIkkeFunnet + ) + ) should { result -> + result.shouldBeInstanceOf() + result.value.map { problem -> problem.regel.id } shouldContainExactlyInAnyOrder listOf( + IkkeFunnet + ) + } + } + } + "skal godkjennes når" - { + "ikke bosatt" { + InngangsRegler.evaluer( + listOf( + DomeneOpplysning.IkkeBosatt, + DomeneOpplysning.ErUnder18Aar, + DomeneOpplysning.ErForhaandsgodkjent + ) + ) should { result -> + result.shouldBeInstanceOf() + } + } + "ingen informasjon om bosatt" { + InngangsRegler.evaluer( + listOf( + DomeneOpplysning.ErUnder18Aar, + DomeneOpplysning.ErForhaandsgodkjent + ) + ) should { result -> + result.shouldBeInstanceOf() + } + } + } + } + } + "Person over 18 år" - { + "skal avvises når" - { + "Norsk statsborger, ikke bosatt" { + InngangsRegler.evaluer( + listOf( + DomeneOpplysning.ErNorskStatsborger, + DomeneOpplysning.ErEuEoesStatsborger, + DomeneOpplysning.ErOver18Aar, + DomeneOpplysning.IkkeBosatt + ) + ) should { result -> + result.shouldBeInstanceOf() + result.value.map { it.regel.id } shouldContainExactlyInAnyOrder listOf( + IkkeBosattINorgeIHenholdTilFolkeregisterloven + ) + } + } + "3. lands borger, ikke bosatt" { + InngangsRegler.evaluer( + listOf( + DomeneOpplysning.ErOver18Aar, + DomeneOpplysning.IkkeBosatt + ) + ) should { result -> + result.shouldBeInstanceOf() + result.value.map { it.regel.id } shouldContainExactlyInAnyOrder listOf( + IkkeBosattINorgeIHenholdTilFolkeregisterloven + ) + } + } + } + "skal godkjennes når" - { + "bosatt" { + InngangsRegler.evaluer( + listOf( + DomeneOpplysning.ErOver18Aar, + DomeneOpplysning.BosattEtterFregLoven + ) + ).shouldBeInstanceOf() + } + "forhåndsgodkjent" { + InngangsRegler.evaluer( + listOf( + DomeneOpplysning.ErOver18Aar, + DomeneOpplysning.IkkeBosatt, + DomeneOpplysning.ErForhaandsgodkjent + ) + ).shouldBeInstanceOf() + } + } + } + } +}) \ No newline at end of file