From b2ca01b4a9fa61a6b8ea6a998e76ccb06cee88bc Mon Sep 17 00:00:00 2001 From: Niko Pitkonen Date: Mon, 21 Aug 2023 16:12:44 +0300 Subject: [PATCH] HAI-1844 Change hanke perustaja back to nullable, use validator to validate create request --- .../fi/hel/haitaton/hanke/HankeServiceImpl.kt | 35 +++--- .../fi/hel/haitaton/hanke/Persistence.kt | 2 +- .../fi/hel/haitaton/hanke/PerustajaEntity.kt | 8 +- .../hanke/application/CustomerWithContacts.kt | 15 +++ .../fi/hel/haitaton/hanke/domain/Hanke.kt | 4 +- .../fi/hel/haitaton/hanke/domain/Perustaja.kt | 5 +- .../hanke/permissions/HankeKayttajaService.kt | 2 +- .../hanke/validation/HankeValidator.kt | 8 +- ...3-change-hanke-perustaja-non-nullable.yaml | 21 ---- .../db/changelog/db.changelog-master.yaml | 2 - .../hel/haitaton/hanke/HankeControllerTest.kt | 117 +++++++++++------- .../haitaton/hanke/application/ContactTest.kt | 30 +++++ 12 files changed, 154 insertions(+), 95 deletions(-) delete mode 100644 services/hanke-service/src/main/resources/db/changelog/changesets/043-change-hanke-perustaja-non-nullable.yaml diff --git a/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/HankeServiceImpl.kt b/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/HankeServiceImpl.kt index cc959fe8e..3f307c802 100644 --- a/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/HankeServiceImpl.kt +++ b/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/HankeServiceImpl.kt @@ -119,7 +119,7 @@ open class HankeServiceImpl( val userId = currentUserId() - val entity = HankeEntity(perustaja = hanke.perustaja.toEntity()) + val entity = HankeEntity() val loggingEntryHolder = prepareLogging(entity) // Create a new hanketunnus for it and save it: @@ -158,13 +158,6 @@ open class HankeServiceImpl( } } - private fun initAccessForCreatedHanke(hanke: Hanke, userId: String) { - val hankeId = hanke.id!! - val permissionAll = permissionService.setPermission(hankeId, userId, Role.KAIKKI_OIKEUDET) - hankeKayttajaService.addHankeFounder(hankeId, hanke.perustaja, permissionAll) - hankeKayttajaService.saveNewTokensFromHanke(hanke) - } - /** * Create application when no existing hanke. Autogenerates hanke and applies application to it. */ @@ -242,6 +235,15 @@ open class HankeServiceImpl( hankeLoggingService.logDelete(hanke, userId) } + private fun initAccessForCreatedHanke(hanke: Hanke, userId: String) { + val hankeId = hanke.id!! + val permissionAll = permissionService.setPermission(hankeId, userId, Role.KAIKKI_OIKEUDET) + val perustaja = + hanke.perustaja ?: throw HankeArgumentException("Missing perustaja information") + hankeKayttajaService.addHankeFounder(hankeId, perustaja, permissionAll) + hankeKayttajaService.saveNewTokensFromHanke(hanke) + } + private fun anyHakemusProcessingInAllu(hakemukset: List): Boolean = hakemukset.any { logger.info { "Hakemus ${it.id} has alluStatus ${it.alluStatus}" } @@ -342,7 +344,7 @@ open class HankeServiceImpl( if (hankeEntity.modifiedAt != null) ZonedDateTime.of(hankeEntity.modifiedAt, TZ_UTC) else null, hankeEntity.status, - hankeEntity.perustaja.toDomainObject(), + hankeEntity.perustaja?.toDomainObject(), hankeEntity.generated, ) @@ -569,6 +571,7 @@ open class HankeServiceImpl( hanke.nimi?.let { entity.nimi = hanke.nimi } hanke.kuvaus?.let { entity.kuvaus = hanke.kuvaus } + hanke.perustaja?.let { entity.perustaja = it.toEntity() } entity.generated = hanke.generated hanke.vaihe?.let { entity.vaihe = hanke.vaihe } hanke.suunnitteluVaihe?.let { entity.suunnitteluVaihe = hanke.suunnitteluVaihe } @@ -960,11 +963,11 @@ open class HankeServiceImpl( ) ) - private fun generatePerustajaFrom(cableReport: CableReportApplicationData): Perustaja = - with(cableReport.findOrderer()) { - if (this == null || fullName().isNullOrBlank() || email.isNullOrBlank()) { - throw HankeArgumentException("Invalid orderer $this for Hanke perustaja") - } - Perustaja(fullName()!!, email) - } + private fun generatePerustajaFrom(cableReport: CableReportApplicationData): Perustaja { + val orderer = + cableReport.findOrderer() + ?: throw HankeArgumentException("Orderer not found for Hanke perustaja") + + return orderer.toHankePerustaja() + } } diff --git a/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/Persistence.kt b/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/Persistence.kt index 4012dc31e..fa962d5e2 100644 --- a/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/Persistence.kt +++ b/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/Persistence.kt @@ -136,7 +136,7 @@ class HankeEntity( var createdAt: LocalDateTime? = null, var modifiedByUserId: String? = null, var modifiedAt: LocalDateTime? = null, - @Embedded var perustaja: PerustajaEntity, + @Embedded var perustaja: PerustajaEntity? = null, var generated: Boolean = false, // NOTE: using IDENTITY (i.e. db does auto-increments, Hibernate reads the result back) // can be a performance problem if there is a need to do bulk inserts. diff --git a/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/PerustajaEntity.kt b/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/PerustajaEntity.kt index d0d37825e..fe41bf274 100644 --- a/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/PerustajaEntity.kt +++ b/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/PerustajaEntity.kt @@ -6,8 +6,8 @@ import jakarta.persistence.Embeddable @Embeddable data class PerustajaEntity( - @Column(name = "perustajanimi") var nimi: String, + @Column(name = "perustajanimi") var nimi: String?, @Column(name = "perustajaemail") var email: String -) - -fun PerustajaEntity.toDomainObject(): Perustaja = Perustaja(nimi, email) +) { + fun toDomainObject(): Perustaja = Perustaja(nimi, email) +} diff --git a/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/application/CustomerWithContacts.kt b/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/application/CustomerWithContacts.kt index 1e250815a..98ebf6a43 100644 --- a/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/application/CustomerWithContacts.kt +++ b/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/application/CustomerWithContacts.kt @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.annotation.JsonIgnoreProperties import com.fasterxml.jackson.annotation.JsonView import fi.hel.haitaton.hanke.ChangeLogView +import fi.hel.haitaton.hanke.HankeArgumentException import fi.hel.haitaton.hanke.allu.Contact as AlluContact import fi.hel.haitaton.hanke.allu.Customer as AlluCustomer import fi.hel.haitaton.hanke.allu.CustomerType @@ -11,6 +12,7 @@ import fi.hel.haitaton.hanke.allu.CustomerWithContacts as AlluCustomerWithContac import fi.hel.haitaton.hanke.allu.PostalAddress as AlluPostalAddress import fi.hel.haitaton.hanke.allu.StreetAddress as AlluStreetAddress import fi.hel.haitaton.hanke.domain.BusinessId +import fi.hel.haitaton.hanke.domain.Perustaja @JsonIgnoreProperties(ignoreUnknown = true) data class CustomerWithContacts(val customer: Customer, val contacts: List) { @@ -44,6 +46,19 @@ data class Contact( } return names.filter { !it.isNullOrBlank() }.joinToString(" ") } + + /** + * It is possible to create a cable report without an existing Hanke. In these cases an + * application contact (orderer) is used as Hanke perustaja. + */ + fun toHankePerustaja(): Perustaja { + val name = fullName() + if (name.isNullOrBlank() || email.isNullOrBlank()) { + throw HankeArgumentException("Invalid orderer $this for Hanke perustaja") + } + + return Perustaja(name, email) + } } @JsonIgnoreProperties(ignoreUnknown = true) diff --git a/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/domain/Hanke.kt b/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/domain/Hanke.kt index 3b88fa470..db6da98e3 100644 --- a/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/domain/Hanke.kt +++ b/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/domain/Hanke.kt @@ -79,8 +79,8 @@ data class Hanke( var status: HankeStatus? = HankeStatus.DRAFT, // @JsonView(ChangeLogView::class) - @field:Schema(description = "Hanke founder contact information") - var perustaja: Perustaja, + @field:Schema(description = "Hanke founder contact information", required = true) + var perustaja: Perustaja? = null, // @JsonView(ChangeLogView::class) @field:Schema(description = "Indicates whether the Hanke data is generated, set by the service") diff --git a/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/domain/Perustaja.kt b/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/domain/Perustaja.kt index aa3530e7d..a2c73ef4b 100644 --- a/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/domain/Perustaja.kt +++ b/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/domain/Perustaja.kt @@ -1,15 +1,12 @@ package fi.hel.haitaton.hanke.domain import fi.hel.haitaton.hanke.PerustajaEntity -import fi.hel.haitaton.hanke.permissions.UserContact import io.swagger.v3.oas.annotations.media.Schema @Schema(description = "Founder information") data class Perustaja( - @field:Schema(description = "Name") val nimi: String, + @field:Schema(description = "Name") val nimi: String?, @field:Schema(description = "Email address") val email: String ) { fun toEntity(): PerustajaEntity = PerustajaEntity(nimi, email) - - fun toUserContact(): UserContact = UserContact(nimi, email) } diff --git a/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/permissions/HankeKayttajaService.kt b/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/permissions/HankeKayttajaService.kt index f5d14b39e..81c9be923 100644 --- a/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/permissions/HankeKayttajaService.kt +++ b/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/permissions/HankeKayttajaService.kt @@ -59,7 +59,7 @@ class HankeKayttajaService( saveUser( HankeKayttajaEntity( hankeId = hankeId, - nimi = founder.nimi, + nimi = founder.nimi!!, sahkoposti = founder.email, permission = permissionEntity, kayttajaTunniste = null, diff --git a/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/validation/HankeValidator.kt b/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/validation/HankeValidator.kt index b6c0b7819..a41b1667e 100644 --- a/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/validation/HankeValidator.kt +++ b/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/validation/HankeValidator.kt @@ -92,7 +92,13 @@ class HankeValidator : ConstraintValidator { var ok = true with(hanke.perustaja) { - if (nimi.isBlank()) { + if (this == null) { + context.addViolation("perustaja") + ok = false + return false + } + + if (nimi.isNullOrBlank()) { context.addViolation("perustaja.nimi") ok = false } diff --git a/services/hanke-service/src/main/resources/db/changelog/changesets/043-change-hanke-perustaja-non-nullable.yaml b/services/hanke-service/src/main/resources/db/changelog/changesets/043-change-hanke-perustaja-non-nullable.yaml deleted file mode 100644 index 4495fd917..000000000 --- a/services/hanke-service/src/main/resources/db/changelog/changesets/043-change-hanke-perustaja-non-nullable.yaml +++ /dev/null @@ -1,21 +0,0 @@ -databaseChangeLog: - - changeSet: - id: 043-add-not-null-constraint-for-hanke-perustaja - author: Niko Pitkonen - changes: - - addDefaultValue: - tableName: hanke - columnName: perustajanimi - defaultValue: "" - - addDefaultValue: - tableName: hanke - columnName: perustajaemail - defaultValue: "" - - addNotNullConstraint: - tableName: hanke - columnName: perustajanimi - defaultNullValue: "" - - addNotNullConstraint: - tableName: hanke - columnName: perustajaemail - defaultNullValue: "" diff --git a/services/hanke-service/src/main/resources/db/changelog/db.changelog-master.yaml b/services/hanke-service/src/main/resources/db/changelog/db.changelog-master.yaml index 241f38d9e..793fb0e47 100644 --- a/services/hanke-service/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/services/hanke-service/src/main/resources/db/changelog/db.changelog-master.yaml @@ -113,5 +113,3 @@ databaseChangeLog: file: db/changelog/changesets/041-drop-column-organisaatioid-from-yhteystiedot.yml - include: file: db/changelog/changesets/042-add-indices-to-hanke-kayttaja.yml - - include: - file: db/changelog/changesets/043-change-hanke-perustaja-non-nullable.yaml diff --git a/services/hanke-service/src/test/kotlin/fi/hel/haitaton/hanke/HankeControllerTest.kt b/services/hanke-service/src/test/kotlin/fi/hel/haitaton/hanke/HankeControllerTest.kt index 8c10c582a..54bfa9b46 100644 --- a/services/hanke-service/src/test/kotlin/fi/hel/haitaton/hanke/HankeControllerTest.kt +++ b/services/hanke-service/src/test/kotlin/fi/hel/haitaton/hanke/HankeControllerTest.kt @@ -4,6 +4,7 @@ import fi.hel.haitaton.hanke.configuration.Feature import fi.hel.haitaton.hanke.configuration.FeatureFlags import fi.hel.haitaton.hanke.domain.Hanke import fi.hel.haitaton.hanke.domain.HankeYhteystieto +import fi.hel.haitaton.hanke.domain.Perustaja import fi.hel.haitaton.hanke.domain.YhteystietoTyyppi.YKSITYISHENKILO import fi.hel.haitaton.hanke.factory.HankeFactory import fi.hel.haitaton.hanke.logging.DisclosureLogService @@ -14,11 +15,15 @@ import io.mockk.clearAllMocks import io.mockk.mockk import io.mockk.verify import jakarta.validation.ConstraintViolationException +import java.util.stream.Stream import org.assertj.core.api.Assertions.assertThat import org.assertj.core.api.Assertions.assertThatExceptionOfType import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.Arguments +import org.junit.jupiter.params.provider.MethodSource import org.mockito.Mockito import org.springframework.beans.factory.annotation.Autowired import org.springframework.context.annotation.Bean @@ -29,6 +34,9 @@ import org.springframework.test.context.junit.jupiter.SpringExtension import org.springframework.validation.beanvalidation.MethodValidationPostProcessor private const val USERNAME = "testuser" +private const val HANKE_NAME_MANNERHEIMINTIE = "Mannerheimintien remontti remonttinen" +private const val HANKE_NAME_HAMEENLINNANVAYLA = "Hämeenlinnanväylän uudistus" +private const val HANKE_MOCK_KUVAUS = "Lorem ipsum dolor sit amet..." @ExtendWith(SpringExtension::class) @Import(HankeControllerTest.TestConfiguration::class) @@ -85,8 +93,8 @@ class HankeControllerTest { id = hankeId, hankeTunnus = mockedHankeTunnus, onYKTHanke = true, - nimi = "Mannerheimintien remontti remonttinen", - kuvaus = "Lorem ipsum dolor sit amet...", + nimi = HANKE_NAME_MANNERHEIMINTIE, + kuvaus = HANKE_MOCK_KUVAUS, vaihe = Vaihe.OHJELMOINTI, suunnitteluVaihe = null, version = 1, @@ -106,6 +114,60 @@ class HankeControllerTest { verify { disclosureLogService.saveDisclosureLogsForHanke(any(), eq(USERNAME)) } } + @ParameterizedTest + @MethodSource("invalidPerustajaArguments") + fun `test that the createHanke will give validation errors from invalid hanke data for perustaja`( + perustaja: Perustaja?, + errorMessage: String, + ) { + val partialHanke = + Hanke( + id = 0, + hankeTunnus = null, + nimi = HANKE_NAME_MANNERHEIMINTIE, + kuvaus = HANKE_MOCK_KUVAUS, + onYKTHanke = false, + vaihe = Vaihe.OHJELMOINTI, + suunnitteluVaihe = null, + version = 1, + createdBy = "", + createdAt = null, + modifiedBy = null, + modifiedAt = null, + status = HankeStatus.DRAFT, + perustaja = perustaja, + ) + + assertThatExceptionOfType(ConstraintViolationException::class.java) + .isThrownBy { hankeController.createHanke(partialHanke) } + .withMessageContaining(errorMessage) + + verify { disclosureLogService wasNot Called } + } + + companion object { + @JvmStatic + private fun invalidPerustajaArguments(): Stream = + Stream.of( + Arguments.of( + Perustaja(nimi = "Test Person", email = ""), + expectedErrorMessage(field = "perustaja.email") + ), + Arguments.of( + Perustaja(nimi = "", email = "test.mail@mail.com"), + expectedErrorMessage(field = "perustaja.nimi") + ), + Arguments.of( + Perustaja(nimi = null, email = "test.mail@mail.com"), + expectedErrorMessage(field = "perustaja.nimi") + ), + Arguments.of(null, expectedErrorMessage(field = "perustaja")) + ) + + private fun expectedErrorMessage(field: String) = + "createHanke.hanke.$field: ${HankeError.HAI1002}" + } + @Test fun `test when called without parameters then getHankeList returns ok and two items without geometry`() { val listOfHanke = @@ -114,8 +176,8 @@ class HankeControllerTest { id = 1234, hankeTunnus = mockedHankeTunnus, onYKTHanke = true, - nimi = "Mannerheimintien remontti remonttinen", - kuvaus = "Lorem ipsum dolor sit amet...", + nimi = HANKE_NAME_MANNERHEIMINTIE, + kuvaus = HANKE_MOCK_KUVAUS, vaihe = Vaihe.OHJELMOINTI, suunnitteluVaihe = null, version = 1, @@ -130,8 +192,8 @@ class HankeControllerTest { id = 50, hankeTunnus = "HAME50", onYKTHanke = true, - nimi = "Hämeenlinnanväylän uudistus", - kuvaus = "Lorem ipsum dolor sit amet...", + nimi = HANKE_NAME_HAMEENLINNANVAYLA, + kuvaus = HANKE_MOCK_KUVAUS, vaihe = Vaihe.SUUNNITTELU, suunnitteluVaihe = SuunnitteluVaihe.KATUSUUNNITTELU_TAI_ALUEVARAUS, version = 1, @@ -149,8 +211,8 @@ class HankeControllerTest { val hankeList = hankeController.getHankeList(false) - assertThat(hankeList[0].nimi).isEqualTo("Mannerheimintien remontti remonttinen") - assertThat(hankeList[1].nimi).isEqualTo("Hämeenlinnanväylän uudistus") + assertThat(hankeList[0].nimi).isEqualTo(HANKE_NAME_MANNERHEIMINTIE) + assertThat(hankeList[1].nimi).isEqualTo(HANKE_NAME_HAMEENLINNANVAYLA) assertThat(hankeList[0].alueidenGeometriat()).isEmpty() assertThat(hankeList[1].alueidenGeometriat()).isEmpty() verify { disclosureLogService.saveDisclosureLogsForHankkeet(any(), eq(USERNAME)) } @@ -162,8 +224,8 @@ class HankeControllerTest { Hanke( id = 123, hankeTunnus = "id123", - nimi = "hankkeen nimi", - kuvaus = "lorem ipsum dolor sit amet...", + nimi = HANKE_NAME_MANNERHEIMINTIE, + kuvaus = HANKE_MOCK_KUVAUS, onYKTHanke = false, vaihe = Vaihe.SUUNNITTELU, suunnitteluVaihe = SuunnitteluVaihe.KATUSUUNNITTELU_TAI_ALUEVARAUS, @@ -188,7 +250,7 @@ class HankeControllerTest { val response: Hanke = hankeController.updateHanke(partialHanke, "id123") assertThat(response).isNotNull - assertThat(response.nimi).isEqualTo("hankkeen nimi") + assertThat(response.nimi).isEqualTo(HANKE_NAME_MANNERHEIMINTIE) verify { disclosureLogService.saveDisclosureLogsForHanke(any(), eq(USERNAME)) } } @@ -231,7 +293,7 @@ class HankeControllerTest { id = null, hankeTunnus = null, nimi = "hankkeen nimi", - kuvaus = "lorem ipsum dolor sit amet...", + kuvaus = HANKE_MOCK_KUVAUS, onYKTHanke = false, vaihe = Vaihe.OHJELMOINTI, suunnitteluVaihe = null, @@ -319,35 +381,4 @@ class HankeControllerTest { verify { disclosureLogService wasNot Called } } - - @Test - fun `test that creating a Hanke also adds owner permissions for creating user`() { - val hanke = - Hanke( - id = null, - hankeTunnus = null, - nimi = "hankkeen nimi", - kuvaus = "lorem ipsum dolor sit amet...", - onYKTHanke = false, - vaihe = Vaihe.OHJELMOINTI, - suunnitteluVaihe = null, - version = 1, - createdBy = "Tiina", - createdAt = getCurrentTimeUTC(), - modifiedBy = null, - modifiedAt = null, - status = HankeStatus.DRAFT, - perustaja = HankeFactory.defaultPerustaja, - ) - - val mockedHanke = hanke.copy() - mockedHanke.id = 12 - mockedHanke.hankeTunnus = "JOKU12" - Mockito.`when`(hankeService.createHanke(hanke)).thenReturn(mockedHanke) - - val response: Hanke = hankeController.createHanke(hanke) - - assertThat(response).isNotNull - verify { disclosureLogService.saveDisclosureLogsForHanke(any(), eq(USERNAME)) } - } } diff --git a/services/hanke-service/src/test/kotlin/fi/hel/haitaton/hanke/application/ContactTest.kt b/services/hanke-service/src/test/kotlin/fi/hel/haitaton/hanke/application/ContactTest.kt index 19d5aaa16..bbdd15076 100644 --- a/services/hanke-service/src/test/kotlin/fi/hel/haitaton/hanke/application/ContactTest.kt +++ b/services/hanke-service/src/test/kotlin/fi/hel/haitaton/hanke/application/ContactTest.kt @@ -4,12 +4,16 @@ import assertk.assertThat import assertk.assertions.hasSize import assertk.assertions.isEqualTo import assertk.assertions.isNull +import fi.hel.haitaton.hanke.HankeArgumentException import fi.hel.haitaton.hanke.factory.AlluDataFactory import fi.hel.haitaton.hanke.factory.AlluDataFactory.Companion.createContact import fi.hel.haitaton.hanke.factory.AlluDataFactory.Companion.withContacts +import java.util.stream.Stream import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertThrows import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.CsvSource +import org.junit.jupiter.params.provider.MethodSource private const val DUMMY_EMAIL = "dummymail@mail.com" private const val DUMMY_PHONE = "04012345678" @@ -92,4 +96,30 @@ class ContactTest { assertThat(allContacts).hasSize(2) assertThat(result).isNull() } + + @ParameterizedTest + @MethodSource("invalidContacts") + fun `toHankePerustaja when invalid contact input should throw`(contact: Contact) { + assertThrows { contact.toHankePerustaja() } + } + + companion object { + @JvmStatic + fun invalidContacts(): Stream { + val contact = + Contact( + firstName = "Firstname", + lastName = "Lastname", + email = "test@email.com", + phone = "04012345678", + orderer = true + ) + return Stream.of( + contact.copy(firstName = null, lastName = null), + contact.copy(firstName = "", lastName = ""), + contact.copy(email = null), + contact.copy(email = "") + ) + } + } }