Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ny iterasjon av eksperimentell river #331

Merged
merged 4 commits into from
Nov 27, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,45 +1,49 @@
package no.nav.helsearbeidsgiver.inntektsmelding.altinn

import io.prometheus.client.Summary
import kotlinx.coroutines.runBlocking
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.json.JsonElement
import no.nav.helsearbeidsgiver.altinn.AltinnClient
import no.nav.helsearbeidsgiver.altinn.AltinnOrganisasjon
import no.nav.helsearbeidsgiver.felles.BehovType
import no.nav.helsearbeidsgiver.felles.DataFelt
import no.nav.helsearbeidsgiver.felles.IKey
import no.nav.helsearbeidsgiver.felles.Key
import no.nav.helsearbeidsgiver.felles.loeser.Loeser
import no.nav.helsearbeidsgiver.felles.json.krev
import no.nav.helsearbeidsgiver.felles.json.les
import no.nav.helsearbeidsgiver.felles.json.toJson
import no.nav.helsearbeidsgiver.felles.loeser.ObjectRiver
import no.nav.helsearbeidsgiver.felles.metrics.Metrics
import no.nav.helsearbeidsgiver.felles.metrics.recordTime
import no.nav.helsearbeidsgiver.utils.json.serializer.set
import no.nav.helsearbeidsgiver.utils.json.toJson

data class Melding(
val behovType: BehovType,
val identitetsnummer: String
)

