Skip to content

Commit f279c6e

Browse files
authored
Merge pull request #26 from navikt/bjellevarsler
Legger til nytt endepunkt "/bjellevarsler" som godtar tokenx.
2 parents e0a2d01 + a799c73 commit f279c6e

File tree

6 files changed

+83
-19
lines changed

6 files changed

+83
-19
lines changed

build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ dependencies {
4141
implementation(Ktor.Server.defaultHeaders)
4242
implementation(Ktor.Server.cors)
4343
implementation(TmsKtorTokenSupport.idportenSidecar)
44+
implementation(TmsKtorTokenSupport.tokenXValidation)
4445
implementation(TmsKtorTokenSupport.tokendingsExchange)
4546
implementation(KotlinLogging.logging)
4647
implementation(Logstash.logbackEncoder)
@@ -55,6 +56,7 @@ dependencies {
5556
testImplementation(Kotest.runnerJunit5)
5657
testImplementation(Ktor.Test.serverTestHost)
5758
implementation(TmsKtorTokenSupport.idportenSidecarMock)
59+
implementation(TmsKtorTokenSupport.tokenXValidationMock)
5860
testImplementation(Mockk.mockk)
5961
}
6062

src/main/kotlin/no/nav/tms/varsel/api/varsel/varselbjelleRoutes.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import io.ktor.server.routing.route
99
import io.ktor.util.pipeline.PipelineContext
1010
import no.nav.tms.token.support.idporten.sidecar.user.IdportenUser
1111
import no.nav.tms.token.support.idporten.sidecar.user.IdportenUserFactory
12+
import no.nav.tms.token.support.tokenx.validation.user.TokenXUser
13+
import no.nav.tms.token.support.tokenx.validation.user.TokenXUserFactory
1214

1315

1416
fun Route.varselbjelle(varselConsumer: VarselConsumer) {
@@ -19,6 +21,15 @@ fun Route.varselbjelle(varselConsumer: VarselConsumer) {
1921
}
2022
}
2123

24+
fun Route.bjellevarsler(varselConsumer: VarselConsumer) {
25+
get("/bjellevarsler") {
26+
call.respond(varselConsumer.getVarselbjelleVarsler(tokenxUser.tokenString))
27+
}
28+
}
29+
2230

2331
private val PipelineContext<Unit, ApplicationCall>.idportenUser: IdportenUser
2432
get() = IdportenUserFactory.createIdportenUser(this.call)
33+
34+
private val PipelineContext<Unit, ApplicationCall>.tokenxUser: TokenXUser
35+
get() = TokenXUserFactory.createTokenXUser(this.call)

src/main/kotlin/no/nav/tms/varsel/api/varselApi.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,10 @@ import io.ktor.serialization.jackson.*
2121
import nav.no.tms.common.metrics.installTmsMicrometerMetrics
2222
import no.nav.tms.token.support.idporten.sidecar.LevelOfAssurance
2323
import no.nav.tms.token.support.idporten.sidecar.idPorten
24+
import no.nav.tms.token.support.tokenx.validation.TokenXAuthenticator
25+
import no.nav.tms.token.support.tokenx.validation.tokenX
2426
import no.nav.tms.varsel.api.varsel.VarselConsumer
27+
import no.nav.tms.varsel.api.varsel.bjellevarsler
2528
import no.nav.tms.varsel.api.varsel.varsel
2629
import no.nav.tms.varsel.api.varsel.varselbjelle
2730

@@ -35,6 +38,10 @@ fun Application.varselApi(
3538
setAsDefault = true
3639
levelOfAssurance = LevelOfAssurance.SUBSTANTIAL
3740
}
41+
tokenX {
42+
setAsDefault = false
43+
levelOfAssurance = TokenXLoa.SUBSTANTIAL
44+
}
3845
}
3946
}
4047
) {
@@ -72,12 +79,17 @@ fun Application.varselApi(
7279
varsel(varselConsumer)
7380
varselbjelle(varselConsumer)
7481
}
82+
authenticate(TokenXAuthenticator.name) {
83+
bjellevarsler(varselConsumer)
84+
}
7585

7686
}
7787

7888
configureShutdownHook(httpClient)
7989
}
8090

