From 0ba57b13d9d8c32a53b023a0b0f61526a5023f91 Mon Sep 17 00:00:00 2001 From: Eirik Dahlen Date: Thu, 8 Aug 2024 17:24:33 +0200 Subject: [PATCH] IS-2577: Add dokarkivclient for journalforing --- .nais/naiserator-dev.yaml | 4 + .nais/naiserator-prod.yaml | 4 + .../no/nav/syfo/ApplicationEnvironment.kt | 4 + .../domain/ManglendeMedvirkningVurdering.kt | 17 +++ .../clients/ClientsEnvironment.kt | 1 + .../clients/dokarkiv/DokarkivClient.kt | 103 ++++++++++++++++++ .../clients/dokarkiv/dto/AvsenderMottaker.kt | 19 ++++ .../clients/dokarkiv/dto/Bruker.kt | 22 ++++ .../clients/dokarkiv/dto/Dokument.kt | 28 +++++ .../clients/dokarkiv/dto/DokumentInfo.kt | 7 ++ .../clients/dokarkiv/dto/Dokumentvariant.kt | 63 +++++++++++ .../dokarkiv/dto/JournalpostRequest.kt | 25 +++++ .../dokarkiv/dto/JournalpostResponse.kt | 9 ++ .../clients/dokarkiv/dto/Sak.kt | 9 ++ .../no/nav/syfo/ExternalMockEnvironment.kt | 12 ++ .../kotlin/no/nav/syfo/TestEnvironment.kt | 4 + src/test/kotlin/no/nav/syfo/UserConstants.kt | 7 ++ .../generator/JournalpostRequestGenerator.kt | 40 +++++++ .../dokarkiv/DokarkivClientSpek.kt | 56 ++++++++++ .../syfo/infrastructure/mock/DokarkivMock.kt | 31 ++++++ .../infrastructure/mock/MockHttpClient.kt | 1 + 21 files changed, 466 insertions(+) create mode 100644 src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/DokarkivClient.kt create mode 100644 src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/AvsenderMottaker.kt create mode 100644 src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/Bruker.kt create mode 100644 src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/Dokument.kt create mode 100644 src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/DokumentInfo.kt create mode 100644 src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/Dokumentvariant.kt create mode 100644 src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/JournalpostRequest.kt create mode 100644 src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/JournalpostResponse.kt create mode 100644 src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/Sak.kt create mode 100644 src/test/kotlin/no/nav/syfo/generator/JournalpostRequestGenerator.kt create mode 100644 src/test/kotlin/no/nav/syfo/infrastructure/dokarkiv/DokarkivClientSpek.kt create mode 100644 src/test/kotlin/no/nav/syfo/infrastructure/mock/DokarkivMock.kt diff --git a/.nais/naiserator-dev.yaml b/.nais/naiserator-dev.yaml index 13abb01..1b150dc 100644 --- a/.nais/naiserator-dev.yaml +++ b/.nais/naiserator-dev.yaml @@ -78,3 +78,7 @@ spec: value: "dev-fss.pdl.pdl-api" - name: PDL_URL value: "https://pdl-api.dev-fss-pub.nais.io/graphql" + - name: DOKARKIV_CLIENT_ID + value: "dev-fss.teamdokumenthandtering.dokarkiv-q1" + - name: DOKARKIV_URL + value: "https://dokarkiv.dev-fss-pub.nais.io" diff --git a/.nais/naiserator-prod.yaml b/.nais/naiserator-prod.yaml index 7c3b2bd..7a3877b 100644 --- a/.nais/naiserator-prod.yaml +++ b/.nais/naiserator-prod.yaml @@ -78,3 +78,7 @@ spec: value: "prod-fss.pdl.pdl-api" - name: PDL_URL value: "https://pdl-api.prod-fss-pub.nais.io/graphql" + - name: DOKARKIV_CLIENT_ID + value: "prod-fss.teamdokumenthandtering.dokarkiv" + - name: DOKARKIV_URL + value: "https://dokarkiv.prod-fss-pub.nais.io" diff --git a/src/main/kotlin/no/nav/syfo/ApplicationEnvironment.kt b/src/main/kotlin/no/nav/syfo/ApplicationEnvironment.kt index 5dd2262..65042e4 100644 --- a/src/main/kotlin/no/nav/syfo/ApplicationEnvironment.kt +++ b/src/main/kotlin/no/nav/syfo/ApplicationEnvironment.kt @@ -34,6 +34,10 @@ data class Environment( baseUrl = getEnvVar("PDL_URL"), clientId = getEnvVar("PDL_CLIENT_ID") ), + dokarkiv = ClientEnvironment( + baseUrl = getEnvVar("DOKARKIV_URL"), + clientId = getEnvVar("DOKARKIV_CLIENT_ID") + ), ), ) diff --git a/src/main/kotlin/no/nav/syfo/domain/ManglendeMedvirkningVurdering.kt b/src/main/kotlin/no/nav/syfo/domain/ManglendeMedvirkningVurdering.kt index 0e38fbd..e44d458 100644 --- a/src/main/kotlin/no/nav/syfo/domain/ManglendeMedvirkningVurdering.kt +++ b/src/main/kotlin/no/nav/syfo/domain/ManglendeMedvirkningVurdering.kt @@ -71,3 +71,20 @@ data class Varsel( val createdAt: OffsetDateTime, val svarfrist: LocalDate, ) + +fun Status.getDokumentTittel(): String = when (this) { + Status.FORHANDSVARSEL -> "Forhåndsvarsel om stans av sykepenger" + Status.OPPFYLT, Status.IKKE_AKTUELL -> "Vurdering av § 8-8 manglende medvirkning" + Status.STANS -> "Innstilling om stans" +} + +fun Status.getBrevkode(): BrevkodeType = when (this) { + Status.FORHANDSVARSEL -> BrevkodeType.MANGLENDE_MEDVIRKNING_FORHANDSVARSEL + Status.OPPFYLT, Status.IKKE_AKTUELL -> BrevkodeType.MANGLENDE_MEDVIRKNING_VURDERING + Status.STANS -> BrevkodeType.MANGLENDE_MEDVIRKNING_STANS +} + +fun Status.getJournalpostType(): JournalpostType = when (this) { + Status.FORHANDSVARSEL, Status.OPPFYLT, Status.IKKE_AKTUELL -> JournalpostType.UTGAAENDE + Status.STANS -> JournalpostType.NOTAT +} diff --git a/src/main/kotlin/no/nav/syfo/infrastructure/clients/ClientsEnvironment.kt b/src/main/kotlin/no/nav/syfo/infrastructure/clients/ClientsEnvironment.kt index 4359df9..de832bc 100644 --- a/src/main/kotlin/no/nav/syfo/infrastructure/clients/ClientsEnvironment.kt +++ b/src/main/kotlin/no/nav/syfo/infrastructure/clients/ClientsEnvironment.kt @@ -3,6 +3,7 @@ package no.nav.syfo.infrastructure.clients data class ClientsEnvironment( val istilgangskontroll: ClientEnvironment, val pdl: ClientEnvironment, + val dokarkiv: ClientEnvironment, ) data class ClientEnvironment( diff --git a/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/DokarkivClient.kt b/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/DokarkivClient.kt new file mode 100644 index 0000000..851f82e --- /dev/null +++ b/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/DokarkivClient.kt @@ -0,0 +1,103 @@ +package no.nav.syfo.infrastructure.clients.dokarkiv + +import io.ktor.client.* +import io.ktor.client.call.* +import io.ktor.client.plugins.* +import io.ktor.client.request.* +import io.ktor.client.statement.* +import io.ktor.http.* +import io.micrometer.core.instrument.Counter +import net.logstash.logback.argument.StructuredArguments +import no.nav.syfo.infrastructure.clients.ClientEnvironment +import no.nav.syfo.infrastructure.clients.azuread.AzureAdClient +import no.nav.syfo.infrastructure.bearerHeader +import no.nav.syfo.infrastructure.clients.dokarkiv.dto.JournalpostRequest +import no.nav.syfo.infrastructure.clients.dokarkiv.dto.JournalpostResponse +import no.nav.syfo.infrastructure.clients.httpClientDefault +import no.nav.syfo.infrastructure.metric.METRICS_NS +import no.nav.syfo.infrastructure.metric.METRICS_REGISTRY +import org.slf4j.LoggerFactory + +class DokarkivClient( + private val azureAdClient: AzureAdClient, + private val dokarkivEnvironment: ClientEnvironment, + private val httpClient: HttpClient = httpClientDefault(), +) { + private val journalpostUrl: String = "${dokarkivEnvironment.baseUrl}$JOURNALPOST_PATH" + + suspend fun journalfor( + journalpostRequest: JournalpostRequest, + ): JournalpostResponse { + val token = azureAdClient.getSystemToken(dokarkivEnvironment.clientId)?.accessToken + ?: throw RuntimeException("Failed to Journalfor Journalpost: No token was found") + return try { + val response: HttpResponse = httpClient.post(journalpostUrl) { + parameter(JOURNALPOST_PARAM_STRING, JOURNALPOST_PARAM_VALUE) + header(HttpHeaders.Authorization, bearerHeader(token)) + accept(ContentType.Application.Json) + contentType(ContentType.Application.Json) + setBody(journalpostRequest) + } + val journalpostResponse = response.body() + Metrics.COUNT_CALL_DOKARKIV_JOURNALPOST_SUCCESS.increment() + journalpostResponse + } catch (e: ClientRequestException) { + if (e.response.status == HttpStatusCode.Conflict) { + val journalpostResponse = e.response.body() + log.warn("Journalpost med id ${journalpostResponse.journalpostId} lagret fra før (409 Conflict)") + Metrics.COUNT_CALL_DOKARKIV_JOURNALPOST_CONFLICT.increment() + journalpostResponse + } else { + handleUnexpectedResponseException(e.response, e.message) + throw e + } + } catch (e: ServerResponseException) { + handleUnexpectedResponseException(e.response, e.message) + throw e + } + } + + private fun handleUnexpectedResponseException( + response: HttpResponse, + message: String?, + ) { + log.error( + "Error while requesting Dokarkiv to Journalpost PDF with {}, {}", + StructuredArguments.keyValue("statusCode", response.status.value.toString()), + StructuredArguments.keyValue("message", message), + ) + Metrics.COUNT_CALL_DOKARKIV_JOURNALPOST_FAIL.increment() + } + + companion object { + private const val JOURNALPOST_PATH = "/rest/journalpostapi/v1/journalpost" + private const val JOURNALPOST_PARAM_STRING = "forsoekFerdigstill" + private const val JOURNALPOST_PARAM_VALUE = true + private val log = LoggerFactory.getLogger(DokarkivClient::class.java) + } +} + +private class Metrics { + companion object { + const val CALL_DOKARKIV_BASE = "${METRICS_NS}_call_dokarkiv" + + const val CALL_DOKARKIV_JOURNALPOST_BASE = "${CALL_DOKARKIV_BASE}_journalpost" + const val CALL_DOKARKIV_JOURNALPOST_SUCCESS = "${CALL_DOKARKIV_JOURNALPOST_BASE}_success_count" + const val CALL_DOKARKIV_JOURNALPOST_FAIL = "${CALL_DOKARKIV_JOURNALPOST_BASE}_fail_count" + + val COUNT_CALL_DOKARKIV_JOURNALPOST_SUCCESS: Counter = Counter + .builder(CALL_DOKARKIV_JOURNALPOST_SUCCESS) + .description("Counts the number of successful calls to Dokarkiv - Journalpost") + .register(METRICS_REGISTRY) + val COUNT_CALL_DOKARKIV_JOURNALPOST_FAIL: Counter = Counter + .builder(CALL_DOKARKIV_JOURNALPOST_FAIL) + .description("Counts the number of failed calls to Dokarkiv - Journalpost") + .register(METRICS_REGISTRY) + + const val CALL_DOKARKIV_JOURNALPOST_CONFLICT = "${CALL_DOKARKIV_JOURNALPOST_BASE}_conflict_count" + val COUNT_CALL_DOKARKIV_JOURNALPOST_CONFLICT: Counter = Counter + .builder(CALL_DOKARKIV_JOURNALPOST_CONFLICT) + .description("Counts the number of calls to Dokarkiv - Journalpost resulting in 409 Conflict") + .register(METRICS_REGISTRY) + } +} diff --git a/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/AvsenderMottaker.kt b/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/AvsenderMottaker.kt new file mode 100644 index 0000000..1183836 --- /dev/null +++ b/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/AvsenderMottaker.kt @@ -0,0 +1,19 @@ +package no.nav.syfo.infrastructure.clients.dokarkiv.dto + +data class AvsenderMottaker private constructor( + val id: String?, + val idType: String?, + val navn: String? = null, +) { + companion object { + fun create( + id: String?, + idType: BrukerIdType?, + navn: String? = null, + ) = AvsenderMottaker( + id = id, + idType = idType?.value, + navn = navn + ) + } +} diff --git a/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/Bruker.kt b/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/Bruker.kt new file mode 100644 index 0000000..a4ed2ea --- /dev/null +++ b/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/Bruker.kt @@ -0,0 +1,22 @@ +package no.nav.syfo.infrastructure.clients.dokarkiv.dto + +enum class BrukerIdType( + val value: String, +) { + PERSON_IDENT("FNR"), +} + +data class Bruker private constructor( + val id: String, + val idType: String, +) { + companion object { + fun create( + id: String, + idType: BrukerIdType, + ) = Bruker( + id = id, + idType = idType.value + ) + } +} diff --git a/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/Dokument.kt b/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/Dokument.kt new file mode 100644 index 0000000..194b061 --- /dev/null +++ b/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/Dokument.kt @@ -0,0 +1,28 @@ +package no.nav.syfo.infrastructure.clients.dokarkiv.dto + +enum class BrevkodeType( + val value: String, +) { + MANGLENDE_MEDVIRKNING_FORHANDSVARSEL("OPPF_MANGLENDE_MEDVIRKNING_FORHANDSVARSEL"), + MANGLENDE_MEDVIRKNING_VURDERING("OPPF_MANGLENDE_MEDVIRKNING_VURDERING"), + MANGLENDE_MEDVIRKNING_STANS("OPPF_MANGLENDE_MEDVIRKNING_STANS"), +} + +data class Dokument private constructor( + val brevkode: String, + val dokumentKategori: String? = null, + val dokumentvarianter: List, + val tittel: String? = null, +) { + companion object { + fun create( + brevkode: BrevkodeType, + dokumentvarianter: List, + tittel: String? = null, + ) = Dokument( + brevkode = brevkode.value, + dokumentvarianter = dokumentvarianter, + tittel = tittel, + ) + } +} diff --git a/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/DokumentInfo.kt b/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/DokumentInfo.kt new file mode 100644 index 0000000..ad12225 --- /dev/null +++ b/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/DokumentInfo.kt @@ -0,0 +1,7 @@ +package no.nav.syfo.infrastructure.clients.dokarkiv.dto + +data class DokumentInfo( + val brevkode: String? = null, + val dokumentInfoId: Int? = null, + val tittel: String? = null, +) diff --git a/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/Dokumentvariant.kt b/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/Dokumentvariant.kt new file mode 100644 index 0000000..d5194c5 --- /dev/null +++ b/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/Dokumentvariant.kt @@ -0,0 +1,63 @@ +package no.nav.syfo.infrastructure.clients.dokarkiv.dto + +enum class FiltypeType( + val value: String, +) { + PDFA("PDFA"), +} + +enum class VariantformatType( + val value: String, +) { + ARKIV("ARKIV"), +} + +const val DOKUMENTVARIANT_FILNAVN_MAX_LENGTH = 200 + +data class Dokumentvariant private constructor( + val filnavn: String, + val filtype: String, + val fysiskDokument: ByteArray, + val variantformat: String, +) { + companion object { + fun create( + filnavn: String, + filtype: FiltypeType, + fysiskDokument: ByteArray, + variantformat: VariantformatType, + ): Dokumentvariant { + if ((filnavn.length + filtype.value.length) >= DOKUMENTVARIANT_FILNAVN_MAX_LENGTH) { + throw IllegalArgumentException("Filnavn of Dokumentvariant is too long, max size is $DOKUMENTVARIANT_FILNAVN_MAX_LENGTH") + } + return Dokumentvariant( + filnavn = filnavn, + filtype = filtype.value, + fysiskDokument = fysiskDokument, + variantformat = variantformat.value, + ) + } + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as Dokumentvariant + + if (filnavn != other.filnavn) return false + if (filtype != other.filtype) return false + if (!fysiskDokument.contentEquals(other.fysiskDokument)) return false + if (variantformat != other.variantformat) return false + + return true + } + + override fun hashCode(): Int { + var result = filnavn.hashCode() + result = 31 * result + filtype.hashCode() + result = 31 * result + fysiskDokument.contentHashCode() + result = 31 * result + variantformat.hashCode() + return result + } +} diff --git a/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/JournalpostRequest.kt b/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/JournalpostRequest.kt new file mode 100644 index 0000000..bbba88d --- /dev/null +++ b/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/JournalpostRequest.kt @@ -0,0 +1,25 @@ +package no.nav.syfo.infrastructure.clients.dokarkiv.dto + +const val JOURNALFORENDE_ENHET = 9999 + +enum class JournalpostType { + UTGAAENDE, + NOTAT, +} + +enum class JournalpostTema(val value: String) { + OPPFOLGING("OPP"), +} + +data class JournalpostRequest( + val avsenderMottaker: AvsenderMottaker, + val tittel: String, + val bruker: Bruker? = null, + val dokumenter: List, + val journalfoerendeEnhet: Int? = JOURNALFORENDE_ENHET, + val journalpostType: String, + val tema: String = JournalpostTema.OPPFOLGING.value, + val sak: Sak = Sak(), + val eksternReferanseId: String, + val overstyrInnsynsregler: String? = null, +) diff --git a/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/JournalpostResponse.kt b/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/JournalpostResponse.kt new file mode 100644 index 0000000..7326998 --- /dev/null +++ b/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/JournalpostResponse.kt @@ -0,0 +1,9 @@ +package no.nav.syfo.infrastructure.clients.dokarkiv.dto + +data class JournalpostResponse( + val dokumenter: List? = null, + val journalpostId: Int, + val journalpostferdigstilt: Boolean? = null, + val journalstatus: String, + val melding: String? = null, +) diff --git a/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/Sak.kt b/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/Sak.kt new file mode 100644 index 0000000..3e50aed --- /dev/null +++ b/src/main/kotlin/no/nav/syfo/infrastructure/clients/dokarkiv/dto/Sak.kt @@ -0,0 +1,9 @@ +package no.nav.syfo.infrastructure.clients.dokarkiv.dto + +enum class SaksType(val value: String) { + GENERELL("GENERELL_SAK"), +} + +data class Sak( + val sakstype: String = SaksType.GENERELL.value, +) diff --git a/src/test/kotlin/no/nav/syfo/ExternalMockEnvironment.kt b/src/test/kotlin/no/nav/syfo/ExternalMockEnvironment.kt index 53d74a8..8756953 100644 --- a/src/test/kotlin/no/nav/syfo/ExternalMockEnvironment.kt +++ b/src/test/kotlin/no/nav/syfo/ExternalMockEnvironment.kt @@ -1,6 +1,8 @@ package no.nav.syfo import no.nav.syfo.infrastructure.clients.azuread.AzureAdClient +import no.nav.syfo.infrastructure.clients.dokarkiv.DokarkivClient +import no.nav.syfo.infrastructure.clients.pdl.PdlClient import no.nav.syfo.infrastructure.clients.wellknown.WellKnown import no.nav.syfo.infrastructure.database.TestDatabase import no.nav.syfo.infrastructure.mock.mockHttpClient @@ -25,6 +27,16 @@ class ExternalMockEnvironment private constructor() { azureEnvironment = environment.azure, httpClient = mockHttpClient, ) + val pdlClient = PdlClient( + azureAdClient = azureAdClient, + pdlEnvironment = environment.clients.pdl, + httpClient = mockHttpClient, + ) + val dokarkivClient = DokarkivClient( + azureAdClient = azureAdClient, + dokarkivEnvironment = environment.clients.dokarkiv, + httpClient = mockHttpClient, + ) companion object { val instance: ExternalMockEnvironment = ExternalMockEnvironment() diff --git a/src/test/kotlin/no/nav/syfo/TestEnvironment.kt b/src/test/kotlin/no/nav/syfo/TestEnvironment.kt index ab6b918..6cfb998 100644 --- a/src/test/kotlin/no/nav/syfo/TestEnvironment.kt +++ b/src/test/kotlin/no/nav/syfo/TestEnvironment.kt @@ -29,6 +29,10 @@ fun testEnvironment() = Environment( baseUrl = "pdlUrl", clientId = "pdlClientId", ), + dokarkiv = ClientEnvironment( + baseUrl = "dokarkivUrl", + clientId = "dokarkivClientId", + ) ), electorPath = "electorPath", ) diff --git a/src/test/kotlin/no/nav/syfo/UserConstants.kt b/src/test/kotlin/no/nav/syfo/UserConstants.kt index d5b0ce6..214cb47 100644 --- a/src/test/kotlin/no/nav/syfo/UserConstants.kt +++ b/src/test/kotlin/no/nav/syfo/UserConstants.kt @@ -1,6 +1,7 @@ package no.nav.syfo import no.nav.syfo.domain.Personident +import java.util.* object UserConstants { val ARBEIDSTAKER_PERSONIDENT = Personident("12345678910") @@ -16,4 +17,10 @@ object UserConstants { const val PERSON_FULLNAME = "Fornavn Mellomnavn Etternavnesen" const val PERSON_FORNAVN_DASH = "For-Navn" const val PERSON_FULLNAME_DASH = "For-Navn Mellomnavn Etternavnesen" + + val PDF_FORHANDSVARSEL = byteArrayOf(0x2E, 0x28) + val PDF_VURDERING = byteArrayOf(0x2E, 0x30) + val PDF_STANS = byteArrayOf(0x2E, 0x32) + + val EXISTING_EKSTERN_REFERANSE_UUID: UUID = UUID.fromString("e7e8e9e0-e1e2-e3e4-e5e6-e7e8e9e0e1e2") } diff --git a/src/test/kotlin/no/nav/syfo/generator/JournalpostRequestGenerator.kt b/src/test/kotlin/no/nav/syfo/generator/JournalpostRequestGenerator.kt new file mode 100644 index 0000000..af8c260 --- /dev/null +++ b/src/test/kotlin/no/nav/syfo/generator/JournalpostRequestGenerator.kt @@ -0,0 +1,40 @@ +package no.nav.syfo.generator + +import no.nav.syfo.UserConstants +import no.nav.syfo.infrastructure.clients.dokarkiv.dto.* +import java.util.UUID + +fun generateJournalpostRequest( + tittel: String, + brevkodeType: BrevkodeType, + pdf: ByteArray, + vurderingUuid: UUID, + journalpostType: String = JournalpostType.UTGAAENDE.name, +) = JournalpostRequest( + avsenderMottaker = AvsenderMottaker.create( + id = UserConstants.ARBEIDSTAKER_PERSONIDENT.value, + idType = BrukerIdType.PERSON_IDENT, + navn = UserConstants.PERSON_FULLNAME, + ), + bruker = Bruker.create( + id = UserConstants.ARBEIDSTAKER_PERSONIDENT.value, + idType = BrukerIdType.PERSON_IDENT + ), + tittel = tittel, + dokumenter = listOf( + Dokument.create( + brevkode = brevkodeType, + tittel = tittel, + dokumentvarianter = listOf( + Dokumentvariant.create( + filnavn = tittel, + filtype = FiltypeType.PDFA, + fysiskDokument = pdf, + variantformat = VariantformatType.ARKIV, + ) + ), + ) + ), + journalpostType = journalpostType, + eksternReferanseId = vurderingUuid.toString(), +) diff --git a/src/test/kotlin/no/nav/syfo/infrastructure/dokarkiv/DokarkivClientSpek.kt b/src/test/kotlin/no/nav/syfo/infrastructure/dokarkiv/DokarkivClientSpek.kt new file mode 100644 index 0000000..e1599a9 --- /dev/null +++ b/src/test/kotlin/no/nav/syfo/infrastructure/dokarkiv/DokarkivClientSpek.kt @@ -0,0 +1,56 @@ +package no.nav.syfo.infrastructure.dokarkiv + +import kotlinx.coroutines.runBlocking +import no.nav.syfo.ExternalMockEnvironment +import no.nav.syfo.UserConstants.EXISTING_EKSTERN_REFERANSE_UUID +import no.nav.syfo.UserConstants.PDF_FORHANDSVARSEL +import no.nav.syfo.generator.generateJournalpostRequest +import no.nav.syfo.infrastructure.clients.dokarkiv.DokarkivClient +import no.nav.syfo.infrastructure.clients.dokarkiv.dto.BrevkodeType +import no.nav.syfo.infrastructure.mock.dokarkivConflictResponse +import org.amshove.kluent.shouldBeEqualTo +import org.spekframework.spek2.Spek +import org.spekframework.spek2.style.specification.describe +import java.util.* + +class DokarkivClientSpek : Spek({ + val externalMockEnvironment = ExternalMockEnvironment.instance + val dokarkivClient = externalMockEnvironment.dokarkivClient + + describe(DokarkivClient::class.java.simpleName) { + + it("journalfører forhåndsvarsel") { + val journalpostRequestForhandsvarsel = generateJournalpostRequest( + tittel = "Forhåndsvarsel om stans av sykepenger", + brevkodeType = BrevkodeType.MANGLENDE_MEDVIRKNING_FORHANDSVARSEL, + pdf = PDF_FORHANDSVARSEL, + vurderingUuid = UUID.randomUUID(), + ) + + runBlocking { + val response = dokarkivClient.journalfor( + journalpostRequest = journalpostRequestForhandsvarsel, + ) + + response.journalpostId shouldBeEqualTo 1 + } + } + + it("handles conflict from api when eksternRefeanseId exists, and uses the existing journalpostId") { + val journalpostRequestForhandsvarsel = generateJournalpostRequest( + tittel = "Forhåndsvarsel om stans av sykepenger", + brevkodeType = BrevkodeType.MANGLENDE_MEDVIRKNING_FORHANDSVARSEL, + pdf = PDF_FORHANDSVARSEL, + vurderingUuid = EXISTING_EKSTERN_REFERANSE_UUID, + ) + + runBlocking { + val journalpostResponse = + dokarkivClient.journalfor(journalpostRequest = journalpostRequestForhandsvarsel) + + journalpostResponse.journalpostId shouldBeEqualTo dokarkivConflictResponse.journalpostId + journalpostResponse.journalstatus shouldBeEqualTo dokarkivConflictResponse.journalstatus + } + } + } +}) diff --git a/src/test/kotlin/no/nav/syfo/infrastructure/mock/DokarkivMock.kt b/src/test/kotlin/no/nav/syfo/infrastructure/mock/DokarkivMock.kt new file mode 100644 index 0000000..a42ed29 --- /dev/null +++ b/src/test/kotlin/no/nav/syfo/infrastructure/mock/DokarkivMock.kt @@ -0,0 +1,31 @@ +package no.nav.syfo.infrastructure.mock + +import io.ktor.client.engine.mock.* +import io.ktor.client.request.* +import io.ktor.http.* +import no.nav.syfo.UserConstants +import no.nav.syfo.infrastructure.clients.dokarkiv.dto.JournalpostRequest +import no.nav.syfo.infrastructure.clients.dokarkiv.dto.JournalpostResponse + +const val mockedJournalpostId = 1 +val dokarkivResponse = JournalpostResponse( + journalpostId = mockedJournalpostId, + journalpostferdigstilt = true, + journalstatus = "status", +) + +val dokarkivConflictResponse = JournalpostResponse( + journalpostId = 2, + journalpostferdigstilt = true, + journalstatus = "conflict", +) + +suspend fun MockRequestHandleScope.dokarkivMockResponse(request: HttpRequestData): HttpResponseData { + val journalpostRequest = request.receiveBody() + val eksternReferanseId = journalpostRequest.eksternReferanseId + + return when (eksternReferanseId) { + UserConstants.EXISTING_EKSTERN_REFERANSE_UUID.toString() -> respond(dokarkivConflictResponse, HttpStatusCode.Conflict) + else -> respond(dokarkivResponse) + } +} diff --git a/src/test/kotlin/no/nav/syfo/infrastructure/mock/MockHttpClient.kt b/src/test/kotlin/no/nav/syfo/infrastructure/mock/MockHttpClient.kt index ee4bec3..89c540e 100644 --- a/src/test/kotlin/no/nav/syfo/infrastructure/mock/MockHttpClient.kt +++ b/src/test/kotlin/no/nav/syfo/infrastructure/mock/MockHttpClient.kt @@ -16,6 +16,7 @@ fun mockHttpClient(environment: Environment) = HttpClient(MockEngine) { request ) requestUrl.startsWith("/${environment.clients.pdl.baseUrl}") -> pdlMockResponse(request) + requestUrl.startsWith("/${environment.clients.dokarkiv.baseUrl}") -> dokarkivMockResponse(request) else -> error("Unhandled ${request.url.encodedPath}") } }