Skip to content

Commit 81bd61f

Browse files
committed
fixup! fixup! HAI-3538 Send a reminder email when a draft hanke has been unmodified for 175 or 165 days (either limit, not both).
1 parent 11d3501 commit 81bd61f

3 files changed

Lines changed: 187 additions & 2 deletions

File tree

services/hanke-service/src/integrationTest/kotlin/fi/hel/haitaton/hanke/HankeCompletionServiceITest.kt

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1566,6 +1566,139 @@ class HankeCompletionServiceITest(
15661566
}
15671567
}
15681568

1569+
@Nested
1570+
inner class SendUnmodifiedDraftReminderIfNecessary {
1571+
@Test
1572+
fun `does nothing when hanke has already been sent this reminder`() {
1573+
val hanke =
1574+
hankeFactory.builder().saveEntity(HankeStatus.DRAFT) {
1575+
it.sentReminders += HankeReminder.DRAFT_COMPLETION_15
1576+
}
1577+
1578+
hankeCompletionService.sendUnmodifiedDraftReminderIfNecessary(
1579+
hanke.id,
1580+
HankeReminder.DRAFT_COMPLETION_15,
1581+
)
1582+
1583+
assertThat(greenMail.receivedMessages).isEmpty()
1584+
val result = hankeRepository.getReferenceById(hanke.id)
1585+
assertThat(result.sentReminders).containsExactly(HankeReminder.DRAFT_COMPLETION_15)
1586+
}
1587+
1588+
@Test
1589+
fun `marks reminder as sent and sends emails for DRAFT_COMPLETION_15`() {
1590+
val hanke =
1591+
hankeFactory.builder().withNoAreas().saveWithYhteystiedot {
1592+
omistaja(Kayttooikeustaso.KAIKKI_OIKEUDET)
1593+
rakennuttaja(Kayttooikeustaso.KAIKKIEN_MUOKKAUS)
1594+
toteuttaja(Kayttooikeustaso.KATSELUOIKEUS)
1595+
}
1596+
hanke.status = HankeStatus.DRAFT
1597+
hankeRepository.save(hanke)
1598+
1599+
hankeCompletionService.sendUnmodifiedDraftReminderIfNecessary(
1600+
hanke.id,
1601+
HankeReminder.DRAFT_COMPLETION_15,
1602+
)
1603+
1604+
val result = hankeRepository.getReferenceById(hanke.id)
1605+
assertThat(result.sentReminders).containsExactly(HankeReminder.DRAFT_COMPLETION_15)
1606+
1607+
val emails = greenMail.receivedMessages
1608+
assertThat(emails).hasSize(3)
1609+
val recipients = emails.map { it.allRecipients.single().toString() }
1610+
assertThat(recipients)
1611+
.containsExactlyInAnyOrder(
1612+
"pertti@perustaja.test",
1613+
"olivia.omistaja@mail.com",
1614+
"rane.rakennuttaja@mail.com",
1615+
)
1616+
1617+
val email = emails.first()
1618+
assertThat(email.subject)
1619+
.contains(
1620+
"Haitaton: Luonnos-tilainen hankkeesi ${hanke.hankeTunnus} on ollut pitkään muokkaamattomana"
1621+
)
1622+
assertThat(email.textBody())
1623+
.contains(
1624+
"Hankkeesi ${hanke.nimi} (${hanke.hankeTunnus}) on luonnos-tilassa",
1625+
"165 vuorokauteen",
1626+
"180 vuorokautta",
1627+
)
1628+
}
1629+
1630+
@Test
1631+
fun `marks reminder as sent and sends emails for DRAFT_COMPLETION_5`() {
1632+
val hanke =
1633+
hankeFactory.builder().withNoAreas().saveWithYhteystiedot {
1634+
omistaja(Kayttooikeustaso.KAIKKI_OIKEUDET)
1635+
rakennuttaja(Kayttooikeustaso.KAIKKIEN_MUOKKAUS)
1636+
}
1637+
hanke.status = HankeStatus.DRAFT
1638+
hankeRepository.save(hanke)
1639+
1640+
hankeCompletionService.sendUnmodifiedDraftReminderIfNecessary(
1641+
hanke.id,
1642+
HankeReminder.DRAFT_COMPLETION_5,
1643+
)
1644+
1645+
val result = hankeRepository.getReferenceById(hanke.id)
1646+
assertThat(result.sentReminders).containsExactly(HankeReminder.DRAFT_COMPLETION_5)
1647+
1648+
val emails = greenMail.receivedMessages
1649+
assertThat(emails).hasSize(3)
1650+
val recipients = emails.map { it.allRecipients.single().toString() }
1651+
assertThat(recipients)
1652+
.containsExactlyInAnyOrder(
1653+
"pertti@perustaja.test",
1654+
"olivia.omistaja@mail.com",
1655+
"rane.rakennuttaja@mail.com",
1656+
)
1657+
1658+
val email = emails.first()
1659+
assertThat(email.subject)
1660+
.contains(
1661+
"Haitaton: Luonnos-tilainen hankkeesi ${hanke.hankeTunnus} on ollut pitkään muokkaamattomana"
1662+
)
1663+
assertThat(email.textBody())
1664+
.contains(
1665+
"Hankkeesi ${hanke.nimi} (${hanke.hankeTunnus}) on luonnos-tilassa",
1666+
"175 vuorokauteen",
1667+
"180 vuorokautta",
1668+
)
1669+
}
1670+
1671+
@Test
1672+
fun `sends emails only to users with EDIT permissions`() {
1673+
val hanke =
1674+
hankeFactory.builder().withNoAreas().saveWithYhteystiedot {
1675+
omistaja(Kayttooikeustaso.KAIKKI_OIKEUDET)
1676+
rakennuttaja(Kayttooikeustaso.KAIKKIEN_MUOKKAUS)
1677+
toteuttaja(Kayttooikeustaso.KATSELUOIKEUS)
1678+
muuYhteystieto(Kayttooikeustaso.HANKEMUOKKAUS)
1679+
toteuttaja(Kayttooikeustaso.HAKEMUSASIOINTI)
1680+
}
1681+
hanke.status = HankeStatus.DRAFT
1682+
hankeRepository.save(hanke)
1683+
1684+
hankeCompletionService.sendUnmodifiedDraftReminderIfNecessary(
1685+
hanke.id,
1686+
HankeReminder.DRAFT_COMPLETION_15,
1687+
)
1688+
1689+
val emails = greenMail.receivedMessages
1690+
val recipients = emails.map { it.allRecipients.single().toString() }
1691+
assertThat(recipients).hasSize(4)
1692+
assertThat(recipients)
1693+
.containsExactlyInAnyOrder(
1694+
"olivia.omistaja@mail.com",
1695+
"rane.rakennuttaja@mail.com",
1696+
"anssi.asianhoitaja@mail.com",
1697+
"pertti@perustaja.test",
1698+
)
1699+
}
1700+
}
1701+
15691702
companion object {
15701703

15711704
@JvmField

services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/HankeCompletionService.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ class HankeCompletionService(
242242

243243
@Transactional
244244
fun sendUnmodifiedDraftReminderIfNecessary(id: Int, reminder: HankeReminder) {
245-
logger.info { "Checking if a unmodified draft reminder needs to be sent to hanke $id" }
245+
logger.info { "Checking if an unmodified draft reminder needs to be sent to hanke $id" }
246246
val hanke = hankeRepository.getReferenceById(id)
247247

248248
if (hanke.sentReminders.contains(reminder)) {
@@ -408,7 +408,7 @@ class HankeCompletionService(
408408
.plusDays(5)
409409
}
410410

411-
private fun unmodifiedDraftReminderDays(
411+
internal fun unmodifiedDraftReminderDays(
412412
reminder: HankeReminder
413413
): UnmodifiedDraftReminderDays {
414414
val reminderDay =

services/hanke-service/src/test/kotlin/fi/hel/haitaton/hanke/HankeCompletionServiceTest.kt

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import assertk.all
44
import assertk.assertFailure
55
import assertk.assertThat
66
import assertk.assertions.hasClass
7+
import assertk.assertions.isEqualTo
78
import assertk.assertions.isFalse
89
import assertk.assertions.isNotNull
910
import assertk.assertions.isNull
@@ -13,7 +14,9 @@ import assertk.assertions.messageContains
1314
import fi.hel.haitaton.hanke.HankeCompletionService.Companion.areasForDraft
1415
import fi.hel.haitaton.hanke.HankeCompletionService.Companion.areasForPublic
1516
import fi.hel.haitaton.hanke.HankeCompletionService.Companion.hasFutureAreas
17+
import fi.hel.haitaton.hanke.HankeCompletionService.Companion.unmodifiedDraftReminderDays
1618
import fi.hel.haitaton.hanke.allu.ApplicationStatus
19+
import fi.hel.haitaton.hanke.domain.HankeReminder
1720
import fi.hel.haitaton.hanke.factory.ApplicationFactory
1821
import fi.hel.haitaton.hanke.factory.HankeFactory
1922
import fi.hel.haitaton.hanke.factory.HankealueFactory
@@ -273,4 +276,53 @@ class HankeCompletionServiceTest {
273276
assertThat(result).isTrue()
274277
}
275278
}
279+
280+
@Nested
281+
inner class UnmodifiedDraftReminderDays {
282+
@Test
283+
fun `returns correct days for DRAFT_COMPLETION_15 reminder`() {
284+
val result = unmodifiedDraftReminderDays(HankeReminder.DRAFT_COMPLETION_15)
285+
286+
assertThat(result.daysUnmodified).isEqualTo(165)
287+
assertThat(result.daysUntilMarkedReady).isEqualTo(180)
288+
}
289+
290+
@Test
291+
fun `returns correct days for DRAFT_COMPLETION_5 reminder`() {
292+
val result = unmodifiedDraftReminderDays(HankeReminder.DRAFT_COMPLETION_5)
293+
294+
assertThat(result.daysUnmodified).isEqualTo(175)
295+
assertThat(result.daysUntilMarkedReady).isEqualTo(180)
296+
}
297+
298+
@Test
299+
fun `throws exception for unsupported reminder type COMPLETION_5`() {
300+
val failure = assertFailure { unmodifiedDraftReminderDays(HankeReminder.COMPLETION_5) }
301+
302+
failure.all {
303+
hasClass(IllegalArgumentException::class.java)
304+
messageContains("Unsupported reminder type for unmodified drafts: COMPLETION_5")
305+
}
306+
}
307+
308+
@Test
309+
fun `throws exception for unsupported reminder type COMPLETION_14`() {
310+
val failure = assertFailure { unmodifiedDraftReminderDays(HankeReminder.COMPLETION_14) }
311+
312+
failure.all {
313+
hasClass(IllegalArgumentException::class.java)
314+
messageContains("Unsupported reminder type for unmodified drafts: COMPLETION_14")
315+
}
316+
}
317+
318+
@Test
319+
fun `throws exception for unsupported reminder type DELETION_5`() {
320+
val failure = assertFailure { unmodifiedDraftReminderDays(HankeReminder.DELETION_5) }
321+
322+
failure.all {
323+
hasClass(IllegalArgumentException::class.java)
324+
messageContains("Unsupported reminder type for unmodified drafts: DELETION_5")
325+
}
326+
}
327+
}
276328
}

0 commit comments

Comments
 (0)