1
+ package no.nav.paw.arbeidssoekerregisteret.topology
2
+
3
+ import io.kotest.core.spec.style.FreeSpec
4
+ import io.kotest.matchers.shouldBe
5
+ import io.kotest.matchers.shouldNotBe
6
+ import io.kotest.matchers.types.shouldBeInstanceOf
7
+ import no.nav.paw.arbeidssoekerregisteret.context.ApplicationContext
8
+ import no.nav.paw.arbeidssokerregisteret.api.v1.AvviksType
9
+ import no.nav.paw.arbeidssokerregisteret.api.v1.Beskrivelse
10
+ import no.nav.paw.arbeidssokerregisteret.api.v1.BeskrivelseMedDetaljer
11
+ import no.nav.paw.arbeidssokerregisteret.api.v1.Bruker
12
+ import no.nav.paw.arbeidssokerregisteret.api.v1.BrukerType
13
+ import no.nav.paw.arbeidssokerregisteret.api.v1.Helse
14
+ import no.nav.paw.arbeidssokerregisteret.api.v1.JaNeiVetIkke
15
+ import no.nav.paw.arbeidssokerregisteret.api.v1.Jobbsituasjon
16
+ import no.nav.paw.arbeidssokerregisteret.api.v1.Metadata
17
+ import no.nav.paw.arbeidssokerregisteret.api.v1.TidspunktFraKilde
18
+ import no.nav.paw.arbeidssokerregisteret.api.v2.Annet
19
+ import no.nav.paw.arbeidssokerregisteret.api.v4.OpplysningerOmArbeidssoeker
20
+ import no.nav.paw.arbeidssokerregisteret.api.v4.Utdanning
21
+ import org.apache.kafka.common.serialization.Serde
22
+ import org.apache.kafka.common.serialization.Serdes
23
+ import org.apache.kafka.streams.StreamsBuilder
24
+ import org.apache.kafka.streams.TestInputTopic
25
+ import org.apache.kafka.streams.TopologyTestDriver
26
+ import org.apache.kafka.streams.state.KeyValueStore
27
+ import org.apache.kafka.streams.state.Stores
28
+ import org.apache.kafka.streams.state.ValueAndTimestamp
29
+ import java.time.Duration
30
+ import java.time.Instant
31
+ import java.util.*
32
+
33
+ class OpplysningerKStreamTest : FreeSpec ({
34
+
35
+ with(TestContext ()) {
36
+ " Testsuite for aggregering av opplysinger om arbeidssøker" - {
37
+
38
+ " Skal lagre opplysinger ved mottak" {
39
+ val id = UUID .randomUUID()
40
+ val periodeId = UUID .randomUUID()
41
+ val ident = " 01017012345"
42
+ val key = 1L
43
+ val opplysninger = buildOpplysninger(id, periodeId, ident)
44
+ opplysingerTopic.pipeInput(key, opplysninger)
45
+
46
+ stateStore.size() shouldBe 1
47
+ val valueAndTimestamp =
48
+ stateStore.get(id.toString()).shouldBeInstanceOf<ValueAndTimestamp <OpplysningerOmArbeidssoeker >>()
49
+ valueAndTimestamp shouldNotBe null
50
+ valueAndTimestamp.value() shouldNotBe null
51
+ valueAndTimestamp.value().id shouldBe opplysninger.id
52
+ valueAndTimestamp.value().periodeId shouldBe opplysninger.periodeId
53
+ valueAndTimestamp.value().sendtInnAv.utfoertAv.id shouldBe opplysninger.sendtInnAv.utfoertAv.id
54
+ }
55
+
56
+ " Skal slette opplysninger etter 60 minutter" {
57
+ testDriver.advanceWallClockTime(Duration .ofMinutes(65)) // 60 min++
58
+
59
+ stateStore.size() shouldBe 0
60
+ }
61
+ }
62
+ }
63
+
64
+ }) {
65
+ private class TestContext : CommonTestContext () {
66
+
67
+ val sourceKeySerde: Serde <Long > = Serdes .Long ()
68
+ val sourceValueSerde: Serde <OpplysningerOmArbeidssoeker > = MockSchemaRegistryAvroSerde ()
69
+ val storeKeySerde: Serde <String > = Serdes .String ()
70
+
71
+ val testDriver = with (ApplicationContext (logger, applicationProperties)) {
72
+ StreamsBuilder ().apply {
73
+ addStateStore(
74
+ Stores .timestampedKeyValueStoreBuilder(
75
+ Stores .inMemoryKeyValueStore(properties.kafkaStreams.opplysningerStore),
76
+ storeKeySerde,
77
+ sourceValueSerde
78
+ )
79
+ )
80
+ addOpplysningerKStream(meterRegistry)
81
+ }.build()
82
+ }.let { TopologyTestDriver (it, kafkaStreamProperties) }
83
+
84
+ val stateStore: KeyValueStore <String , ValueAndTimestamp <OpplysningerOmArbeidssoeker >> = testDriver
85
+ .getTimestampedKeyValueStore(applicationProperties.kafkaStreams.opplysningerStore)
86
+
87
+ val opplysingerTopic: TestInputTopic <Long , OpplysningerOmArbeidssoeker > = testDriver.createInputTopic(
88
+ applicationProperties.kafkaStreams.opplysningerTopic,
89
+ sourceKeySerde.serializer(),
90
+ sourceValueSerde.serializer()
91
+ )
92
+
93
+ fun buildOpplysninger (id : UUID , periodeId : UUID , ident : String ): OpplysningerOmArbeidssoeker {
94
+ return OpplysningerOmArbeidssoeker (
95
+ id,
96
+ periodeId,
97
+ buildMetadata(ident),
98
+ buildUtdanning(),
99
+ buildHelse(),
100
+ buildJobbsituasjon(),
101
+ buildAnnet()
102
+ )
103
+ }
104
+
105
+ fun buildMetadata (ident : String ): Metadata {
106
+ return Metadata (
107
+ Instant .now(),
108
+ buildBruker(ident),
109
+ " test" ,
110
+ " test" ,
111
+ TidspunktFraKilde (Instant .now(), AvviksType .UKJENT_VERDI )
112
+ )
113
+ }
114
+
115
+ fun buildBruker (ident : String ): Bruker {
116
+ return Bruker (BrukerType .SLUTTBRUKER , ident)
117
+ }
118
+
119
+ fun buildUtdanning (): Utdanning {
120
+ return Utdanning (" 69" , JaNeiVetIkke .JA , JaNeiVetIkke .JA )
121
+ }
122
+
123
+ fun buildHelse (): Helse {
124
+ return Helse (JaNeiVetIkke .NEI )
125
+ }
126
+
127
+ fun buildJobbsituasjon (): Jobbsituasjon {
128
+ val beskrivelse = BeskrivelseMedDetaljer (
129
+ Beskrivelse .ANNET , mapOf (
130
+ " stilling" to " test" ,
131
+ " stilling_styrk08" to " test"
132
+ )
133
+ )
134
+ return Jobbsituasjon (listOf (beskrivelse))
135
+ }
136
+
137
+ fun buildAnnet (): Annet {
138
+ return Annet (JaNeiVetIkke .NEI )
139
+ }
140
+ }
141
+ }
0 commit comments