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 760ca5844..6fac690ce 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 @@ -27,7 +27,7 @@ class InntektProducer( MdcUtils.withLogFields( Log.klasse(this), Log.event(EventName.INNTEKT_REQUESTED), - Log.clientId(transaksjonId), + Log.transaksjonId(transaksjonId), Log.forespoerselId(request.forespoerselId), ) { rapid diff --git a/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/Key.kt b/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/Key.kt index 490829ba7..16fc23f78 100644 --- a/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/Key.kt +++ b/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/Key.kt @@ -23,7 +23,6 @@ enum class Key( ARBEIDSGIVER_ID("arbeidsgiverId"), ARBEIDSGIVER_FNR("arbeidsgiver_fnr"), UUID("uuid"), - CLIENT_ID("client_id"), FORESPOERSEL_ID("forespoerselId"), JOURNALPOST_ID("journalpostId"), DATA("data"), diff --git a/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/FailKanal.kt b/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/FailKanal.kt deleted file mode 100644 index a15282b0f..000000000 --- a/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/FailKanal.kt +++ /dev/null @@ -1,43 +0,0 @@ -package no.nav.helsearbeidsgiver.felles.rapidsrivers - -import no.nav.helse.rapids_rivers.JsonMessage -import no.nav.helse.rapids_rivers.MessageContext -import no.nav.helse.rapids_rivers.RapidsConnection -import no.nav.helse.rapids_rivers.River -import no.nav.helsearbeidsgiver.felles.EventName -import no.nav.helsearbeidsgiver.felles.Key -import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Fail -import no.nav.helsearbeidsgiver.utils.json.fromJson - -class FailKanal( - private val event: EventName, - rapid: RapidsConnection, - private val onFail: (JsonMessage, MessageContext) -> Unit, -) : River.PacketListener { - init { - River(rapid) - .apply { - validate { msg -> - msg.demand( - Key.FAIL to { it.fromJson(Fail.serializer()) }, - ) - msg.demandValues( - Key.EVENT_NAME to event.name, - ) - msg.requireKeys(Key.UUID) - msg.interestedIn(Key.FORESPOERSEL_ID) - msg.rejectKeys( - Key.BEHOV, - Key.DATA, - ) - } - }.register(this) - } - - override fun onPacket( - packet: JsonMessage, - context: MessageContext, - ) { - onFail(packet, context) - } -} diff --git a/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/LagreDataRedisRiver.kt b/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/LagreDataRedisRiver.kt deleted file mode 100644 index e0a002e7f..000000000 --- a/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/LagreDataRedisRiver.kt +++ /dev/null @@ -1,99 +0,0 @@ -package no.nav.helsearbeidsgiver.felles.rapidsrivers - -import kotlinx.serialization.builtins.serializer -import kotlinx.serialization.json.JsonElement -import no.nav.helse.rapids_rivers.JsonMessage -import no.nav.helse.rapids_rivers.MessageContext -import no.nav.helse.rapids_rivers.RapidsConnection -import no.nav.helse.rapids_rivers.River -import no.nav.helsearbeidsgiver.felles.EventName -import no.nav.helsearbeidsgiver.felles.Key -import no.nav.helsearbeidsgiver.felles.json.lesOrNull -import no.nav.helsearbeidsgiver.felles.json.toMap -import no.nav.helsearbeidsgiver.felles.json.toPretty -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.utils.json.parseJson -import no.nav.helsearbeidsgiver.utils.json.serializer.UuidSerializer -import no.nav.helsearbeidsgiver.utils.log.MdcUtils -import no.nav.helsearbeidsgiver.utils.log.logger -import no.nav.helsearbeidsgiver.utils.log.sikkerLogger -import java.util.UUID - -class LagreDataRedisRiver( - private val event: EventName, - private val dataKeys: Set, - private val rapid: RapidsConnection, - private val redisStore: RedisStore, - private val etterDataLagret: (JsonMessage, MessageContext) -> Unit, -) : River.PacketListener { - private val logger = logger() - private val sikkerLogger = sikkerLogger() - - init { - River(rapid) - .validate { - it.demandValues(Key.EVENT_NAME to event.name) - it.demandKeys(Key.DATA) - - it.rejectKeys(Key.BEHOV) - - it.requireKeys(Key.UUID) - - it.interestedIn( - Key.FORESPOERSEL_ID, - *dataKeys.toTypedArray(), - ) - }.register(this) - } - - override fun onPacket( - packet: JsonMessage, - context: MessageContext, - ) { - val melding = packet.toJson().parseJson().toMap() - - if (Key.FORESPOERSEL_ID.lesOrNull(String.serializer(), melding).isNullOrEmpty()) { - logger.warn("Mangler forespørselId!") - sikkerLogger.warn("Mangler forespørselId!") - } - - val transaksjonId = - runCatching { - Key.UUID.lesOrNull(UuidSerializer, melding) - }.onFailure { - sikkerLogger.error("Klarte ikke lese transaksjon-ID.", it) - }.getOrNull() - - if (transaksjonId != null) { - MdcUtils.withLogFields( - Log.klasse(this), - Log.event(event), - Log.transaksjonId(transaksjonId), - ) { - val antallLagret = lagreData(melding, transaksjonId) - - if (antallLagret > 0) { - sikkerLogger.info("Lagret $antallLagret nøkler (med data) i Redis for melding\n${melding.toPretty()}") - // TODO packet -> melding - etterDataLagret(packet, rapid) - } else { - sikkerLogger.warn("Fant ikke data å lagre for melding\n${melding.toPretty()}") - } - } - } else { - sikkerLogger.error("Transaksjon-ID er ikke initialisert for melding\n${melding.toPretty()}") - } - } - - private fun lagreData( - melding: Map, - transaksjonId: UUID, - ): Int = - melding - .filterKeys(dataKeys::contains) - .onEach { (key, data) -> - redisStore.set(RedisKey.of(transaksjonId, key), data.toString()) - }.size -} diff --git a/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/LagreStartDataRedisRiver.kt b/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/LagreStartDataRedisRiver.kt deleted file mode 100644 index d51288ee9..000000000 --- a/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/LagreStartDataRedisRiver.kt +++ /dev/null @@ -1,78 +0,0 @@ -package no.nav.helsearbeidsgiver.felles.rapidsrivers - -import no.nav.helse.rapids_rivers.JsonMessage -import no.nav.helse.rapids_rivers.MessageContext -import no.nav.helse.rapids_rivers.RapidsConnection -import no.nav.helse.rapids_rivers.River -import no.nav.helsearbeidsgiver.felles.EventName -import no.nav.helsearbeidsgiver.felles.Key -import no.nav.helsearbeidsgiver.felles.json.toMap -import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisKey -import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisStore -import no.nav.helsearbeidsgiver.felles.utils.randomUuid -import no.nav.helsearbeidsgiver.utils.json.parseJson -import no.nav.helsearbeidsgiver.utils.json.toJson -import no.nav.helsearbeidsgiver.utils.log.logger -import no.nav.helsearbeidsgiver.utils.log.sikkerLogger - -class LagreStartDataRedisRiver( - private val eventName: EventName, - private val dataKeys: Set, - rapid: RapidsConnection, - private val redisStore: RedisStore, - private val etterDataLagret: (JsonMessage, MessageContext) -> Unit, -) : River.PacketListener { - private val logger = logger() - private val sikkerLogger = sikkerLogger() - - init { - River(rapid) - .apply { - validate { - it.demandValues( - Key.EVENT_NAME to eventName.name, - ) - it.rejectKeys( - Key.BEHOV, - Key.DATA, - Key.FAIL, - ) - it.interestedIn( - Key.UUID, - *dataKeys.toTypedArray(), - ) - } - }.register(this) - } - - override fun onPacket( - packet: JsonMessage, - context: MessageContext, - ) { - lagreData(packet) - - "Lagret startdata for event $eventName.".also { - logger.info(it) - sikkerLogger.info("$it\n${packet.toPretty()}") - } - - etterDataLagret(packet, context) - } - - private fun lagreData(packet: JsonMessage) { - val melding = packet.toJson().parseJson().toMap() - - val transaksjonId = randomUuid() - - // TODO fjern når client-ID er død - packet[Key.UUID.str] = transaksjonId.toString() - - melding - .plus( - Key.UUID to transaksjonId.toJson(), - ).filterKeys(dataKeys::contains) - .onEach { (key, data) -> - redisStore.set(RedisKey.of(transaksjonId, key), data.toString()) - } - } -} diff --git a/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/RiverUtils.kt b/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/RiverUtils.kt index a3d9cc705..7488b6dd9 100644 --- a/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/RiverUtils.kt +++ b/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/RiverUtils.kt @@ -16,12 +16,6 @@ import no.nav.helsearbeidsgiver.utils.pipe.mapFirst fun JsonMessage.toPretty(): String = toJson().parseJson().toPretty() -fun JsonMessage.demandKeys(vararg keys: IKey) { - keys.forEach { - demandKey(it.toString()) - } -} - fun JsonMessage.demandValues(vararg keyAndValuePairs: Pair) { keyAndValuePairs.forEach { (key, value) -> demandValue(key.str, value) @@ -48,11 +42,6 @@ fun JsonMessage.require(vararg keyAndParserPairs: Pair An validate(JsonMessage::require, keyStringAndParserPairs) } -fun JsonMessage.interestedIn(vararg keyAndParserPairs: Pair Any>) { - val keyStringAndParserPairs = keyAndParserPairs.map { it.mapFirst(IKey::str) } - validate(JsonMessage::interestedIn, keyStringAndParserPairs) -} - fun JsonMessage.interestedIn(vararg keys: IKey) { val keysAsStr = keys.map(IKey::str).toTypedArray() interestedIn(*keysAsStr) diff --git a/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/composite/CompositeEventListener.kt b/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/composite/CompositeEventListener.kt deleted file mode 100644 index c37f8d191..000000000 --- a/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/composite/CompositeEventListener.kt +++ /dev/null @@ -1,154 +0,0 @@ -package no.nav.helsearbeidsgiver.felles.rapidsrivers.composite - -import kotlinx.serialization.builtins.serializer -import kotlinx.serialization.json.JsonElement -import no.nav.helse.rapids_rivers.JsonMessage -import no.nav.helse.rapids_rivers.MessageContext -import no.nav.helse.rapids_rivers.River -import no.nav.helsearbeidsgiver.felles.EventName -import no.nav.helsearbeidsgiver.felles.Key -import no.nav.helsearbeidsgiver.felles.json.lesOrNull -import no.nav.helsearbeidsgiver.felles.json.toMap -import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Fail -import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.ModelUtils.toFailOrNull -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.utils.collection.mapKeysNotNull -import no.nav.helsearbeidsgiver.utils.collection.mapValuesNotNull -import no.nav.helsearbeidsgiver.utils.json.fromJson -import no.nav.helsearbeidsgiver.utils.json.parseJson -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.log.logger -import no.nav.helsearbeidsgiver.utils.log.sikkerLogger -import no.nav.helsearbeidsgiver.utils.pipe.orDefault -import java.util.UUID - -abstract class CompositeEventListener : River.PacketListener { - private val logger = logger() - private val sikkerLogger = sikkerLogger() - - abstract val redisStore: RedisStore - abstract val event: EventName - abstract val startKeys: Set - abstract val dataKeys: Set - - abstract fun new(melding: Map) - - abstract fun inProgress(melding: Map) - - abstract fun finalize(melding: Map) - - abstract fun onError( - melding: Map, - fail: Fail, - ) - - override fun onPacket( - packet: JsonMessage, - context: MessageContext, - ) { - val melding = packet.toJson().parseJson().toMap() - - if (Key.FORESPOERSEL_ID.lesOrNull(String.serializer(), melding).isNullOrEmpty()) { - logger.warn("Mangler forespørselId!") - sikkerLogger.warn("Mangler forespørselId!") - } - - val transaksjonId = melding[Key.UUID]?.fromJson(UuidSerializer) - - if (transaksjonId == null) { - "Melding mangler transaksjon-ID. Ignorerer melding.".also { - logger.error(it) - sikkerLogger.error(it) - } - return - } - - MdcUtils.withLogFields( - Log.transaksjonId(transaksjonId), - ) { - val fail = toFailOrNull(melding) - - val clientIdRedisKey = RedisKey.of(transaksjonId, event) - - val meldingMedRedisData = getAllRedisData(transaksjonId) + melding - - return when { - !startKeys.all(meldingMedRedisData::containsKey) -> { - "'startKeys' mangler, enten pga. Redis-timeout eller feil i melding fra im-api.".also { - logger.error(it) - sikkerLogger.error(it) - } - Unit - } - - fail != null -> { - sikkerLogger.error("Feilmelding er '${fail.feilmelding}'. Utløsende melding er \n${fail.utloesendeMelding.toPretty()}") - onError(meldingMedRedisData, fail) - } - - redisStore.get(clientIdRedisKey).isNullOrEmpty() -> { - if (!isEventMelding(melding)) { - "Servicen er inaktiv for gitt event. Mest sannsynlig skyldes dette timeout av Redis-verdier.".also { - logger.error(it) - sikkerLogger.error(it) - } - Unit - } else { - val clientId = - melding[Key.CLIENT_ID] - ?.fromJson(UuidSerializer) - .orDefault { - "Client-ID mangler. Bruker transaksjon-ID som backup.".also { - logger.warn(it) - sikkerLogger.warn(it) - } - transaksjonId - } - - redisStore.set(clientIdRedisKey, clientId.toString()) - - new(melding) - } - } - - dataKeys.all(meldingMedRedisData::containsKey) -> { - finalize(meldingMedRedisData) - } - - else -> { - inProgress(meldingMedRedisData) - } - } - } - } - - private fun isEventMelding(melding: Map): Boolean = - melding[Key.EVENT_NAME] != null && - setOf(Key.BEHOV, Key.DATA, Key.FAIL).none(melding::containsKey) - - private fun getAllRedisData(transaksjonId: UUID): Map { - val allDataKeys = (startKeys + dataKeys).map { RedisKey.of(transaksjonId, it) }.toSet() - return redisStore - .getAll(allDataKeys) - .mapKeysNotNull { key -> - key - .removePrefix(transaksjonId.toString()) - .runCatching(Key::fromString) - .getOrElse { - sikkerLogger.error("Feil med nøkkel i Redis.", it) - null - } - }.mapValuesNotNull { value -> - runCatching { - value.parseJson() - }.getOrElse { - sikkerLogger.warn("Klarte ikke parse redis-verdi.\nvalue=$value", it) - null - } - } - } -} diff --git a/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/utils/Log.kt b/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/utils/Log.kt index 6f5fc1298..09e1cfc08 100644 --- a/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/utils/Log.kt +++ b/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/utils/Log.kt @@ -16,8 +16,6 @@ object Log { fun transaksjonId(value: UUID) = "transaksjon_id" to value.toString() - fun clientId(value: UUID) = "client_id" to value.toString() - fun forespoerselId(value: UUID) = "forespoersel_id" to value.toString() fun selvbestemtId(value: UUID) = "selvbestemt_id" to value.toString() diff --git a/felles/src/test/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/FailKanalTest.kt b/felles/src/test/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/FailKanalTest.kt deleted file mode 100644 index e078d46a1..000000000 --- a/felles/src/test/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/FailKanalTest.kt +++ /dev/null @@ -1,65 +0,0 @@ -package no.nav.helsearbeidsgiver.felles.rapidsrivers - -import io.mockk.clearAllMocks -import io.mockk.mockk -import io.mockk.verify -import kotlinx.serialization.json.JsonNull -import no.nav.helse.rapids_rivers.River -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.rapidsrivers.model.Fail -import no.nav.helsearbeidsgiver.felles.test.rapidsrivers.sendJson -import no.nav.helsearbeidsgiver.utils.json.toJson -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import java.util.UUID - -class FailKanalTest { - private val testRapid = TestRapid() - private val mockPacketListener = mockk(relaxed = true) - - init { - FailKanal(EventName.INSENDING_STARTED, testRapid, mockPacketListener::onPacket) - } - - @BeforeEach - fun setup() { - testRapid.reset() - clearAllMocks() - } - - @Test - fun `FAIL bør vare delegert`() { - val fail = mockFail(EventName.INSENDING_STARTED) - - testRapid.sendJson( - Key.FAIL to fail.toJson(Fail.serializer()), - Key.EVENT_NAME to fail.event.toJson(), - Key.UUID to UUID.randomUUID().toJson(), - ) - verify(exactly = 1) { mockPacketListener.onPacket(any(), any()) } - } - - @Test - fun `fanger ikke FAIL med en annen event`() { - val fail = mockFail(EventName.KVITTERING_REQUESTED) - - testRapid.sendJson( - Key.FAIL to fail.toJson(Fail.serializer()), - Key.EVENT_NAME to fail.event.toJson(), - Key.UUID to UUID.randomUUID().toJson(), - ) - verify(exactly = 0) { mockPacketListener.onPacket(any(), any()) } - } -} - -private fun mockFail(event: EventName): Fail = - Fail( - feilmelding = "failando, failando", - event = event, - transaksjonId = UUID.randomUUID(), - forespoerselId = UUID.randomUUID(), - utloesendeMelding = JsonNull, - ) diff --git a/felles/src/test/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/LagreDataRedisRiverTest.kt b/felles/src/test/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/LagreDataRedisRiverTest.kt deleted file mode 100644 index 7b428b225..000000000 --- a/felles/src/test/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/LagreDataRedisRiverTest.kt +++ /dev/null @@ -1,271 +0,0 @@ -package no.nav.helsearbeidsgiver.felles.rapidsrivers - -import io.kotest.core.spec.style.FunSpec -import io.kotest.matchers.maps.shouldContainExactly -import io.mockk.clearAllMocks -import io.mockk.mockk -import io.mockk.verify -import io.mockk.verifySequence -import kotlinx.serialization.builtins.serializer -import no.nav.helse.rapids_rivers.River -import no.nav.helse.rapids_rivers.testsupport.TestRapid -import no.nav.helsearbeidsgiver.felles.BehovType -import no.nav.helsearbeidsgiver.felles.EventName -import no.nav.helsearbeidsgiver.felles.Inntekt -import no.nav.helsearbeidsgiver.felles.InntektPerMaaned -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.rapidsrivers.redis.RedisKey -import no.nav.helsearbeidsgiver.felles.test.mock.MockRedis -import no.nav.helsearbeidsgiver.felles.test.rapidsrivers.sendJson -import no.nav.helsearbeidsgiver.utils.json.parseJson -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.mars -import java.util.UUID - -class LagreDataRedisRiverTest : - FunSpec({ - - val testRapid = TestRapid() - val mockRedis = MockRedis() - val mockListener = mockk(relaxed = true) - - val event = EventName.MANUELL_OPPRETT_SAK_REQUESTED - val dataKeys = setOf(Key.FNR, Key.INNTEKT) - - LagreDataRedisRiver( - event, - dataKeys, - testRapid, - mockRedis.store, - mockListener::onPacket, - ) - - beforeEach { - testRapid.reset() - clearAllMocks() - mockRedis.setup() - } - - test("Alle nøkler fra 'dataKeys' lagres (med verdi) i Redis når melding inkluderer DATA-nøkkel") { - val transaksjonId = UUID.randomUUID() - - testRapid.sendJson( - Key.EVENT_NAME to event.toJson(), - Key.DATA to "".toJson(), - Key.UUID to transaksjonId.toJson(), - Key.FNR to Mock.FNR.toJson(), - Key.INNTEKT to Mock.inntekt.toJson(Inntekt.serializer()), - ) - - verifySequence { - mockRedis.store.set(RedisKey.of(transaksjonId, Key.FNR), Mock.FNR.toJsonStr(String.serializer())) - mockRedis.store.set(RedisKey.of(transaksjonId, Key.INNTEKT), Mock.inntekt.toJsonStr(Inntekt.serializer())) - } - } - - test("Enkelt nøkkel fra 'dataKeys' lagres (med verdi) i Redis når melding inkluderer DATA-nøkkel") { - val transaksjonId = UUID.randomUUID() - - testRapid.sendJson( - Key.EVENT_NAME to event.toJson(), - Key.DATA to "".toJson(), - Key.UUID to transaksjonId.toJson(), - Key.FNR to Mock.FNR.toJson(), - ) - - verifySequence { - mockRedis.store.set(RedisKey.of(transaksjonId, Key.FNR), Mock.FNR.toJsonStr(String.serializer())) - } - } - - test("Nøkler fra 'dataKeys' lagres _ikke_ i Redis når melding _mangler_ DATA-nøkkel") { - val transaksjonId = UUID.randomUUID() - - testRapid.sendJson( - Key.EVENT_NAME to event.toJson(), - Key.UUID to transaksjonId.toJson(), - Key.FNR to Mock.FNR.toJson(), - ) - - verify(exactly = 0) { - mockRedis.store.set(RedisKey.of(transaksjonId, Key.FNR), any()) - } - } - - test("Nøkler fra 'dataKeys' lagres _ikke_ i Redis når melding _mangler_ EVENT_NAME") { - val transaksjonId = UUID.randomUUID() - - testRapid.sendJson( - Key.DATA to "".toJson(), - Key.UUID to transaksjonId.toJson(), - Key.FNR to Mock.FNR.toJson(), - ) - - verify(exactly = 0) { - mockRedis.store.set(RedisKey.of(transaksjonId, Key.FNR), any()) - } - } - - test("Nøkler fra 'dataKeys' lagres _ikke_ i Redis når melding har feil EVENT_NAME") { - val transaksjonId = UUID.randomUUID() - - testRapid.sendJson( - Key.EVENT_NAME to EventName.AKTIVE_ORGNR_REQUESTED.toJson(), - Key.DATA to "".toJson(), - Key.UUID to transaksjonId.toJson(), - Key.FNR to Mock.FNR.toJson(), - ) - - verify(exactly = 0) { - mockRedis.store.set(RedisKey.of(transaksjonId, Key.FNR), any()) - } - } - - test("Nøkler fra 'dataKeys' lagres _ikke_ i Redis når melding inkluderer BEHOV-nøkkel") { - val transaksjonId = UUID.randomUUID() - - testRapid.sendJson( - Key.EVENT_NAME to event.toJson(), - Key.BEHOV to BehovType.INNTEKT.toJson(), - Key.DATA to "".toJson(), - Key.UUID to transaksjonId.toJson(), - Key.FNR to Mock.FNR.toJson(), - ) - - verify(exactly = 0) { - mockRedis.store.set(RedisKey.of(transaksjonId, Key.FNR), any()) - } - } - - test("Nøkler fra 'dataKeys' lagres _ikke_ i Redis når melding _mangler_ UUID-nøkkel") { - testRapid.sendJson( - Key.EVENT_NAME to event.toJson(), - Key.DATA to "".toJson(), - Key.FNR to Mock.FNR.toJson(), - ) - - verify(exactly = 0) { - mockRedis.store.set(any(), any()) - } - } - - test("Nøkler fra 'dataKeys' lagres _ikke_ i Redis når melding har UUID på feil format") { - val transaksjonIdMedFeilFormat = "ikke en uuid" - - testRapid.sendJson( - Key.EVENT_NAME to event.toJson(), - Key.DATA to "".toJson(), - Key.UUID to transaksjonIdMedFeilFormat.toJson(), - Key.FNR to Mock.FNR.toJson(), - ) - - verify(exactly = 0) { - mockRedis.store.set(any(), any()) - } - } - - test("Nøkler utenfor 'dataKeys' lagres _ikke_ i Redis når melding inkluderer DATA-nøkkel") { - val transaksjonId = UUID.randomUUID() - - testRapid.sendJson( - Key.EVENT_NAME to event.toJson(), - Key.DATA to "".toJson(), - Key.UUID to transaksjonId.toJson(), - Key.FNR to Mock.FNR.toJson(), - Key.ORGNRUNDERENHET to Mock.ORGNR.toJson(), - ) - - verify { - mockRedis.store.set(RedisKey.of(transaksjonId, Key.FNR), Mock.FNR.toJsonStr(String.serializer())) - } - verify(exactly = 0) { - mockRedis.store.set(RedisKey.of(transaksjonId, Key.ORGNRUNDERENHET), any()) - } - } - - test("Nøkler utenfor 'dataKeys' lagres _ikke_ i Redis når melding _mangler_ DATA-nøkkel") { - val transaksjonId = UUID.randomUUID() - - testRapid.sendJson( - Key.EVENT_NAME to event.toJson(), - Key.UUID to transaksjonId.toJson(), - Key.ORGNRUNDERENHET to Mock.ORGNR.toJson(), - ) - - verify(exactly = 0) { - mockRedis.store.set(RedisKey.of(transaksjonId, Key.ORGNRUNDERENHET), any()) - } - } - - test("Argumentfunksjon 'etterDataLagret' kalles når data har blitt lagret") { - val transaksjonId = UUID.randomUUID() - - val innkommendeMelding = - mapOf( - Key.EVENT_NAME to event.toJson(), - Key.DATA to "".toJson(), - Key.UUID to transaksjonId.toJson(), - Key.FNR to Mock.FNR.toJson(), - Key.INNTEKT to Mock.inntekt.toJson(Inntekt.serializer()), - ) - - testRapid.sendJson( - *innkommendeMelding.toList().toTypedArray(), - ) - - verifySequence { - mockRedis.store.set(RedisKey.of(transaksjonId, Key.FNR), any()) - mockRedis.store.set(RedisKey.of(transaksjonId, Key.INNTEKT), any()) - - mockListener.onPacket( - withArg { - val melding = it.toJson().parseJson().toMap() - - melding shouldContainExactly innkommendeMelding - }, - any(), - ) - } - } - - test("Argumentfunksjon 'etterDataLagret' kalles _ikke_ når data _ikke_ har blitt lagret") { - val transaksjonId = UUID.randomUUID() - - testRapid.sendJson( - Key.EVENT_NAME to event.toJson(), - Key.UUID to transaksjonId.toJson(), - Key.FNR to Mock.FNR.toJson(), - Key.INNTEKT to Mock.inntekt.toJson(Inntekt.serializer()), - ) - - verify(exactly = 0) { - mockRedis.store.set(any(), any()) - - mockListener.onPacket(any(), any()) - } - } - }) - -private object Mock { - const val FNR = "11223355077" - const val ORGNR = "888222888" - - val inntekt = - Inntekt( - maanedOversikt = - listOf( - InntektPerMaaned( - maaned = mars(2020), - inntekt = 17.18, - ), - InntektPerMaaned( - maaned = april(2020), - inntekt = 0.12, - ), - ), - ) -}