From d66ffbc5d73ab54c508359d554248a41bcf16cf7 Mon Sep 17 00:00:00 2001 From: "Geir A. Lund" Date: Fri, 19 Feb 2021 07:49:57 +0100 Subject: [PATCH] Task/update dependencies second try (#111) * Oppdatere 3.parts biblioteker * BUG: Using blocking primitives on this dispatcher is not allowed. Consider using async channel instead or use blocking primitives in withContext(Dispatchers.IO) instead. Ser ut til at vi treffer samme bug som i https://youtrack.jetbrains.com/issue/KTOR-1286 Workaround: Pakke call.receive inn i coroutine IO kontekst --- buildSrc/src/main/kotlin/Constants.kt | 37 ++-- dp-inntekt-api/build.gradle.kts | 6 +- .../no/nav/dagpenger/inntekt/Application.kt | 2 +- .../inntekt/db/PostgresInntektStore.kt | 3 +- .../enhetsregister/EnhetsregisterClient.kt | 2 +- .../oppslag/pdl/PdlGraphQLRepository.kt | 5 +- .../inntekt/v1/EnhetsregistrerRoute.kt | 25 ++- .../nav/dagpenger/inntekt/v1/InntektRoute.kt | 53 +++-- .../inntekt/v1/InntjeningsperiodeRoute.kt | 20 +- .../inntekt/v1/UklassifisertInntektRoute.kt | 196 ++++++++++-------- .../no/nav/dagpenger/inntekt/DummyConfigs.kt | 2 +- .../nav/dagpenger/inntekt/db/PostgresTest.kt | 7 +- .../v1/InntektskomponentHttpClientTest.kt | 10 +- .../mapping/MapToFromGUIInntektTest.kt | 18 +- .../mapping/MapToSpesifisertInntektTest.kt | 2 +- .../oppslag/pdl/PdlGraphQLRepositoryTest.kt | 2 +- .../v1/UklassifisertInntektRouteTest.kt | 5 +- dp-inntekt-grpc/build.gradle.kts | 2 +- 18 files changed, 214 insertions(+), 183 deletions(-) diff --git a/buildSrc/src/main/kotlin/Constants.kt b/buildSrc/src/main/kotlin/Constants.kt index 84c37980..beabdba2 100644 --- a/buildSrc/src/main/kotlin/Constants.kt +++ b/buildSrc/src/main/kotlin/Constants.kt @@ -24,7 +24,7 @@ object Cucumber { object Dagpenger { object Biblioteker { - const val version = "2020.07.30-12.21.8857eb1469bf" + const val version = "2020.11.24-08.15.86482b2eead8" const val stsKlient = "com.github.navikt.dp-biblioteker:sts-klient:$version" const val grunnbeløp = "com.github.navikt.dp-biblioteker:grunnbelop:$version" const val ktorUtils = "com.github.navikt.dp-biblioteker:ktor-utils:$version" @@ -45,8 +45,8 @@ object Dagpenger { } } - const val Streams = "com.github.navikt:dagpenger-streams:2020.05.15-23.03.e0ab571caee4" - const val Events = "com.github.navikt:dagpenger-events:2020.05.15-21.57.e4685fc2a371" + const val Streams = "com.github.navikt:dagpenger-streams:2020.08.19-13.32.0fd360f3ef11" + const val Events = "com.github.navikt:dagpenger-events:2020.08.19-10.57.d2fe892352eb" } object Database { @@ -69,18 +69,19 @@ object GradleWrapper { } object Jackson { - const val version = "2.10.3" + const val version = "2.12.1" const val core = "com.fasterxml.jackson.core:jackson-core:$version" const val kotlin = "com.fasterxml.jackson.module:jackson-module-kotlin:$version" const val jsr310 = "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$version" } object Junit5 { - const val version = "5.6.1" + const val version = "5.7.1" const val api = "org.junit.jupiter:junit-jupiter-api:$version" const val params = "org.junit.jupiter:junit-jupiter-params:$version" const val engine = "org.junit.jupiter:junit-jupiter-engine:$version" const val vintageEngine = "org.junit.vintage:junit-vintage-engine:$version" + const val kotlinRunner = "io.kotlintest:kotlintest-runner-junit5:3.4.2" fun library(name: String) = "org.junit.jupiter:junit-jupiter-$name:$version" } @@ -121,22 +122,22 @@ object Konfig { } object Kotlin { - const val version = "1.3.72" + const val version = "1.4.30" const val stdlib = "org.jetbrains.kotlin:kotlin-stdlib:$version" object Coroutines { - const val version = "1.3.7" + const val version = "1.4.2" fun module(name: String) = "org.jetbrains.kotlinx:kotlinx-coroutines-$name:$version" } object Logging { - const val version = "1.7.9" + const val version = "2.0.4" const val kotlinLogging = "io.github.microutils:kotlin-logging:$version" } } object KoTest { - const val version = "4.0.3" + const val version = "4.4.1" // for kotest framework const val runner = "io.kotest:kotest-runner-junit5-jvm:$version" @@ -156,7 +157,7 @@ object Kotlinx { } object Ktor { - const val version = "1.3.2" + const val version = "1.5.1" const val server = "io.ktor:ktor-server:$version" const val serverNetty = "io.ktor:ktor-server-netty:$version" const val auth = "io.ktor:ktor-auth:$version" @@ -168,7 +169,7 @@ object Ktor { } object Log4j2 { - const val version = "2.13.1" + const val version = "2.14.0" const val api = "org.apache.logging.log4j:log4j-api:$version" const val core = "org.apache.logging.log4j:log4j-core:$version" const val slf4j = "org.apache.logging.log4j:log4j-slf4j-impl:$version" @@ -176,7 +177,7 @@ object Log4j2 { fun library(name: String) = "org.apache.logging.log4j:log4j-$name:$version" object Logstash { - private const val version = "1.0.2" + private const val version = "1.0.5" const val logstashLayout = "com.vlkan.log4j2:log4j2-logstash-layout:$version" } } @@ -198,7 +199,7 @@ object Moshi { } object Mockk { - const val version = "1.10.0" + const val version = "1.10.6" const val mockk = "io.mockk:mockk:$version" } @@ -220,7 +221,7 @@ object Prometheus { } } -const val RapidAndRivers = "com.github.navikt:rapids-and-rivers:1.74ae9cb" +const val RapidAndRivers = "com.github.navikt:rapids-and-rivers:1.6d6256d" object Slf4j { const val version = "1.7.25" @@ -228,11 +229,11 @@ object Slf4j { } object Ktlint { - const val version = "0.37.2" + const val version = "0.38.1" } object Spotless { - const val version = "5.1.0" + const val version = "5.10.1" const val spotless = "com.diffplug.spotless" } @@ -257,12 +258,12 @@ object Vault { } object Wiremock { - const val version = "2.21.0" + const val version = "2.27.2" const val standalone = "com.github.tomakehurst:wiremock-standalone:$version" } object Graphql { - const val version = "3.1.1" + const val version = "4.0.0-alpha.12" const val graphql = "com.expediagroup.graphql" val client = library("client") fun library(name: String) = "com.expediagroup:graphql-kotlin-$name:$version" diff --git a/dp-inntekt-api/build.gradle.kts b/dp-inntekt-api/build.gradle.kts index 7be0cfa9..a9a38704 100644 --- a/dp-inntekt-api/build.gradle.kts +++ b/dp-inntekt-api/build.gradle.kts @@ -12,6 +12,7 @@ buildscript { } repositories { + mavenCentral() maven("https://packages.confluent.io/maven/") } @@ -20,7 +21,7 @@ application { mainClassName = "no.nav.dagpenger.inntekt.ApplicationKt" } -val grpcVersion = "1.29.0" +val grpcVersion = "1.35.0" dependencies { implementation(project(":dp-inntekt-grpc")) @@ -36,6 +37,7 @@ dependencies { implementation(Micrometer.prometheusRegistry) implementation(Graphql.client) + implementation(Graphql.library("ktor-client")) implementation(Ktor.library("client-logging-jvm")) implementation(Ktor.library("client-apache")) @@ -90,10 +92,10 @@ dependencies { testImplementation(kotlin("test")) testImplementation(Ktor.ktorTest) + testImplementation(Ktor.library("client-mock")) testImplementation(Junit5.api) testImplementation(Junit5.params) testRuntimeOnly(Junit5.engine) - testRuntimeOnly(Junit5.vintageEngine) testImplementation(Wiremock.standalone) testImplementation(KoTest.assertions) testImplementation(KoTest.runner) diff --git a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/Application.kt b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/Application.kt index 7b873e86..4888b46b 100644 --- a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/Application.kt +++ b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/Application.kt @@ -50,7 +50,7 @@ fun main() { val pdlPersonOppslag = PdlGraphQLRepository( client = PdlGraphQLClientFactory( url = config.pdl.url, - oidcProvider = { stsOidcClient.oidcToken().access_token } + oidcProvider = { runBlocking { stsOidcClient.oidcToken().access_token } } ) ) val enhetsregisterClient = EnhetsregisterClient( diff --git a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/db/PostgresInntektStore.kt b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/db/PostgresInntektStore.kt index 87acc29c..acac9589 100644 --- a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/db/PostgresInntektStore.kt +++ b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/db/PostgresInntektStore.kt @@ -100,7 +100,8 @@ internal class PostgresInntektStore(private val dataSource: DataSource) : Inntek return using(sessionOf(dataSource)) { session -> session.run( queryOf( - statement, mapOf("inntektId" to inntektId.id) + statement, + mapOf("inntektId" to inntektId.id) ).map { row -> row.localDateOrNull("beregningsdato") }.asSingle diff --git a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/oppslag/enhetsregister/EnhetsregisterClient.kt b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/oppslag/enhetsregister/EnhetsregisterClient.kt index b6ddce5e..57052d67 100644 --- a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/oppslag/enhetsregister/EnhetsregisterClient.kt +++ b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/oppslag/enhetsregister/EnhetsregisterClient.kt @@ -23,7 +23,7 @@ class EnhetsregisterClient( suspend fun hentEnhet(orgnummer: String): String { return withContext(Dispatchers.IO) { try { - httpClient.get("$baseUrl/api/enheter/$orgnummer") + httpClient.get("$baseUrl/api/enheter/$orgnummer") } catch (e: ClientRequestException) { when (e.response.status.value) { 404 -> httpClient.get("$baseUrl/api/underenheter/$orgnummer") diff --git a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/oppslag/pdl/PdlGraphQLRepository.kt b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/oppslag/pdl/PdlGraphQLRepository.kt index 4892b6f6..15bb05fa 100644 --- a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/oppslag/pdl/PdlGraphQLRepository.kt +++ b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/oppslag/pdl/PdlGraphQLRepository.kt @@ -1,6 +1,7 @@ package no.nav.dagpenger.inntekt.oppslag.pdl import com.expediagroup.graphql.client.GraphQLClient +import com.expediagroup.graphql.client.ktor.GraphQLKtorClient import com.expediagroup.graphql.types.GraphQLResponse import io.ktor.client.features.defaultRequest import io.ktor.client.features.logging.LogLevel @@ -21,7 +22,7 @@ private val sikkerlogg = KotlinLogging.logger("tjenestekall") @KtorExperimentalAPI class PdlGraphQLRepository constructor( - client: GraphQLClient<*> + client: GraphQLClient ) : PersonOppslag { private val query = HentPerson(client) @@ -56,7 +57,7 @@ class PdlGraphQLRepository constructor( fun PdlGraphQLClientFactory( url: String, oidcProvider: () -> String -) = GraphQLClient(url = URL(url)) { +) = GraphQLKtorClient(url = URL(url)) { install(Logging) { logger = object : Logger { override fun log(message: String) = sikkerlogg.info { message } diff --git a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/v1/EnhetsregistrerRoute.kt b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/v1/EnhetsregistrerRoute.kt index 3ccb74b9..fe38bd24 100644 --- a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/v1/EnhetsregistrerRoute.kt +++ b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/v1/EnhetsregistrerRoute.kt @@ -11,6 +11,8 @@ import io.ktor.response.respondText import io.ktor.routing.Route import io.ktor.routing.get import io.ktor.routing.route +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import no.nav.dagpenger.inntekt.oppslag.enhetsregister.EnhetsregisterClient private const val CACHE_SECONDS = 86400 @@ -18,16 +20,19 @@ private const val CACHE_SECONDS = 86400 fun Route.enhetsregisteret(client: EnhetsregisterClient) { route("enhetsregisteret") { get("enhet/{orgnummer}") { - val orgnummer = call.parameters["orgnummer"] ?: throw BadRequestException("Orgnummer ikke spesifisert") - try { - val result = client.hentEnhet(orgnummer) - call.response.cacheControl(CacheControl.MaxAge(CACHE_SECONDS)) - call.respondText(result, ContentType.Application.Json) - } catch (e: Exception) { - when (e) { - is ClientRequestException -> when (e.response.status.value) { - in 400..499 -> call.response.status(e.response.status) - } else -> call.response.status(HttpStatusCode.BadGateway) + withContext(Dispatchers.IO) { + val orgnummer = call.parameters["orgnummer"] ?: throw BadRequestException("Orgnummer ikke spesifisert") + try { + val result = client.hentEnhet(orgnummer) + call.response.cacheControl(CacheControl.MaxAge(CACHE_SECONDS)) + call.respondText(result, ContentType.Application.Json) + } catch (e: Exception) { + when (e) { + is ClientRequestException -> when (e.response?.status?.value) { + in 400..499 -> call.response.status(e.response!!.status) + } + else -> call.response.status(HttpStatusCode.BadGateway) + } } } } diff --git a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/v1/InntektRoute.kt b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/v1/InntektRoute.kt index 02da6a3d..46475a06 100644 --- a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/v1/InntektRoute.kt +++ b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/v1/InntektRoute.kt @@ -8,51 +8,48 @@ import io.ktor.response.respond import io.ktor.routing.Route import io.ktor.routing.post import io.ktor.routing.route -import kotlinx.coroutines.asCoroutineDispatcher +import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.withContext import no.nav.dagpenger.inntekt.BehandlingsInntektsGetter import no.nav.dagpenger.inntekt.db.Inntektparametre import java.time.LocalDate -import java.util.concurrent.Executors - -val api = Executors.newFixedThreadPool(4).asCoroutineDispatcher() fun Route.inntekt(behandlingsInntektsGetter: BehandlingsInntektsGetter) { authenticate { route("spesifisert") { post { - val request = call.receive() - - val spesifisertInntekt = withContext(api) { - behandlingsInntektsGetter.getSpesifisertInntekt( - Inntektparametre( - aktørId = request.aktørId, - vedtakId = request.vedtakId, - beregningsdato = request.beregningsDato, - fødselnummer = request.fødselsnummer + withContext(IO) { + val request = call.receive() + + val spesifisertInntekt = + behandlingsInntektsGetter.getSpesifisertInntekt( + Inntektparametre( + aktørId = request.aktørId, + vedtakId = request.vedtakId, + beregningsdato = request.beregningsDato, + fødselnummer = request.fødselsnummer + ) ) - ) - } - call.respond(HttpStatusCode.OK, spesifisertInntekt) + call.respond(HttpStatusCode.OK, spesifisertInntekt) + } } } route("klassifisert") { post { - val request = call.receive() - - val klassifisertInntekt = withContext(api) { - behandlingsInntektsGetter.getKlassifisertInntekt( - Inntektparametre( - aktørId = request.aktørId, - vedtakId = request.vedtakId, - beregningsdato = request.beregningsDato, - fødselnummer = request.fødselsnummer + withContext(IO) { + val request = call.receive() + val klassifisertInntekt = + behandlingsInntektsGetter.getKlassifisertInntekt( + Inntektparametre( + aktørId = request.aktørId, + vedtakId = request.vedtakId, + beregningsdato = request.beregningsDato, + fødselnummer = request.fødselsnummer + ) ) - ) + call.respond(HttpStatusCode.OK, klassifisertInntekt) } - - call.respond(HttpStatusCode.OK, klassifisertInntekt) } } } diff --git a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/v1/InntjeningsperiodeRoute.kt b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/v1/InntjeningsperiodeRoute.kt index 2da6b9da..8468dcbe 100644 --- a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/v1/InntjeningsperiodeRoute.kt +++ b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/v1/InntjeningsperiodeRoute.kt @@ -7,6 +7,8 @@ import io.ktor.response.respond import io.ktor.routing.Route import io.ktor.routing.post import io.ktor.routing.route +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import no.nav.dagpenger.inntekt.db.InntektId import no.nav.dagpenger.inntekt.db.InntektStore import no.nav.dagpenger.inntekt.opptjeningsperiode.Opptjeningsperiode @@ -18,19 +20,21 @@ fun Route.opptjeningsperiodeApi(inntektStore: InntektStore) { route("is-samme-inntjeningsperiode") { post { - val parametere = call.receive() + withContext(Dispatchers.IO) { + val parametere = call.receive() - val gammelBeregningsdato = inntektStore.getBeregningsdato(InntektId(parametere.inntektsId)) + val gammelBeregningsdato = inntektStore.getBeregningsdato(InntektId(parametere.inntektsId)) - val resultat = Opptjeningsperiode(gammelBeregningsdato).sammeOpptjeningsPeriode( - Opptjeningsperiode( - LocalDate.parse(parametere.beregningsdato) + val resultat = Opptjeningsperiode(gammelBeregningsdato).sammeOpptjeningsPeriode( + Opptjeningsperiode( + LocalDate.parse(parametere.beregningsdato) + ) ) - ) - val response = InntjeningsperiodeResultat(resultat, parametere) + val response = InntjeningsperiodeResultat(resultat, parametere) - call.respond(HttpStatusCode.OK, response) + call.respond(HttpStatusCode.OK, response) + } } } } diff --git a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/v1/UklassifisertInntektRoute.kt b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/v1/UklassifisertInntektRoute.kt index e4c0e3ad..073248f5 100644 --- a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/v1/UklassifisertInntektRoute.kt +++ b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/v1/UklassifisertInntektRoute.kt @@ -17,6 +17,8 @@ import io.ktor.routing.post import io.ktor.routing.route import io.ktor.util.pipeline.PipelineContext import io.prometheus.client.Counter +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import mu.KotlinLogging import no.nav.dagpenger.inntekt.db.InntektNotFoundException import no.nav.dagpenger.inntekt.db.InntektStore @@ -64,121 +66,137 @@ fun Route.uklassifisertInntekt( authenticate("jwt") { route("/uklassifisert/{aktørId}/{vedtakId}/{beregningsDato}") { get { - parseUrlPathParameters().run { - inntektStore.getInntektId(Inntektparametre(aktørId = this.aktørId, vedtakId = this.vedtakId.toString(), beregningsdato = this.beregningsDato)) - ?.let { - inntektStore.getInntekt(it) - }?.let { - val person = personOppslag.hentPerson(this.aktørId) - val inntektsmottaker = Inntektsmottaker(person?.fødselsnummer, person?.sammensattNavn()) - mapToGUIInntekt(it, Opptjeningsperiode(this.beregningsDato), inntektsmottaker) - }?.let { - call.respond(HttpStatusCode.OK, it) - } ?: throw InntektNotFoundException("Inntekt with for $this not found.") + withContext(Dispatchers.IO) { + parseUrlPathParameters().run { + inntektStore.getInntektId( + Inntektparametre( + aktørId = this.aktørId, + vedtakId = this.vedtakId.toString(), + beregningsdato = this.beregningsDato + ) + ) + ?.let { + inntektStore.getInntekt(it) + }?.let { + val person = personOppslag.hentPerson(this.aktørId) + val inntektsmottaker = Inntektsmottaker(person?.fødselsnummer, person?.sammensattNavn()) + mapToGUIInntekt(it, Opptjeningsperiode(this.beregningsDato), inntektsmottaker) + }?.let { + call.respond(HttpStatusCode.OK, it) + } ?: throw InntektNotFoundException("Inntekt with for $this not found.") + } } } post { - parseUrlPathParameters().run { - val guiInntekt = call.receive() - mapToStoredInntekt(guiInntekt) - .let { + withContext(Dispatchers.IO) { + parseUrlPathParameters().run { + val guiInntekt = call.receive() + mapToStoredInntekt(guiInntekt) + .let { - inntektStore.storeInntekt( - StoreInntektCommand( - inntektparametre = Inntektparametre( - aktørId = this.aktørId, - vedtakId = this.vedtakId.toString(), - beregningsdato = this.beregningsDato - ), - inntekt = it.inntekt, - manueltRedigert = ManueltRedigert.from( - guiInntekt.redigertAvSaksbehandler, - getSubject() + inntektStore.storeInntekt( + StoreInntektCommand( + inntektparametre = Inntektparametre( + aktørId = this.aktørId, + vedtakId = this.vedtakId.toString(), + beregningsdato = this.beregningsDato + ), + inntekt = it.inntekt, + manueltRedigert = ManueltRedigert.from( + guiInntekt.redigertAvSaksbehandler, + getSubject() + ) ) - ) - ) - } - .let { - call.respond( - HttpStatusCode.OK, - mapToGUIInntekt( - it, - Opptjeningsperiode(this.beregningsDato), - guiInntekt.inntektsmottaker ) - ) - }.also { - inntektKorrigeringCounter.inc() - } + } + .let { + call.respond( + HttpStatusCode.OK, + mapToGUIInntekt( + it, + Opptjeningsperiode(this.beregningsDato), + guiInntekt.inntektsmottaker + ) + ) + }.also { + inntektKorrigeringCounter.inc() + } + } } } } route("/uklassifisert/uncached/{aktørId}/{vedtakId}/{beregningsDato}") { get { - parseUrlPathParameters().run { - val opptjeningsperiode = Opptjeningsperiode(this.beregningsDato) - toInntektskomponentRequest(this, opptjeningsperiode) - .let { - inntektskomponentClient.getInntekt(it) - } - .let { - val person = personOppslag.hentPerson(this.aktørId) - val inntektsmottaker = Inntektsmottaker(person?.fødselsnummer, person?.sammensattNavn()) - mapToGUIInntekt(it, opptjeningsperiode, inntektsmottaker) - } - .let { - call.respond(HttpStatusCode.OK, it) - }.also { - inntektOppfriskingCounter.inc() - } + withContext(Dispatchers.IO) { + parseUrlPathParameters().run { + val opptjeningsperiode = Opptjeningsperiode(this.beregningsDato) + toInntektskomponentRequest(this, opptjeningsperiode) + .let { + inntektskomponentClient.getInntekt(it) + } + .let { + val person = personOppslag.hentPerson(this.aktørId) + val inntektsmottaker = Inntektsmottaker(person?.fødselsnummer, person?.sammensattNavn()) + mapToGUIInntekt(it, opptjeningsperiode, inntektsmottaker) + } + .let { + call.respond(HttpStatusCode.OK, it) + }.also { + inntektOppfriskingCounter.inc() + } + } } } post { - parseUrlPathParameters().run { - val guiInntekt = call.receive() - mapToDetachedInntekt(guiInntekt) - .let { - inntektStore.storeInntekt( - StoreInntektCommand( - inntektparametre = Inntektparametre( - aktørId = this.aktørId, - vedtakId = this.vedtakId.toString(), - beregningsdato = this.beregningsDato - ), - inntekt = it.inntekt, - manueltRedigert = ManueltRedigert.from( - guiInntekt.redigertAvSaksbehandler, - getSubject() + withContext(Dispatchers.IO) { + parseUrlPathParameters().run { + val guiInntekt = call.receive() + mapToDetachedInntekt(guiInntekt) + .let { + inntektStore.storeInntekt( + StoreInntektCommand( + inntektparametre = Inntektparametre( + aktørId = this.aktørId, + vedtakId = this.vedtakId.toString(), + beregningsdato = this.beregningsDato + ), + inntekt = it.inntekt, + manueltRedigert = ManueltRedigert.from( + guiInntekt.redigertAvSaksbehandler, + getSubject() + ) ) ) - ) - } - .let { - call.respond( - HttpStatusCode.OK, - mapToGUIInntekt( - it, - Opptjeningsperiode(this.beregningsDato), - guiInntekt.inntektsmottaker + } + .let { + call.respond( + HttpStatusCode.OK, + mapToGUIInntekt( + it, + Opptjeningsperiode(this.beregningsDato), + guiInntekt.inntektsmottaker + ) ) - ) - }.also { - inntektOppfriskingBruktCounter.inc() - } + }.also { + inntektOppfriskingBruktCounter.inc() + } + } } } } } route("/verdikoder") { get { - call.respondText( - inntektKlassifiseringsKoderJsonAdapter.toJson(dataGrunnlagKlassifiseringToVerdikode.values), - ContentType.Application.Json, - HttpStatusCode.OK - ) + withContext(Dispatchers.IO) { + call.respondText( + inntektKlassifiseringsKoderJsonAdapter.toJson(dataGrunnlagKlassifiseringToVerdikode.values), + ContentType.Application.Json, + HttpStatusCode.OK + ) + } } } } diff --git a/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/DummyConfigs.kt b/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/DummyConfigs.kt index 4ed43814..7725fe76 100644 --- a/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/DummyConfigs.kt +++ b/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/DummyConfigs.kt @@ -13,7 +13,7 @@ private val mockedConfigs = listOf( "jwks.issuer" ) -val dummyConfigs = mockedConfigs.associate { it to "test" } +val dummyConfigs = mockedConfigs.associateWith { "test" } fun withProps(props: Map, test: () -> Unit) { for ((k, v) in props) { diff --git a/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/db/PostgresTest.kt b/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/db/PostgresTest.kt index ab5f0663..86024a48 100644 --- a/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/db/PostgresTest.kt +++ b/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/db/PostgresTest.kt @@ -6,7 +6,7 @@ import io.kotest.matchers.shouldBe import io.kotest.matchers.shouldNotBe import io.kotest.property.Arb import io.kotest.property.arbitrary.arb -import io.kotest.property.arbitrary.localDate +import io.kotest.property.arbitrary.localDateTime import io.kotest.property.arbitrary.next import io.kotest.property.arbitrary.string import io.kotest.property.checkAll @@ -23,6 +23,7 @@ import org.junit.jupiter.api.Test import java.time.LocalDate import kotlin.test.assertEquals import kotlin.test.assertFalse +import kotlin.test.assertNotEquals import kotlin.test.assertNotNull import kotlin.test.assertNull import kotlin.test.assertTrue @@ -130,7 +131,7 @@ internal class PostgresInntektStoreTest { assertSoftly { getInntektId(aktør1) shouldNotBe null getInntektId(aktør2) shouldNotBe null - getInntektId(aktør2) shouldNotBe getInntektId(aktør1) + assertNotEquals(getInntektId(aktør2), getInntektId(aktør1)) getInntektId(Inntektparametre(aktørId = aktørId2, vedtakId = "464664", beregningsdato = LocalDate.now())) shouldBe null getInntektId(Inntektparametre(aktørId = "3535535335", vedtakId = "1234", beregningsdato = LocalDate.now())) shouldBe null } @@ -362,7 +363,7 @@ internal class InntektsStorePropertyTest : StringSpec() { aktørId = stringArb.next(it), vedtakId = stringArb.next(it), fødselnummer = stringArb.next(it), - beregningsdato = Arb.localDate(minYear = 2010, maxYear = LocalDate.now().year).next(it) + beregningsdato = Arb.localDateTime(minYear = 2010, maxYear = LocalDate.now().year).next(it).toLocalDate() ), inntekt = InntektkomponentResponse( arbeidsInntektMaaned = emptyList(), diff --git a/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/inntektskomponenten/v1/InntektskomponentHttpClientTest.kt b/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/inntektskomponenten/v1/InntektskomponentHttpClientTest.kt index 0d168e87..327eb4cd 100644 --- a/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/inntektskomponenten/v1/InntektskomponentHttpClientTest.kt +++ b/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/inntektskomponenten/v1/InntektskomponentHttpClientTest.kt @@ -2,8 +2,8 @@ package no.nav.dagpenger.inntekt.inntektskomponenten.v1 import com.github.tomakehurst.wiremock.WireMockServer import com.github.tomakehurst.wiremock.client.WireMock -import com.github.tomakehurst.wiremock.client.WireMock.aResponse import com.github.tomakehurst.wiremock.client.WireMock.configureFor +import com.github.tomakehurst.wiremock.client.WireMock.okForContentType import com.github.tomakehurst.wiremock.client.WireMock.post import com.github.tomakehurst.wiremock.client.WireMock.stubFor import com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo @@ -66,9 +66,7 @@ internal class InntektskomponentHttpClientTest { .withHeader("Nav-Consumer-Id", EqualToPattern("dp-inntekt-api")) .withHeader("Nav-Call-Id", AnythingPattern()) .willReturn( - aResponse() - .withHeader("Content-Type", "application/json") - .withBody(body) + okForContentType("application/json", body) ) ) @@ -103,9 +101,7 @@ internal class InntektskomponentHttpClientTest { .withHeader("Nav-Consumer-Id", EqualToPattern("dp-inntekt-api")) .withHeader("Nav-Call-Id", AnythingPattern()) .willReturn( - WireMock.aResponse() - .withHeader("Content-Type", "application/json") - .withBody(body) + okForContentType("application/json", body) ) ) diff --git a/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/mapping/MapToFromGUIInntektTest.kt b/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/mapping/MapToFromGUIInntektTest.kt index 11e87ef7..2acdc71a 100644 --- a/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/mapping/MapToFromGUIInntektTest.kt +++ b/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/mapping/MapToFromGUIInntektTest.kt @@ -174,7 +174,8 @@ internal class KategoriseringTest { val mappedJson = moshiInstance.adapter(GUIInntektsKomponentResponse::class.java).toJson(guiInntekt.inntekt) JSONAssert.assertEquals( - mappedJson, beforeJson, + mappedJson, + beforeJson, AttributeIgnoringComparator( JSONCompareMode.STRICT, setOf("verdikode", "fraDato", "tilDato"), @@ -186,7 +187,8 @@ internal class KategoriseringTest { @Test fun `mapFromGUIInntekt removes verdikode and updates to beskrivelse, type and tilleggsinformasjon correctly`() { val guiInntekt = GUIInntekt( - InntektId(ULID().nextULID()), LocalDateTime.now(), + InntektId(ULID().nextULID()), + LocalDateTime.now(), GUIInntektsKomponentResponse( YearMonth.now(), YearMonth.now(), @@ -199,7 +201,8 @@ internal class KategoriseringTest { ), Aktoer(AktoerType.AKTOER_ID, "3333333333") ), - false, false + false, + false ) val mappedInntekt = mapToStoredInntekt(guiInntekt) @@ -215,7 +218,8 @@ internal class KategoriseringTest { @Test fun `mapFromGUIInntekt does not modify other fields than beskrivelse, type and tilleggsinformasjon`() { val guiInntekt = GUIInntekt( - InntektId(ULID().nextULID()), LocalDateTime.now(), + InntektId(ULID().nextULID()), + LocalDateTime.now(), GUIInntektsKomponentResponse( YearMonth.now(), YearMonth.now(), @@ -228,7 +232,8 @@ internal class KategoriseringTest { ), Aktoer(AktoerType.AKTOER_ID, "3333333333") ), - false, false + false, + false ) val mappedInntekt = mapToStoredInntekt(guiInntekt) @@ -237,7 +242,8 @@ internal class KategoriseringTest { val mappedJson = moshiInstance.adapter(InntektkomponentResponse::class.java).toJson(mappedInntekt.inntekt) JSONAssert.assertEquals( - beforeJson, mappedJson, + beforeJson, + mappedJson, AttributeIgnoringComparator( JSONCompareMode.LENIENT, setOf("verdikode", "fraDato", "tilDato"), diff --git a/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/mapping/MapToSpesifisertInntektTest.kt b/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/mapping/MapToSpesifisertInntektTest.kt index 7c6fc8b0..f371b975 100644 --- a/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/mapping/MapToSpesifisertInntektTest.kt +++ b/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/mapping/MapToSpesifisertInntektTest.kt @@ -20,7 +20,7 @@ import no.nav.dagpenger.inntekt.inntektskomponenten.v1.Periode import no.nav.dagpenger.inntekt.inntektskomponenten.v1.SpesielleInntjeningsforhold import no.nav.dagpenger.inntekt.inntektskomponenten.v1.TilleggInformasjon import no.nav.dagpenger.inntekt.inntektskomponenten.v1.TilleggInformasjonsDetaljer -import org.junit.Test +import org.junit.jupiter.api.Test import java.math.BigDecimal import java.time.LocalDate import java.time.LocalDateTime diff --git a/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/oppslag/pdl/PdlGraphQLRepositoryTest.kt b/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/oppslag/pdl/PdlGraphQLRepositoryTest.kt index 8c9159d4..42e12760 100644 --- a/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/oppslag/pdl/PdlGraphQLRepositoryTest.kt +++ b/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/oppslag/pdl/PdlGraphQLRepositoryTest.kt @@ -103,7 +103,7 @@ internal class PdlGraphQLRepositoryTest { this.addStubMapping( WireMock.post(WireMock.urlEqualTo("/graphql")) .withHeader(HttpHeaders.CONTENT_TYPE, WireMock.equalTo("application/json")) - .withHeader(HttpHeaders.ACCEPT, WireMock.equalTo("application/json;application/json")) + .withHeader(HttpHeaders.ACCEPT, WireMock.equalTo("application/json")) .withHeader(HttpHeaders.AUTHORIZATION, WireMock.equalTo("Bearer $TOKEN")) .withHeader("TEMA", WireMock.equalTo("DAG")) .withHeader("Nav-Consumer-Token", WireMock.equalTo("Bearer $TOKEN")) diff --git a/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/v1/UklassifisertInntektRouteTest.kt b/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/v1/UklassifisertInntektRouteTest.kt index 4069f17a..c8ac9e84 100644 --- a/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/v1/UklassifisertInntektRouteTest.kt +++ b/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/v1/UklassifisertInntektRouteTest.kt @@ -137,9 +137,8 @@ internal class UklassifisertInntektApiTest { ) { addHeader(HttpHeaders.Cookie, "ID_token=$token") }.apply { - assertTrue(requestHandled) - Assertions.assertEquals(HttpStatusCode.NotFound, response.status()) - val problem = moshiInstance.adapter(Problem::class.java).fromJson(response.content!!) + assertEquals(HttpStatusCode.NotFound, response.status()) + val problem = moshiInstance.adapter(Problem::class.java).fromJson(response.content!!) assertEquals("Kunne ikke finne inntekt i databasen", problem?.title) assertEquals("urn:dp:error:inntekt", problem?.type.toString()) assertEquals(404, problem?.status) diff --git a/dp-inntekt-grpc/build.gradle.kts b/dp-inntekt-grpc/build.gradle.kts index f27b4c42..4110c639 100644 --- a/dp-inntekt-grpc/build.gradle.kts +++ b/dp-inntekt-grpc/build.gradle.kts @@ -1,6 +1,6 @@ import com.google.protobuf.gradle.* // ktlint-disable no-wildcard-imports -val grpcVersion = "1.29.0" +val grpcVersion = "1.35.0" val grpcKotlinVersion = "0.1.1" val protbufVersion = "3.11.1" val protobufGradleVersion = "0.8.12"