91+
typealias TokenXLoa = no.nav.tms.token.support.tokenx.validation.LevelOfAssurance
92+
8193
private fun Application.configureShutdownHook(httpClient: HttpClient) {
8294
environment.monitor.subscribe(ApplicationStopping) {
8395
httpClient.close()

src/test/kotlin/no/nav/tms/varsel/api/VarselRoutesTest.kt

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
package no.nav.tms.varsel.api
22

3-
import com.fasterxml.jackson.annotation.JsonInclude
4-
import com.fasterxml.jackson.databind.DeserializationFeature
5-
import com.fasterxml.jackson.databind.SerializationFeature
6-
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
7-
import com.fasterxml.jackson.module.kotlin.jacksonMapperBuilder
83
import io.kotest.matchers.collections.shouldContainExactlyInAnyOrder
94
import io.kotest.matchers.shouldBe
105
import io.ktor.client.*
@@ -35,7 +30,6 @@ import no.nav.tms.varsel.api.varsel.AntallVarsler
3530
import no.nav.tms.varsel.api.varsel.InaktivtVarsel
3631
import no.nav.tms.varsel.api.varsel.VarselType
3732
import org.junit.jupiter.api.Test
38-
import java.text.DateFormat
3933
import java.time.ZonedDateTime
4034

4135
class VarselRoutesTest {
@@ -54,7 +48,7 @@ class VarselRoutesTest {
5448
setupVarselAuthority(inaktiveVarslerFromEventHandler = varsler)
5549
mockVarselApi(
5650
varselConsumer = setupVarselConsumer(),
57-
authMockInstaller = installIdportenAuthenticatedMock(LevelOfAssurance.LEVEL_4)
51+
authMockInstaller = installAuthenticatedMock(LevelOfAssurance.LEVEL_4)
5852
)
5953

6054
val response = client.get("/inaktive")
@@ -98,7 +92,7 @@ class VarselRoutesTest {
9892
setupVarselAuthority(aktiveVarslerFromEventHandler = varsler)
9993
mockVarselApi(
10094
varselConsumer = setupVarselConsumer(),
101-
authMockInstaller = installIdportenAuthenticatedMock(LevelOfAssurance.LEVEL_4)
95+
authMockInstaller = installAuthenticatedMock(LevelOfAssurance.LEVEL_4)
10296
)
10397

10498
val response = client.get("/aktive")
@@ -130,7 +124,7 @@ class VarselRoutesTest {
130124
)
131125
mockVarselApi(
132126
varselConsumer = setupVarselConsumer(),
133-
authMockInstaller = installIdportenAuthenticatedMock(LevelOfAssurance.LEVEL_3)
127+
authMockInstaller = installAuthenticatedMock(LevelOfAssurance.LEVEL_3)
134128
)
135129

136130
val response = client.get("/aktive")
@@ -164,7 +158,7 @@ class VarselRoutesTest {
164158
setupVarselAuthority(aktiveVarslerFromEventHandler = varsler)
165159
mockVarselApi(
166160
varselConsumer = setupVarselConsumer(),
167-
authMockInstaller = installIdportenAuthenticatedMock(LevelOfAssurance.LEVEL_4)
161+
authMockInstaller = installAuthenticatedMock(LevelOfAssurance.LEVEL_4)
168162
)
169163

170164
val response = client.get("/antall/aktive")
@@ -199,7 +193,7 @@ class VarselRoutesTest {
199193

200194
mockVarselApi(
201195
varselConsumer = setupVarselConsumer(),
202-
authMockInstaller = installIdportenAuthenticatedMock(LevelOfAssurance.LEVEL_4)
196+
authMockInstaller = installAuthenticatedMock(LevelOfAssurance.LEVEL_4)
203197
)
204198
client.post("/beskjed/inaktiver") {
205199
header(HttpHeaders.ContentType, ContentType.Application.Json)
@@ -218,7 +212,7 @@ class VarselRoutesTest {
218212
setupVarselAuthority(aktiveVarslerFromEventHandler = listOf(beskjed), inaktiveVarslerFromEventHandler = listOf(oppgave))
219213
mockVarselApi(
220214
varselConsumer = setupVarselConsumer(),
221-
authMockInstaller = installIdportenAuthenticatedMock(LevelOfAssurance.LEVEL_4)
215+
authMockInstaller = installAuthenticatedMock(LevelOfAssurance.LEVEL_4)
222216
)
223217

224218
val aktiveVarsler: AktiveVarsler = client.get("/aktive").body()
@@ -273,7 +267,7 @@ class VarselRoutesTest {
273267

274268
mockVarselApi(
275269
varselConsumer = setupVarselConsumer(),
276-
authMockInstaller = installIdportenAuthenticatedMock(LevelOfAssurance.LEVEL_4)
270+
authMockInstaller = installAuthenticatedMock(LevelOfAssurance.LEVEL_4)
277271
)
278272
client.post("/beskjed/inaktiver") {
279273
header(HttpHeaders.ContentType, ContentType.Application.Json)

src/test/kotlin/no/nav/tms/varsel/api/VarselbjelleRoutesTest.kt

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class VarselbjelleRoutesTest {
2727
setupVarselAuthority(aktiveVarslerFromEventHandler = varsler)
2828
mockVarselApi(
2929
varselConsumer = setupVarselConsumer(),
30-
authMockInstaller = installIdportenAuthenticatedMock(LevelOfAssurance.LEVEL_4)
30+
authMockInstaller = installAuthenticatedMock(LevelOfAssurance.LEVEL_4)
3131
)
3232

3333
client.get("/varselbjelle/varsler").apply {
@@ -48,4 +48,40 @@ class VarselbjelleRoutesTest {
4848
}
4949
}
5050
}
51+
52+
@Test
53+
fun `Varsel har riktige felter fra bjellevarsler`() = testApplication {
54+
val expectedBeskjed = VarselTestData.varsel(type = VarselType.beskjed)
55+
val varsler = listOf(
56+
expectedBeskjed,
57+
VarselTestData.varsel(type = VarselType.oppgave),
58+
VarselTestData.varsel(type = VarselType.oppgave),
59+
VarselTestData.varsel(type = VarselType.oppgave),
60+
VarselTestData.varsel(type = VarselType.innboks)
61+
)
62+
testApplication {
63+
setupVarselAuthority(aktiveVarslerFromEventHandler = varsler)
64+
mockVarselApi(
65+
varselConsumer = setupVarselConsumer(),
66+
authMockInstaller = installAuthenticatedMock(LevelOfAssurance.LEVEL_4)
67+
)
68+
69+
client.get("/bjellevarsler").apply {
70+
status shouldBe HttpStatusCode.OK
71+
val varselbjellevarsler = Json.decodeFromString<VarselbjelleVarsler>(bodyAsText())
72+
varselbjellevarsler.beskjeder.size shouldBe 2
73+
varselbjellevarsler.oppgaver.size shouldBe 3
74+
val beskjed = varselbjellevarsler.beskjeder.first { it.eventId == expectedBeskjed.varselId }
75+
beskjed.varselId shouldBe expectedBeskjed.varselId
76+
beskjed.eventId shouldBe expectedBeskjed.varselId
77+
beskjed.isMasked shouldBe (expectedBeskjed.innhold == null)
78+
beskjed.link shouldBe expectedBeskjed.innhold?.link
79+
beskjed.tekst shouldBe expectedBeskjed.innhold?.tekst
80+
beskjed.eksternVarslingKanaler shouldBe expectedBeskjed.eksternVarslingKanaler
81+
beskjed.tidspunkt shouldBe expectedBeskjed.opprettet
82+
beskjed.eksternVarslingSendt shouldBe expectedBeskjed.eksternVarslingSendt
83+
beskjed.type shouldBe "beskjed"
84+
}
85+
}
86+
}
5187
}

src/test/kotlin/no/nav/tms/varsel/api/varselTestData.kt

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
package no.nav.tms.varsel.api
22

3-
import com.fasterxml.jackson.databind.DeserializationFeature
4-
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
53
import io.kotest.matchers.shouldBe
64
import io.ktor.client.HttpClient
75
import io.ktor.client.plugins.HttpTimeout
8-
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation.*
96
import io.ktor.http.HttpStatusCode
107
import io.ktor.serialization.jackson.*
118
import io.ktor.server.application.Application
@@ -23,9 +20,9 @@ import io.mockk.mockk
2320
import no.nav.tms.token.support.idporten.sidecar.mock.LevelOfAssurance
2421
import no.nav.tms.token.support.idporten.sidecar.mock.idPortenMock
2522
import no.nav.tms.token.support.tokendings.exchange.TokendingsService
23+
import no.nav.tms.token.support.tokenx.validation.mock.tokenXMock
2624
import no.nav.tms.varsel.api.varsel.VarselConsumer
2725
import no.nav.tms.varsel.api.varsel.VarselType
28-
import java.text.DateFormat
2926
import java.time.ZoneOffset
3027
import java.time.ZonedDateTime
3128
import java.util.*
@@ -142,7 +139,7 @@ fun ApplicationTestBuilder.setupVarselConsumer(
142139

143140
)
144141

145-
fun installIdportenAuthenticatedMock(
142+
fun installAuthenticatedMock(
146143
levelOfAssurance: LevelOfAssurance,
147144
authenticated: Boolean = true
148145
): Application.() -> Unit = {
@@ -153,6 +150,18 @@ fun installIdportenAuthenticatedMock(
153150
staticLevelOfAssurance = levelOfAssurance
154151
staticUserPid = "12345"
155152
}
153+
tokenXMock {
154+
setAsDefault = false
155+
alwaysAuthenticated = authenticated
156+
staticLevelOfAssurance = levelOfAssurance.toTokenxLoa()
157+
staticUserPid = "12345"
158+
}
156159
}
157160
}
158161

162+
private fun LevelOfAssurance.toTokenxLoa() = when(this) {
163+
LevelOfAssurance.SUBSTANTIAL -> no.nav.tms.token.support.tokenx.validation.mock.LevelOfAssurance.SUBSTANTIAL
164+
LevelOfAssurance.LEVEL_3 -> no.nav.tms.token.support.tokenx.validation.mock.LevelOfAssurance.SUBSTANTIAL
165+
LevelOfAssurance.HIGH -> no.nav.tms.token.support.tokenx.validation.mock.LevelOfAssurance.HIGH
166+
LevelOfAssurance.LEVEL_4 -> no.nav.tms.token.support.tokenx.validation.mock.LevelOfAssurance.HIGH
167+
}

0 commit comments

Comments
 (0)