Skip to content

Commit

Permalink
ignorerer nye generasjoner om de er håndtert før
Browse files Browse the repository at this point in the history
  • Loading branch information
davidsteinsland committed Jan 26, 2024
1 parent 0dd8d2d commit bb6ffa1
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 79 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,16 @@ class Pølsefabrikk private constructor(
}

fun nyPølse(pølse: Pølse) {
if (håndtertFør(pølse)) return
if (skalLageNyrad(pølse)) return lagNyRad(pølse)
pakken[0] = pakken[0].nyPølse(pølse)
}

private fun håndtertFør(pølse: Pølse) =
pakken.any { rad ->
rad.pølser.any { it.generasjonId == pølse.generasjonId }
}

fun oppdaterPølse(vedtaksperiodeId: UUID, generasjonId: UUID, status: Pølsestatus): PølseDto {
pakken[0] = pakken[0].oppdaterPølse(vedtaksperiodeId, generasjonId, status)
return pakken[0].pølser.single { it.vedtaksperiodeId == vedtaksperiodeId }.dto()
Expand Down Expand Up @@ -55,8 +61,6 @@ data class Pølserad(
.copy(kildeTilRad = pølse.kilde)
}
fun nyPølse(pølse: Pølse): Pølserad {
// har håndtert pølsen før
if (pølser.any { it.generasjonId == pølse.generasjonId }) return this
return this.copy(
pølser = pølser
.filterNot { it.vedtaksperiodeId == pølse.vedtaksperiodeId }
Expand Down Expand Up @@ -91,12 +95,7 @@ data class Pølse(
) {
fun erNyPølseAv(other: Pølse): Boolean {
// må være samme vedtaksperiode
if (this.vedtaksperiodeId != other.vedtaksperiodeId) return false
// lik kilde == duplikat av noe vi har håndtert før
if (this.kilde == other.kilde) return false
// lik generasjonId == duplikat av noe vi har håndtert før
if (this.generasjonId == other.generasjonId) return false
return this.status == ÅPEN && other.status != ÅPEN
return this.vedtaksperiodeId == other.vedtaksperiodeId
}
fun dto() = PølseDto(
vedtaksperiodeId = vedtaksperiodeId,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package no.nav.helse.spekemat.foredler

import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
import java.util.*

class DuplikathåndteringTest : PølseTest() {

@Test
fun `en duplikat ny pølse`() {
val p1 = 1.januar til 5.januar
val p2 = p1 fordi UUID.randomUUID()

fabrikk.nyPølse(p1)
fabrikk.nyPølse(p2)

val result = fabrikk.pakke()
assertEquals(1, result.size) // forventer én rad
assertEquals(setOf(p1), result.single()) // rekkefølgen på rad 1
}

@Test
fun `en duplikat ny pølse etter at pølsen er lukket`() {
val p1 = 1.januar til 5.januar
val p2 = p1 fordi UUID.randomUUID()

fabrikk.nyPølse(p1)
fabrikk.lukketPølse(p1)
fabrikk.nyPølse(p2) // f.eks. at spekemat har lest inn generasjon_opprettet på nytt, eller at noen har sendt feil

val result = fabrikk.pakke()
assertEquals(1, result.size) // forventer én rad
assertEquals(setOf(p1.lukket()), result.single()) // rekkefølgen på rad 1
}

@Test
fun `en duplikat ny pølse etter at pølsen er revurdert`() {
val p1 = 1.januar til 5.januar
val p1Revurdering = p1.nyGenerasjon()
val p2 = p1 fordi UUID.randomUUID()

fabrikk.nyPølse(p1)
fabrikk.lukketPølse(p1)
fabrikk.nyPølse(p1Revurdering)
fabrikk.lukketPølse(p1Revurdering.lukket())
fabrikk.nyPølse(p2) // f.eks. at spekemat har lest inn generasjon_opprettet på nytt, eller at noen har sendt feil

val result = fabrikk.pakke()
assertEquals(2, result.size)
assertEquals(setOf(p1Revurdering.lukket()), result[0].pølser)
assertEquals(setOf(p1.lukket()), result[1].pølser)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package no.nav.helse.spekemat.foredler

import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.BeforeEach
import java.time.LocalDate
import java.util.*

abstract class PølseTest {
protected lateinit var fabrikk: Pølsefabrikk

@BeforeEach
fun setup() {
fabrikk = Pølsefabrikk()
}

private fun pølse(
vedtaksperiodeId: UUID,
kilde: UUID = UUID.randomUUID(),
status: Pølsestatus = Pølsestatus.ÅPEN
) = Pølse(vedtaksperiodeId, UUID.randomUUID(), status, kilde)

protected infix fun LocalDate.til(tom: LocalDate) = pølse(UUID.randomUUID())
protected infix fun Pølse.som(vedtaksperiodeId: UUID) = this.copy(vedtaksperiodeId = vedtaksperiodeId)
protected fun Pølse.nyGenerasjon(generasjonId: UUID = UUID.randomUUID(), kilde: UUID = UUID.randomUUID()) = fordi(kilde).copy(generasjonId = UUID.randomUUID())
protected infix fun Pølse.fordi(kilde: UUID) = this.copy(kilde = kilde)

protected fun Pølse.lukket() = this.copy(status = Pølsestatus.LUKKET)
protected fun Pølse.forkastet() = this.copy(status = Pølsestatus.FORKASTET)

protected val mandag = LocalDate.of(2018, 1, 1)
protected val Int.januar get() = mandag.withDayOfMonth(this).withMonth(1)

protected fun assertEquals(expected: Set<Pølse>, actual: PølseradDto) {
assertEquals(expected, actual.pølser)
}
protected fun assertEquals(expected: Set<Pølse>, actual: List<PølseDto>) {
assertEquals(expected.size, actual.size)
val ingenMatch = expected.map { it.dto() }.filterNot { it in actual }
assertEquals(emptyList<PølseDto>(), ingenMatch) { "Det er pølser som ikke finnes i actual" }
}

protected fun Pølsefabrikk.lukketPølse(pølse: Pølse) {
this.oppdaterPølse(pølse.vedtaksperiodeId, pølse.generasjonId, Pølsestatus.LUKKET)
}

protected fun Pølsefabrikk.pølseForkastet(pølse: Pølse) {
this.oppdaterPølse(pølse.vedtaksperiodeId, pølse.generasjonId, Pølsestatus.FORKASTET)
}
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,10 @@
package no.nav.helse.spekemat.foredler

import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import java.time.LocalDate
import java.util.*

class PølsefabrikkTest {

private lateinit var fabrikk: Pølsefabrikk

@BeforeEach
fun setup() {
fabrikk = Pølsefabrikk()
}
class PølsefabrikkTest : PølseTest() {

@Test
fun `en ny pølse`() {
Expand All @@ -26,33 +17,6 @@ class PølsefabrikkTest {
assertEquals(setOf(p1), result.single()) // rekkefølgen på rad 1
}

@Test
fun `en duplikat ny pølse`() {
val p1 = 1.januar til 5.januar
val p2 = p1 fordi UUID.randomUUID()

fabrikk.nyPølse(p1)
fabrikk.nyPølse(p2)

val result = fabrikk.pakke()
assertEquals(1, result.size) // forventer én rad
assertEquals(setOf(p1), result.single()) // rekkefølgen på rad 1
}

@Test
fun `en duplikat ny pølse etter at pølsen er lukket`() {
val p1 = 1.januar til 5.januar
val p2 = p1 fordi UUID.randomUUID()

fabrikk.nyPølse(p1)
fabrikk.lukketPølse(p1)
fabrikk.nyPølse(p2) // f.eks. at spekemat har lest inn generasjon_opprettet på nytt, eller at noen har sendt feil

val result = fabrikk.pakke()
assertEquals(1, result.size) // forventer én rad
assertEquals(setOf(p1.lukket()), result.single()) // rekkefølgen på rad 1
}

@Test
fun `en forkastet ny pølse`() {
val p1 = 1.januar til 5.januar
Expand Down Expand Up @@ -239,38 +203,4 @@ class PølsefabrikkTest {
assertEquals(setOf(p1Revurdering.lukket()), result[1])
assertEquals(setOf(p3.lukket(), p2.lukket(), p1.lukket()), result[2])
}

private fun pølse(
vedtaksperiodeId: UUID,
kilde: UUID = UUID.randomUUID(),
status: Pølsestatus = Pølsestatus.ÅPEN
) = Pølse(vedtaksperiodeId, UUID.randomUUID(), status, kilde)

private infix fun LocalDate.til(tom: LocalDate) = pølse(UUID.randomUUID())
private infix fun Pølse.som(vedtaksperiodeId: UUID) = this.copy(vedtaksperiodeId = vedtaksperiodeId)
private fun Pølse.nyGenerasjon(generasjonId: UUID = UUID.randomUUID(), kilde: UUID = UUID.randomUUID()) = fordi(kilde).copy(generasjonId = UUID.randomUUID())
private infix fun Pølse.fordi(kilde: UUID) = this.copy(kilde = kilde)

private fun Pølse.lukket() = this.copy(status = Pølsestatus.LUKKET)
private fun Pølse.forkastet() = this.copy(status = Pølsestatus.FORKASTET)

private val mandag = LocalDate.of(2018, 1, 1)
private val Int.januar get() = mandag.withDayOfMonth(this).withMonth(1)

private fun assertEquals(expected: Set<Pølse>, actual: PølseradDto) {
assertEquals(expected, actual.pølser)
}
private fun assertEquals(expected: Set<Pølse>, actual: List<PølseDto>) {
assertEquals(expected.size, actual.size)
val ingenMatch = expected.map { it.dto() }.filterNot { it in actual }
assertEquals(emptyList<PølseDto>(), ingenMatch) { "Det er pølser som ikke finnes i actual" }
}

private fun Pølsefabrikk.lukketPølse(pølse: Pølse) {
this.oppdaterPølse(pølse.vedtaksperiodeId, pølse.generasjonId, Pølsestatus.LUKKET)
}

private fun Pølsefabrikk.pølseForkastet(pølse: Pølse) {
this.oppdaterPølse(pølse.vedtaksperiodeId, pølse.generasjonId, Pølsestatus.FORKASTET)
}
}

0 comments on commit bb6ffa1

Please sign in to comment.