From 6bb76c207ddc0a83e633e07b02bc2969eb6a199e Mon Sep 17 00:00:00 2001 From: Anders Rognstad Date: Tue, 3 Sep 2024 09:44:19 +0200 Subject: [PATCH] Add POST single --- .../api/v2/endpoints/PersonTildelingApiV2.kt | 27 ++++++ .../api/v2/PersontildelingApiV2Spek.kt | 92 ++++++++++++++----- .../no/nav/syfo/testutil/UserConstants.kt | 1 + .../mock/VeilederTilgangskontrollMock.kt | 11 ++- 4 files changed, 107 insertions(+), 24 deletions(-) diff --git a/src/main/kotlin/no/nav/syfo/personstatus/api/v2/endpoints/PersonTildelingApiV2.kt b/src/main/kotlin/no/nav/syfo/personstatus/api/v2/endpoints/PersonTildelingApiV2.kt index 7611307d..45500dfb 100644 --- a/src/main/kotlin/no/nav/syfo/personstatus/api/v2/endpoints/PersonTildelingApiV2.kt +++ b/src/main/kotlin/no/nav/syfo/personstatus/api/v2/endpoints/PersonTildelingApiV2.kt @@ -16,6 +16,7 @@ import no.nav.syfo.personstatus.domain.VeilederBrukerKnytningListe import no.nav.syfo.personstatus.infrastructure.clients.veiledertilgang.VeilederTilgangskontrollClient import no.nav.syfo.personstatus.PersonoversiktStatusService import no.nav.syfo.personstatus.api.v2.model.VeilederBrukerKnytningDTO +import no.nav.syfo.personstatus.domain.PersonIdent import no.nav.syfo.util.* import no.nav.syfo.util.getBearerHeader import no.nav.syfo.util.getCallId @@ -72,6 +73,32 @@ fun Route.registerPersonTildelingApiV2( } } + post("/personer/single") { + val callId = getCallId() + val token = getBearerHeader() + ?: throw java.lang.IllegalArgumentException("No Authorization header supplied") + try { + val veilederBrukerKnytning: VeilederBrukerKnytning = call.receive() + + val tilgang = veilederTilgangskontrollClient.getVeilederAccessToPerson( + personident = PersonIdent(veilederBrukerKnytning.fnr), + token = token, + callId = callId + ) + if (tilgang?.erGodkjent == true) { + personTildelingService.lagreKnytningMellomVeilederOgBruker(listOf(veilederBrukerKnytning)) + call.respond(HttpStatusCode.OK) + } else { + log.error("Kan ikke registrere tilknytning fordi veileder ikke har tilgang til bruker, {}", callIdArgument(callId)) + call.respond(HttpStatusCode.Forbidden) + } + } catch (e: Error) { + val navIdent = getNAVIdentFromToken(token) + log.error("Feil under tildeling av bruker for navIdent=$navIdent, ${e.message}", e.cause) + call.respond(HttpStatusCode.InternalServerError) + } + } + get("/personer/single") { try { val token = getBearerHeader() diff --git a/src/test/kotlin/no/nav/syfo/personstatus/api/v2/PersontildelingApiV2Spek.kt b/src/test/kotlin/no/nav/syfo/personstatus/api/v2/PersontildelingApiV2Spek.kt index c6e5e051..286bf773 100644 --- a/src/test/kotlin/no/nav/syfo/personstatus/api/v2/PersontildelingApiV2Spek.kt +++ b/src/test/kotlin/no/nav/syfo/personstatus/api/v2/PersontildelingApiV2Spek.kt @@ -12,6 +12,7 @@ import no.nav.syfo.personstatus.db.* import no.nav.syfo.testutil.* import no.nav.syfo.testutil.UserConstants.ARBEIDSTAKER_2_FNR import no.nav.syfo.testutil.UserConstants.ARBEIDSTAKER_FNR +import no.nav.syfo.testutil.UserConstants.ARBEIDSTAKER_NO_ACCESS import no.nav.syfo.testutil.UserConstants.NAV_ENHET import no.nav.syfo.testutil.UserConstants.VEILEDER_ID import no.nav.syfo.util.NAV_PERSONIDENT_HEADER @@ -66,35 +67,80 @@ object PersontildelingApiV2Spek : Spek({ } describe("/personer") { - it("returns person with correct values") { - val tilknytning = VeilederBrukerKnytning(VEILEDER_ID, ARBEIDSTAKER_FNR) - database.lagreVeilederForBruker(tilknytning) + describe("GET veilederknytning for person") { + it("returns person with correct values") { + val tilknytning = VeilederBrukerKnytning(VEILEDER_ID, ARBEIDSTAKER_FNR) + database.lagreVeilederForBruker(tilknytning) - val url = "$personTildelingApiV2Path/personer/single" - with( - handleRequest(HttpMethod.Get, url) { - addHeader(HttpHeaders.Authorization, bearerHeader(validToken)) - addHeader(NAV_PERSONIDENT_HEADER, ARBEIDSTAKER_FNR) + val url = "$personTildelingApiV2Path/personer/single" + with( + handleRequest(HttpMethod.Get, url) { + addHeader(HttpHeaders.Authorization, bearerHeader(validToken)) + addHeader(NAV_PERSONIDENT_HEADER, ARBEIDSTAKER_FNR) + } + ) { + response.status() shouldBeEqualTo HttpStatusCode.OK + val personinfo = objectMapper.readValue(response.content!!) + personinfo.tildeltVeilederident shouldBeEqualTo tilknytning.veilederIdent + personinfo.personident.value shouldBeEqualTo tilknytning.fnr } - ) { - response.status() shouldBeEqualTo HttpStatusCode.OK - val personinfo = objectMapper.readValue(response.content!!) - personinfo.tildeltVeilederident shouldBeEqualTo tilknytning.veilederIdent - personinfo.personident.value shouldBeEqualTo tilknytning.fnr } - } - it("returns 404 when person does not exist") { - val tilknytning = VeilederBrukerKnytning(VEILEDER_ID, ARBEIDSTAKER_FNR) - database.lagreVeilederForBruker(tilknytning) + it("returns 404 when person does not exist") { + val tilknytning = VeilederBrukerKnytning(VEILEDER_ID, ARBEIDSTAKER_FNR) + database.lagreVeilederForBruker(tilknytning) + val url = "$personTildelingApiV2Path/personer/single" + with( + handleRequest(HttpMethod.Get, url) { + addHeader(HttpHeaders.Authorization, bearerHeader(validToken)) + addHeader(NAV_PERSONIDENT_HEADER, ARBEIDSTAKER_2_FNR) + } + ) { + response.status() shouldBeEqualTo HttpStatusCode.NoContent + } + } + } + describe("POST veilederknytning for person") { val url = "$personTildelingApiV2Path/personer/single" - with( - handleRequest(HttpMethod.Get, url) { - addHeader(HttpHeaders.Authorization, bearerHeader(validToken)) - addHeader(NAV_PERSONIDENT_HEADER, ARBEIDSTAKER_2_FNR) + + val veilederBrukerKnytning = VeilederBrukerKnytning(VEILEDER_ID, ARBEIDSTAKER_FNR) + + it("returns OK when request is successful") { + with( + handleRequest(HttpMethod.Post, url) { + addHeader(HttpHeaders.ContentType, ContentType.Application.Json.toString()) + addHeader(HttpHeaders.Authorization, bearerHeader(validToken)) + setBody(objectMapper.writeValueAsString(veilederBrukerKnytning)) + } + ) { + response.status() shouldBeEqualTo HttpStatusCode.OK + + val person = database.getPersonOversiktStatusList(fnr = veilederBrukerKnytning.fnr).first() + person.veilederIdent shouldBeEqualTo veilederBrukerKnytning.veilederIdent + } + } + + it("returns Unauthorized when missing token") { + with( + handleRequest(HttpMethod.Post, url) { + addHeader(HttpHeaders.ContentType, ContentType.Application.Json.toString()) + setBody(objectMapper.writeValueAsString(veilederBrukerKnytning)) + } + ) { + response.status() shouldBeEqualTo HttpStatusCode.Unauthorized + } + } + + it("returns Forbidden when no access to person") { + with( + handleRequest(HttpMethod.Post, url) { + addHeader(HttpHeaders.ContentType, ContentType.Application.Json.toString()) + addHeader(HttpHeaders.Authorization, bearerHeader(validToken)) + setBody(objectMapper.writeValueAsString(VeilederBrukerKnytning(VEILEDER_ID, ARBEIDSTAKER_NO_ACCESS))) + } + ) { + response.status() shouldBeEqualTo HttpStatusCode.Forbidden } - ) { - response.status() shouldBeEqualTo HttpStatusCode.NoContent } } } diff --git a/src/test/kotlin/no/nav/syfo/testutil/UserConstants.kt b/src/test/kotlin/no/nav/syfo/testutil/UserConstants.kt index fa34ab29..f5ba8812 100644 --- a/src/test/kotlin/no/nav/syfo/testutil/UserConstants.kt +++ b/src/test/kotlin/no/nav/syfo/testutil/UserConstants.kt @@ -10,6 +10,7 @@ object UserConstants { const val ARBEIDSTAKER_2_FNR = "12345678911" const val ARBEIDSTAKER_3_FNR = "12345678913" const val ARBEIDSTAKER_4_FNR_WITH_ERROR = "12345678666" + const val ARBEIDSTAKER_NO_ACCESS = "12345678915" val ARBEIDSTAKER_NO_NAME_FNR = ARBEIDSTAKER_FNR.replace("2", "1") val ARBEIDSTAKER_ENHET_ERROR_PERSONIDENT = PersonIdent(ARBEIDSTAKER_FNR.replace("2", "3")) diff --git a/src/test/kotlin/no/nav/syfo/testutil/mock/VeilederTilgangskontrollMock.kt b/src/test/kotlin/no/nav/syfo/testutil/mock/VeilederTilgangskontrollMock.kt index 59bb87a2..4ffbda5f 100644 --- a/src/test/kotlin/no/nav/syfo/testutil/mock/VeilederTilgangskontrollMock.kt +++ b/src/test/kotlin/no/nav/syfo/testutil/mock/VeilederTilgangskontrollMock.kt @@ -5,6 +5,7 @@ import io.ktor.client.request.* import io.ktor.http.* import no.nav.syfo.personstatus.infrastructure.clients.veiledertilgang.Tilgang import no.nav.syfo.testutil.UserConstants +import no.nav.syfo.util.NAV_PERSONIDENT_HEADER suspend fun MockRequestHandleScope.tilgangskontrollResponse(request: HttpRequestData): HttpResponseData { val responseAccess = Tilgang(erGodkjent = true) @@ -18,7 +19,15 @@ suspend fun MockRequestHandleScope.tilgangskontrollResponse(request: HttpRequest return when { requestUrl.endsWith("tilgang/navident/person") -> { - respondOk(responseAccess) + val personident = request.headers[NAV_PERSONIDENT_HEADER] + when (personident) { + UserConstants.ARBEIDSTAKER_NO_ACCESS -> { + respondOk(body = Tilgang(erGodkjent = false)) + } + else -> { + respondOk(responseAccess) + } + } } requestUrl.endsWith("tilgang/navident/brukere") -> { respondOk(responseAccessPersons)