class AltinnLoeser(
private val altinnClient: AltinnClient
) : Loeser<Set<AltinnOrganisasjon>>() {
override val behovType = BehovType.ARBEIDSGIVERE

lateinit var identitetsnummer: Behov.() -> String
private val requestLatency = Summary.build()
.name("simba_altinn_hent_rettighet_organisasjoner_latency_seconds")
.help("altinn hentrettighetOrganisasjoner latency in seconds")
.register()

) : ObjectRiver<Melding>() {
init {
start()
}

override fun BehovReader.createReaders() {
identitetsnummer = readFn(Key.IDENTITETSNUMMER)
}
override fun les(json: Map<IKey, JsonElement>): Melding =
Melding(
b162214 marked this conversation as resolved.
Show resolved Hide resolved
behovType = Key.BEHOV.krev(BehovType.ARBEIDSGIVERE, BehovType.serializer(), json),
identitetsnummer = Key.IDENTITETSNUMMER.les(String.serializer(), json)
)

override fun Behov.løs(): Set<AltinnOrganisasjon> {
val requestTimer = requestLatency.startTimer()
runBlocking {
altinnClient.hentRettighetOrganisasjoner(identitetsnummer())
}.also {
requestTimer.observeDuration()
return it
override fun Melding.haandter(): Map<IKey, JsonElement> {
val rettigheter = Metrics.altinnRequest.recordTime {
altinnClient.hentRettighetOrganisasjoner(identitetsnummer)
}
}

override fun Set<AltinnOrganisasjon>.toJson(): JsonElement =
toJson(AltinnOrganisasjon.serializer().set())
return mapOf(
b162214 marked this conversation as resolved.
Show resolved Hide resolved
Key.BEHOV to behovType.toJson(),
Key.DATA to "".toJson(),
DataFelt.ARBEIDSFORHOLD to rettigheter.toJson(AltinnOrganisasjon.serializer().set())
b162214 marked this conversation as resolved.
Show resolved Hide resolved
)
}
}
Original file line number Diff line number Diff line change
@@ -1,53 +1,92 @@
package no.nav.helsearbeidsgiver.inntektsmelding.altinn

import io.kotest.core.spec.style.FunSpec
import io.kotest.matchers.maps.shouldContainAll
import io.kotest.matchers.shouldBe
import io.mockk.clearAllMocks
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.coVerifySequence
import io.mockk.every
import io.mockk.mockk
import kotlinx.serialization.json.JsonElement
import no.nav.helse.rapids_rivers.RapidApplication
import no.nav.helse.rapids_rivers.testsupport.TestRapid
import no.nav.helsearbeidsgiver.altinn.AltinnClient
import no.nav.helsearbeidsgiver.altinn.AltinnOrganisasjon
import no.nav.helsearbeidsgiver.felles.BehovType
import no.nav.helsearbeidsgiver.felles.DataFelt
import no.nav.helsearbeidsgiver.felles.IKey
import no.nav.helsearbeidsgiver.felles.Key
import no.nav.helsearbeidsgiver.felles.loeser.toLøsningSuccess
import no.nav.helsearbeidsgiver.felles.test.loeser.LoeserTest
import no.nav.helsearbeidsgiver.felles.test.loeser.LoeserTest.LoeserAnswer.Companion.toLoeserAnswer
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.test.rapidsrivers.sendJson
import no.nav.helsearbeidsgiver.utils.json.serializer.set
import no.nav.helsearbeidsgiver.utils.json.toJson
import org.junit.jupiter.api.Test
import java.util.UUID
import no.nav.helsearbeidsgiver.utils.test.mock.mockObject

class AltinnLoeserTest : LoeserTest() {
private val mockAltinnClient = mockk<AltinnClient> {
coEvery { hentRettighetOrganisasjoner(any()) } returns mockAltinnOrganisasjonSet()
class AltinnLoeserTest : FunSpec({
val testRapid = TestRapid()

val mockAltinnClient = mockk<AltinnClient>(relaxed = true)

beforeEach {
testRapid.reset()
clearAllMocks()
}

mockObject(RapidApplication) {
every { RapidApplication.create(any()) } returns testRapid

AltinnLoeser(mockAltinnClient)
}

private val altinnLoeser = withTestRapid { AltinnLoeser(mockAltinnClient) }
test("henter organisasjonsrettigheter med id fra behov") {
coEvery { mockAltinnClient.hentRettighetOrganisasjoner(any()) } returns mockAltinnOrganisasjonSet()

@Test
fun `henter organisasjonsrettigheter med id fra behov`() {
val mockId = "long-john-silver"

val expectedAnswer = LoeserAnswer(
behovType = altinnLoeser.behovType,
initiateId = UUID.randomUUID(),
loesning = mockAltinnOrganisasjonSet().toLøsningSuccess()
val expectedPublished = mapOf<IKey, JsonElement>(
Key.BEHOV to BehovType.ARBEIDSGIVERE.toJson(),
Key.DATA to "".toJson(),
DataFelt.ARBEIDSFORHOLD to mockAltinnOrganisasjonSet().toJson(AltinnOrganisasjon.serializer().set())
)

testRapid.sendJson(
Key.BEHOV to expectedAnswer.behovType.let(::listOf).toJson(BehovType.serializer()),
Key.INITIATE_ID to expectedAnswer.initiateId.toJson(),
Key.BEHOV to BehovType.ARBEIDSGIVERE.toJson(),
Key.IDENTITETSNUMMER to mockId.toJson()
)

val actualAnswer = testRapid.firstMessage()
.toLoeserAnswer(AltinnOrganisasjon.serializer().set())
val actualPublished = testRapid.firstMessage().toMap()

coVerifySequence { mockAltinnClient.hentRettighetOrganisasjoner(mockId) }
actualAnswer shouldBe expectedAnswer
actualPublished shouldContainAll expectedPublished
}

test("melding med feil behov aktiverer ikke river") {
val mockId = "small-jack-gold"

testRapid.sendJson(
Key.BEHOV to BehovType.FULLT_NAVN.toJson(),
Key.IDENTITETSNUMMER to mockId.toJson()
)

testRapid.inspektør.size shouldBe 0

coVerify(exactly = 0) { mockAltinnClient.hentRettighetOrganisasjoner(any()) }
}

test("ufullstendig melding aktiverer ikke river") {
testRapid.sendJson(
Key.BEHOV to BehovType.ARBEIDSGIVERE.toJson()
)

testRapid.inspektør.size shouldBe 0

coVerify(exactly = 0) { mockAltinnClient.hentRettighetOrganisasjoner(any()) }
}
}
})

private fun mockAltinnOrganisasjonSet(): Set<AltinnOrganisasjon> =
setOf(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,9 @@ package no.nav.helsearbeidsgiver.inntektsmelding.api

import io.kotest.matchers.shouldBe
import kotlinx.coroutines.runBlocking
import kotlinx.serialization.builtins.serializer
import no.nav.helsearbeidsgiver.felles.ForespurtData
import no.nav.helsearbeidsgiver.felles.Periode
import no.nav.helsearbeidsgiver.felles.TrengerInntekt
import no.nav.helsearbeidsgiver.felles.json.loesning
import no.nav.helsearbeidsgiver.felles.loeser.toLøsningSuccess
import no.nav.helsearbeidsgiver.felles.test.mock.mockTrengerInntekt
import no.nav.helsearbeidsgiver.utils.json.fromJson
import no.nav.helsearbeidsgiver.utils.json.serializer.list
Expand All @@ -21,8 +18,8 @@ import java.util.UUID

class RedisPollerTest {
private val key = UUID.randomUUID()
private val løsningSuccess = "noe data".toLøsningSuccess().toJson(String.serializer().loesning())
private val gyldigRedisInnhold = løsningSuccess.toString()
private val noeData = "noe data".toJson()
private val gyldigRedisInnhold = noeData.toString()

@Test
fun `skal finne med tillatt antall forsøk`() {
Expand All @@ -32,7 +29,7 @@ class RedisPollerTest {
redisPoller.hent(key, 5, 0)
}

json shouldBe løsningSuccess
json shouldBe noeData
}

@Test
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import no.nav.helsearbeidsgiver.felles.DataFelt
import no.nav.helsearbeidsgiver.felles.EventName
import no.nav.helsearbeidsgiver.felles.IKey
import no.nav.helsearbeidsgiver.felles.Key
import no.nav.helsearbeidsgiver.felles.loeser.Løsning
import no.nav.helsearbeidsgiver.felles.rapidsrivers.pritopic.Pri
import no.nav.helsearbeidsgiver.utils.json.fromJson
import no.nav.helsearbeidsgiver.utils.json.fromJsonMapFiltered
Expand All @@ -19,9 +18,6 @@ import no.nav.helsearbeidsgiver.utils.json.toJson
fun JsonNode.toJsonElement(): JsonElement =
toString().parseJson()

fun <T : Any> KSerializer<T>.loesning(): KSerializer<Løsning<T>> =
Løsning.serializer(this)

fun EventName.toJson(): JsonElement =
toJson(EventName.serializer())

Expand All @@ -47,3 +43,10 @@ fun <K : IKey, T : Any> K.lesOrNull(serializer: KSerializer<T>, melding: Map<K,
fun <K : IKey, T : Any> K.les(serializer: KSerializer<T>, melding: Map<K, JsonElement>): T =
lesOrNull(serializer, melding)
?: throw IllegalArgumentException("Felt '$this' mangler i JSON-map.")

fun <K : IKey, T : Any> K.krev(krav: T, serializer: KSerializer<T>, melding: Map<K, JsonElement>): T =
les(serializer, melding).also {
if (it != krav) {
throw IllegalArgumentException("Nøkkel '$this' har verdi '$it', som ikke matcher med påkrevd verdi '$krav'.")
}
}
Loading