From 765e947133bc24a207436d6d37aa789ecf67f67a Mon Sep 17 00:00:00 2001 From: Mikael Bjerga <6940327+bjerga@users.noreply.github.com> Date: Thu, 20 Jun 2024 11:14:49 +0200 Subject: [PATCH 1/7] Lag egne apper for henting og lagring av selvbestemt IM (#570) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Lag egne apper for henting og lagring av selvbestemt IM * Minimer endringer i test for å forhindre merge conflict --- .../selvbestemt-hent-im-service/dev-gcp.yml | 6 +++++ .../selvbestemt-hent-im-service/prod-gcp.yml | 6 +++++ .../selvbestemt-lagre-im-service/dev-gcp.yml | 6 +++++ .../selvbestemt-lagre-im-service/prod-gcp.yml | 6 +++++ .../build.gradle.kts | 0 .../selvbestemthentimservice}/App.kt | 14 +++------- .../selvbestemthentimservice}/Env.kt | 2 +- .../HentSelvbestemtImService.kt | 2 +- .../HentSelvbestemtImServiceTest.kt | 12 ++++----- selvbestemt-lagre-im-service/build.gradle.kts | 0 .../selvbestemtlagreimservice/App.kt | 27 +++++++++++++++++++ .../selvbestemtlagreimservice/Env.kt | 7 +++++ .../LagreSelvbestemtImService.kt | 2 +- .../LagreSelvbestemtImServiceTest.kt | 2 +- 14 files changed, 72 insertions(+), 20 deletions(-) create mode 100644 config/selvbestemt-hent-im-service/dev-gcp.yml create mode 100644 config/selvbestemt-hent-im-service/prod-gcp.yml create mode 100644 config/selvbestemt-lagre-im-service/dev-gcp.yml create mode 100644 config/selvbestemt-lagre-im-service/prod-gcp.yml rename {aapenimservice => selvbestemt-hent-im-service}/build.gradle.kts (100%) rename {aapenimservice/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aapenimservice => selvbestemt-hent-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemthentimservice}/App.kt (65%) rename {aapenimservice/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aapenimservice => selvbestemt-hent-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemthentimservice}/Env.kt (58%) rename {aapenimservice/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aapenimservice => selvbestemt-hent-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemthentimservice}/HentSelvbestemtImService.kt (97%) rename {aapenimservice/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aapenimservice => selvbestemt-hent-im-service/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemthentimservice}/HentSelvbestemtImServiceTest.kt (92%) create mode 100644 selvbestemt-lagre-im-service/build.gradle.kts create mode 100644 selvbestemt-lagre-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/App.kt create mode 100644 selvbestemt-lagre-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/Env.kt rename {aapenimservice/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aapenimservice => selvbestemt-lagre-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice}/LagreSelvbestemtImService.kt (99%) rename {aapenimservice/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aapenimservice => selvbestemt-lagre-im-service/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice}/LagreSelvbestemtImServiceTest.kt (99%) diff --git a/config/selvbestemt-hent-im-service/dev-gcp.yml b/config/selvbestemt-hent-im-service/dev-gcp.yml new file mode 100644 index 000000000..47b7d8d76 --- /dev/null +++ b/config/selvbestemt-hent-im-service/dev-gcp.yml @@ -0,0 +1,6 @@ +kafkaPool: nav-dev +env: +- name: REDIS_URL + value: redis://helsearbeidsgiver-redis.helsearbeidsgiver.svc.cluster.local:6379/0 +apps: + - name: helsearbeidsgiver-redis diff --git a/config/selvbestemt-hent-im-service/prod-gcp.yml b/config/selvbestemt-hent-im-service/prod-gcp.yml new file mode 100644 index 000000000..a39dd5b14 --- /dev/null +++ b/config/selvbestemt-hent-im-service/prod-gcp.yml @@ -0,0 +1,6 @@ +kafkaPool: nav-prod +env: +- name: REDIS_URL + value: redis://helsearbeidsgiver-redis.helsearbeidsgiver.svc.cluster.local:6379/0 +apps: + - name: helsearbeidsgiver-redis diff --git a/config/selvbestemt-lagre-im-service/dev-gcp.yml b/config/selvbestemt-lagre-im-service/dev-gcp.yml new file mode 100644 index 000000000..47b7d8d76 --- /dev/null +++ b/config/selvbestemt-lagre-im-service/dev-gcp.yml @@ -0,0 +1,6 @@ +kafkaPool: nav-dev +env: +- name: REDIS_URL + value: redis://helsearbeidsgiver-redis.helsearbeidsgiver.svc.cluster.local:6379/0 +apps: + - name: helsearbeidsgiver-redis diff --git a/config/selvbestemt-lagre-im-service/prod-gcp.yml b/config/selvbestemt-lagre-im-service/prod-gcp.yml new file mode 100644 index 000000000..a39dd5b14 --- /dev/null +++ b/config/selvbestemt-lagre-im-service/prod-gcp.yml @@ -0,0 +1,6 @@ +kafkaPool: nav-prod +env: +- name: REDIS_URL + value: redis://helsearbeidsgiver-redis.helsearbeidsgiver.svc.cluster.local:6379/0 +apps: + - name: helsearbeidsgiver-redis diff --git a/aapenimservice/build.gradle.kts b/selvbestemt-hent-im-service/build.gradle.kts similarity index 100% rename from aapenimservice/build.gradle.kts rename to selvbestemt-hent-im-service/build.gradle.kts diff --git a/aapenimservice/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aapenimservice/App.kt b/selvbestemt-hent-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemthentimservice/App.kt similarity index 65% rename from aapenimservice/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aapenimservice/App.kt rename to selvbestemt-hent-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemthentimservice/App.kt index 9470a22f6..1a38ac668 100644 --- a/aapenimservice/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aapenimservice/App.kt +++ b/selvbestemt-hent-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemthentimservice/App.kt @@ -1,32 +1,29 @@ -package no.nav.helsearbeidsgiver.inntektsmelding.aapenimservice +package no.nav.helsearbeidsgiver.inntektsmelding.selvbestemthentimservice import no.nav.helse.rapids_rivers.RapidApplication import no.nav.helse.rapids_rivers.RapidsConnection import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisConnection import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisPrefix -import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisStore import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisStoreClassSpecific import no.nav.helsearbeidsgiver.felles.rapidsrivers.registerShutdownLifecycle import no.nav.helsearbeidsgiver.felles.rapidsrivers.service.ServiceRiver import no.nav.helsearbeidsgiver.utils.log.logger -private val logger = "im-selvbestemtimservice".logger() +private val logger = "im-selvbestemt-hent-im-service".logger() fun main() { val redisConnection = RedisConnection(Env.redisUrl) - val redisStore = RedisStore(Env.redisUrl) RapidApplication .create(System.getenv()) - .createSelvbestemtImService(redisConnection, redisStore) + .createHentSelvbestemtImService(redisConnection) .registerShutdownLifecycle { redisConnection.close() - redisStore.shutdown() } .start() } -fun RapidsConnection.createSelvbestemtImService(redisConnection: RedisConnection, redisStore: RedisStore): RapidsConnection = +fun RapidsConnection.createHentSelvbestemtImService(redisConnection: RedisConnection): RapidsConnection = also { logger.info("Starter ${HentSelvbestemtImService::class.simpleName}...") ServiceRiver( @@ -36,7 +33,4 @@ fun RapidsConnection.createSelvbestemtImService(redisConnection: RedisConnection ) ) .connect(this) - - logger.info("Starter ${LagreSelvbestemtImService::class.simpleName}...") - LagreSelvbestemtImService(this, redisStore) } diff --git a/aapenimservice/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aapenimservice/Env.kt b/selvbestemt-hent-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemthentimservice/Env.kt similarity index 58% rename from aapenimservice/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aapenimservice/Env.kt rename to selvbestemt-hent-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemthentimservice/Env.kt index a980cb188..c2df0d567 100644 --- a/aapenimservice/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aapenimservice/Env.kt +++ b/selvbestemt-hent-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemthentimservice/Env.kt @@ -1,4 +1,4 @@ -package no.nav.helsearbeidsgiver.inntektsmelding.aapenimservice +package no.nav.helsearbeidsgiver.inntektsmelding.selvbestemthentimservice import no.nav.helsearbeidsgiver.felles.fromEnv diff --git a/aapenimservice/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aapenimservice/HentSelvbestemtImService.kt b/selvbestemt-hent-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemthentimservice/HentSelvbestemtImService.kt similarity index 97% rename from aapenimservice/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aapenimservice/HentSelvbestemtImService.kt rename to selvbestemt-hent-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemthentimservice/HentSelvbestemtImService.kt index e76577afd..2328f600c 100644 --- a/aapenimservice/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aapenimservice/HentSelvbestemtImService.kt +++ b/selvbestemt-hent-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemthentimservice/HentSelvbestemtImService.kt @@ -1,4 +1,4 @@ -package no.nav.helsearbeidsgiver.inntektsmelding.aapenimservice +package no.nav.helsearbeidsgiver.inntektsmelding.selvbestemthentimservice import kotlinx.serialization.builtins.serializer import kotlinx.serialization.json.JsonElement diff --git a/aapenimservice/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aapenimservice/HentSelvbestemtImServiceTest.kt b/selvbestemt-hent-im-service/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemthentimservice/HentSelvbestemtImServiceTest.kt similarity index 92% rename from aapenimservice/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aapenimservice/HentSelvbestemtImServiceTest.kt rename to selvbestemt-hent-im-service/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemthentimservice/HentSelvbestemtImServiceTest.kt index 3b3d03376..a2f367940 100644 --- a/aapenimservice/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aapenimservice/HentSelvbestemtImServiceTest.kt +++ b/selvbestemt-hent-im-service/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemthentimservice/HentSelvbestemtImServiceTest.kt @@ -1,4 +1,4 @@ -package no.nav.helsearbeidsgiver.inntektsmelding.aapenimservice +package no.nav.helsearbeidsgiver.inntektsmelding.selvbestemthentimservice import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.ints.shouldBeExactly @@ -47,14 +47,14 @@ class HentSelvbestemtImServiceTest : FunSpec({ val transaksjonId = UUID.randomUUID() testRapid.sendJson( - MockHent.startMelding(transaksjonId) + Mock.startMelding(transaksjonId) ) testRapid.inspektør.size shouldBeExactly 1 testRapid.firstMessage().lesBehov() shouldBe BehovType.HENT_SELVBESTEMT_IM testRapid.sendJson( - MockHent.dataMelding(transaksjonId) + Mock.dataMelding(transaksjonId) ) testRapid.inspektør.size shouldBeExactly 1 @@ -63,7 +63,7 @@ class HentSelvbestemtImServiceTest : FunSpec({ mockRedis.store.set( RedisKey.of(transaksjonId), ResultJson( - success = MockHent.inntektsmelding.toJson(Inntektsmelding.serializer()) + success = Mock.inntektsmelding.toJson(Inntektsmelding.serializer()) ).toJson(ResultJson.serializer()) ) } @@ -74,7 +74,7 @@ class HentSelvbestemtImServiceTest : FunSpec({ val feilmelding = "Snitches get stitches (fordi vi har gratis helsevesen)" testRapid.sendJson( - MockHent.startMelding(transaksjonId) + Mock.startMelding(transaksjonId) ) testRapid.sendJson( @@ -108,7 +108,7 @@ class HentSelvbestemtImServiceTest : FunSpec({ private fun JsonElement.lesBehov(): BehovType? = Key.BEHOV.lesOrNull(BehovType.serializer(), this.toMap()) -private object MockHent { +private object Mock { private val selvbestemtId: UUID = UUID.randomUUID() val inntektsmelding = mockInntektsmeldingV1() diff --git a/selvbestemt-lagre-im-service/build.gradle.kts b/selvbestemt-lagre-im-service/build.gradle.kts new file mode 100644 index 000000000..e69de29bb diff --git a/selvbestemt-lagre-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/App.kt b/selvbestemt-lagre-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/App.kt new file mode 100644 index 000000000..42a668f0a --- /dev/null +++ b/selvbestemt-lagre-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/App.kt @@ -0,0 +1,27 @@ +package no.nav.helsearbeidsgiver.inntektsmelding.selvbestemtlagreimservice + +import no.nav.helse.rapids_rivers.RapidApplication +import no.nav.helse.rapids_rivers.RapidsConnection +import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisStore +import no.nav.helsearbeidsgiver.felles.rapidsrivers.registerShutdownLifecycle +import no.nav.helsearbeidsgiver.utils.log.logger + +private val logger = "im-selvbestemt-lagre-im-service".logger() + +fun main() { + val redisStore = RedisStore(Env.redisUrl) + + RapidApplication + .create(System.getenv()) + .createLagreSelvbestemtImService(redisStore) + .registerShutdownLifecycle { + redisStore.shutdown() + } + .start() +} + +fun RapidsConnection.createLagreSelvbestemtImService(redisStore: RedisStore): RapidsConnection = + also { + logger.info("Starter ${LagreSelvbestemtImService::class.simpleName}...") + LagreSelvbestemtImService(this, redisStore) + } diff --git a/selvbestemt-lagre-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/Env.kt b/selvbestemt-lagre-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/Env.kt new file mode 100644 index 000000000..ad6a6140e --- /dev/null +++ b/selvbestemt-lagre-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/Env.kt @@ -0,0 +1,7 @@ +package no.nav.helsearbeidsgiver.inntektsmelding.selvbestemtlagreimservice + +import no.nav.helsearbeidsgiver.felles.fromEnv + +object Env { + val redisUrl = "REDIS_URL".fromEnv() +} diff --git a/aapenimservice/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aapenimservice/LagreSelvbestemtImService.kt b/selvbestemt-lagre-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImService.kt similarity index 99% rename from aapenimservice/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aapenimservice/LagreSelvbestemtImService.kt rename to selvbestemt-lagre-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImService.kt index 0ad9decb7..c8db1fa1a 100644 --- a/aapenimservice/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aapenimservice/LagreSelvbestemtImService.kt +++ b/selvbestemt-lagre-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImService.kt @@ -1,4 +1,4 @@ -package no.nav.helsearbeidsgiver.inntektsmelding.aapenimservice +package no.nav.helsearbeidsgiver.inntektsmelding.selvbestemtlagreimservice import kotlinx.serialization.builtins.serializer import kotlinx.serialization.json.JsonElement diff --git a/aapenimservice/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aapenimservice/LagreSelvbestemtImServiceTest.kt b/selvbestemt-lagre-im-service/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImServiceTest.kt similarity index 99% rename from aapenimservice/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aapenimservice/LagreSelvbestemtImServiceTest.kt rename to selvbestemt-lagre-im-service/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImServiceTest.kt index 9dd9d866d..2f05756aa 100644 --- a/aapenimservice/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aapenimservice/LagreSelvbestemtImServiceTest.kt +++ b/selvbestemt-lagre-im-service/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImServiceTest.kt @@ -1,4 +1,4 @@ -package no.nav.helsearbeidsgiver.inntektsmelding.aapenimservice +package no.nav.helsearbeidsgiver.inntektsmelding.selvbestemtlagreimservice import io.kotest.assertions.fail import io.kotest.core.spec.style.FunSpec From 367212d8ede7b9cc284d3e4a228ce934d5e2cce6 Mon Sep 17 00:00:00 2001 From: Mikael Bjerga <6940327+bjerga@users.noreply.github.com> Date: Thu, 20 Jun 2024 11:17:22 +0200 Subject: [PATCH 2/7] Start prodapper av selvbestemt-servicer (#571) --- config/aktiveorgnrservice/prod-gcp.yml | 6 ++++++ config/inntekt-selvbestemt-service/dev-gcp.yml | 4 ++-- config/inntekt-selvbestemt-service/prod-gcp.yml | 6 ++++++ 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 config/aktiveorgnrservice/prod-gcp.yml create mode 100644 config/inntekt-selvbestemt-service/prod-gcp.yml diff --git a/config/aktiveorgnrservice/prod-gcp.yml b/config/aktiveorgnrservice/prod-gcp.yml new file mode 100644 index 000000000..51ce46692 --- /dev/null +++ b/config/aktiveorgnrservice/prod-gcp.yml @@ -0,0 +1,6 @@ +kafkaPool: nav-prod +env: + - name: REDIS_URL + value: redis://helsearbeidsgiver-redis.helsearbeidsgiver.svc.cluster.local:6379/0 +apps: + - name: helsearbeidsgiver-redis diff --git a/config/inntekt-selvbestemt-service/dev-gcp.yml b/config/inntekt-selvbestemt-service/dev-gcp.yml index 47b7d8d76..dc4a3a5dd 100644 --- a/config/inntekt-selvbestemt-service/dev-gcp.yml +++ b/config/inntekt-selvbestemt-service/dev-gcp.yml @@ -1,6 +1,6 @@ kafkaPool: nav-dev env: -- name: REDIS_URL - value: redis://helsearbeidsgiver-redis.helsearbeidsgiver.svc.cluster.local:6379/0 + - name: REDIS_URL + value: redis://helsearbeidsgiver-redis.helsearbeidsgiver.svc.cluster.local:6379/0 apps: - name: helsearbeidsgiver-redis diff --git a/config/inntekt-selvbestemt-service/prod-gcp.yml b/config/inntekt-selvbestemt-service/prod-gcp.yml new file mode 100644 index 000000000..51ce46692 --- /dev/null +++ b/config/inntekt-selvbestemt-service/prod-gcp.yml @@ -0,0 +1,6 @@ +kafkaPool: nav-prod +env: + - name: REDIS_URL + value: redis://helsearbeidsgiver-redis.helsearbeidsgiver.svc.cluster.local:6379/0 +apps: + - name: helsearbeidsgiver-redis From ee6b94db95d2a1ec4d2044245c9907145986e9b1 Mon Sep 17 00:00:00 2001 From: Gustav Berggren <83211434+b162214@users.noreply.github.com> Date: Thu, 20 Jun 2024 15:02:33 +0200 Subject: [PATCH 3/7] Sjekk arbeidsforhold ved selvbestemt innsending (#569) Co-authored-by: Morten Byhring --- .../aktiveorgnrservice/AktiveOrgnrService.kt | 2 + .../ArbeidsforholdUtilsKtTest.kt | 1 + .../LagreSelvbestemtImRoute.kt | 8 +- .../api/response/ErrorResponse.kt | 9 ++ .../LagreSelvbestemtImRouteKtTest.kt | 71 +++++++++++++ .../felles/utils}/ArbeidsforholdUtils.kt | 2 +- .../felles/utils}/AaregTestData.kt | 2 +- .../ArbeidsforholdInnenforPeriodeKtTest.kt | 2 +- .../LagreSelvbestemtImService.kt | 54 +++++++--- .../LagreSelvbestemtImServiceTest.kt | 100 ++++++++++++++---- 10 files changed, 211 insertions(+), 40 deletions(-) create mode 100644 api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImRouteKtTest.kt rename {aktiveorgnrservice/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aktiveorgnrservice => felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/utils}/ArbeidsforholdUtils.kt (97%) rename {aktiveorgnrservice/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aktiveorgnrservice => felles/src/test/kotlin/no/nav/helsearbeidsgiver/felles/utils}/AaregTestData.kt (98%) rename {aktiveorgnrservice/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aktiveorgnrservice => felles/src/test/kotlin/no/nav/helsearbeidsgiver/felles/utils}/ArbeidsforholdInnenforPeriodeKtTest.kt (97%) diff --git a/aktiveorgnrservice/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aktiveorgnrservice/AktiveOrgnrService.kt b/aktiveorgnrservice/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aktiveorgnrservice/AktiveOrgnrService.kt index b15972d88..5b619a6a4 100644 --- a/aktiveorgnrservice/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aktiveorgnrservice/AktiveOrgnrService.kt +++ b/aktiveorgnrservice/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aktiveorgnrservice/AktiveOrgnrService.kt @@ -22,6 +22,8 @@ import no.nav.helsearbeidsgiver.felles.rapidsrivers.publish import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisKey import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisStore import no.nav.helsearbeidsgiver.felles.utils.Log +import no.nav.helsearbeidsgiver.felles.utils.filterOrgnr +import no.nav.helsearbeidsgiver.felles.utils.orgnrMedHistoriskArbeidsforhold import no.nav.helsearbeidsgiver.utils.json.fromJson import no.nav.helsearbeidsgiver.utils.json.serializer.UuidSerializer import no.nav.helsearbeidsgiver.utils.json.serializer.list diff --git a/aktiveorgnrservice/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aktiveorgnrservice/ArbeidsforholdUtilsKtTest.kt b/aktiveorgnrservice/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aktiveorgnrservice/ArbeidsforholdUtilsKtTest.kt index 9bd6bf7d5..333392c5d 100644 --- a/aktiveorgnrservice/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aktiveorgnrservice/ArbeidsforholdUtilsKtTest.kt +++ b/aktiveorgnrservice/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aktiveorgnrservice/ArbeidsforholdUtilsKtTest.kt @@ -6,6 +6,7 @@ import no.nav.helsearbeidsgiver.felles.Ansettelsesperiode import no.nav.helsearbeidsgiver.felles.Arbeidsforhold import no.nav.helsearbeidsgiver.felles.Arbeidsgiver import no.nav.helsearbeidsgiver.felles.PeriodeNullable +import no.nav.helsearbeidsgiver.felles.utils.orgnrMedHistoriskArbeidsforhold import java.time.LocalDate import java.time.LocalDateTime diff --git a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImRoute.kt b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImRoute.kt index f73aa06bd..8e7b11cc7 100644 --- a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImRoute.kt +++ b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImRoute.kt @@ -19,6 +19,7 @@ import no.nav.helsearbeidsgiver.inntektsmelding.api.Routes import no.nav.helsearbeidsgiver.inntektsmelding.api.auth.Tilgangskontroll import no.nav.helsearbeidsgiver.inntektsmelding.api.auth.lesFnrFraAuthToken import no.nav.helsearbeidsgiver.inntektsmelding.api.logger +import no.nav.helsearbeidsgiver.inntektsmelding.api.response.ArbeidsforholdErrorResponse import no.nav.helsearbeidsgiver.inntektsmelding.api.response.JsonErrorResponse import no.nav.helsearbeidsgiver.inntektsmelding.api.response.RedisPermanentErrorResponse import no.nav.helsearbeidsgiver.inntektsmelding.api.response.RedisTimeoutResponse @@ -128,10 +129,13 @@ private suspend fun PipelineContext.sendResponse(resultat respond(HttpStatusCode.OK, LagreSelvbestemtImResponse(selvbestemtId), LagreSelvbestemtImResponse.serializer()) } else { val feilmelding = resultat.failure?.fromJson(String.serializer()).orDefault("Tomt resultat i Redis.") - logger.info("Fikk feil under mottagelse av selvbestemt inntektsmelding.") sikkerLogger.info("Fikk feil under mottagelse av selvbestemt inntektsmelding: $feilmelding") - respondInternalServerError(UkjentErrorResponse(), UkjentErrorResponse.serializer()) + if ("Mangler arbeidsforhold i perioden" == feilmelding) { + respondBadRequest(ArbeidsforholdErrorResponse(), ArbeidsforholdErrorResponse.serializer()) + } else { + respondInternalServerError(UkjentErrorResponse(), UkjentErrorResponse.serializer()) + } } } .onFailure { diff --git a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/response/ErrorResponse.kt b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/response/ErrorResponse.kt index c854eace3..eaf79efee 100644 --- a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/response/ErrorResponse.kt +++ b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/response/ErrorResponse.kt @@ -57,3 +57,12 @@ data class RedisPermanentErrorResponse( @EncodeDefault val error = "Permanent feil mot redis." } + +@Serializable +@OptIn(ExperimentalSerializationApi::class) +data class ArbeidsforholdErrorResponse( + val inntektsmeldingTypeId: UUID? = null +) { + @EncodeDefault + val error = "Mangler arbeidsforhold i perioden" +} diff --git a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImRouteKtTest.kt b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImRouteKtTest.kt new file mode 100644 index 000000000..210f529dc --- /dev/null +++ b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImRouteKtTest.kt @@ -0,0 +1,71 @@ +package no.nav.helsearbeidsgiver.inntektsmelding.api.lagreselvbestemtim + +import io.ktor.client.statement.bodyAsText +import io.ktor.http.HttpStatusCode +import io.mockk.clearAllMocks +import io.mockk.coEvery +import io.mockk.every +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmeldingSelvbestemt +import no.nav.helsearbeidsgiver.felles.ResultJson +import no.nav.helsearbeidsgiver.felles.Tilgang +import no.nav.helsearbeidsgiver.felles.test.mock.mockSkjemaInntektsmeldingSelvbestemt +import no.nav.helsearbeidsgiver.inntektsmelding.api.Routes +import no.nav.helsearbeidsgiver.inntektsmelding.api.response.ArbeidsforholdErrorResponse +import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.ApiTest +import no.nav.helsearbeidsgiver.utils.json.fromJson +import no.nav.helsearbeidsgiver.utils.json.toJson +import no.nav.helsearbeidsgiver.utils.test.mock.mockConstructor +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import java.util.UUID + +class LagreSelvbestemtImRouteKtTest : ApiTest() { + private val path = Routes.PREFIX + Routes.SELVBESTEMT_INNTEKTSMELDING + + @BeforeEach + fun setup() { + clearAllMocks() + } + + @Test + fun `skal godta og returnere id ved gyldig innsending`() = + testApi { + mockTilgang(Tilgang.HAR_TILGANG) + val mockClientId = UUID.randomUUID() + val selvbestemtId = UUID.randomUUID() + coEvery { mockRedisPoller.hent(mockClientId) } returns + ResultJson( + success = selvbestemtId.toJson() + ).toJson(ResultJson.serializer()) + + val response = + mockConstructor(LagreSelvbestemtImProducer::class) { + every { anyConstructed().publish(any(), any()) } returns mockClientId + post(path, mockSkjemaInntektsmeldingSelvbestemt(), SkjemaInntektsmeldingSelvbestemt.serializer()) + } + + assertEquals(HttpStatusCode.OK, response.status) + assertEquals(LagreSelvbestemtImResponse(selvbestemtId = selvbestemtId), response.bodyAsText().fromJson(LagreSelvbestemtImResponse.serializer())) + } + + @Test + fun `skal returnere bad reqest hvis arbeidsforhold mangler`() = + testApi { + mockTilgang(Tilgang.HAR_TILGANG) + val mockClientId = UUID.randomUUID() + coEvery { mockRedisPoller.hent(mockClientId) } returns + ResultJson( + failure = "Mangler arbeidsforhold i perioden".toJson() + ).toJson(ResultJson.serializer()) + + val response = + mockConstructor(LagreSelvbestemtImProducer::class) { + every { anyConstructed().publish(any(), any()) } returns mockClientId + post(path, mockSkjemaInntektsmeldingSelvbestemt(), SkjemaInntektsmeldingSelvbestemt.serializer()) + } + + assertEquals(HttpStatusCode.BadRequest, response.status) + assertEquals(ArbeidsforholdErrorResponse(), response.bodyAsText().fromJson(ArbeidsforholdErrorResponse.serializer())) + } +} diff --git a/aktiveorgnrservice/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aktiveorgnrservice/ArbeidsforholdUtils.kt b/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/utils/ArbeidsforholdUtils.kt similarity index 97% rename from aktiveorgnrservice/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aktiveorgnrservice/ArbeidsforholdUtils.kt rename to felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/utils/ArbeidsforholdUtils.kt index 16714f26b..cde2662bc 100644 --- a/aktiveorgnrservice/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aktiveorgnrservice/ArbeidsforholdUtils.kt +++ b/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/utils/ArbeidsforholdUtils.kt @@ -1,4 +1,4 @@ -package no.nav.helsearbeidsgiver.inntektsmelding.aktiveorgnrservice +package no.nav.helsearbeidsgiver.felles.utils import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Periode import no.nav.helsearbeidsgiver.felles.Arbeidsforhold diff --git a/aktiveorgnrservice/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aktiveorgnrservice/AaregTestData.kt b/felles/src/test/kotlin/no/nav/helsearbeidsgiver/felles/utils/AaregTestData.kt similarity index 98% rename from aktiveorgnrservice/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aktiveorgnrservice/AaregTestData.kt rename to felles/src/test/kotlin/no/nav/helsearbeidsgiver/felles/utils/AaregTestData.kt index 975c9ac27..ff28e800a 100644 --- a/aktiveorgnrservice/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aktiveorgnrservice/AaregTestData.kt +++ b/felles/src/test/kotlin/no/nav/helsearbeidsgiver/felles/utils/AaregTestData.kt @@ -1,4 +1,4 @@ -package no.nav.helsearbeidsgiver.inntektsmelding.aktiveorgnrservice +package no.nav.helsearbeidsgiver.felles.utils import no.nav.helsearbeidsgiver.felles.Ansettelsesperiode import no.nav.helsearbeidsgiver.felles.Arbeidsforhold diff --git a/aktiveorgnrservice/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aktiveorgnrservice/ArbeidsforholdInnenforPeriodeKtTest.kt b/felles/src/test/kotlin/no/nav/helsearbeidsgiver/felles/utils/ArbeidsforholdInnenforPeriodeKtTest.kt similarity index 97% rename from aktiveorgnrservice/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aktiveorgnrservice/ArbeidsforholdInnenforPeriodeKtTest.kt rename to felles/src/test/kotlin/no/nav/helsearbeidsgiver/felles/utils/ArbeidsforholdInnenforPeriodeKtTest.kt index 82577e513..90734931f 100644 --- a/aktiveorgnrservice/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/aktiveorgnrservice/ArbeidsforholdInnenforPeriodeKtTest.kt +++ b/felles/src/test/kotlin/no/nav/helsearbeidsgiver/felles/utils/ArbeidsforholdInnenforPeriodeKtTest.kt @@ -1,4 +1,4 @@ -package no.nav.helsearbeidsgiver.inntektsmelding.aktiveorgnrservice +package no.nav.helsearbeidsgiver.felles.utils import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.shouldBe diff --git a/selvbestemt-lagre-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImService.kt b/selvbestemt-lagre-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImService.kt index c8db1fa1a..26cdf036c 100644 --- a/selvbestemt-lagre-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImService.kt +++ b/selvbestemt-lagre-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImService.kt @@ -8,6 +8,7 @@ import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Avsender import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Inntektsmelding import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Sykmeldt import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmeldingSelvbestemt +import no.nav.helsearbeidsgiver.felles.Arbeidsforhold import no.nav.helsearbeidsgiver.felles.BehovType import no.nav.helsearbeidsgiver.felles.EventName import no.nav.helsearbeidsgiver.felles.Key @@ -28,7 +29,9 @@ import no.nav.helsearbeidsgiver.felles.rapidsrivers.publishNotNull import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisKey import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisStore import no.nav.helsearbeidsgiver.felles.utils.Log +import no.nav.helsearbeidsgiver.felles.utils.aktivtArbeidsforholdIPeriode import no.nav.helsearbeidsgiver.utils.json.serializer.UuidSerializer +import no.nav.helsearbeidsgiver.utils.json.serializer.list import no.nav.helsearbeidsgiver.utils.json.toJson import no.nav.helsearbeidsgiver.utils.json.toPretty import no.nav.helsearbeidsgiver.utils.log.MdcUtils @@ -43,7 +46,6 @@ class LagreSelvbestemtImService( private val rapid: RapidsConnection, override val redisStore: RedisStore ) : CompositeEventListener() { - private val logger = logger() private val sikkerLogger = sikkerLogger() @@ -57,12 +59,14 @@ class LagreSelvbestemtImService( Key.PERSONER, Key.SELVBESTEMT_INNTEKTSMELDING, Key.ER_DUPLIKAT_IM, - Key.SAK_ID + Key.SAK_ID, + Key.ARBEIDSFORHOLD ) private val steg1Keys = setOf( Key.VIRKSOMHET, - Key.PERSONER + Key.PERSONER, + Key.ARBEIDSFORHOLD ) private val steg2Keys = setOf( Key.SELVBESTEMT_INNTEKTSMELDING, @@ -103,6 +107,14 @@ class LagreSelvbestemtImService( avsenderFnr ).toJson(Fnr.serializer()) ) + + rapid.publishNotNull( + Key.EVENT_NAME to event.toJson(), + Key.BEHOV to BehovType.ARBEIDSFORHOLD.toJson(), + Key.IDENTITETSNUMMER to skjema.sykmeldtFnr.verdi.toJson(), + Key.UUID to transaksjonId.toJson(), + Key.SELVBESTEMT_ID to skjema.selvbestemtId?.toJson() + ) } } @@ -140,6 +152,8 @@ class LagreSelvbestemtImService( val avsenderFnr = Key.ARBEIDSGIVER_FNR.les(Fnr.serializer(), melding) val orgNavn = Key.VIRKSOMHET.les(String.serializer(), melding) val personer = Key.PERSONER.les(personMapSerializer, melding) + val arbeidsforholdListe = Key.ARBEIDSFORHOLD.les(Arbeidsforhold.serializer().list(), melding) + .filter { it.arbeidsgiver.organisasjonsnummer == skjema.avsender.orgnr.verdi } val sykmeldt = skjema.sykmeldtFnr.let { personer[it.verdi] ?: tomPerson(it.verdi) @@ -155,16 +169,32 @@ class LagreSelvbestemtImService( avsender = avsender ) - rapid.publish( - Key.EVENT_NAME to event.toJson(), - Key.BEHOV to BehovType.LAGRE_SELVBESTEMT_IM.toJson(), - Key.UUID to transaksjonId.toJson(), - Key.SELVBESTEMT_INNTEKTSMELDING to inntektsmelding.toJson(Inntektsmelding.serializer()) - ) - .also { - logger.info("Publiserte melding med behov '${BehovType.LAGRE_SELVBESTEMT_IM}'.") - sikkerLogger.info("Publiserte melding:\n${it.toPretty()}") + val sykeperioder = skjema.agp?.perioder.orEmpty() + skjema.sykmeldingsperioder + val erAktivtArbeidsforhold = sykeperioder.aktivtArbeidsforholdIPeriode(arbeidsforholdListe) + if (erAktivtArbeidsforhold) { + rapid.publish( + Key.EVENT_NAME to event.toJson(), + Key.BEHOV to BehovType.LAGRE_SELVBESTEMT_IM.toJson(), + Key.UUID to transaksjonId.toJson(), + Key.SELVBESTEMT_INNTEKTSMELDING to inntektsmelding.toJson(Inntektsmelding.serializer()) + ) + .also { + logger.info("Publiserte melding med behov '${BehovType.LAGRE_SELVBESTEMT_IM}'.") + sikkerLogger.info("Publiserte melding:\n${it.toPretty()}") + } + } else { + val clientId = redisStore.get(RedisKey.of(transaksjonId, event))?.let(UUID::fromString) + if (clientId == null) { + sikkerLogger.error("Forsøkte å fullføre, men clientId mangler i Redis.") + } else { + "Mangler arbeidsforhold i perioden".also { feilmelding -> + logger.warn(feilmelding) + sikkerLogger.warn(feilmelding) + val resultJson = ResultJson(failure = feilmelding.toJson()).toJsonStr() + redisStore.set(RedisKey.of(clientId), resultJson) + } } + } } else { Unit } diff --git a/selvbestemt-lagre-im-service/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImServiceTest.kt b/selvbestemt-lagre-im-service/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImServiceTest.kt index 2f05756aa..5a73a879b 100644 --- a/selvbestemt-lagre-im-service/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImServiceTest.kt +++ b/selvbestemt-lagre-im-service/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImServiceTest.kt @@ -26,9 +26,13 @@ import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.RefusjonEndring import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaAvsender import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmeldingSelvbestemt import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.til +import no.nav.helsearbeidsgiver.felles.Ansettelsesperiode +import no.nav.helsearbeidsgiver.felles.Arbeidsforhold +import no.nav.helsearbeidsgiver.felles.Arbeidsgiver import no.nav.helsearbeidsgiver.felles.BehovType import no.nav.helsearbeidsgiver.felles.EventName import no.nav.helsearbeidsgiver.felles.Key +import no.nav.helsearbeidsgiver.felles.PeriodeNullable import no.nav.helsearbeidsgiver.felles.Person import no.nav.helsearbeidsgiver.felles.ResultJson import no.nav.helsearbeidsgiver.felles.json.lesOrNull @@ -49,6 +53,8 @@ import no.nav.helsearbeidsgiver.utils.test.mock.mockStatic import no.nav.helsearbeidsgiver.utils.test.wrapper.genererGyldig import no.nav.helsearbeidsgiver.utils.wrapper.Fnr import no.nav.helsearbeidsgiver.utils.wrapper.Orgnr +import java.time.LocalDate +import java.time.LocalDateTime import java.time.OffsetDateTime import java.util.UUID @@ -85,9 +91,10 @@ class LagreSelvbestemtImServiceTest : FunSpec({ ) } - testRapid.inspektør.size shouldBeExactly 2 + testRapid.inspektør.size shouldBeExactly 3 testRapid.message(0).lesBehov() shouldBe BehovType.VIRKSOMHET testRapid.message(1).lesBehov() shouldBe BehovType.HENT_PERSONER + testRapid.message(2).lesBehov() shouldBe BehovType.ARBEIDSFORHOLD mockStatic(OffsetDateTime::class) { every { OffsetDateTime.now() } returns nyInntektsmelding.mottatt @@ -98,8 +105,8 @@ class LagreSelvbestemtImServiceTest : FunSpec({ ) } - testRapid.inspektør.size shouldBeExactly 3 - testRapid.message(2).also { + testRapid.inspektør.size shouldBeExactly 4 + testRapid.message(3).also { it.lesBehov() shouldBe BehovType.LAGRE_SELVBESTEMT_IM it.lesInntektsmelding().shouldBeEqualToIgnoringFields(nyInntektsmelding, Inntektsmelding::id, Inntektsmelding::type) @@ -115,16 +122,16 @@ class LagreSelvbestemtImServiceTest : FunSpec({ .minus(Key.SELVBESTEMT_ID) ) - testRapid.inspektør.size shouldBeExactly 4 - testRapid.message(3).lesBehov() shouldBe BehovType.OPPRETT_SELVBESTEMT_SAK + testRapid.inspektør.size shouldBeExactly 5 + testRapid.message(4).lesBehov() shouldBe BehovType.OPPRETT_SELVBESTEMT_SAK testRapid.sendJson( MockLagre.steg3Data(transaksjonId) .minus(Key.SELVBESTEMT_ID) ) - testRapid.inspektør.size shouldBeExactly 5 - testRapid.message(4).also { + testRapid.inspektør.size shouldBeExactly 6 + testRapid.message(5).also { Key.EVENT_NAME.lesOrNull(EventName.serializer(), it.toMap()) shouldBe EventName.SELVBESTEMT_IM_LAGRET Key.UUID.lesOrNull(UuidSerializer, it.toMap()) shouldBe transaksjonId it.lesInntektsmelding().shouldBeEqualToIgnoringFields(nyInntektsmelding, Inntektsmelding::id) @@ -153,9 +160,10 @@ class LagreSelvbestemtImServiceTest : FunSpec({ ) } - testRapid.inspektør.size shouldBeExactly 2 + testRapid.inspektør.size shouldBeExactly 3 testRapid.message(0).lesBehov() shouldBe BehovType.VIRKSOMHET testRapid.message(1).lesBehov() shouldBe BehovType.HENT_PERSONER + testRapid.message(2).lesBehov() shouldBe BehovType.ARBEIDSFORHOLD mockStatic(OffsetDateTime::class) { every { OffsetDateTime.now() } returns endretInntektsmelding.mottatt @@ -165,8 +173,8 @@ class LagreSelvbestemtImServiceTest : FunSpec({ ) } - testRapid.inspektør.size shouldBeExactly 3 - testRapid.message(2).also { + testRapid.inspektør.size shouldBeExactly 4 + testRapid.message(3).also { it.lesBehov() shouldBe BehovType.LAGRE_SELVBESTEMT_IM it.lesInntektsmelding().shouldBeEqualToIgnoringFields(endretInntektsmelding, Inntektsmelding::id) } @@ -175,8 +183,8 @@ class LagreSelvbestemtImServiceTest : FunSpec({ MockLagre.steg2Data(transaksjonId, endretInntektsmelding) ) - testRapid.inspektør.size shouldBeExactly 4 - testRapid.message(3).also { + testRapid.inspektør.size shouldBeExactly 5 + testRapid.message(4).also { Key.EVENT_NAME.lesOrNull(EventName.serializer(), it.toMap()) shouldBe EventName.SELVBESTEMT_IM_LAGRET Key.UUID.lesOrNull(UuidSerializer, it.toMap()) shouldBe transaksjonId it.lesInntektsmelding().shouldBeEqualToIgnoringFields(endretInntektsmelding, Inntektsmelding::id) @@ -213,8 +221,8 @@ class LagreSelvbestemtImServiceTest : FunSpec({ ) } - testRapid.inspektør.size shouldBeExactly 3 - testRapid.message(2).also { + testRapid.inspektør.size shouldBeExactly 4 + testRapid.message(3).also { it.lesBehov() shouldBe BehovType.LAGRE_SELVBESTEMT_IM it.lesInntektsmelding().shouldBeEqualToIgnoringFields(duplikatInntektsmelding, Inntektsmelding::id) } @@ -226,10 +234,10 @@ class LagreSelvbestemtImServiceTest : FunSpec({ ) ) - testRapid.inspektør.size shouldBeExactly 3 + testRapid.inspektør.size shouldBeExactly 4 Key.EVENT_NAME.lesOrNull( EventName.serializer(), - testRapid.message(2).toMap() + testRapid.message(3).toMap() ) shouldNotBe EventName.SELVBESTEMT_IM_LAGRET verify { @@ -267,6 +275,9 @@ class LagreSelvbestemtImServiceTest : FunSpec({ MockLagre.startMelding(clientId, transaksjonId) ) } + testRapid.sendJson( + MockLagre.steg1Data(transaksjonId).minus(Key.VIRKSOMHET).minus(Key.PERSONER) + ) testRapid.sendJson( Fail( @@ -300,8 +311,8 @@ class LagreSelvbestemtImServiceTest : FunSpec({ ) } - testRapid.inspektør.size shouldBeExactly 3 - testRapid.message(2).also { + testRapid.inspektør.size shouldBeExactly 4 + testRapid.message(3).also { it.lesBehov() shouldBe BehovType.LAGRE_SELVBESTEMT_IM it.lesInntektsmelding().shouldBeEqualToIgnoringFields(inntektsmeldingMedDefaults, Inntektsmelding::id) } @@ -310,8 +321,8 @@ class LagreSelvbestemtImServiceTest : FunSpec({ MockLagre.steg2Data(transaksjonId, inntektsmeldingMedDefaults) ) - testRapid.inspektør.size shouldBeExactly 4 - testRapid.message(3).also { + testRapid.inspektør.size shouldBeExactly 5 + testRapid.message(4).also { Key.EVENT_NAME.lesOrNull(EventName.serializer(), it.toMap()) shouldBe EventName.SELVBESTEMT_IM_LAGRET Key.UUID.lesOrNull(UuidSerializer, it.toMap()) shouldBe transaksjonId it.lesInntektsmelding().shouldBeEqualToIgnoringFields(inntektsmeldingMedDefaults, Inntektsmelding::id) @@ -374,8 +385,8 @@ class LagreSelvbestemtImServiceTest : FunSpec({ ).tilMelding() ) - testRapid.inspektør.size shouldBeExactly 3 - testRapid.message(2).also { + testRapid.inspektør.size shouldBeExactly 4 + testRapid.message(3).also { it.lesBehov() shouldBe BehovType.LAGRE_SELVBESTEMT_IM it.lesInntektsmelding().shouldBeEqualToIgnoringFields(endretInntektsmelding, Inntektsmelding::id) } @@ -389,6 +400,40 @@ class LagreSelvbestemtImServiceTest : FunSpec({ ) } } + + test("stopp flyt ved ikke aktivt arbeidsforhold") { + val clientId = UUID.randomUUID() + val transaksjonId = UUID.randomUUID() + val inntektsmelding = MockLagre.inntektsmelding + + mockStatic(::randomUuid) { + every { randomUuid() } returns transaksjonId + + testRapid.sendJson( + MockLagre.startMelding(clientId, transaksjonId) + ) + } + + mockStatic(OffsetDateTime::class) { + every { OffsetDateTime.now() } returns inntektsmelding.mottatt + + testRapid.sendJson( + MockLagre.steg1Data(transaksjonId) + .plus(Key.ARBEIDSFORHOLD to MockLagre.lagArbeidsforhold("123456789").toJson(Arbeidsforhold.serializer())) + ) + } + + testRapid.inspektør.size shouldBeExactly 3 + + verify { + mockRedis.store.set( + RedisKey.of(clientId), + ResultJson( + failure = "Mangler arbeidsforhold i perioden".toJson() + ).toJsonStr() + ) + } + } }) private fun JsonElement.lesBehov(): BehovType? = @@ -494,7 +539,8 @@ private object MockLagre { Key.PERSONER to mapOf( sykmeldt.fnr to sykmeldt, avsender.fnr to avsender - ).toJson(personMapSerializer) + ).toJson(personMapSerializer), + Key.ARBEIDSFORHOLD to lagArbeidsforhold(orgnr = skjema.avsender.orgnr.verdi).toJson(Arbeidsforhold.serializer()) ) fun steg2Data(transaksjonId: UUID, inntektsmelding: Inntektsmelding): Map = @@ -513,4 +559,12 @@ private object MockLagre { Key.DATA to "".toJson(), Key.SAK_ID to "folkelig-lurendreier-sak-id".toJson() ) + + fun lagArbeidsforhold(orgnr: String) = listOf( + Arbeidsforhold( + arbeidsgiver = Arbeidsgiver("ORG", orgnr), + ansettelsesperiode = Ansettelsesperiode(PeriodeNullable(LocalDate.MIN, LocalDate.MAX)), + registrert = LocalDateTime.MIN + ) + ) } From 718d30333a4e7e23ecc03a62d5146a87f313035d Mon Sep 17 00:00:00 2001 From: Mikael Bjerga <6940327+bjerga@users.noreply.github.com> Date: Fri, 21 Jun 2024 09:48:28 +0200 Subject: [PATCH 4/7] Slett utdatert config (#573) --- config/aapenimservice/dev-gcp.yml | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 config/aapenimservice/dev-gcp.yml diff --git a/config/aapenimservice/dev-gcp.yml b/config/aapenimservice/dev-gcp.yml deleted file mode 100644 index 47b7d8d76..000000000 --- a/config/aapenimservice/dev-gcp.yml +++ /dev/null @@ -1,6 +0,0 @@ -kafkaPool: nav-dev -env: -- name: REDIS_URL - value: redis://helsearbeidsgiver-redis.helsearbeidsgiver.svc.cluster.local:6379/0 -apps: - - name: helsearbeidsgiver-redis From 30142d214c6876e4c0a7beb477a50ef133be60ce Mon Sep 17 00:00:00 2001 From: Mikael Bjerga <6940327+bjerga@users.noreply.github.com> Date: Mon, 24 Jun 2024 10:08:23 +0200 Subject: [PATCH 5/7] Bruk fnr-wrapper i personklasse (#563) --- .../no/nav/helsearbeidsgiver/felles/Person.kt | 11 ++--- .../felles/json/KotlinxUtils.kt | 10 ++++- .../helsearbeidsgiver/felles/PersonTest.kt | 11 ++--- .../inntektsmelding/pdl/HentPersonerRiver.kt | 23 +++++----- .../pdl/HentPersonerRiverTest.kt | 43 ++++++++----------- .../HentSelvbestemtImService.kt | 3 +- .../LagreSelvbestemtImService.kt | 34 +++++---------- .../LagreSelvbestemtImServiceTest.kt | 12 +++--- 8 files changed, 67 insertions(+), 80 deletions(-) diff --git a/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/Person.kt b/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/Person.kt index d676aa987..b330b46ed 100644 --- a/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/Person.kt +++ b/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/Person.kt @@ -5,6 +5,7 @@ package no.nav.helsearbeidsgiver.felles import kotlinx.serialization.Serializable import kotlinx.serialization.UseSerializers import no.nav.helsearbeidsgiver.utils.json.serializer.LocalDateSerializer +import no.nav.helsearbeidsgiver.utils.wrapper.Fnr import java.time.LocalDate import java.time.format.DateTimeFormatter @@ -12,15 +13,15 @@ private val fnrFoedselsdatoFormatter = DateTimeFormatter.ofPattern("ddMMyyyy") @Serializable data class Person( - val fnr: String, + val fnr: Fnr, val navn: String, val foedselsdato: LocalDate ) { companion object { // For info om fødselsdato i fnr, se https://lovdata.no/dokument/SF/forskrift/2017-07-14-1201/KAPITTEL_2#%C2%A72-2-1 - fun foedselsdato(fnr: String): LocalDate { - val foedtEtterAar39 = fnr[4].digitToInt() >= 4 - val individsifferUnder500 = fnr[6].digitToInt() < 5 + fun foedselsdato(fnr: Fnr): LocalDate { + val foedtEtterAar39 = fnr.verdi[4].digitToInt() >= 4 + val individsifferUnder500 = fnr.verdi[6].digitToInt() < 5 val aarhundre = if (foedtEtterAar39 || individsifferUnder500) { "19" @@ -28,7 +29,7 @@ data class Person( "20" } - val foedseldato = fnr.take(4) + aarhundre + fnr.slice(4..5) + val foedseldato = fnr.verdi.take(4) + aarhundre + fnr.verdi.slice(4..5) return LocalDate.parse(foedseldato, fnrFoedselsdatoFormatter) } diff --git a/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/json/KotlinxUtils.kt b/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/json/KotlinxUtils.kt index 5321442db..25d6efba8 100644 --- a/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/json/KotlinxUtils.kt +++ b/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/json/KotlinxUtils.kt @@ -14,10 +14,12 @@ import no.nav.helsearbeidsgiver.utils.json.fromJson import no.nav.helsearbeidsgiver.utils.json.fromJsonMapFiltered import no.nav.helsearbeidsgiver.utils.json.toJson import no.nav.helsearbeidsgiver.utils.json.toPretty +import no.nav.helsearbeidsgiver.utils.wrapper.Fnr +import no.nav.helsearbeidsgiver.utils.wrapper.Orgnr val personMapSerializer = MapSerializer( - String.serializer(), + Fnr.serializer(), Person.serializer() ) @@ -27,6 +29,12 @@ fun EventName.toJson(): JsonElement = fun BehovType.toJson(): JsonElement = toJson(BehovType.serializer()) +fun Fnr.toJson(): JsonElement = + toJson(Fnr.serializer()) + +fun Orgnr.toJson(): JsonElement = + toJson(Orgnr.serializer()) + @JvmName("toJsonMapKeyStringValueString") fun Map.toJson(): JsonElement = toJson( diff --git a/felles/src/test/kotlin/no/nav/helsearbeidsgiver/felles/PersonTest.kt b/felles/src/test/kotlin/no/nav/helsearbeidsgiver/felles/PersonTest.kt index 9e9ab1384..5aea6b3f2 100644 --- a/felles/src/test/kotlin/no/nav/helsearbeidsgiver/felles/PersonTest.kt +++ b/felles/src/test/kotlin/no/nav/helsearbeidsgiver/felles/PersonTest.kt @@ -8,17 +8,18 @@ import no.nav.helsearbeidsgiver.utils.test.date.april import no.nav.helsearbeidsgiver.utils.test.date.februar import no.nav.helsearbeidsgiver.utils.test.date.januar import no.nav.helsearbeidsgiver.utils.test.date.mars +import no.nav.helsearbeidsgiver.utils.wrapper.Fnr class PersonTest : FunSpec({ withData( nameFn = { (fnr, _) -> fnr }, listOf( - row("01015030000", 1.januar(1950)), - row("01025090000", 1.februar(1950)), - row("01033030000", 1.mars(1930)), - row("01041070000", 1.april(2010)) + row("01015030069", 1.januar(1950)), + row("01025090035", 1.februar(1950)), + row("01033030092", 1.mars(1930)), + row("01041070087", 1.april(2010)) ) ) { (fnr, forventetDato) -> - Person.foedselsdato(fnr) shouldBe forventetDato + Person.foedselsdato(Fnr(fnr)) shouldBe forventetDato } }) diff --git a/pdl/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/pdl/HentPersonerRiver.kt b/pdl/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/pdl/HentPersonerRiver.kt index 5030ee334..f9ed7bdac 100644 --- a/pdl/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/pdl/HentPersonerRiver.kt +++ b/pdl/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/pdl/HentPersonerRiver.kt @@ -1,7 +1,5 @@ package no.nav.helsearbeidsgiver.inntektsmelding.pdl -import kotlinx.serialization.builtins.MapSerializer -import kotlinx.serialization.builtins.serializer import kotlinx.serialization.json.JsonElement import no.nav.helsearbeidsgiver.felles.BehovType import no.nav.helsearbeidsgiver.felles.EventName @@ -9,6 +7,7 @@ import no.nav.helsearbeidsgiver.felles.Key import no.nav.helsearbeidsgiver.felles.Person import no.nav.helsearbeidsgiver.felles.json.krev import no.nav.helsearbeidsgiver.felles.json.les +import no.nav.helsearbeidsgiver.felles.json.personMapSerializer import no.nav.helsearbeidsgiver.felles.json.toJson import no.nav.helsearbeidsgiver.felles.loeser.ObjectRiver import no.nav.helsearbeidsgiver.felles.metrics.Metrics @@ -23,13 +22,14 @@ import no.nav.helsearbeidsgiver.utils.json.serializer.list import no.nav.helsearbeidsgiver.utils.json.toJson import no.nav.helsearbeidsgiver.utils.log.logger import no.nav.helsearbeidsgiver.utils.log.sikkerLogger +import no.nav.helsearbeidsgiver.utils.wrapper.Fnr import java.util.UUID data class Melding( val eventName: EventName, val behovType: BehovType, val transaksjonId: UUID, - val fnrListe: List + val fnrListe: List ) class HentPersonerRiver( @@ -47,7 +47,7 @@ class HentPersonerRiver( eventName = Key.EVENT_NAME.les(EventName.serializer(), json), behovType = Key.BEHOV.krev(BehovType.HENT_PERSONER, BehovType.serializer(), json), transaksjonId = Key.UUID.les(UuidSerializer, json), - fnrListe = Key.FNR_LISTE.les(String.serializer().list(), json) + fnrListe = Key.FNR_LISTE.les(Fnr.serializer().list(), json) ) } @@ -70,12 +70,7 @@ class HentPersonerRiver( Key.FORESPOERSEL_ID to json[Key.FORESPOERSEL_ID], Key.SELVBESTEMT_ID to json[Key.SELVBESTEMT_ID], Key.DATA to "".toJson(), - Key.PERSONER to personer.toJson( - MapSerializer( - String.serializer(), - Person.serializer() - ) - ) + Key.PERSONER to personer.toJson(personMapSerializer) ) .mapValuesNotNull { it } } @@ -105,15 +100,17 @@ class HentPersonerRiver( Log.transaksjonId(transaksjonId) ) - private fun hentPersoner(fnrListe: List): List = + private fun hentPersoner(fnrListe: List): List = Metrics.pdlRequest.recordTime(pdlClient::personBolk) { - pdlClient.personBolk(fnrListe) + pdlClient.personBolk( + fnrListe.map(Fnr::verdi) + ) } .orEmpty() .mapNotNull { person -> person.ident?.let { fnr -> Person( - fnr = fnr, + fnr = Fnr(fnr), navn = person.navn.fulltNavn(), foedselsdato = person.foedselsdato ) diff --git a/pdl/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/pdl/HentPersonerRiverTest.kt b/pdl/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/pdl/HentPersonerRiverTest.kt index 0452aa2f8..1bac36643 100644 --- a/pdl/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/pdl/HentPersonerRiverTest.kt +++ b/pdl/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/pdl/HentPersonerRiverTest.kt @@ -10,8 +10,6 @@ import io.mockk.coVerify import io.mockk.coVerifySequence import io.mockk.mockk import io.prometheus.client.CollectorRegistry -import kotlinx.serialization.builtins.MapSerializer -import kotlinx.serialization.builtins.serializer import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonNull import no.nav.helse.rapids_rivers.testsupport.TestRapid @@ -19,6 +17,7 @@ import no.nav.helsearbeidsgiver.felles.BehovType import no.nav.helsearbeidsgiver.felles.EventName import no.nav.helsearbeidsgiver.felles.Key import no.nav.helsearbeidsgiver.felles.Person +import no.nav.helsearbeidsgiver.felles.json.personMapSerializer import no.nav.helsearbeidsgiver.felles.json.toJson import no.nav.helsearbeidsgiver.felles.json.toMap import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Fail @@ -48,7 +47,7 @@ class HentPersonerRiverTest : FunSpec({ } test("finner én person") { - val olaFnr = Fnr.genererGyldig().verdi + val olaFnr = Fnr.genererGyldig() val innkommendeMelding = Mock.innkommendeMelding(listOf(olaFnr)) @@ -72,13 +71,13 @@ class HentPersonerRiverTest : FunSpec({ ) coVerifySequence { - mockPdlClient.personBolk(listOf(olaFnr)) + mockPdlClient.personBolk(listOf(olaFnr.verdi)) } } test("finner flere personer") { - val olaFnr = Fnr.genererGyldig().verdi - val kariFnr = Fnr.genererGyldig(somDnr = true).verdi + val olaFnr = Fnr.genererGyldig() + val kariFnr = Fnr.genererGyldig(somDnr = true) val innkommendeMelding = Mock.innkommendeMelding(listOf(olaFnr, kariFnr)) @@ -112,13 +111,13 @@ class HentPersonerRiverTest : FunSpec({ ) coVerifySequence { - mockPdlClient.personBolk(listOf(olaFnr, kariFnr)) + mockPdlClient.personBolk(listOf(olaFnr.verdi, kariFnr.verdi)) } } test("returnerer kun personer som blir funnet") { - val olaFnr = Fnr.genererGyldig().verdi - val kariFnr = Fnr.genererGyldig().verdi + val olaFnr = Fnr.genererGyldig() + val kariFnr = Fnr.genererGyldig() val innkommendeMelding = Mock.innkommendeMelding(listOf(olaFnr, kariFnr)) @@ -142,13 +141,13 @@ class HentPersonerRiverTest : FunSpec({ ) coVerifySequence { - mockPdlClient.personBolk(listOf(olaFnr, kariFnr)) + mockPdlClient.personBolk(listOf(olaFnr.verdi, kariFnr.verdi)) } } test("sender med forespoerselId dersom det finnes i utløsende melding") { val forespoerselId = UUID.randomUUID() - val olaFnr = Fnr.genererGyldig().verdi + val olaFnr = Fnr.genererGyldig() val innkommendeMelding = Mock.innkommendeMelding(listOf(olaFnr)) @@ -178,7 +177,7 @@ class HentPersonerRiverTest : FunSpec({ test("sender med selvbestemtId dersom det finnes i utløsende melding") { val selvbestemtId = UUID.randomUUID() - val olaFnr = Fnr.genererGyldig().verdi + val olaFnr = Fnr.genererGyldig() val innkommendeMelding = Mock.innkommendeMelding(listOf(olaFnr)) @@ -209,7 +208,7 @@ class HentPersonerRiverTest : FunSpec({ test("håndterer ukjente feil") { val forespoerselId = UUID.randomUUID() val selvbestemtId = UUID.randomUUID() - val randomFnr = Fnr.genererGyldig().verdi + val randomFnr = Fnr.genererGyldig() val innkommendeMelding = Mock.innkommendeMelding(listOf(randomFnr)) @@ -236,7 +235,7 @@ class HentPersonerRiverTest : FunSpec({ .plus(Key.SELVBESTEMT_ID to selvbestemtId.toJson()) coVerifySequence { - mockPdlClient.personBolk(listOf(randomFnr)) + mockPdlClient.personBolk(listOf(randomFnr.verdi)) } } @@ -248,7 +247,7 @@ class HentPersonerRiverTest : FunSpec({ "melding med fail" to Pair(Key.FAIL, Mock.fail.toJson(Fail.serializer())) ) ) { uoensketKeyMedVerdi -> - val fnrListe = listOf(Fnr.genererGyldig().verdi) + val fnrListe = listOf(Fnr.genererGyldig()) testRapid.sendJson( Mock.innkommendeMelding(fnrListe).toMap() @@ -264,12 +263,6 @@ class HentPersonerRiverTest : FunSpec({ } }) -private val personMapSerializer = - MapSerializer( - String.serializer(), - Person.serializer() - ) - private object Mock { val fail = Fail( feilmelding = "They have a cave troll.", @@ -279,7 +272,7 @@ private object Mock { utloesendeMelding = JsonNull ) - fun innkommendeMelding(fnrListe: List): Melding = + fun innkommendeMelding(fnrListe: List): Melding = Melding( eventName = EventName.TRENGER_REQUESTED, behovType = BehovType.HENT_PERSONER, @@ -292,10 +285,10 @@ private object Mock { Key.EVENT_NAME to eventName.toJson(), Key.BEHOV to behovType.toJson(), Key.UUID to transaksjonId.toJson(), - Key.FNR_LISTE to fnrListe.toJson(String.serializer()) + Key.FNR_LISTE to fnrListe.toJson(Fnr.serializer()) ) - fun fullPerson(fornavn: String, ident: String): FullPerson = + fun fullPerson(fornavn: String, fnr: Fnr): FullPerson = FullPerson( navn = PersonNavn( fornavn = fornavn, @@ -303,6 +296,6 @@ private object Mock { etternavn = "Normann" ), foedselsdato = 13.juni(1956), - ident = ident + ident = fnr.verdi ) } diff --git a/selvbestemt-hent-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemthentimservice/HentSelvbestemtImService.kt b/selvbestemt-hent-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemthentimservice/HentSelvbestemtImService.kt index 2328f600c..5744b4e48 100644 --- a/selvbestemt-hent-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemthentimservice/HentSelvbestemtImService.kt +++ b/selvbestemt-hent-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemthentimservice/HentSelvbestemtImService.kt @@ -1,6 +1,5 @@ package no.nav.helsearbeidsgiver.inntektsmelding.selvbestemthentimservice -import kotlinx.serialization.builtins.serializer import kotlinx.serialization.json.JsonElement import no.nav.helse.rapids_rivers.RapidsConnection import no.nav.helsearbeidsgiver.felles.BehovType @@ -62,7 +61,7 @@ class HentSelvbestemtImService( } override fun onError(melding: Map, fail: Fail) { - val feilmeldingJson = fail.feilmelding.toJson(String.serializer()) + val feilmeldingJson = fail.feilmelding.toJson() val resultJson = ResultJson(failure = feilmeldingJson).toJson(ResultJson.serializer()) redisStore.set(RedisKey.of(fail.transaksjonId), resultJson) } diff --git a/selvbestemt-lagre-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImService.kt b/selvbestemt-lagre-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImService.kt index 26cdf036c..2ff333aef 100644 --- a/selvbestemt-lagre-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImService.kt +++ b/selvbestemt-lagre-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImService.kt @@ -38,7 +38,6 @@ import no.nav.helsearbeidsgiver.utils.log.MdcUtils import no.nav.helsearbeidsgiver.utils.log.logger import no.nav.helsearbeidsgiver.utils.log.sikkerLogger import no.nav.helsearbeidsgiver.utils.wrapper.Fnr -import no.nav.helsearbeidsgiver.utils.wrapper.Orgnr import java.time.OffsetDateTime import java.util.UUID @@ -94,7 +93,7 @@ class LagreSelvbestemtImService( Key.UUID to transaksjonId.toJson(), Key.SELVBESTEMT_ID to skjema.selvbestemtId?.toJson(), Key.BEHOV to BehovType.VIRKSOMHET.toJson(), - Key.ORGNRUNDERENHET to skjema.avsender.orgnr.toJson(Orgnr.serializer()) + Key.ORGNRUNDERENHET to skjema.avsender.orgnr.toJson() ) rapid.publishNotNull( @@ -155,18 +154,14 @@ class LagreSelvbestemtImService( val arbeidsforholdListe = Key.ARBEIDSFORHOLD.les(Arbeidsforhold.serializer().list(), melding) .filter { it.arbeidsgiver.organisasjonsnummer == skjema.avsender.orgnr.verdi } - val sykmeldt = skjema.sykmeldtFnr.let { - personer[it.verdi] ?: tomPerson(it.verdi) - } - val avsender = avsenderFnr.let { - personer[it.verdi] ?: tomPerson(it.verdi) - } + val sykmeldtNavn = personer[skjema.sykmeldtFnr]?.navn.orEmpty() + val avsenderNavn = personer[avsenderFnr]?.navn.orEmpty() val inntektsmelding = tilInntektsmelding( skjema = skjema, orgNavn = orgNavn, - sykmeldt = sykmeldt, - avsender = avsender + sykmeldtNavn = sykmeldtNavn, + avsenderNavn = avsenderNavn ) val sykeperioder = skjema.agp?.perioder.orEmpty() + skjema.sykmeldingsperioder @@ -252,7 +247,7 @@ class LagreSelvbestemtImService( BehovType.VIRKSOMHET -> Key.VIRKSOMHET to "Ukjent virksomhet".toJson() // Lesing av personer bruker allerede defaults, så trenger bare map-struktur her - BehovType.FULLT_NAVN -> Key.PERSONER to emptyMap().toJson() + BehovType.HENT_PERSONER -> Key.PERSONER to emptyMap().toJson(personMapSerializer) else -> null } @@ -282,8 +277,8 @@ class LagreSelvbestemtImService( fun tilInntektsmelding( skjema: SkjemaInntektsmeldingSelvbestemt, orgNavn: String, - sykmeldt: Person, - avsender: Person + sykmeldtNavn: String, + avsenderNavn: String ): Inntektsmelding { val aarsakInnsending = if (skjema.selvbestemtId == null) { @@ -298,13 +293,13 @@ fun tilInntektsmelding( id = skjema.selvbestemtId ?: UUID.randomUUID() ), sykmeldt = Sykmeldt( - fnr = sykmeldt.fnr.let(::Fnr), - navn = sykmeldt.navn + fnr = skjema.sykmeldtFnr, + navn = sykmeldtNavn ), avsender = Avsender( orgnr = skjema.avsender.orgnr, orgNavn = orgNavn, - navn = avsender.navn, + navn = avsenderNavn, tlf = skjema.avsender.tlf ), sykmeldingsperioder = skjema.sykmeldingsperioder, @@ -315,10 +310,3 @@ fun tilInntektsmelding( mottatt = OffsetDateTime.now() ) } - -private fun tomPerson(fnr: String): Person = - Person( - fnr = fnr, - navn = "", - foedselsdato = Person.foedselsdato(fnr) - ) diff --git a/selvbestemt-lagre-im-service/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImServiceTest.kt b/selvbestemt-lagre-im-service/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImServiceTest.kt index 5a73a879b..8f8d74739 100644 --- a/selvbestemt-lagre-im-service/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImServiceTest.kt +++ b/selvbestemt-lagre-im-service/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImServiceTest.kt @@ -304,7 +304,7 @@ class LagreSelvbestemtImServiceTest : FunSpec({ forespoerselId = null, utloesendeMelding = JsonObject( mapOf( - Key.BEHOV.toString() to BehovType.FULLT_NAVN.toJson() + Key.BEHOV.toString() to BehovType.HENT_PERSONER.toJson() ) ) ).tilMelding() @@ -444,14 +444,14 @@ private fun JsonElement.lesInntektsmelding(): Inntektsmelding = private object MockLagre { private const val ORG_NAVN = "Keiser Augustus' Ponniutleie" - private val sykmeldt = Fnr.genererGyldig().verdi.let { + private val sykmeldt = Fnr.genererGyldig().let { Person( fnr = it, navn = "Ponnius Pilatus", foedselsdato = Person.foedselsdato(it) ) } - private val avsender = Fnr.genererGyldig().verdi.let { + private val avsender = Fnr.genererGyldig().let { Person( fnr = it, navn = "King Kong Keiser", @@ -461,7 +461,7 @@ private object MockLagre { val skjema = SkjemaInntektsmeldingSelvbestemt( selvbestemtId = UUID.randomUUID(), - sykmeldtFnr = sykmeldt.fnr.let(::Fnr), + sykmeldtFnr = sykmeldt.fnr, avsender = SkjemaAvsender( orgnr = Orgnr.genererGyldig(), tlf = "43431234" @@ -517,8 +517,8 @@ private object MockLagre { val inntektsmelding = tilInntektsmelding( skjema = skjema, orgNavn = ORG_NAVN, - sykmeldt = sykmeldt, - avsender = avsender + sykmeldtNavn = sykmeldt.navn, + avsenderNavn = avsender.navn ) fun startMelding(clientId: UUID, transaksjonId: UUID): Map = From fc60e2def3e39d264ed64b75b5202161e1448658 Mon Sep 17 00:00:00 2001 From: Mikael Bjerga <6940327+bjerga@users.noreply.github.com> Date: Mon, 24 Jun 2024 10:13:15 +0200 Subject: [PATCH 6/7] Bruk enklere mocking i route-tester (#565) * Bruk enklere mocking i route-tester * Fiks integrasjonstest --- .../api/aktiveorgnr/AktiveOrgnrProducer.kt | 5 +- .../api/aktiveorgnr/AktiveOrgnrRoute.kt | 5 +- .../api/auth/Tilgangskontroll.kt | 13 +-- .../HentSelvbestemtImProducer.kt | 6 +- .../HentSelvbestemtImRoute.kt | 7 +- .../api/innsending/InnsendingProducer.kt | 6 +- .../api/innsending/InnsendingRoute.kt | 4 +- .../api/inntekt/InntektProducer.kt | 7 +- .../api/inntekt/InntektRoute.kt | 5 +- .../InntektSelvbestemtProducer.kt | 6 +- .../InntektSelvbestemtRoute.kt | 5 +- .../api/kvittering/KvitteringProducer.kt | 4 +- .../api/kvittering/KvitteringRoute.kt | 4 +- .../LagreSelvbestemtImProducer.kt | 6 +- .../LagreSelvbestemtImRoute.kt | 22 ++--- .../api/tilgang/TilgangProducer.kt | 21 ++--- .../api/trenger/TrengerProducer.kt | 6 +- .../api/trenger/TrengerRoute.kt | 5 +- .../inntektsmelding/api/AuthorizationTest.kt | 2 +- .../api/InnsendingProducerTest.kt | 49 +++++++---- .../aktiveorgnr/AktiveOrgnrProducerTest.kt | 36 ++++++++ .../HentSelvbestemtImProducerTest.kt | 8 +- .../HentSelvbestemtImRouteKtTest.kt | 86 ++++++------------- .../api/innsending/InnsendingRouteKtTest.kt | 64 ++++---------- .../api/inntekt/InntektProducerTest.kt | 13 +-- .../InntektSelvbestemtProducerTest.kt | 4 +- .../InntektSelvbestemtRouteKtTest.kt | 65 ++++---------- .../api/kvittering/KvitteringRouteKtTest.kt | 22 ++--- .../LagreSelvbestemtImProducerTest.kt | 8 +- .../api/trenger/TrengerProducerTest.kt | 3 +- .../api/trenger/TrengerRouteKtTest.kt | 54 ++++-------- .../inntektsmelding/api/utils/TestUtils.kt | 18 +--- .../integrasjonstest/TilgangskontrollIT.kt | 8 +- 33 files changed, 239 insertions(+), 338 deletions(-) create mode 100644 api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/aktiveorgnr/AktiveOrgnrProducerTest.kt diff --git a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/aktiveorgnr/AktiveOrgnrProducer.kt b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/aktiveorgnr/AktiveOrgnrProducer.kt index 2b1a37363..093346113 100644 --- a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/aktiveorgnr/AktiveOrgnrProducer.kt +++ b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/aktiveorgnr/AktiveOrgnrProducer.kt @@ -6,7 +6,6 @@ import no.nav.helsearbeidsgiver.felles.Key import no.nav.helsearbeidsgiver.felles.json.toJson import no.nav.helsearbeidsgiver.felles.rapidsrivers.publish import no.nav.helsearbeidsgiver.felles.utils.Log -import no.nav.helsearbeidsgiver.felles.utils.randomUuid import no.nav.helsearbeidsgiver.inntektsmelding.api.logger import no.nav.helsearbeidsgiver.inntektsmelding.api.sikkerLogger import no.nav.helsearbeidsgiver.utils.json.toJson @@ -20,8 +19,7 @@ class AktiveOrgnrProducer( init { logger.info("Starter ${AktiveOrgnrProducer::class.simpleName}...") } - fun publish(arbeidsgiverFnr: String, arbeidstagerFnr: String): UUID { - val clientId = randomUuid() + fun publish(clientId: UUID, arbeidsgiverFnr: String, arbeidstagerFnr: String) { MdcUtils.withLogFields( Log.klasse(this), Log.event(EventName.AKTIVE_ORGNR_REQUESTED), @@ -40,6 +38,5 @@ class AktiveOrgnrProducer( } } } - return clientId } } diff --git a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/aktiveorgnr/AktiveOrgnrRoute.kt b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/aktiveorgnr/AktiveOrgnrRoute.kt index 1c5fa5eb0..d7ed4aa6c 100644 --- a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/aktiveorgnr/AktiveOrgnrRoute.kt +++ b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/aktiveorgnr/AktiveOrgnrRoute.kt @@ -20,6 +20,7 @@ import no.nav.helsearbeidsgiver.inntektsmelding.api.sikkerLogger import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.respondInternalServerError import no.nav.helsearbeidsgiver.utils.json.fromJson import no.nav.helsearbeidsgiver.utils.json.toJson +import java.util.UUID fun Route.aktiveOrgnrRoute( connection: RapidsConnection, @@ -27,11 +28,13 @@ fun Route.aktiveOrgnrRoute( ) { val aktiveOrgnrProducer = AktiveOrgnrProducer(connection) post(Routes.AKTIVEORGNR) { + val clientId = UUID.randomUUID() + try { val request = call.receive() val arbeidsgiverFnr = call.request.lesFnrFraAuthToken() - val clientId = aktiveOrgnrProducer.publish(arbeidsgiverFnr = arbeidsgiverFnr, arbeidstagerFnr = request.identitetsnummer) + aktiveOrgnrProducer.publish(clientId, arbeidsgiverFnr = arbeidsgiverFnr, arbeidstagerFnr = request.identitetsnummer) val resultatJson = redis.hent(clientId).fromJson(ResultJson.serializer()) diff --git a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/auth/Tilgangskontroll.kt b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/auth/Tilgangskontroll.kt index cc748447d..310bff218 100644 --- a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/auth/Tilgangskontroll.kt +++ b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/auth/Tilgangskontroll.kt @@ -20,8 +20,8 @@ class Tilgangskontroll( request: ApplicationRequest, forespoerselId: UUID ) { - validerTilgang(request, forespoerselId.toString()) { fnr -> - tilgangProducer.publishForespoerselId(forespoerselId, fnr) + validerTilgang(request, forespoerselId.toString()) { clientId, fnr -> + tilgangProducer.publishForespoerselId(clientId, fnr, forespoerselId) } } @@ -29,23 +29,24 @@ class Tilgangskontroll( request: ApplicationRequest, orgnr: String ) { - validerTilgang(request, orgnr) { fnr -> - tilgangProducer.publishOrgnr(orgnr, fnr) + validerTilgang(request, orgnr) { clientId, fnr -> + tilgangProducer.publishOrgnr(clientId, fnr, orgnr) } } private fun validerTilgang( request: ApplicationRequest, cacheKeyPostfix: String, - publish: (String) -> UUID + publish: (UUID, String) -> Unit ) { + val clientId = UUID.randomUUID() val innloggerFnr = request.lesFnrFraAuthToken() val tilgang = runBlocking { cache.get("$innloggerFnr:$cacheKeyPostfix") { logger.info("Fant ikke tilgang i cache, ber om tilgangskontroll.") - val clientId = publish(innloggerFnr) + publish(clientId, innloggerFnr) val resultat = redisPoller.hent(clientId) .fromJson(TilgangResultat.serializer()) diff --git a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/hentselvbestemtim/HentSelvbestemtImProducer.kt b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/hentselvbestemtim/HentSelvbestemtImProducer.kt index 4236a832c..dbc8954d9 100644 --- a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/hentselvbestemtim/HentSelvbestemtImProducer.kt +++ b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/hentselvbestemtim/HentSelvbestemtImProducer.kt @@ -20,9 +20,7 @@ class HentSelvbestemtImProducer( logger.info("Starter ${HentSelvbestemtImProducer::class.simpleName}...") } - fun publish(selvbestemtId: UUID): UUID { - val transaksjonId = UUID.randomUUID() - + fun publish(transaksjonId: UUID, selvbestemtId: UUID) { MdcUtils.withLogFields( Log.event(EventName.SELVBESTEMT_IM_REQUESTED), Log.transaksjonId(transaksjonId), @@ -39,7 +37,5 @@ class HentSelvbestemtImProducer( sikkerLogger.info("Publiserte til kafka:\n${it.toPretty()}") } } - - return transaksjonId } } diff --git a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/hentselvbestemtim/HentSelvbestemtImRoute.kt b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/hentselvbestemtim/HentSelvbestemtImRoute.kt index 671e059ea..d39cde96d 100644 --- a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/hentselvbestemtim/HentSelvbestemtImRoute.kt +++ b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/hentselvbestemtim/HentSelvbestemtImRoute.kt @@ -35,6 +35,8 @@ fun Route.hentSelvbestemtImRoute( val producer = HentSelvbestemtImProducer(rapid) get(Routes.SELVBESTEMT_INNTEKTSMELDING_MED_ID) { + val transaksjonId = UUID.randomUUID() + val selvbestemtId = call.parameters["selvbestemtId"] ?.runCatching(UUID::fromString) ?.getOrNull() @@ -48,9 +50,10 @@ fun Route.hentSelvbestemtImRoute( } else { MdcUtils.withLogFields( Log.apiRoute(Routes.SELVBESTEMT_INNTEKTSMELDING_MED_ID), - Log.selvbestemtId(selvbestemtId) + Log.selvbestemtId(selvbestemtId), + Log.transaksjonId(transaksjonId) ) { - val transaksjonId = producer.publish(selvbestemtId) + producer.publish(transaksjonId, selvbestemtId) MdcUtils.withLogFields( Log.transaksjonId(transaksjonId) diff --git a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/innsending/InnsendingProducer.kt b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/innsending/InnsendingProducer.kt index 6f6297518..2700cef31 100644 --- a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/innsending/InnsendingProducer.kt +++ b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/innsending/InnsendingProducer.kt @@ -19,9 +19,7 @@ class InnsendingProducer( logger.info("Starter ${InnsendingProducer::class.simpleName}...") } - fun publish(forespoerselId: UUID, request: Innsending, arbeidsgiverFnr: String): UUID { - val clientId = UUID.randomUUID() - + fun publish(clientId: UUID, forespoerselId: UUID, request: Innsending, arbeidsgiverFnr: String) { rapid.publish( Key.EVENT_NAME to EventName.INSENDING_STARTED.toJson(), Key.CLIENT_ID to clientId.toJson(), @@ -35,7 +33,5 @@ class InnsendingProducer( logger.info("Publiserte til kafka forespørselId: $forespoerselId og clientId=$clientId") sikkerLogger.info("Publiserte til kafka forespørselId: $forespoerselId json=${it.toPretty()}") } - - return clientId } } diff --git a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/innsending/InnsendingRoute.kt b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/innsending/InnsendingRoute.kt index 68a097703..a04475cb9 100644 --- a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/innsending/InnsendingRoute.kt +++ b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/innsending/InnsendingRoute.kt @@ -45,6 +45,8 @@ fun Route.innsendingRoute( .register() post(Routes.INNSENDING + "/{forespoerselId}") { + val clientId = UUID.randomUUID() + val forespoerselId = call.parameters["forespoerselId"] ?.runCatching(UUID::fromString) ?.getOrNull() @@ -67,7 +69,7 @@ fun Route.innsendingRoute( request.validate() val innloggerFnr = call.request.lesFnrFraAuthToken() - val clientId = producer.publish(forespoerselId, request, innloggerFnr) + producer.publish(clientId, forespoerselId, request, innloggerFnr) logger.info("Publiserte til rapid med forespørselId: $forespoerselId og clientId=$clientId") val resultatJson = redisPoller.hent(clientId).fromJson(ResultJson.serializer()) diff --git a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntekt/InntektProducer.kt b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntekt/InntektProducer.kt index a3c671d67..99913e0cc 100644 --- a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntekt/InntektProducer.kt +++ b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntekt/InntektProducer.kt @@ -6,7 +6,6 @@ import no.nav.helsearbeidsgiver.felles.Key import no.nav.helsearbeidsgiver.felles.json.toJson import no.nav.helsearbeidsgiver.felles.rapidsrivers.publish import no.nav.helsearbeidsgiver.felles.utils.Log -import no.nav.helsearbeidsgiver.felles.utils.randomUuid import no.nav.helsearbeidsgiver.inntektsmelding.api.logger import no.nav.helsearbeidsgiver.inntektsmelding.api.sikkerLogger import no.nav.helsearbeidsgiver.utils.json.toJson @@ -21,9 +20,7 @@ class InntektProducer( logger.info("Starter ${InntektProducer::class.simpleName}...") } - fun publish(request: InntektRequest): UUID { - val clientId = randomUuid() - + fun publish(clientId: UUID, request: InntektRequest) { MdcUtils.withLogFields( Log.klasse(this), Log.event(EventName.INNTEKT_REQUESTED), @@ -43,7 +40,5 @@ class InntektProducer( } } } - - return clientId } } diff --git a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntekt/InntektRoute.kt b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntekt/InntektRoute.kt index e627c013a..e28e96e83 100644 --- a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntekt/InntektRoute.kt +++ b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntekt/InntektRoute.kt @@ -24,6 +24,7 @@ import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.respondForbidden import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.respondInternalServerError import no.nav.helsearbeidsgiver.utils.json.fromJson import no.nav.helsearbeidsgiver.utils.json.toJson +import java.util.UUID // TODO Mangler tester fun Route.inntektRoute( @@ -34,6 +35,8 @@ fun Route.inntektRoute( val inntektProducer = InntektProducer(rapid) post(Routes.INNTEKT) { + val clientId = UUID.randomUUID() + val request = call.receive() tilgangskontroll.validerTilgangTilForespoersel(call.request, request.forespoerselId) @@ -44,7 +47,7 @@ fun Route.inntektRoute( } try { - val clientId = inntektProducer.publish(request) + inntektProducer.publish(clientId, request) val resultatJson = redisPoller.hent(clientId).fromJson(ResultJson.serializer()) sikkerLogger.info("Fikk inntektresultat:\n$resultatJson") diff --git a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntektselvbestemt/InntektSelvbestemtProducer.kt b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntektselvbestemt/InntektSelvbestemtProducer.kt index b33bbed38..cc319103c 100644 --- a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntektselvbestemt/InntektSelvbestemtProducer.kt +++ b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntektselvbestemt/InntektSelvbestemtProducer.kt @@ -22,9 +22,7 @@ class InntektSelvbestemtProducer( logger.info("Starter ${InntektSelvbestemtProducer::class.simpleName}...") } - fun publish(request: InntektSelvbestemtRequest): UUID { - val transaksjonId = UUID.randomUUID() - + fun publish(transaksjonId: UUID, request: InntektSelvbestemtRequest) { MdcUtils.withLogFields( Log.klasse(this), Log.event(EventName.INNTEKT_SELVBESTEMT_REQUESTED), @@ -45,7 +43,5 @@ class InntektSelvbestemtProducer( } } } - - return transaksjonId } } diff --git a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntektselvbestemt/InntektSelvbestemtRoute.kt b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntektselvbestemt/InntektSelvbestemtRoute.kt index 9f4a68166..74594d2b9 100644 --- a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntektselvbestemt/InntektSelvbestemtRoute.kt +++ b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntektselvbestemt/InntektSelvbestemtRoute.kt @@ -24,6 +24,7 @@ import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.respondForbidden import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.respondInternalServerError import no.nav.helsearbeidsgiver.utils.json.fromJson import no.nav.helsearbeidsgiver.utils.json.toJson +import java.util.UUID fun Route.inntektSelvbestemtRoute( rapid: RapidsConnection, @@ -33,6 +34,8 @@ fun Route.inntektSelvbestemtRoute( val inntektSelvbestemtProducer = InntektSelvbestemtProducer(rapid) post(Routes.INNTEKT_SELVBESTEMT) { + val transaksjonId = UUID.randomUUID() + val request = call.receive() tilgangskontroll.validerTilgangTilOrg(call.request, request.orgnr.verdi) @@ -43,7 +46,7 @@ fun Route.inntektSelvbestemtRoute( } try { - val transaksjonId = inntektSelvbestemtProducer.publish(request) + inntektSelvbestemtProducer.publish(transaksjonId, request) val resultatJson = redisPoller.hent(transaksjonId).fromJson(ResultJson.serializer()) sikkerLogger.info("Fikk inntektsresultat for selvbestemt inntektsmelding:\n$resultatJson") diff --git a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/kvittering/KvitteringProducer.kt b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/kvittering/KvitteringProducer.kt index 812cf6571..d6f304d62 100644 --- a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/kvittering/KvitteringProducer.kt +++ b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/kvittering/KvitteringProducer.kt @@ -14,8 +14,7 @@ class KvitteringProducer( logger.info("Starter ${KvitteringProducer::class.simpleName}...") } - fun publish(foresporselId: UUID): UUID { - val clientId = UUID.randomUUID() + fun publish(clientId: UUID, foresporselId: UUID) { val packet: JsonMessage = JsonMessage.newMessage( mapOf( Key.EVENT_NAME.str to EventName.KVITTERING_REQUESTED.name, @@ -25,6 +24,5 @@ class KvitteringProducer( ) rapid.publish(packet.toJson()) logger.info("Publiserte kvittering requested, forespørselid=$foresporselId") - return clientId } } diff --git a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/kvittering/KvitteringRoute.kt b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/kvittering/KvitteringRoute.kt index 534eb30ac..cc67e684a 100644 --- a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/kvittering/KvitteringRoute.kt +++ b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/kvittering/KvitteringRoute.kt @@ -50,6 +50,8 @@ fun Route.kvitteringRoute( .register() get(Routes.KVITTERING) { + val clientId = UUID.randomUUID() + val forespoerselId = call.parameters["uuid"] ?.let(::fjernLedendeSlash) ?.runCatching(UUID::fromString) @@ -71,7 +73,7 @@ fun Route.kvitteringRoute( logger.info("Authorize took $it") } - val clientId = kvitteringProducer.publish(forespoerselId) + kvitteringProducer.publish(clientId, forespoerselId) val resultatJson = redisPoller.hent(clientId).fromJson(ResultJson.serializer()) sikkerLogger.info("Resultat for henting av kvittering for $forespoerselId: $resultatJson") diff --git a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImProducer.kt b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImProducer.kt index 418fde051..53ab97cd9 100644 --- a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImProducer.kt +++ b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImProducer.kt @@ -21,9 +21,7 @@ class LagreSelvbestemtImProducer( logger.info("Starter ${LagreSelvbestemtImProducer::class.simpleName}...") } - fun publish(skjema: SkjemaInntektsmeldingSelvbestemt, avsenderFnr: String): UUID { - val clientId = UUID.randomUUID() - + fun publish(clientId: UUID, skjema: SkjemaInntektsmeldingSelvbestemt, avsenderFnr: String) { MdcUtils.withLogFields( Log.event(EventName.SELVBESTEMT_IM_MOTTATT), Log.clientId(clientId) @@ -39,7 +37,5 @@ class LagreSelvbestemtImProducer( sikkerLogger.info("Publiserte til kafka:\n${it.toPretty()}") } } - - return clientId } } diff --git a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImRoute.kt b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImRoute.kt index 8e7b11cc7..e2a6d285c 100644 --- a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImRoute.kt +++ b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImRoute.kt @@ -35,6 +35,7 @@ import no.nav.helsearbeidsgiver.utils.json.serializer.UuidSerializer import no.nav.helsearbeidsgiver.utils.json.toPretty import no.nav.helsearbeidsgiver.utils.log.MdcUtils import no.nav.helsearbeidsgiver.utils.pipe.orDefault +import java.util.UUID // TODO test fun Route.lagreSelvbestemtImRoute( @@ -45,8 +46,11 @@ fun Route.lagreSelvbestemtImRoute( val producer = LagreSelvbestemtImProducer(rapid) post(Routes.SELVBESTEMT_INNTEKTSMELDING) { + val clientId = UUID.randomUUID() + MdcUtils.withLogFields( - Log.apiRoute(Routes.SELVBESTEMT_INNTEKTSMELDING) + Log.apiRoute(Routes.SELVBESTEMT_INNTEKTSMELDING), + Log.clientId(clientId) ) { val skjema = lesRequestOrNull() when { @@ -72,18 +76,14 @@ fun Route.lagreSelvbestemtImRoute( val avsenderFnr = call.request.lesFnrFraAuthToken() - val clientId = producer.publish(skjema, avsenderFnr) + producer.publish(clientId, skjema, avsenderFnr) - MdcUtils.withLogFields( - Log.clientId(clientId) - ) { - runCatching { - redisPoller.hent(clientId) - } - .let { - sendResponse(it) - } + runCatching { + redisPoller.hent(clientId) } + .let { + sendResponse(it) + } } } } diff --git a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/tilgang/TilgangProducer.kt b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/tilgang/TilgangProducer.kt index 860ae5ee0..c8c6f9520 100644 --- a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/tilgang/TilgangProducer.kt +++ b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/tilgang/TilgangProducer.kt @@ -7,7 +7,6 @@ import no.nav.helsearbeidsgiver.felles.Key import no.nav.helsearbeidsgiver.felles.json.toJson import no.nav.helsearbeidsgiver.felles.rapidsrivers.publish import no.nav.helsearbeidsgiver.felles.utils.Log -import no.nav.helsearbeidsgiver.felles.utils.randomUuid import no.nav.helsearbeidsgiver.inntektsmelding.api.logger import no.nav.helsearbeidsgiver.inntektsmelding.api.sikkerLogger import no.nav.helsearbeidsgiver.utils.json.toJson @@ -22,23 +21,23 @@ class TilgangProducer( logger.info("Starter ${TilgangProducer::class.simpleName}...") } - fun publishForespoerselId(forespoerselId: UUID, fnr: String): UUID = + fun publishForespoerselId(clientId: UUID, fnr: String, forespoerselId: UUID) = publish( EventName.TILGANG_FORESPOERSEL_REQUESTED, - Key.FORESPOERSEL_ID to forespoerselId.toJson(), - Key.FNR to fnr.toJson() + clientId, + Key.FNR to fnr.toJson(), + Key.FORESPOERSEL_ID to forespoerselId.toJson() ) - fun publishOrgnr(orgnr: String, fnr: String): UUID = + fun publishOrgnr(clientId: UUID, fnr: String, orgnr: String) = publish( EventName.TILGANG_ORG_REQUESTED, - Key.ORGNRUNDERENHET to orgnr.toJson(), - Key.FNR to fnr.toJson() + clientId, + Key.FNR to fnr.toJson(), + Key.ORGNRUNDERENHET to orgnr.toJson() ) - private fun publish(eventName: EventName, vararg messageFields: Pair): UUID { - val clientId = randomUuid() - + private fun publish(eventName: EventName, clientId: UUID, vararg messageFields: Pair) { MdcUtils.withLogFields( Log.klasse(this), Log.event(eventName), @@ -56,7 +55,5 @@ class TilgangProducer( } } } - - return clientId } } diff --git a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/trenger/TrengerProducer.kt b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/trenger/TrengerProducer.kt index 85ad1aacf..e4eaf20e3 100644 --- a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/trenger/TrengerProducer.kt +++ b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/trenger/TrengerProducer.kt @@ -17,9 +17,7 @@ class TrengerProducer( logger.info("Starter ${TrengerProducer::class.simpleName}...") } - fun publish(request: HentForespoerselRequest, arbeidsgiverFnr: String): UUID { - val transaksjonId = UUID.randomUUID() - + fun publish(transaksjonId: UUID, request: HentForespoerselRequest, arbeidsgiverFnr: String) { rapid.publish( Key.EVENT_NAME to EventName.TRENGER_REQUESTED.toJson(EventName.serializer()), Key.UUID to transaksjonId.toString().toJson(), @@ -31,7 +29,5 @@ class TrengerProducer( logger.info("Publiserte trenger behov med transaksjonId=$transaksjonId") sikkerLogger.info("Publiserte trenger behov med transaksjonId=$transaksjonId json=${it.toPretty()}") } - - return transaksjonId } } diff --git a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/trenger/TrengerRoute.kt b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/trenger/TrengerRoute.kt index 990700ff5..bc1bbb19f 100644 --- a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/trenger/TrengerRoute.kt +++ b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/trenger/TrengerRoute.kt @@ -29,6 +29,7 @@ import no.nav.helsearbeidsgiver.inntektsmelding.api.validation.ValidationError import no.nav.helsearbeidsgiver.inntektsmelding.api.validation.ValidationResponse import no.nav.helsearbeidsgiver.utils.json.fromJson import no.nav.helsearbeidsgiver.utils.json.toJson +import java.util.UUID fun Route.trengerRoute( rapid: RapidsConnection, @@ -42,6 +43,8 @@ fun Route.trengerRoute( .register() post(Routes.TRENGER) { + val transaksjonId = UUID.randomUUID() + val requestTimer = requestLatency.startTimer() runCatching { receive(HentForespoerselRequest.serializer()) @@ -53,7 +56,7 @@ fun Route.trengerRoute( val arbeidsgiverFnr = call.request.lesFnrFraAuthToken() - val transaksjonId = trengerProducer.publish(request, arbeidsgiverFnr) + trengerProducer.publish(transaksjonId, request, arbeidsgiverFnr) val resultatJson = redisPoller.hent(transaksjonId).fromJson(ResultJson.serializer()) diff --git a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/AuthorizationTest.kt b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/AuthorizationTest.kt index bfacee53c..43c6af355 100644 --- a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/AuthorizationTest.kt +++ b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/AuthorizationTest.kt @@ -64,7 +64,7 @@ class AuthorizationTest : ApiTest() { } } - val testClient = TestClient(this, mockk()) { mockAuthToken() } + val testClient = TestClient(this, ::mockAuthToken) val response = testClient.get(path) diff --git a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/InnsendingProducerTest.kt b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/InnsendingProducerTest.kt index 1cdad25a7..f2548b775 100644 --- a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/InnsendingProducerTest.kt +++ b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/InnsendingProducerTest.kt @@ -1,23 +1,42 @@ package no.nav.helsearbeidsgiver.inntektsmelding.api -import io.mockk.every -import io.mockk.mockk -import no.nav.helse.rapids_rivers.RapidsConnection +import io.kotest.core.spec.style.FunSpec +import io.kotest.matchers.ints.shouldBeExactly +import io.kotest.matchers.maps.shouldContainExactly +import no.nav.helse.rapids_rivers.testsupport.TestRapid +import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Innsending +import no.nav.helsearbeidsgiver.felles.EventName +import no.nav.helsearbeidsgiver.felles.Key +import no.nav.helsearbeidsgiver.felles.json.toJson +import no.nav.helsearbeidsgiver.felles.json.toMap import no.nav.helsearbeidsgiver.felles.test.mock.GYLDIG_INNSENDING_REQUEST +import no.nav.helsearbeidsgiver.felles.test.rapidsrivers.firstMessage import no.nav.helsearbeidsgiver.inntektsmelding.api.innsending.InnsendingProducer -import org.junit.jupiter.api.Assertions.assertNotNull -import org.junit.jupiter.api.Test +import no.nav.helsearbeidsgiver.utils.json.toJson +import no.nav.helsearbeidsgiver.utils.test.wrapper.genererGyldig +import no.nav.helsearbeidsgiver.utils.wrapper.Fnr import java.util.UUID -class InnsendingProducerTest { +class InnsendingProducerTest : FunSpec({ + val testRapid = TestRapid() + val producer = InnsendingProducer(testRapid) - @Test - fun skal_returnere_uuid() { - val rapidsConnection = mockk() - val producer = InnsendingProducer(rapidsConnection) - every { - rapidsConnection.publish(any()) - } returns Unit - assertNotNull(producer.publish(UUID.randomUUID(), GYLDIG_INNSENDING_REQUEST, "gyldig-fnr")) + test("publiserer melding på forventet format") { + val clientId = UUID.randomUUID() + val forespoerselId = UUID.randomUUID() + val avsenderFnr = Fnr.genererGyldig().verdi + + producer.publish(clientId, forespoerselId, GYLDIG_INNSENDING_REQUEST, avsenderFnr) + + testRapid.inspektør.size shouldBeExactly 1 + testRapid.firstMessage().toMap() shouldContainExactly mapOf( + Key.EVENT_NAME to EventName.INSENDING_STARTED.toJson(), + Key.CLIENT_ID to clientId.toJson(), + Key.FORESPOERSEL_ID to forespoerselId.toJson(), + Key.ORGNRUNDERENHET to GYLDIG_INNSENDING_REQUEST.orgnrUnderenhet.toJson(), + Key.IDENTITETSNUMMER to GYLDIG_INNSENDING_REQUEST.identitetsnummer.toJson(), + Key.ARBEIDSGIVER_ID to avsenderFnr.toJson(), + Key.SKJEMA_INNTEKTSMELDING to GYLDIG_INNSENDING_REQUEST.toJson(Innsending.serializer()) + ) } -} +}) diff --git a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/aktiveorgnr/AktiveOrgnrProducerTest.kt b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/aktiveorgnr/AktiveOrgnrProducerTest.kt new file mode 100644 index 000000000..fdd6ffe8d --- /dev/null +++ b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/aktiveorgnr/AktiveOrgnrProducerTest.kt @@ -0,0 +1,36 @@ +package no.nav.helsearbeidsgiver.inntektsmelding.api.aktiveorgnr + +import io.kotest.core.spec.style.FunSpec +import io.kotest.matchers.ints.shouldBeExactly +import io.kotest.matchers.maps.shouldContainExactly +import no.nav.helse.rapids_rivers.testsupport.TestRapid +import no.nav.helsearbeidsgiver.felles.EventName +import no.nav.helsearbeidsgiver.felles.Key +import no.nav.helsearbeidsgiver.felles.json.toJson +import no.nav.helsearbeidsgiver.felles.json.toMap +import no.nav.helsearbeidsgiver.felles.test.rapidsrivers.firstMessage +import no.nav.helsearbeidsgiver.utils.json.toJson +import no.nav.helsearbeidsgiver.utils.test.wrapper.genererGyldig +import no.nav.helsearbeidsgiver.utils.wrapper.Fnr +import java.util.UUID + +class AktiveOrgnrProducerTest : FunSpec({ + val testRapid = TestRapid() + val producer = AktiveOrgnrProducer(testRapid) + + test("publiserer melding på forventet format") { + val clientId = UUID.randomUUID() + val arbeidsgiverFnr = Fnr.genererGyldig().verdi + val arbeidstagerFnr = Fnr.genererGyldig().verdi + + producer.publish(clientId, arbeidsgiverFnr, arbeidstagerFnr) + + testRapid.inspektør.size shouldBeExactly 1 + testRapid.firstMessage().toMap() shouldContainExactly mapOf( + Key.EVENT_NAME to EventName.AKTIVE_ORGNR_REQUESTED.toJson(), + Key.CLIENT_ID to clientId.toJson(), + Key.ARBEIDSGIVER_FNR to arbeidsgiverFnr.toJson(), + Key.FNR to arbeidstagerFnr.toJson() + ) + } +}) diff --git a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/hentselvbestemtim/HentSelvbestemtImProducerTest.kt b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/hentselvbestemtim/HentSelvbestemtImProducerTest.kt index f6230b254..05fcdb9af 100644 --- a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/hentselvbestemtim/HentSelvbestemtImProducerTest.kt +++ b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/hentselvbestemtim/HentSelvbestemtImProducerTest.kt @@ -3,7 +3,6 @@ package no.nav.helsearbeidsgiver.inntektsmelding.api.hentselvbestemtim import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.ints.shouldBeExactly import io.kotest.matchers.maps.shouldContainExactly -import io.mockk.every import no.nav.helse.rapids_rivers.testsupport.TestRapid import no.nav.helsearbeidsgiver.felles.EventName import no.nav.helsearbeidsgiver.felles.Key @@ -11,7 +10,6 @@ import no.nav.helsearbeidsgiver.felles.json.toJson import no.nav.helsearbeidsgiver.felles.json.toMap import no.nav.helsearbeidsgiver.felles.test.rapidsrivers.firstMessage import no.nav.helsearbeidsgiver.utils.json.toJson -import no.nav.helsearbeidsgiver.utils.test.mock.mockStatic import java.util.UUID class HentSelvbestemtImProducerTest : FunSpec({ @@ -23,11 +21,7 @@ class HentSelvbestemtImProducerTest : FunSpec({ val transaksjonId = UUID.randomUUID() val selvbestemtId = UUID.randomUUID() - mockStatic(UUID::randomUUID) { - every { UUID.randomUUID() } returns transaksjonId - - producer.publish(selvbestemtId) - } + producer.publish(transaksjonId, selvbestemtId) testRapid.inspektør.size shouldBeExactly 1 testRapid.firstMessage().toMap() shouldContainExactly mapOf( diff --git a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/hentselvbestemtim/HentSelvbestemtImRouteKtTest.kt b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/hentselvbestemtim/HentSelvbestemtImRouteKtTest.kt index 1b2893f12..f56e9950a 100644 --- a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/hentselvbestemtim/HentSelvbestemtImRouteKtTest.kt +++ b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/hentselvbestemtim/HentSelvbestemtImRouteKtTest.kt @@ -6,7 +6,6 @@ import io.ktor.client.statement.bodyAsText import io.ktor.http.HttpStatusCode import io.mockk.clearAllMocks import io.mockk.coEvery -import io.mockk.every import kotlinx.serialization.builtins.serializer import kotlinx.serialization.json.JsonElement import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Arbeidsgiverperiode @@ -33,18 +32,18 @@ import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Sykmeldt import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Tariffendring import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.VarigLoennsendring import no.nav.helsearbeidsgiver.felles.ResultJson -import no.nav.helsearbeidsgiver.felles.Tilgang import no.nav.helsearbeidsgiver.felles.test.mock.mockInntektsmeldingV1 import no.nav.helsearbeidsgiver.inntektsmelding.api.RedisPollerTimeoutException import no.nav.helsearbeidsgiver.inntektsmelding.api.Routes import no.nav.helsearbeidsgiver.inntektsmelding.api.response.RedisPermanentErrorResponse import no.nav.helsearbeidsgiver.inntektsmelding.api.response.RedisTimeoutResponse import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.ApiTest +import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.harTilgangResultat import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.hardcodedJson +import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.ikkeTilgangResultat import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.jsonStrOrNull import no.nav.helsearbeidsgiver.utils.json.toJson import no.nav.helsearbeidsgiver.utils.test.json.removeJsonWhitespace -import no.nav.helsearbeidsgiver.utils.test.mock.mockConstructor import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import java.util.UUID @@ -66,18 +65,14 @@ class HentSelvbestemtImRouteKtTest : ApiTest() { @Test fun `gi OK med inntektsmelding`() = testApi { - val mockTransaksjonId = UUID.randomUUID() val expectedInntektsmelding = mockInntektsmeldingV1() - mockTilgang(Tilgang.HAR_TILGANG) + coEvery { mockRedisPoller.hent(any()) } returnsMany listOf( + Mock.successResult(expectedInntektsmelding), + harTilgangResultat + ) - coEvery { mockRedisPoller.hent(mockTransaksjonId) } returns Mock.successResult(expectedInntektsmelding) - - val response = mockConstructor(HentSelvbestemtImProducer::class) { - every { anyConstructed().publish(any()) } returns mockTransaksjonId - - get(pathMedId) - } + val response = get(pathMedId) val actualJson = response.bodyAsText() @@ -87,17 +82,12 @@ class HentSelvbestemtImRouteKtTest : ApiTest() { @Test fun `manglende tilgang gir 500-feil`() = testApi { - val mockTransaksjonId = UUID.randomUUID() - - mockTilgang(Tilgang.IKKE_TILGANG) - - coEvery { mockRedisPoller.hent(mockTransaksjonId) } returns Mock.successResult(mockInntektsmeldingV1()) + coEvery { mockRedisPoller.hent(any()) } returnsMany listOf( + Mock.successResult(mockInntektsmeldingV1()), + ikkeTilgangResultat + ) - val response = mockConstructor(HentSelvbestemtImProducer::class) { - every { anyConstructed().publish(any()) } returns mockTransaksjonId - - get(pathMedId) - } + val response = get(pathMedId) val actualJson = response.bodyAsText() @@ -107,18 +97,14 @@ class HentSelvbestemtImRouteKtTest : ApiTest() { @Test fun `feilresultat gir 500-feil`() = testApi { - val mockTransaksjonId = UUID.randomUUID() val expectedFeilmelding = "Du får vente til freddan'!" - mockTilgang(Tilgang.HAR_TILGANG) - - coEvery { mockRedisPoller.hent(mockTransaksjonId) } returns Mock.failureResult(expectedFeilmelding) - - val response = mockConstructor(HentSelvbestemtImProducer::class) { - every { anyConstructed().publish(any()) } returns mockTransaksjonId + coEvery { mockRedisPoller.hent(any()) } returnsMany listOf( + Mock.failureResult(expectedFeilmelding), + harTilgangResultat + ) - get(pathMedId) - } + val response = get(pathMedId) val actualJson = response.bodyAsText() @@ -128,18 +114,14 @@ class HentSelvbestemtImRouteKtTest : ApiTest() { @Test fun `tomt resultat gir 500-feil`() = testApi { - val mockTransaksjonId = UUID.randomUUID() val expectedFeilmelding = "Ukjent feil." - mockTilgang(Tilgang.HAR_TILGANG) - - coEvery { mockRedisPoller.hent(mockTransaksjonId) } returns Mock.emptyResult() + coEvery { mockRedisPoller.hent(any()) } returnsMany listOf( + Mock.emptyResult(), + harTilgangResultat + ) - val response = mockConstructor(HentSelvbestemtImProducer::class) { - every { anyConstructed().publish(any()) } returns mockTransaksjonId - - get(pathMedId) - } + val response = get(pathMedId) val actualJson = response.bodyAsText() @@ -149,17 +131,12 @@ class HentSelvbestemtImRouteKtTest : ApiTest() { @Test fun `timeout mot redis gir 500-feil`() = testApi { - val mockTransaksjonId = UUID.randomUUID() val selvbestemtId = UUID.randomUUID() val expectedFeilobjekt = RedisTimeoutResponse(inntektsmeldingTypeId = selvbestemtId).toJson(RedisTimeoutResponse.serializer()) - coEvery { mockRedisPoller.hent(mockTransaksjonId) } throws RedisPollerTimeoutException(UUID.randomUUID()) + coEvery { mockRedisPoller.hent(any()) } throws RedisPollerTimeoutException(UUID.randomUUID()) - val response = mockConstructor(HentSelvbestemtImProducer::class) { - every { anyConstructed().publish(any()) } returns mockTransaksjonId - - get("$pathUtenId$selvbestemtId") - } + val response = get("$pathUtenId$selvbestemtId") val actualJson = response.bodyAsText() @@ -169,17 +146,12 @@ class HentSelvbestemtImRouteKtTest : ApiTest() { @Test fun `ukjent feil mot redis gir 500-feil`() = testApi { - val mockTransaksjonId = UUID.randomUUID() val selvbestemtId = UUID.randomUUID() val expectedFeilobjekt = RedisPermanentErrorResponse(selvbestemtId).toJson(RedisPermanentErrorResponse.serializer()) - coEvery { mockRedisPoller.hent(mockTransaksjonId) } throws IllegalStateException() - - val response = mockConstructor(HentSelvbestemtImProducer::class) { - every { anyConstructed().publish(any()) } returns mockTransaksjonId + coEvery { mockRedisPoller.hent(any()) } throws IllegalStateException() - get("$pathUtenId$selvbestemtId") - } + val response = get("$pathUtenId$selvbestemtId") val actualJson = response.bodyAsText() @@ -189,11 +161,9 @@ class HentSelvbestemtImRouteKtTest : ApiTest() { @Test fun `ukjent feil gir 500-feil`() = testApi { - val response = mockConstructor(HentSelvbestemtImProducer::class) { - every { anyConstructed().publish(any()) } throws NullPointerException() + coEvery { mockRedisPoller.hent(any()) } returns Mock.successResult(mockInntektsmeldingV1()) andThenThrows NullPointerException() - get(pathMedId) - } + val response = get(pathMedId) val actualJson = response.bodyAsText() diff --git a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/innsending/InnsendingRouteKtTest.kt b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/innsending/InnsendingRouteKtTest.kt index 87dfceabf..7d15445fa 100644 --- a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/innsending/InnsendingRouteKtTest.kt +++ b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/innsending/InnsendingRouteKtTest.kt @@ -6,11 +6,9 @@ import io.ktor.client.statement.bodyAsText import io.ktor.http.HttpStatusCode import io.mockk.clearAllMocks import io.mockk.coEvery -import io.mockk.every import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Innsending import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntektsmelding import no.nav.helsearbeidsgiver.felles.ResultJson -import no.nav.helsearbeidsgiver.felles.Tilgang import no.nav.helsearbeidsgiver.felles.test.mock.DELVIS_INNSENDING_REQUEST import no.nav.helsearbeidsgiver.felles.test.mock.GYLDIG_INNSENDING_REQUEST import no.nav.helsearbeidsgiver.felles.test.mock.mockDelvisInntektsmeldingDokument @@ -20,10 +18,10 @@ import no.nav.helsearbeidsgiver.inntektsmelding.api.Routes import no.nav.helsearbeidsgiver.inntektsmelding.api.response.JsonErrorResponse import no.nav.helsearbeidsgiver.inntektsmelding.api.response.RedisTimeoutResponse import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.ApiTest +import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.harTilgangResultat import no.nav.helsearbeidsgiver.utils.json.fromJson import no.nav.helsearbeidsgiver.utils.json.toJson import no.nav.helsearbeidsgiver.utils.json.toJsonStr -import no.nav.helsearbeidsgiver.utils.test.mock.mockConstructor import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -42,23 +40,14 @@ class InnsendingRouteKtTest : ApiTest() { @Test fun `mottar inntektsmelding og svarer OK`() = testApi { - mockTilgang(Tilgang.HAR_TILGANG) + coEvery { mockRedisPoller.hent(any()) } returnsMany listOf( + harTilgangResultat, + ResultJson( + success = mockInntektsmelding().toJson(Inntektsmelding.serializer()) + ).toJson(ResultJson.serializer()) + ) - val mockClientId = UUID.randomUUID() - - coEvery { - mockRedisPoller.hent(mockClientId) - } returns ResultJson( - success = mockInntektsmelding().toJson(Inntektsmelding.serializer()) - ).toJson(ResultJson.serializer()) - - val response = mockConstructor(InnsendingProducer::class) { - every { - anyConstructed().publish(any(), any(), any()) - } returns mockClientId - - post(path, GYLDIG_REQUEST) - } + val response = post(path, GYLDIG_REQUEST) assertEquals(HttpStatusCode.Created, response.status) assertEquals(InnsendingResponse(Mock.forespoerselId).toJsonStr(InnsendingResponse.serializer()), response.bodyAsText()) @@ -66,23 +55,14 @@ class InnsendingRouteKtTest : ApiTest() { @Test fun `mottar delvis inntektsmelding og svarer OK`() = testApi { - mockTilgang(Tilgang.HAR_TILGANG) - - val mockClientId = UUID.randomUUID() - - coEvery { - mockRedisPoller.hent(mockClientId) - } returns ResultJson( - success = mockDelvisInntektsmeldingDokument().toJson(Inntektsmelding.serializer()) - ).toJson(ResultJson.serializer()) + coEvery { mockRedisPoller.hent(any()) } returnsMany listOf( + harTilgangResultat, + ResultJson( + success = mockDelvisInntektsmeldingDokument().toJson(Inntektsmelding.serializer()) + ).toJson(ResultJson.serializer()) + ) - val response = mockConstructor(InnsendingProducer::class) { - every { - anyConstructed().publish(any(), any(), any()) - } returns mockClientId - - post(path, GYLDIG_DELVIS_REQUEST) - } + val response = post(path, GYLDIG_DELVIS_REQUEST) assertEquals(HttpStatusCode.Created, response.status) assertEquals(InnsendingResponse(Mock.forespoerselId).toJsonStr(InnsendingResponse.serializer()), response.bodyAsText()) @@ -101,19 +81,9 @@ class InnsendingRouteKtTest : ApiTest() { @Test fun `skal returnere feilmelding ved timeout fra Redis`() = testApi { - mockTilgang(Tilgang.HAR_TILGANG) - - val mockClientId = UUID.randomUUID() - - coEvery { mockRedisPoller.hent(mockClientId) } throws RedisPollerTimeoutException(Mock.forespoerselId) - - val response = mockConstructor(InnsendingProducer::class) { - every { - anyConstructed().publish(any(), any(), any()) - } returns mockClientId + coEvery { mockRedisPoller.hent(any()) } returns harTilgangResultat andThenThrows RedisPollerTimeoutException(Mock.forespoerselId) - post(path, GYLDIG_REQUEST) - } + val response = post(path, GYLDIG_REQUEST) assertEquals(HttpStatusCode.InternalServerError, response.status) assertEquals(RedisTimeoutResponse(Mock.forespoerselId).toJsonStr(RedisTimeoutResponse.serializer()), response.bodyAsText()) diff --git a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntekt/InntektProducerTest.kt b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntekt/InntektProducerTest.kt index 048e2fc5d..57dcb42f2 100644 --- a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntekt/InntektProducerTest.kt +++ b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntekt/InntektProducerTest.kt @@ -2,17 +2,14 @@ package no.nav.helsearbeidsgiver.inntektsmelding.api.inntekt import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.maps.shouldContainAll -import io.mockk.every import no.nav.helse.rapids_rivers.testsupport.TestRapid import no.nav.helsearbeidsgiver.felles.EventName import no.nav.helsearbeidsgiver.felles.Key import no.nav.helsearbeidsgiver.felles.json.toJson import no.nav.helsearbeidsgiver.felles.json.toMap import no.nav.helsearbeidsgiver.felles.test.rapidsrivers.firstMessage -import no.nav.helsearbeidsgiver.felles.utils.randomUuid import no.nav.helsearbeidsgiver.utils.json.toJson import no.nav.helsearbeidsgiver.utils.test.date.januar -import no.nav.helsearbeidsgiver.utils.test.mock.mockStatic import java.util.UUID class InntektProducerTest : FunSpec({ @@ -20,20 +17,16 @@ class InntektProducerTest : FunSpec({ val inntektProducer = InntektProducer(testRapid) test("Publiserer melding på forventet format") { - val expectedClientId = UUID.randomUUID() + val clientId = UUID.randomUUID() val request = InntektRequest(UUID.randomUUID(), 18.januar) - mockStatic(::randomUuid) { - every { randomUuid() } returns expectedClientId - - inntektProducer.publish(request) - } + inntektProducer.publish(clientId, request) val publisert = testRapid.firstMessage().toMap() publisert shouldContainAll mapOf( Key.EVENT_NAME to EventName.INNTEKT_REQUESTED.toJson(), - Key.CLIENT_ID to expectedClientId.toJson(), + Key.CLIENT_ID to clientId.toJson(), Key.FORESPOERSEL_ID to request.forespoerselId.toJson(), Key.SKJAERINGSTIDSPUNKT to request.skjaeringstidspunkt.toJson() ) diff --git a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntektselvbestemt/InntektSelvbestemtProducerTest.kt b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntektselvbestemt/InntektSelvbestemtProducerTest.kt index bbf557bb5..7ba4f3a09 100644 --- a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntektselvbestemt/InntektSelvbestemtProducerTest.kt +++ b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntektselvbestemt/InntektSelvbestemtProducerTest.kt @@ -14,17 +14,19 @@ import no.nav.helsearbeidsgiver.utils.test.date.april import no.nav.helsearbeidsgiver.utils.test.wrapper.genererGyldig import no.nav.helsearbeidsgiver.utils.wrapper.Fnr import no.nav.helsearbeidsgiver.utils.wrapper.Orgnr +import java.util.UUID class InntektSelvbestemtProducerTest : FunSpec({ val testRapid = TestRapid() val producer = InntektSelvbestemtProducer(testRapid) test("publiserer melding på forventet format") { + val transaksjonId = UUID.randomUUID() val sykmeldtFnr = Fnr.genererGyldig() val orgnr = Orgnr.genererGyldig() val inntektsdato = 12.april - val transaksjonId = producer.publish(InntektSelvbestemtRequest(sykmeldtFnr, orgnr, inntektsdato)) + producer.publish(transaksjonId, InntektSelvbestemtRequest(sykmeldtFnr, orgnr, inntektsdato)) testRapid.inspektør.size shouldBeExactly 1 testRapid.firstMessage().toMap() shouldContainExactly mapOf( diff --git a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntektselvbestemt/InntektSelvbestemtRouteKtTest.kt b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntektselvbestemt/InntektSelvbestemtRouteKtTest.kt index 71085bbc0..6ce7a581d 100644 --- a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntektselvbestemt/InntektSelvbestemtRouteKtTest.kt +++ b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/inntektselvbestemt/InntektSelvbestemtRouteKtTest.kt @@ -5,24 +5,23 @@ import io.ktor.client.statement.bodyAsText import io.ktor.http.HttpStatusCode import io.mockk.clearAllMocks import io.mockk.coEvery -import io.mockk.every import kotlinx.serialization.builtins.serializer import kotlinx.serialization.json.JsonElement import no.nav.helsearbeidsgiver.felles.Inntekt import no.nav.helsearbeidsgiver.felles.InntektPerMaaned import no.nav.helsearbeidsgiver.felles.ResultJson -import no.nav.helsearbeidsgiver.felles.Tilgang import no.nav.helsearbeidsgiver.inntektsmelding.api.RedisPollerTimeoutException import no.nav.helsearbeidsgiver.inntektsmelding.api.Routes import no.nav.helsearbeidsgiver.inntektsmelding.api.response.RedisTimeoutResponse import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.ApiTest +import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.harTilgangResultat +import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.ikkeTilgangResultat import no.nav.helsearbeidsgiver.utils.json.toJson import no.nav.helsearbeidsgiver.utils.json.toJsonStr import no.nav.helsearbeidsgiver.utils.test.date.april import no.nav.helsearbeidsgiver.utils.test.date.juni import no.nav.helsearbeidsgiver.utils.test.date.mai import no.nav.helsearbeidsgiver.utils.test.json.removeJsonWhitespace -import no.nav.helsearbeidsgiver.utils.test.mock.mockConstructor import no.nav.helsearbeidsgiver.utils.test.wrapper.genererGyldig import no.nav.helsearbeidsgiver.utils.wrapper.Fnr import no.nav.helsearbeidsgiver.utils.wrapper.Orgnr @@ -41,18 +40,14 @@ class InntektSelvbestemtRouteKtTest : ApiTest() { @Test fun `gi OK med inntekt`() = testApi { - val mockTransaksjonId = UUID.randomUUID() val expectedInntekt = Mock.inntekt - mockTilgang(Tilgang.HAR_TILGANG) - - coEvery { mockRedisPoller.hent(mockTransaksjonId) } returns Mock.successResult(expectedInntekt) - - val response = mockConstructor(InntektSelvbestemtProducer::class) { - every { anyConstructed().publish(any()) } returns mockTransaksjonId + coEvery { mockRedisPoller.hent(any()) } returnsMany listOf( + harTilgangResultat, + Mock.successResult(expectedInntekt) + ) - post(PATH, Mock.request, InntektSelvbestemtRequest.serializer()) - } + val response = post(PATH, Mock.request, InntektSelvbestemtRequest.serializer()) val actualJson = response.bodyAsText() @@ -62,7 +57,7 @@ class InntektSelvbestemtRouteKtTest : ApiTest() { @Test fun `manglende tilgang gir 500-feil`() = testApi { - mockTilgang(Tilgang.IKKE_TILGANG) + coEvery { mockRedisPoller.hent(any()) } returns ikkeTilgangResultat val response = post(PATH, Mock.request, InntektSelvbestemtRequest.serializer()) @@ -74,18 +69,14 @@ class InntektSelvbestemtRouteKtTest : ApiTest() { @Test fun `feilresultat gir 500-feil`() = testApi { - val mockTransaksjonId = UUID.randomUUID() val expectedFeilmelding = "Du får vente til freddan'!" - mockTilgang(Tilgang.HAR_TILGANG) - - coEvery { mockRedisPoller.hent(mockTransaksjonId) } returns Mock.failureResult(expectedFeilmelding) - - val response = mockConstructor(InntektSelvbestemtProducer::class) { - every { anyConstructed().publish(any()) } returns mockTransaksjonId + coEvery { mockRedisPoller.hent(any()) } returnsMany listOf( + harTilgangResultat, + Mock.failureResult(expectedFeilmelding) + ) - post(PATH, Mock.request, InntektSelvbestemtRequest.serializer()) - } + val response = post(PATH, Mock.request, InntektSelvbestemtRequest.serializer()) val actualJson = response.bodyAsText() @@ -95,18 +86,11 @@ class InntektSelvbestemtRouteKtTest : ApiTest() { @Test fun `timeout mot redis gir 500-feil`() = testApi { - val mockTransaksjonId = UUID.randomUUID() val expectedFeilJson = RedisTimeoutResponse().toJsonStr(RedisTimeoutResponse.serializer()) - mockTilgang(Tilgang.HAR_TILGANG) + coEvery { mockRedisPoller.hent(any()) } returns harTilgangResultat andThenThrows RedisPollerTimeoutException(UUID.randomUUID()) - coEvery { mockRedisPoller.hent(mockTransaksjonId) } throws RedisPollerTimeoutException(UUID.randomUUID()) - - val response = mockConstructor(InntektSelvbestemtProducer::class) { - every { anyConstructed().publish(any()) } returns mockTransaksjonId - - post(PATH, Mock.request, InntektSelvbestemtRequest.serializer()) - } + val response = post(PATH, Mock.request, InntektSelvbestemtRequest.serializer()) val actualJson = response.bodyAsText() @@ -116,18 +100,11 @@ class InntektSelvbestemtRouteKtTest : ApiTest() { @Test fun `ukjent feil mot redis gir 500-feil`() = testApi { - val mockTransaksjonId = UUID.randomUUID() val expectedFeilJson = "Error 500: java.lang.IllegalStateException".toJsonStr(String.serializer()) - mockTilgang(Tilgang.HAR_TILGANG) - - coEvery { mockRedisPoller.hent(mockTransaksjonId) } throws IllegalStateException() + coEvery { mockRedisPoller.hent(any()) } returns harTilgangResultat andThenThrows IllegalStateException() - val response = mockConstructor(InntektSelvbestemtProducer::class) { - every { anyConstructed().publish(any()) } returns mockTransaksjonId - - post(PATH, Mock.request, InntektSelvbestemtRequest.serializer()) - } + val response = post(PATH, Mock.request, InntektSelvbestemtRequest.serializer()) val actualJson = response.bodyAsText() @@ -137,13 +114,9 @@ class InntektSelvbestemtRouteKtTest : ApiTest() { @Test fun `ukjent feil gir 500-feil`() = testApi { - mockTilgang(Tilgang.HAR_TILGANG) + coEvery { mockRedisPoller.hent(any()) } throws NullPointerException() - val response = mockConstructor(InntektSelvbestemtProducer::class) { - every { anyConstructed().publish(any()) } throws NullPointerException() - - post(PATH, Mock.request, InntektSelvbestemtRequest.serializer()) - } + val response = post(PATH, Mock.request, InntektSelvbestemtRequest.serializer()) val actualJson = response.bodyAsText() diff --git a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/kvittering/KvitteringRouteKtTest.kt b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/kvittering/KvitteringRouteKtTest.kt index fc62277e4..6294879ff 100644 --- a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/kvittering/KvitteringRouteKtTest.kt +++ b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/kvittering/KvitteringRouteKtTest.kt @@ -2,15 +2,13 @@ package no.nav.helsearbeidsgiver.inntektsmelding.api.kvittering import io.ktor.http.HttpStatusCode import io.mockk.coEvery -import io.mockk.every import no.nav.helsearbeidsgiver.felles.ResultJson -import no.nav.helsearbeidsgiver.felles.Tilgang import no.nav.helsearbeidsgiver.inntektsmelding.api.Routes import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.ApiTest +import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.harTilgangResultat import no.nav.helsearbeidsgiver.utils.json.parseJson import no.nav.helsearbeidsgiver.utils.json.toJson import no.nav.helsearbeidsgiver.utils.test.json.removeJsonWhitespace -import no.nav.helsearbeidsgiver.utils.test.mock.mockConstructor import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test import java.util.UUID @@ -33,18 +31,14 @@ class KvitteringRouteKtTest : ApiTest() { @Test fun `skal godta gyldig uuid`() = testApi { - val mockClientId = UUID.randomUUID() - mockTilgang(Tilgang.HAR_TILGANG) + coEvery { mockRedisPoller.hent(any()) } returnsMany listOf( + harTilgangResultat, + ResultJson( + success = resultatMedInntektsmelding.parseJson() + ).toJson(ResultJson.serializer()) + ) - coEvery { mockRedisPoller.hent(mockClientId) } returns ResultJson( - success = resultatMedInntektsmelding.parseJson() - ).toJson(ResultJson.serializer()) - - val response = mockConstructor(KvitteringProducer::class) { - every { anyConstructed().publish(any()) } returns mockClientId - - get(PATH + "?uuid=" + UUID.randomUUID()) - } + val response = get(PATH + "?uuid=" + UUID.randomUUID()) assertEquals(HttpStatusCode.OK, response.status) } diff --git a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImProducerTest.kt b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImProducerTest.kt index d7b259a63..047fc77fc 100644 --- a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImProducerTest.kt +++ b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImProducerTest.kt @@ -3,7 +3,6 @@ package no.nav.helsearbeidsgiver.inntektsmelding.api.lagreselvbestemtim import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.ints.shouldBeExactly import io.kotest.matchers.maps.shouldContainExactly -import io.mockk.every import no.nav.helse.rapids_rivers.testsupport.TestRapid import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmeldingSelvbestemt import no.nav.helsearbeidsgiver.felles.EventName @@ -13,7 +12,6 @@ import no.nav.helsearbeidsgiver.felles.json.toMap import no.nav.helsearbeidsgiver.felles.test.mock.mockSkjemaInntektsmeldingSelvbestemt import no.nav.helsearbeidsgiver.felles.test.rapidsrivers.firstMessage import no.nav.helsearbeidsgiver.utils.json.toJson -import no.nav.helsearbeidsgiver.utils.test.mock.mockStatic import no.nav.helsearbeidsgiver.utils.test.wrapper.genererGyldig import no.nav.helsearbeidsgiver.utils.wrapper.Fnr import java.util.UUID @@ -28,11 +26,7 @@ class LagreSelvbestemtImProducerTest : FunSpec({ val avsenderFnr = Fnr.genererGyldig().verdi val skjema = mockSkjemaInntektsmeldingSelvbestemt() - mockStatic(UUID::randomUUID) { - every { UUID.randomUUID() } returns clientId - - producer.publish(skjema, avsenderFnr) - } + producer.publish(clientId, skjema, avsenderFnr) testRapid.inspektør.size shouldBeExactly 1 testRapid.firstMessage().toMap() shouldContainExactly mapOf( diff --git a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/trenger/TrengerProducerTest.kt b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/trenger/TrengerProducerTest.kt index 086974469..8cda1eb56 100644 --- a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/trenger/TrengerProducerTest.kt +++ b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/trenger/TrengerProducerTest.kt @@ -19,10 +19,11 @@ class TrengerProducerTest : FunSpec({ val producer = TrengerProducer(testRapid) test("publiserer melding på forventet format") { + val transaksjonId = UUID.randomUUID() val forespoerselId = UUID.randomUUID() val avsenderFnr = Fnr.genererGyldig().verdi - val transaksjonId = producer.publish(HentForespoerselRequest(forespoerselId), avsenderFnr) + producer.publish(transaksjonId, HentForespoerselRequest(forespoerselId), avsenderFnr) testRapid.inspektør.size shouldBeExactly 1 testRapid.firstMessage().toMap() shouldContainExactly mapOf( diff --git a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/trenger/TrengerRouteKtTest.kt b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/trenger/TrengerRouteKtTest.kt index 7ddc4ece2..1f327f6a1 100644 --- a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/trenger/TrengerRouteKtTest.kt +++ b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/trenger/TrengerRouteKtTest.kt @@ -4,7 +4,6 @@ import io.ktor.client.statement.bodyAsText import io.ktor.http.HttpStatusCode import io.mockk.clearAllMocks import io.mockk.coEvery -import io.mockk.every import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonObject import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Periode @@ -19,15 +18,15 @@ import no.nav.helsearbeidsgiver.felles.HentForespoerselResultat import no.nav.helsearbeidsgiver.felles.Inntekt import no.nav.helsearbeidsgiver.felles.InntektPerMaaned import no.nav.helsearbeidsgiver.felles.ResultJson -import no.nav.helsearbeidsgiver.felles.Tilgang import no.nav.helsearbeidsgiver.felles.TilgangResultat import no.nav.helsearbeidsgiver.felles.test.mock.mockForespurtData import no.nav.helsearbeidsgiver.felles.test.mock.mockForespurtDataMedForrigeInntekt import no.nav.helsearbeidsgiver.inntektsmelding.api.RedisPollerTimeoutException import no.nav.helsearbeidsgiver.inntektsmelding.api.Routes -import no.nav.helsearbeidsgiver.inntektsmelding.api.tilgang.TilgangProducer import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.ApiTest +import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.harTilgangResultat import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.hardcodedJson +import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.ikkeTilgangResultat import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.jsonStrOrNull import no.nav.helsearbeidsgiver.inntektsmelding.api.validation.ValidationResponse import no.nav.helsearbeidsgiver.utils.json.fromJson @@ -38,7 +37,6 @@ import no.nav.helsearbeidsgiver.utils.test.date.februar import no.nav.helsearbeidsgiver.utils.test.date.januar import no.nav.helsearbeidsgiver.utils.test.date.mars import no.nav.helsearbeidsgiver.utils.test.json.removeJsonWhitespace -import no.nav.helsearbeidsgiver.utils.test.mock.mockConstructor import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertNotNull import org.junit.jupiter.api.Assertions.assertNull @@ -57,18 +55,14 @@ class TrengerRouteKtTest : ApiTest() { @Test fun `skal returnere resultat og status CREATED når trenger virker`() = testApi { - val mockTransaksjonId = UUID.randomUUID() val expectedJson = Mock.responseJson() - mockTilgang(Tilgang.HAR_TILGANG) - - coEvery { mockRedisPoller.hent(mockTransaksjonId) } returns Mock.resultatOkJson - - val response = mockConstructor(TrengerProducer::class) { - every { anyConstructed().publish(any(), any()) } returns mockTransaksjonId + coEvery { mockRedisPoller.hent(any()) } returnsMany listOf( + harTilgangResultat, + Mock.resultatOkJson + ) - post(PATH, Mock.request, HentForespoerselRequest.serializer()) - } + val response = post(PATH, Mock.request, HentForespoerselRequest.serializer()) val actualJson = response.bodyAsText() @@ -78,18 +72,14 @@ class TrengerRouteKtTest : ApiTest() { @Test fun `skal returnere resultat og status CREATED når trenger virker med forespørsel bare inntekt`() = testApi { - val mockTransaksjonId = UUID.randomUUID() val expectedJson = Mock.responseBareInntektJson() - mockTilgang(Tilgang.HAR_TILGANG) - - coEvery { mockRedisPoller.hent(mockTransaksjonId) } returns Mock.resultatOkMedForrigeInntektJson - - val response = mockConstructor(TrengerProducer::class) { - every { anyConstructed().publish(any(), any()) } returns mockTransaksjonId + coEvery { mockRedisPoller.hent(any()) } returnsMany listOf( + harTilgangResultat, + Mock.resultatOkMedForrigeInntektJson + ) - post(PATH, Mock.request, HentForespoerselRequest.serializer()) - } + val response = post(PATH, Mock.request, HentForespoerselRequest.serializer()) val actualJson = response.bodyAsText() @@ -99,17 +89,9 @@ class TrengerRouteKtTest : ApiTest() { @Test fun `skal returnere Internal server error hvis Redis timer ut`() = testApi { - val mockTransaksjonId = UUID.randomUUID() - - mockTilgang(Tilgang.HAR_TILGANG) - - coEvery { mockRedisPoller.hent(mockTransaksjonId) } throws RedisPollerTimeoutException(UUID.randomUUID()) - - val response = mockConstructor(TrengerProducer::class) { - every { anyConstructed().publish(any(), any()) } returns mockTransaksjonId + coEvery { mockRedisPoller.hent(any()) } returns harTilgangResultat andThenThrows RedisPollerTimeoutException(UUID.randomUUID()) - post(PATH, Mock.request, HentForespoerselRequest.serializer()) - } + val response = post(PATH, Mock.request, HentForespoerselRequest.serializer()) assertEquals(HttpStatusCode.InternalServerError, response.status) } @@ -140,7 +122,7 @@ class TrengerRouteKtTest : ApiTest() { @Test fun `skal returnere Forbidden hvis feil ikke tilgang`() = testApi { - mockTilgang(Tilgang.IKKE_TILGANG) + coEvery { mockRedisPoller.hent(any()) } returns ikkeTilgangResultat val response = post(PATH, Mock.request, HentForespoerselRequest.serializer()) assertEquals(HttpStatusCode.Forbidden, response.status) @@ -148,11 +130,7 @@ class TrengerRouteKtTest : ApiTest() { @Test fun `skal returnere Forbidden hvis feil i Tilgangsresultet`() = testApi { - val mockTilgangClientId = UUID.randomUUID() - - every { anyConstructed().publishForespoerselId(any(), any()) } returns mockTilgangClientId - - coEvery { mockRedisPoller.hent(mockTilgangClientId) } returns TilgangResultat( + coEvery { mockRedisPoller.hent(any()) } returns TilgangResultat( feilmelding = "Noe er riv ruskende galt!" ).toJson(TilgangResultat.serializer()) diff --git a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/utils/TestUtils.kt b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/utils/TestUtils.kt index 9e8e4613f..9ee8da376 100644 --- a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/utils/TestUtils.kt +++ b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/utils/TestUtils.kt @@ -12,8 +12,6 @@ import io.ktor.http.contentType import io.ktor.serialization.kotlinx.json.json import io.ktor.server.testing.ApplicationTestBuilder import io.ktor.server.testing.testApplication -import io.mockk.coEvery -import io.mockk.every import io.mockk.mockk import io.prometheus.client.CollectorRegistry import kotlinx.coroutines.runBlocking @@ -28,7 +26,9 @@ import no.nav.helsearbeidsgiver.utils.json.jsonConfig import no.nav.helsearbeidsgiver.utils.json.toJson import no.nav.helsearbeidsgiver.utils.test.mock.mockConstructor import org.junit.jupiter.api.AfterEach -import java.util.UUID + +val harTilgangResultat = TilgangResultat(Tilgang.HAR_TILGANG).toJson(TilgangResultat.serializer()) +val ikkeTilgangResultat = TilgangResultat(Tilgang.IKKE_TILGANG).toJson(TilgangResultat.serializer()) abstract class ApiTest : MockAuthToken() { val mockRedisPoller = mockk() @@ -38,7 +38,7 @@ abstract class ApiTest : MockAuthToken() { apiModule(mockk(relaxed = true), mockRedisPoller) } - val testClient = TestClient(this, mockRedisPoller) { mockAuthToken() } + val testClient = TestClient(this, ::mockAuthToken) mockConstructor(TilgangProducer::class) { testClient.block() @@ -53,7 +53,6 @@ abstract class ApiTest : MockAuthToken() { class TestClient( appTestBuilder: ApplicationTestBuilder, - private val mockRedisPoller: RedisPoller, private val authToken: () -> String ) { private val httpClient = appTestBuilder.createClient { @@ -62,15 +61,6 @@ class TestClient( } } - fun mockTilgang(tilgang: Tilgang) { - val mockTilgangClientId = UUID.randomUUID() - - every { anyConstructed().publishForespoerselId(any(), any()) } returns mockTilgangClientId - every { anyConstructed().publishOrgnr(any(), any()) } returns mockTilgangClientId - - coEvery { mockRedisPoller.hent(mockTilgangClientId) } returns TilgangResultat(tilgang).toJson(TilgangResultat.serializer()) - } - fun get( path: String, block: HttpRequestBuilder.() -> Unit = { withAuth() } diff --git a/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/TilgangskontrollIT.kt b/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/TilgangskontrollIT.kt index caed2f157..b3ce53345 100644 --- a/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/TilgangskontrollIT.kt +++ b/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/TilgangskontrollIT.kt @@ -53,7 +53,7 @@ class TilgangskontrollIT : EndToEndTest() { mockStatic(::randomUuid) { every { randomUuid() } returns transaksjonId - tilgangProducer.publishForespoerselId(Mock.forespoerselId, Mock.INNLOGGET_FNR) + tilgangProducer.publishForespoerselId(UUID.randomUUID(), Mock.INNLOGGET_FNR, Mock.forespoerselId) } messages.filter(EventName.TILGANG_FORESPOERSEL_REQUESTED) @@ -91,7 +91,7 @@ class TilgangskontrollIT : EndToEndTest() { mockStatic(::randomUuid) { every { randomUuid() } returns transaksjonId - tilgangProducer.publishForespoerselId(Mock.forespoerselId, Mock.INNLOGGET_FNR) + tilgangProducer.publishForespoerselId(UUID.randomUUID(), Mock.INNLOGGET_FNR, Mock.forespoerselId) } val result = messages.filter(EventName.TILGANG_FORESPOERSEL_REQUESTED) @@ -107,7 +107,7 @@ class TilgangskontrollIT : EndToEndTest() { @Test fun `organisasjon - skal få tilgang`() { - tilgangProducer.publishOrgnr(Mock.ORGNR_MED_TILGANG, Mock.INNLOGGET_FNR) + tilgangProducer.publishOrgnr(UUID.randomUUID(), Mock.INNLOGGET_FNR, Mock.ORGNR_MED_TILGANG) val result = messages.filter(EventName.TILGANG_ORG_REQUESTED) .filter(Key.TILGANG) @@ -122,7 +122,7 @@ class TilgangskontrollIT : EndToEndTest() { @Test fun `organisasjon - skal bli nektet tilgang`() { - tilgangProducer.publishOrgnr(Mock.ORGNR_UTEN_TILGANG, Mock.INNLOGGET_FNR) + tilgangProducer.publishOrgnr(UUID.randomUUID(), Mock.INNLOGGET_FNR, Mock.ORGNR_UTEN_TILGANG) val result = messages.filter(EventName.TILGANG_ORG_REQUESTED) .filter(Key.TILGANG) From c771851448ddee977c141d0ffcfde3dc366f12ad Mon Sep 17 00:00:00 2001 From: Mikael Bjerga <6940327+bjerga@users.noreply.github.com> Date: Mon, 24 Jun 2024 14:55:44 +0200 Subject: [PATCH 7/7] Bruk ny tilgangsmocking i api-test (#575) --- .../LagreSelvbestemtImRouteKtTest.kt | 65 ++++++++----------- 1 file changed, 27 insertions(+), 38 deletions(-) diff --git a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImRouteKtTest.kt b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImRouteKtTest.kt index 210f529dc..4bac1f587 100644 --- a/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImRouteKtTest.kt +++ b/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImRouteKtTest.kt @@ -4,17 +4,15 @@ import io.ktor.client.statement.bodyAsText import io.ktor.http.HttpStatusCode import io.mockk.clearAllMocks import io.mockk.coEvery -import io.mockk.every import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmeldingSelvbestemt import no.nav.helsearbeidsgiver.felles.ResultJson -import no.nav.helsearbeidsgiver.felles.Tilgang import no.nav.helsearbeidsgiver.felles.test.mock.mockSkjemaInntektsmeldingSelvbestemt import no.nav.helsearbeidsgiver.inntektsmelding.api.Routes import no.nav.helsearbeidsgiver.inntektsmelding.api.response.ArbeidsforholdErrorResponse import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.ApiTest +import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.harTilgangResultat import no.nav.helsearbeidsgiver.utils.json.fromJson import no.nav.helsearbeidsgiver.utils.json.toJson -import no.nav.helsearbeidsgiver.utils.test.mock.mockConstructor import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -29,43 +27,34 @@ class LagreSelvbestemtImRouteKtTest : ApiTest() { } @Test - fun `skal godta og returnere id ved gyldig innsending`() = - testApi { - mockTilgang(Tilgang.HAR_TILGANG) - val mockClientId = UUID.randomUUID() - val selvbestemtId = UUID.randomUUID() - coEvery { mockRedisPoller.hent(mockClientId) } returns - ResultJson( - success = selvbestemtId.toJson() - ).toJson(ResultJson.serializer()) + fun `skal godta og returnere id ved gyldig innsending`() = testApi { + val selvbestemtId = UUID.randomUUID() - val response = - mockConstructor(LagreSelvbestemtImProducer::class) { - every { anyConstructed().publish(any(), any()) } returns mockClientId - post(path, mockSkjemaInntektsmeldingSelvbestemt(), SkjemaInntektsmeldingSelvbestemt.serializer()) - } + coEvery { mockRedisPoller.hent(any()) } returnsMany listOf( + harTilgangResultat, + ResultJson( + success = selvbestemtId.toJson() + ).toJson(ResultJson.serializer()) + ) - assertEquals(HttpStatusCode.OK, response.status) - assertEquals(LagreSelvbestemtImResponse(selvbestemtId = selvbestemtId), response.bodyAsText().fromJson(LagreSelvbestemtImResponse.serializer())) - } + val response = post(path, mockSkjemaInntektsmeldingSelvbestemt(), SkjemaInntektsmeldingSelvbestemt.serializer()) - @Test - fun `skal returnere bad reqest hvis arbeidsforhold mangler`() = - testApi { - mockTilgang(Tilgang.HAR_TILGANG) - val mockClientId = UUID.randomUUID() - coEvery { mockRedisPoller.hent(mockClientId) } returns - ResultJson( - failure = "Mangler arbeidsforhold i perioden".toJson() - ).toJson(ResultJson.serializer()) - - val response = - mockConstructor(LagreSelvbestemtImProducer::class) { - every { anyConstructed().publish(any(), any()) } returns mockClientId - post(path, mockSkjemaInntektsmeldingSelvbestemt(), SkjemaInntektsmeldingSelvbestemt.serializer()) - } + assertEquals(HttpStatusCode.OK, response.status) + assertEquals(LagreSelvbestemtImResponse(selvbestemtId = selvbestemtId), response.bodyAsText().fromJson(LagreSelvbestemtImResponse.serializer())) + } - assertEquals(HttpStatusCode.BadRequest, response.status) - assertEquals(ArbeidsforholdErrorResponse(), response.bodyAsText().fromJson(ArbeidsforholdErrorResponse.serializer())) - } + @Test + fun `skal returnere bad reqest hvis arbeidsforhold mangler`() = testApi { + coEvery { mockRedisPoller.hent(any()) } returnsMany listOf( + harTilgangResultat, + ResultJson( + failure = "Mangler arbeidsforhold i perioden".toJson() + ).toJson(ResultJson.serializer()) + ) + + val response = post(path, mockSkjemaInntektsmeldingSelvbestemt(), SkjemaInntektsmeldingSelvbestemt.serializer()) + + assertEquals(HttpStatusCode.BadRequest, response.status) + assertEquals(ArbeidsforholdErrorResponse(), response.bodyAsText().fromJson(ArbeidsforholdErrorResponse.serializer())) + } }