diff --git a/src/main/kotlin/no/nav/syfo/application/IForesporselRepository.kt b/src/main/kotlin/no/nav/syfo/application/IForesporselRepository.kt index f44e767..b8b0b95 100644 --- a/src/main/kotlin/no/nav/syfo/application/IForesporselRepository.kt +++ b/src/main/kotlin/no/nav/syfo/application/IForesporselRepository.kt @@ -2,9 +2,12 @@ package no.nav.syfo.application import no.nav.syfo.domain.Foresporsel import no.nav.syfo.domain.Personident +import java.util.UUID interface IForesporselRepository { fun createForesporsel(foresporsel: Foresporsel): Foresporsel fun getForesporsler(personident: Personident): List + + fun setPublishedAt(foresporselUuid: UUID) } diff --git a/src/main/kotlin/no/nav/syfo/infrastructure/database/repository/ForesporselRepository.kt b/src/main/kotlin/no/nav/syfo/infrastructure/database/repository/ForesporselRepository.kt index f5dc0b7..794d0e0 100644 --- a/src/main/kotlin/no/nav/syfo/infrastructure/database/repository/ForesporselRepository.kt +++ b/src/main/kotlin/no/nav/syfo/infrastructure/database/repository/ForesporselRepository.kt @@ -7,7 +7,9 @@ import no.nav.syfo.domain.Veilederident import no.nav.syfo.domain.Virksomhetsnummer import no.nav.syfo.infrastructure.database.DatabaseInterface import no.nav.syfo.infrastructure.database.toList +import no.nav.syfo.util.nowUTC import java.sql.ResultSet +import java.sql.SQLException import java.time.OffsetDateTime import java.util.* @@ -39,6 +41,20 @@ class ForesporselRepository(val database: DatabaseInterface) : IForesporselRepos } } + override fun setPublishedAt(foresporselUuid: UUID) { + database.connection.use { connection -> + connection.prepareStatement(SET_PUBLISHED_AT).use { + it.setObject(1, nowUTC()) + it.setString(2, foresporselUuid.toString()) + val updated = it.executeUpdate() + if (updated != 1) { + throw SQLException("Expected a single row to be updated, got update count $updated") + } + } + connection.commit() + } + } + companion object { private const val CREATE_FORESPORSEL = """ @@ -60,6 +76,13 @@ class ForesporselRepository(val database: DatabaseInterface) : IForesporselRepos FROM foresporsel WHERE arbeidstaker_personident = ? """ + + private const val SET_PUBLISHED_AT = + """ + UPDATE foresporsel + SET published_at = ? + WHERE uuid = ? + """ } } diff --git a/src/test/kotlin/no/nav/syfo/ExternalMockEnvironment.kt b/src/test/kotlin/no/nav/syfo/ExternalMockEnvironment.kt index 4498ddf..dd9b122 100644 --- a/src/test/kotlin/no/nav/syfo/ExternalMockEnvironment.kt +++ b/src/test/kotlin/no/nav/syfo/ExternalMockEnvironment.kt @@ -5,6 +5,7 @@ import no.nav.syfo.application.IVarselProducer import no.nav.syfo.infrastructure.clients.azuread.AzureAdClient import no.nav.syfo.infrastructure.clients.wellknown.WellKnown import no.nav.syfo.infrastructure.database.TestDatabase +import no.nav.syfo.infrastructure.database.repository.ForesporselRepository import no.nav.syfo.infrastructure.mock.mockHttpClient import java.nio.file.Paths @@ -29,6 +30,7 @@ class ExternalMockEnvironment private constructor() { httpClient = mockHttpClient, ) val varselProducer = mockk(relaxed = true) + val foresporselRepository = ForesporselRepository(database) companion object { val instance: ExternalMockEnvironment = ExternalMockEnvironment() diff --git a/src/test/kotlin/no/nav/syfo/TestUtils.kt b/src/test/kotlin/no/nav/syfo/TestUtils.kt index 4d2c9d7..36c152a 100644 --- a/src/test/kotlin/no/nav/syfo/TestUtils.kt +++ b/src/test/kotlin/no/nav/syfo/TestUtils.kt @@ -1,5 +1,8 @@ package no.nav.syfo import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertNotEquals infix fun T.shouldBeEqualTo(other: T) = assertEquals(this, other) + +infix fun T.shouldNotBeEqualTo(other: T) = assertNotEquals(this, other) diff --git a/src/test/kotlin/no/nav/syfo/infrastructure/database/TestDatabase.kt b/src/test/kotlin/no/nav/syfo/infrastructure/database/TestDatabase.kt index 3cdf085..77458d0 100644 --- a/src/test/kotlin/no/nav/syfo/infrastructure/database/TestDatabase.kt +++ b/src/test/kotlin/no/nav/syfo/infrastructure/database/TestDatabase.kt @@ -1,8 +1,11 @@ package no.nav.syfo.infrastructure.database import io.zonky.test.db.postgres.embedded.EmbeddedPostgres +import no.nav.syfo.infrastructure.database.repository.PForesporsel +import no.nav.syfo.infrastructure.database.repository.toPForesporsel import org.flywaydb.core.Flyway import java.sql.Connection +import java.util.* class TestDatabase : DatabaseInterface { private val pg: EmbeddedPostgres = @@ -42,6 +45,21 @@ fun TestDatabase.dropData() { } } +fun TestDatabase.getForesporsel(uuid: UUID): PForesporsel { + val query = + """ + SELECT * + FROM foresporsel + WHERE uuid = ? + """ + return this.connection.use { connection -> + connection.prepareStatement(query).use { + it.setString(1, uuid.toString()) + it.executeQuery().toList { toPForesporsel() }.single() + } + } +} + class TestDatabaseNotResponding : DatabaseInterface { override val connection: Connection get() = throw Exception("Not working") diff --git a/src/test/kotlin/no/nav/syfo/infrastructure/database/repository/ForesporselRepositoryTest.kt b/src/test/kotlin/no/nav/syfo/infrastructure/database/repository/ForesporselRepositoryTest.kt index 0d59829..22c8a56 100644 --- a/src/test/kotlin/no/nav/syfo/infrastructure/database/repository/ForesporselRepositoryTest.kt +++ b/src/test/kotlin/no/nav/syfo/infrastructure/database/repository/ForesporselRepositoryTest.kt @@ -4,17 +4,20 @@ import no.nav.syfo.ExternalMockEnvironment import no.nav.syfo.UserConstants import no.nav.syfo.generator.generateForsporsel import no.nav.syfo.infrastructure.database.dropData +import no.nav.syfo.infrastructure.database.getForesporsel import no.nav.syfo.shouldBeEqualTo -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.DisplayName -import org.junit.jupiter.api.Nested -import org.junit.jupiter.api.Test +import no.nav.syfo.shouldNotBeEqualTo +import org.junit.jupiter.api.* +import java.sql.SQLException import java.time.temporal.ChronoUnit +import java.util.* class ForesporselRepositoryTest { private val externalMockEnvironment = ExternalMockEnvironment.instance private val database = externalMockEnvironment.database - private val foresporselRepository = ForesporselRepository(database) + private val foresporselRepository = externalMockEnvironment.foresporselRepository + + private val foresporsel = generateForsporsel() @BeforeEach fun setup() { @@ -26,8 +29,6 @@ class ForesporselRepositoryTest { inner class CreateForesporselTests { @Test fun `creates a new Foresporsel`() { - val foresporsel = generateForsporsel() - val createdForesporsel = foresporselRepository.createForesporsel(foresporsel) createdForesporsel.uuid shouldBeEqualTo foresporsel.uuid @@ -44,7 +45,6 @@ class ForesporselRepositoryTest { inner class GetForesporslerTests { @Test fun `gets Foresporsler`() { - val foresporsel = generateForsporsel() val createdForesporsel = foresporselRepository.createForesporsel(foresporsel) val fetchedForesporsel = foresporselRepository.getForesporsler(foresporsel.arbeidstakerPersonident) @@ -54,7 +54,6 @@ class ForesporselRepositoryTest { @Test fun `gets Foresporsler only for given personident`() { - val foresporsel = generateForsporsel() val otherForesporsel = generateForsporsel(UserConstants.ARBEIDSTAKER_PERSONIDENT_2) foresporselRepository.createForesporsel(foresporsel) foresporselRepository.createForesporsel(otherForesporsel) @@ -68,7 +67,6 @@ class ForesporselRepositoryTest { @Test fun `gets several Foresporsler for given personident`() { - val foresporsel = generateForsporsel() val otherForesporsel = generateForsporsel() foresporselRepository.createForesporsel(foresporsel) foresporselRepository.createForesporsel(otherForesporsel) @@ -88,4 +86,26 @@ class ForesporselRepositoryTest { fetchedForesporsel.size shouldBeEqualTo 0 } } + + @Nested + @DisplayName("Update publishedAt") + inner class PublishedAtTests { + @Test + fun `updates publishedAt for Foresporsel`() { + val createdForesporsel = foresporselRepository.createForesporsel(foresporsel) + + foresporselRepository.setPublishedAt(createdForesporsel.uuid) + + val pForesporsel = database.getForesporsel(createdForesporsel.uuid) + + pForesporsel.publishedAt shouldNotBeEqualTo null + } + + @Test + fun `failes when no Foresporsel for uuid`() { + assertThrows { + foresporselRepository.setPublishedAt(UUID.randomUUID()) + } + } + } }