Skip to content

Commit a0f3b59

Browse files
committed
Test for dialogportenservice
1 parent 0c821d0 commit a0f3b59

File tree

11 files changed

+170
-42
lines changed

11 files changed

+170
-42
lines changed

.nais/dev.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ spec:
5959
- name: DIALOGPORTEN_SCOPE
6060
value: "digdir:dialogporten.serviceprovider"
6161
- name: NAV_ARBEIDSGIVER_API_BASEURL
62-
value: "https://sykepenger-im-lps-api.ekstern.dev.nav.no"
62+
value: "https://sykepenger-api.ekstern.dev.nav.no"
6363
- name: DIALOG_KAFKA_TOPIC
6464
value: helsearbeidsgiver.dialog
6565

src/main/kotlin/App.kt

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,14 @@ fun startServer() {
3232
logger.info("Setter opp DialogportenService...")
3333
val dialogportenClient =
3434
DialogportenClient(
35-
baseUrl = Env.altinnBaseUrl,
36-
ressurs = Env.altinnImRessurs,
35+
baseUrl = Env.Altinn.altinnBaseUrl,
36+
ressurs = Env.Altinn.altinnImRessurs,
3737
getToken = authClient.dialogportenTokenGetter(),
3838
)
3939

40+
logger.info("Setter opp DialogRepository...")
41+
val dialogRepository = DialogRepository(database.db)
42+
4043
logger.info("Starter server...")
4144
embeddedServer(
4245
factory = Netty,
@@ -46,7 +49,11 @@ fun startServer() {
4649
meldingTolker =
4750
MeldingTolker(
4851
unleashFeatureToggles = unleashFeatureToggles,
49-
dialogportenService = DialogportenService(dialogportenClient),
52+
dialogportenService =
53+
DialogportenService(
54+
dialogportenClient,
55+
dialogRepository,
56+
),
5057
),
5158
)
5259
},

src/main/kotlin/Env.kt

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,19 @@ object Env {
2828
val name = "${databasePrefix}_DATABASE".fromEnv()
2929
}
3030

31-
val navArbeidsgiverApiBaseUrl = "NAV_ARBEIDSGIVER_API_BASEURL".fromEnv()
32-
val altinnBaseUrl = "ALTINN_3_BASE_URL".fromEnv()
33-
val altinnImRessurs = "ALTINN_IM_RESSURS".fromEnv()
34-
val tokenEndpoint = "NAIS_TOKEN_ENDPOINT".fromEnv()
35-
val tokenAltinn3ExchangeEndpoint = "${"ALTINN_3_BASE_URL".fromEnv()}/authentication/api/v1/exchange/maskinporten"
31+
object Nav {
32+
val arbeidsgiverApiBaseUrl = "arbeidsgiver.baseUrl".fromEnv()
33+
val naisTokenEndpoint = "NAIS_TOKEN_ENDPOINT".fromEnv()
34+
}
3635

37-
val dialogportenScope = "DIALOGPORTEN_SCOPE".fromEnv()
36+
object Altinn {
37+
val altinnBaseUrl = "ALTINN_3_BASE_URL".fromEnv()
38+
val altinnImRessurs = "ALTINN_IM_RESSURS".fromEnv()
39+
val tokenAltinn3ExchangeEndpoint = "${"ALTINN_3_BASE_URL".fromEnv()}/authentication/api/v1/exchange/maskinporten"
40+
val dialogportenScope = "DIALOGPORTEN_SCOPE".fromEnv()
41+
}
3842

39-
private fun String.fromEnv(): String =
43+
fun String.fromEnv(): String =
4044
System.getenv(this)
4145
?: appConfig.propertyOrNull(this)?.getString()
4246
?: throw RuntimeException("Missing required environment variable \"$this\".")

src/main/kotlin/auth/AuthClient.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class AuthClient {
2727
try {
2828
httpClient
2929
.submitForm(
30-
url = Env.tokenEndpoint,
30+
url = Env.Nav.naisTokenEndpoint,
3131
formParameters =
3232
parameters {
3333
append("identity_provider", "maskinporten")
@@ -40,7 +40,7 @@ class AuthClient {
4040

4141
suspend fun altinnExchange(token: String): String =
4242
httpClient
43-
.get(Env.tokenAltinn3ExchangeEndpoint) {
43+
.get(Env.Altinn.tokenAltinn3ExchangeEndpoint) {
4444
bearerAuth(token)
4545
}.bodyAsText()
4646
.replace("\"", "")
@@ -64,4 +64,4 @@ private fun AuthClient.hentAltinnToken(target: String): () -> String {
6464
}
6565
}
6666

67-
fun AuthClient.dialogportenTokenGetter() = hentAltinnToken(Env.dialogportenScope)
67+
fun AuthClient.dialogportenTokenGetter() = hentAltinnToken(Env.Altinn.dialogportenScope)

src/main/kotlin/dialogporten/DialogportenService.kt

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,60 @@
11
package no.nav.helsearbeidsgiver.dialogporten
22

33
import kotlinx.coroutines.runBlocking
4+
import no.nav.helsearbeidsgiver.DialogRepository
45
import no.nav.helsearbeidsgiver.Env
6+
import no.nav.helsearbeidsgiver.Env.fromEnv
57
import no.nav.helsearbeidsgiver.kafka.Sykepengesoknad
68
import no.nav.helsearbeidsgiver.kafka.Sykmelding
79
import no.nav.helsearbeidsgiver.kafka.Sykmeldingsperiode
10+
import no.nav.helsearbeidsgiver.utils.log.logger
811
import no.nav.helsearbeidsgiver.utils.tilNorskFormat
12+
import no.nav.helsearbeidsgiver.utils.toUuid
913
import java.util.UUID
1014

1115
class DialogportenService(
1216
private val dialogportenClient: DialogportenClient,
17+
private val dialogRepository: DialogRepository,
1318
) {
14-
fun opprettNyDialogMedSykmelding(sykmelding: Sykmelding): String =
19+
private val logger = logger()
20+
21+
fun behandleSykmelding(sykmelding: Sykmelding) {
22+
val dialogId = opprettNyDialogMedSykmelding(sykmelding)
23+
dialogRepository.lagreDialog(dialogId = dialogId, sykmeldingId = sykmelding.sykmeldingId)
24+
}
25+
26+
fun behandleSykepengesoknad(sykepengesoknad: Sykepengesoknad) {
27+
when (val dialogId = dialogRepository.finnDialogId(sykmeldingId = sykepengesoknad.sykmeldingId)) {
28+
null ->
29+
logger.warn(
30+
"Fant ikke dialog for sykmeldingId ${sykepengesoknad.sykmeldingId}. " +
31+
"Klarer derfor ikke oppdatere dialogen med sykepengesøknad ${sykepengesoknad.soknadId}.",
32+
)
33+
34+
else -> oppdaterDialogMedSykepengesoknad(dialogId = dialogId, sykepengesoknad = sykepengesoknad)
35+
}
36+
}
37+
38+
private fun opprettNyDialogMedSykmelding(sykmelding: Sykmelding): UUID =
1539
runBlocking {
1640
dialogportenClient
1741
.opprettDialogMedSykmelding(
1842
orgnr = sykmelding.orgnr.toString(),
1943
dialogTittel = "Sykepenger for ${sykmelding.fulltNavn} (f. ${sykmelding.foedselsdato.tilNorskFormat()})",
2044
dialogSammendrag = sykmelding.sykmeldingsperioder.getSykmeldingsPerioderString(),
2145
sykmeldingId = sykmelding.sykmeldingId,
22-
sykmeldingJsonUrl = "${Env.navArbeidsgiverApiBaseUrl}/sykmelding/${sykmelding.sykmeldingId}",
46+
sykmeldingJsonUrl = "${"arbeidsgiver.baseUrl".fromEnv()}/sykmelding/${sykmelding.sykmeldingId}",
2347
)
24-
}
48+
}.toUuid()
2549

26-
fun oppdaterDialogMedSykepengesoknad(sykepengesoknad: Sykepengesoknad) {
50+
private fun oppdaterDialogMedSykepengesoknad(
51+
dialogId: UUID,
52+
sykepengesoknad: Sykepengesoknad,
53+
) {
2754
runBlocking {
2855
dialogportenClient.oppdaterDialogMedSykepengesoknad(
29-
dialogId = UUID.randomUUID(), // TODO: Hent dialogId fra database,
30-
soknadJsonUrl = "${Env.navArbeidsgiverApiBaseUrl}/soknad/${sykepengesoknad.soknadId}",
56+
dialogId = dialogId,
57+
soknadJsonUrl = "${Env.Nav.arbeidsgiverApiBaseUrl}/soknad/${sykepengesoknad.soknadId}",
3158
)
3259
}
3360
}

src/main/kotlin/kafka/MeldingTolker.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class MeldingTolker(
2828
is Sykmelding -> {
2929
if (unleashFeatureToggles.skalOppretteDialogVedMottattSykmelding(orgnr = dekodetMelding.orgnr)) {
3030
logger.info("Oppretter dialog for sykmelding.")
31-
dialogportenService.opprettNyDialogMedSykmelding(sykmelding = dekodetMelding)
31+
dialogportenService.behandleSykmelding(sykmelding = dekodetMelding)
3232
} else {
3333
logger.info("Feature toggle for dialogopprettelse for sykmelding er avskrudd, ignorerer melding.")
3434
}
@@ -37,7 +37,7 @@ class MeldingTolker(
3737
is Sykepengesoknad -> {
3838
if (unleashFeatureToggles.skalOppdatereDialogVedMottattSoknad(orgnr = dekodetMelding.orgnr)) {
3939
logger.info("Oppdaterer dialog med sykepengesøknad.")
40-
dialogportenService.oppdaterDialogMedSykepengesoknad(sykepengesoknad = dekodetMelding)
40+
dialogportenService.behandleSykepengesoknad(sykepengesoknad = dekodetMelding)
4141
} else {
4242
logger.info("Feature toggle for oppdatering av dialog med sykepengesøknad er avskrudd, ignorerer melding.")
4343
}

src/main/kotlin/utils/UuidUtils.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package no.nav.helsearbeidsgiver.utils
2+
3+
import java.util.UUID
4+
5+
fun String.toUuid(): UUID = UUID.fromString(this)

src/main/resources/application.conf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,8 @@ kafkaConsumer {
33
topic = helsearbeidsgiver.dialog
44
}
55
}
6+
7+
arbeidsgiver {
8+
baseUrl = "https://sykepenger1-api.ekstern.dev.nav.no"
9+
baseUrl = ${?NAV_ARBEIDSGIVER_API_BASEURL}
10+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import io.kotest.core.spec.style.FunSpec
2+
import io.mockk.Runs
3+
import io.mockk.coEvery
4+
import io.mockk.coVerify
5+
import io.mockk.every
6+
import io.mockk.just
7+
import io.mockk.mockk
8+
import io.mockk.verify
9+
import no.nav.helsearbeidsgiver.DialogRepository
10+
import no.nav.helsearbeidsgiver.dialogporten.DialogportenClient
11+
import no.nav.helsearbeidsgiver.dialogporten.DialogportenService
12+
import java.util.UUID
13+
14+
class DialogportenServiceTest :
15+
FunSpec({
16+
val dialogportenClientMock = mockk<DialogportenClient>()
17+
val dialogRepositoryMock = mockk<DialogRepository>()
18+
val dialogportenService = DialogportenService(dialogportenClientMock, dialogRepositoryMock)
19+
20+
test("behandler sykmelding") {
21+
val dialogId = UUID.randomUUID()
22+
coEvery {
23+
dialogportenClientMock.opprettDialogMedSykmelding(
24+
any(),
25+
any(),
26+
any(),
27+
any(),
28+
any(),
29+
)
30+
} returns dialogId.toString()
31+
32+
every { dialogRepositoryMock.lagreDialog(any(), any()) } just Runs
33+
34+
dialogportenService.behandleSykmelding(sykmelding)
35+
36+
coVerify(exactly = 1) {
37+
dialogportenClientMock.opprettDialogMedSykmelding(
38+
any(),
39+
any(),
40+
any(),
41+
any(),
42+
any(),
43+
)
44+
}
45+
verify(exactly = 1) { dialogRepositoryMock.lagreDialog(any(), any()) }
46+
}
47+
})

src/test/kotlin/MeldingTolkerTest.kt

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,41 +7,51 @@ import io.mockk.verify
77
import no.nav.helsearbeidsgiver.dialogporten.DialogportenService
88
import no.nav.helsearbeidsgiver.kafka.Melding
99
import no.nav.helsearbeidsgiver.kafka.MeldingTolker
10-
import no.nav.helsearbeidsgiver.kafka.Sykmelding
11-
import no.nav.helsearbeidsgiver.kafka.Sykmeldingsperiode
10+
import no.nav.helsearbeidsgiver.kafka.Sykepengesoknad
1211
import no.nav.helsearbeidsgiver.utils.UnleashFeatureToggles
1312
import no.nav.helsearbeidsgiver.utils.json.toJson
1413
import no.nav.helsearbeidsgiver.utils.test.wrapper.genererGyldig
1514
import no.nav.helsearbeidsgiver.utils.wrapper.Orgnr
16-
import java.time.LocalDate
1715
import java.util.UUID
1816

1917
class MeldingTolkerTest :
2018
FunSpec({
21-
test("Opprett dialog ved gyldig sykmelding") {
19+
test("Behandle gyldig sykmelding") {
2220
val orgnr = Orgnr.genererGyldig()
23-
val sykmelding =
24-
Sykmelding(
21+
val melding = sykmelding.toJson(Melding.serializer()).toString()
22+
23+
val dialogportenServiceMock = mockk<DialogportenService>()
24+
val unleashFeatureTogglesMock = mockk<UnleashFeatureToggles>()
25+
26+
every { dialogportenServiceMock.behandleSykmelding(any()) } just Runs
27+
every { unleashFeatureTogglesMock.skalOppretteDialogVedMottattSykmelding(orgnr) } returns true
28+
29+
val meldingTolker =
30+
MeldingTolker(
31+
unleashFeatureToggles = unleashFeatureTogglesMock,
32+
dialogportenService = dialogportenServiceMock,
33+
)
34+
35+
meldingTolker.lesMelding(melding)
36+
37+
verify(exactly = 1) { dialogportenServiceMock.behandleSykmelding(sykmelding) }
38+
}
39+
40+
test("Behandle gyldig sykepengesøknad") {
41+
val orgnr = Orgnr.genererGyldig()
42+
val sykepengesoknad =
43+
Sykepengesoknad(
44+
soknadId = UUID.randomUUID(),
2545
sykmeldingId = UUID.randomUUID(),
2646
orgnr = orgnr,
27-
foedselsdato = LocalDate.of(1990, 1, 1),
28-
fulltNavn = "OLA NORDMANN",
29-
sykmeldingsperioder =
30-
listOf(
31-
Sykmeldingsperiode(
32-
fom = LocalDate.of(2023, 1, 1),
33-
tom = LocalDate.of(2023, 1, 31),
34-
),
35-
),
3647
)
37-
val melding = sykmelding.toJson(Melding.serializer()).toString()
48+
val melding = sykepengesoknad.toJson(Melding.serializer()).toString()
3849

3950
val dialogportenServiceMock = mockk<DialogportenService>()
4051
val unleashFeatureTogglesMock = mockk<UnleashFeatureToggles>()
4152

42-
every { dialogportenServiceMock.opprettNyDialogMedSykmelding(any()) } returns "123"
43-
every { dialogportenServiceMock.oppdaterDialogMedSykepengesoknad(any()) } just Runs
44-
every { unleashFeatureTogglesMock.skalOppretteDialogVedMottattSykmelding(orgnr) } returns true
53+
every { dialogportenServiceMock.behandleSykepengesoknad(any()) } just Runs
54+
every { unleashFeatureTogglesMock.skalOppdatereDialogVedMottattSoknad(orgnr) } returns true
4555

4656
val meldingTolker =
4757
MeldingTolker(
@@ -51,6 +61,6 @@ class MeldingTolkerTest :
5161

5262
meldingTolker.lesMelding(melding)
5363

54-
verify(exactly = 1) { dialogportenServiceMock.opprettNyDialogMedSykmelding(sykmelding) }
64+
verify(exactly = 1) { dialogportenServiceMock.behandleSykepengesoknad(sykepengesoknad) }
5565
}
5666
})

0 commit comments

Comments
 (0)