Skip to content

Commit 7dd529c

Browse files
committed
fix: schedule tests
1 parent 4f7b0c0 commit 7dd529c

3 files changed

Lines changed: 175 additions & 26 deletions

File tree

backend/src/test/kotlin/com/ynixt/sharedfinances/scenarios/wallet/TransactionEditScenarioDslTest.kt

Lines changed: 138 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import org.junit.jupiter.api.Test
2121
import org.junit.jupiter.api.assertThrows
2222
import java.math.BigDecimal
2323
import java.time.LocalDate
24+
import java.time.YearMonth
2425
import java.util.UUID
2526

2627
class TransactionEditScenarioDslTest {
@@ -1177,6 +1178,7 @@ class TransactionEditScenarioDslTest {
11771178
val today = LocalDate.of(2026, 1, 8)
11781179
val firstOccurrence = today.plusDays(1)
11791180
val secondOccurrence = firstOccurrence.plusMonths(1)
1181+
val thirdOccurrence = secondOccurrence.plusMonths(1)
11801182
lateinit var bankAccountId: UUID
11811183

11821184
walletScenario(initialDate = today) {
@@ -1217,9 +1219,36 @@ class TransactionEditScenarioDslTest {
12171219
}
12181220

12191221
then {
1220-
scheduledManagerCountShouldBe(ScheduledExecutionFilter.FUTURE, 3)
1221-
scheduledManagerCountShouldBe(ScheduledExecutionFilter.ALREADY_GENERATED, 0)
1222-
scheduledManagerCountShouldBe(ScheduledExecutionFilter.ALL, 3)
1222+
scheduledManagerCountShouldBe(
1223+
ScheduledExecutionFilter.FUTURE,
1224+
3,
1225+
selectedMonths =
1226+
listOf(
1227+
YearMonth.from(firstOccurrence),
1228+
YearMonth.from(secondOccurrence),
1229+
YearMonth.from(thirdOccurrence),
1230+
),
1231+
)
1232+
scheduledManagerCountShouldBe(
1233+
ScheduledExecutionFilter.ALREADY_GENERATED,
1234+
0,
1235+
selectedMonths =
1236+
listOf(
1237+
YearMonth.from(firstOccurrence),
1238+
YearMonth.from(secondOccurrence),
1239+
YearMonth.from(thirdOccurrence),
1240+
),
1241+
)
1242+
scheduledManagerCountShouldBe(
1243+
ScheduledExecutionFilter.ALL,
1244+
3,
1245+
selectedMonths =
1246+
listOf(
1247+
YearMonth.from(firstOccurrence),
1248+
YearMonth.from(secondOccurrence),
1249+
YearMonth.from(thirdOccurrence),
1250+
),
1251+
)
12231252
}
12241253

12251254
`when` {
@@ -1229,9 +1258,26 @@ class TransactionEditScenarioDslTest {
12291258

12301259
then {
12311260
balanceShouldBe(BigDecimal("900.00"), bankAccountId)
1232-
scheduledManagerCountShouldBe(ScheduledExecutionFilter.FUTURE, 2)
1233-
scheduledManagerCountShouldBe(ScheduledExecutionFilter.ALREADY_GENERATED, 1)
1234-
scheduledManagerCountShouldBe(ScheduledExecutionFilter.ALL, 3)
1261+
scheduledManagerCountShouldBe(
1262+
ScheduledExecutionFilter.FUTURE,
1263+
2,
1264+
selectedMonths = listOf(YearMonth.from(secondOccurrence), YearMonth.from(thirdOccurrence)),
1265+
)
1266+
scheduledManagerCountShouldBe(
1267+
ScheduledExecutionFilter.ALREADY_GENERATED,
1268+
1,
1269+
selectedMonths = listOf(YearMonth.from(firstOccurrence)),
1270+
)
1271+
scheduledManagerCountShouldBe(
1272+
ScheduledExecutionFilter.ALL,
1273+
3,
1274+
selectedMonths =
1275+
listOf(
1276+
YearMonth.from(firstOccurrence),
1277+
YearMonth.from(secondOccurrence),
1278+
YearMonth.from(thirdOccurrence),
1279+
),
1280+
)
12351281
}
12361282

12371283
`when` {
@@ -1366,8 +1412,16 @@ class TransactionEditScenarioDslTest {
13661412

13671413
then {
13681414
balanceShouldBe(BigDecimal("960.00"), bankAccountId)
1369-
scheduledManagerCountShouldBe(ScheduledExecutionFilter.FUTURE, 1)
1370-
scheduledManagerCountShouldBe(ScheduledExecutionFilter.ALREADY_GENERATED, 1)
1415+
scheduledManagerCountShouldBe(
1416+
ScheduledExecutionFilter.FUTURE,
1417+
1,
1418+
selectedMonths = listOf(YearMonth.from(secondOccurrence)),
1419+
)
1420+
scheduledManagerCountShouldBe(
1421+
ScheduledExecutionFilter.ALREADY_GENERATED,
1422+
1,
1423+
selectedMonths = listOf(YearMonth.from(today)),
1424+
)
13711425
scheduledManagerDatesShouldBe(
13721426
filter = ScheduledExecutionFilter.ALL,
13731427
expectedDates = listOf(today, secondOccurrence),
@@ -1479,7 +1533,11 @@ class TransactionEditScenarioDslTest {
14791533

14801534
then {
14811535
balanceShouldBe(BigDecimal("900.00"), bankAccountId)
1482-
scheduledManagerCountShouldBe(ScheduledExecutionFilter.ALREADY_GENERATED, 1)
1536+
scheduledManagerCountShouldBe(
1537+
ScheduledExecutionFilter.ALREADY_GENERATED,
1538+
1,
1539+
selectedMonths = listOf(YearMonth.from(today)),
1540+
)
14831541
scheduledManagerDatesShouldBe(
14841542
filter = ScheduledExecutionFilter.ALL,
14851543
expectedDates = listOf(today, secondOccurrence),
@@ -1488,6 +1546,7 @@ class TransactionEditScenarioDslTest {
14881546
filter = ScheduledExecutionFilter.FUTURE,
14891547
expectedInstallments = listOf(2),
14901548
expectedTotal = 3,
1549+
selectedMonths = listOf(YearMonth.from(secondOccurrence)),
14911550
)
14921551
lastPublishedWalletEventShouldConvert(ActionEventType.UPDATE)
14931552
}
@@ -1507,6 +1566,7 @@ class TransactionEditScenarioDslTest {
15071566
filter = ScheduledExecutionFilter.FUTURE,
15081567
expectedInstallments = listOf(3),
15091568
expectedTotal = 3,
1569+
selectedMonths = listOf(YearMonth.from(thirdOccurrence)),
15101570
)
15111571
}
15121572
}
@@ -1559,11 +1619,19 @@ class TransactionEditScenarioDslTest {
15591619

15601620
then {
15611621
balanceShouldBe(BigDecimal("960.00"), bankAccountId)
1562-
scheduledManagerCountShouldBe(ScheduledExecutionFilter.ALREADY_GENERATED, 1)
1563-
scheduledManagerCountShouldBe(ScheduledExecutionFilter.FUTURE, 1)
1622+
scheduledManagerCountShouldBe(
1623+
ScheduledExecutionFilter.ALREADY_GENERATED,
1624+
1,
1625+
selectedMonths = listOf(YearMonth.from(today)),
1626+
)
1627+
scheduledManagerCountShouldBe(
1628+
ScheduledExecutionFilter.FUTURE,
1629+
2,
1630+
selectedMonths = listOf(YearMonth.from(secondOccurrence)),
1631+
)
15641632
scheduledManagerDatesShouldBe(
15651633
filter = ScheduledExecutionFilter.ALL,
1566-
expectedDates = listOf(today, secondOccurrence),
1634+
expectedDates = listOf(today, secondOccurrence, thirdOccurrence),
15671635
)
15681636
lastPublishedWalletEventShouldConvert(ActionEventType.UPDATE)
15691637
}
@@ -1621,8 +1689,21 @@ class TransactionEditScenarioDslTest {
16211689
recurrenceLimitShouldBe(5)
16221690
recurrenceSeriesQtyTotalShouldBe(5)
16231691
recurrenceNextExecutionShouldBe(fourthOccurrence)
1624-
scheduledManagerCountShouldBe(ScheduledExecutionFilter.ALREADY_GENERATED, 3)
1625-
scheduledManagerCountShouldBe(ScheduledExecutionFilter.FUTURE, 1)
1692+
scheduledManagerCountShouldBe(
1693+
ScheduledExecutionFilter.ALREADY_GENERATED,
1694+
3,
1695+
selectedMonths =
1696+
listOf(
1697+
YearMonth.from(firstOccurrence),
1698+
YearMonth.from(secondOccurrence),
1699+
YearMonth.from(thirdOccurrence),
1700+
),
1701+
)
1702+
scheduledManagerCountShouldBe(
1703+
ScheduledExecutionFilter.FUTURE,
1704+
1,
1705+
selectedMonths = listOf(YearMonth.from(fourthOccurrence)),
1706+
)
16261707
scheduledManagerDatesShouldBe(
16271708
filter = ScheduledExecutionFilter.ALREADY_GENERATED,
16281709
expectedDates = listOf(firstOccurrence, secondOccurrence, thirdOccurrence),
@@ -1635,6 +1716,7 @@ class TransactionEditScenarioDslTest {
16351716
filter = ScheduledExecutionFilter.FUTURE,
16361717
expectedInstallments = listOf(4),
16371718
expectedTotal = 5,
1719+
selectedMonths = listOf(YearMonth.from(fourthOccurrence)),
16381720
)
16391721
}
16401722

@@ -1655,6 +1737,7 @@ class TransactionEditScenarioDslTest {
16551737
filter = ScheduledExecutionFilter.FUTURE,
16561738
expectedInstallments = listOf(5),
16571739
expectedTotal = 5,
1740+
selectedMonths = listOf(YearMonth.from(fifthOccurrence)),
16581741
)
16591742
}
16601743
}
@@ -1697,8 +1780,21 @@ class TransactionEditScenarioDslTest {
16971780
recurrenceLimitShouldBe(null)
16981781
recurrenceSeriesQtyTotalShouldBe(3)
16991782
recurrenceNextExecutionShouldBe(fourthOccurrence)
1700-
scheduledManagerCountShouldBe(ScheduledExecutionFilter.ALREADY_GENERATED, 3)
1701-
scheduledManagerCountShouldBe(ScheduledExecutionFilter.FUTURE, 1)
1783+
scheduledManagerCountShouldBe(
1784+
ScheduledExecutionFilter.ALREADY_GENERATED,
1785+
3,
1786+
selectedMonths =
1787+
listOf(
1788+
YearMonth.from(firstOccurrence),
1789+
YearMonth.from(secondOccurrence),
1790+
YearMonth.from(thirdOccurrence),
1791+
),
1792+
)
1793+
scheduledManagerCountShouldBe(
1794+
ScheduledExecutionFilter.FUTURE,
1795+
1,
1796+
selectedMonths = listOf(YearMonth.from(fourthOccurrence)),
1797+
)
17021798
scheduledManagerDatesShouldBe(
17031799
filter = ScheduledExecutionFilter.ALREADY_GENERATED,
17041800
expectedDates = listOf(firstOccurrence, secondOccurrence, thirdOccurrence),
@@ -1778,8 +1874,16 @@ class TransactionEditScenarioDslTest {
17781874
then {
17791875
balanceShouldBe(BigDecimal("900.00"), bankAccountId)
17801876
recurrenceExecutionCountShouldBe(1)
1781-
scheduledManagerCountShouldBe(ScheduledExecutionFilter.ALREADY_GENERATED, 2)
1782-
scheduledManagerCountShouldBe(ScheduledExecutionFilter.FUTURE, 1)
1877+
scheduledManagerCountShouldBe(
1878+
ScheduledExecutionFilter.ALREADY_GENERATED,
1879+
2,
1880+
selectedMonths = listOf(YearMonth.from(firstOccurrence)),
1881+
)
1882+
scheduledManagerCountShouldBe(
1883+
ScheduledExecutionFilter.FUTURE,
1884+
1,
1885+
selectedMonths = listOf(YearMonth.from(thirdOccurrence)),
1886+
)
17831887
scheduledManagerDatesShouldBe(
17841888
filter = ScheduledExecutionFilter.ALL,
17851889
expectedDates = listOf(firstOccurrence, allowedPastDate, thirdOccurrence),
@@ -1927,8 +2031,16 @@ class TransactionEditScenarioDslTest {
19272031
then {
19282032
balanceShouldBe(BigDecimal("800.00"), bankAccountId)
19292033
recurrenceExecutionCountShouldBe(1)
1930-
scheduledManagerCountShouldBe(ScheduledExecutionFilter.ALREADY_GENERATED, 2)
1931-
scheduledManagerCountShouldBe(ScheduledExecutionFilter.FUTURE, 1)
2034+
scheduledManagerCountShouldBe(
2035+
ScheduledExecutionFilter.ALREADY_GENERATED,
2036+
2,
2037+
selectedMonths = listOf(YearMonth.from(firstOccurrence)),
2038+
)
2039+
scheduledManagerCountShouldBe(
2040+
ScheduledExecutionFilter.FUTURE,
2041+
1,
2042+
selectedMonths = listOf(YearMonth.from(thirdOccurrence)),
2043+
)
19322044
scheduledManagerDatesShouldBe(
19332045
filter = ScheduledExecutionFilter.ALL,
19342046
expectedDates = listOf(firstOccurrence, allowedPastDate, thirdOccurrence),
@@ -1937,6 +2049,7 @@ class TransactionEditScenarioDslTest {
19372049
filter = ScheduledExecutionFilter.FUTURE,
19382050
expectedInstallments = listOf(3),
19392051
expectedTotal = 3,
2052+
selectedMonths = listOf(YearMonth.from(thirdOccurrence)),
19402053
)
19412054
}
19422055
}
@@ -2031,6 +2144,7 @@ class TransactionEditScenarioDslTest {
20312144
filter = ScheduledExecutionFilter.FUTURE,
20322145
expectedInstallments = listOf(3),
20332146
expectedTotal = 5,
2147+
selectedMonths = listOf(YearMonth.from(thirdOccurrence)),
20342148
)
20352149
}
20362150
}
@@ -2084,6 +2198,7 @@ class TransactionEditScenarioDslTest {
20842198
filter = ScheduledExecutionFilter.FUTURE,
20852199
expectedInstallments = listOf(2),
20862200
expectedTotal = 3,
2201+
selectedMonths = listOf(YearMonth.from(secondOccurrence)),
20872202
)
20882203
}
20892204

@@ -2097,6 +2212,7 @@ class TransactionEditScenarioDslTest {
20972212
filter = ScheduledExecutionFilter.FUTURE,
20982213
expectedInstallments = listOf(3),
20992214
expectedTotal = 3,
2215+
selectedMonths = listOf(YearMonth.from(secondOccurrence.plusMonths(1))),
21002216
)
21012217
}
21022218
}
@@ -2150,6 +2266,7 @@ class TransactionEditScenarioDslTest {
21502266
filter = ScheduledExecutionFilter.FUTURE,
21512267
expectedInstallments = listOf(2, 3),
21522268
expectedTotal = 3,
2269+
selectedMonths = listOf(YearMonth.from(secondOccurrence), YearMonth.from(secondOccurrence.plusMonths(1))),
21532270
)
21542271
}
21552272
}
@@ -2545,6 +2662,7 @@ class TransactionEditScenarioDslTest {
25452662
filter = ScheduledExecutionFilter.FUTURE,
25462663
expectedInstallments = listOf(2),
25472664
expectedTotal = 3,
2665+
selectedMonths = listOf(YearMonth.from(secondOccurrence)),
25482666
)
25492667
}
25502668
}

backend/src/test/kotlin/com/ynixt/sharedfinances/scenarios/wallet/support/WalletScenarioResolver.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import kotlinx.coroutines.flow.toList
1616
import kotlinx.coroutines.reactor.awaitSingle
1717
import kotlinx.coroutines.reactor.awaitSingleOrNull
1818
import java.time.LocalDate
19+
import java.time.YearMonth
1920
import java.util.UUID
2021

2122
internal class WalletScenarioResolver(
@@ -242,9 +243,15 @@ internal class WalletScenarioResolver(
242243
?.walletEvent
243244
?.let { runtime.walletEventListService.convertEntityToEntryListResponse(it, true) }
244245

245-
suspend fun listScheduledExecutions(filter: ScheduledExecutionFilter): Int = listScheduledExecutionEntries(filter).size
246+
suspend fun listScheduledExecutions(
247+
filter: ScheduledExecutionFilter,
248+
selectedMonth: YearMonth = YearMonth.from(runtime.clock.today()),
249+
): Int = listScheduledExecutionEntries(filter, selectedMonth).size
246250

247-
suspend fun listScheduledExecutionEntries(filter: ScheduledExecutionFilter): List<EventListResponse> {
251+
suspend fun listScheduledExecutionEntries(
252+
filter: ScheduledExecutionFilter,
253+
selectedMonth: YearMonth = YearMonth.from(runtime.clock.today()),
254+
): List<EventListResponse> {
248255
val userId = ensureUser()
249256

250257
return runtime.scheduledExecutionManagerService
@@ -254,6 +261,7 @@ internal class WalletScenarioResolver(
254261
ScheduledExecutionManagerRequest(
255262
groupId = null,
256263
filter = filter,
264+
selectedMonth = selectedMonth.toString(),
257265
),
258266
)
259267
}

backend/src/test/kotlin/com/ynixt/sharedfinances/scenarios/wallet/support/WalletScenarioThen.kt

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -299,8 +299,14 @@ class WalletScenarioThen internal constructor(
299299
suspend fun scheduledManagerCountShouldBe(
300300
filter: ScheduledExecutionFilter,
301301
expected: Int,
302+
selectedMonths: List<YearMonth> = emptyList(),
302303
) {
303-
val count = resolver.listScheduledExecutions(filter)
304+
val count =
305+
if (selectedMonths.isEmpty()) {
306+
resolver.listScheduledExecutions(filter)
307+
} else {
308+
selectedMonths.distinct().sumOf { month -> resolver.listScheduledExecutions(filter, selectedMonth = month) }
309+
}
304310

305311
assertThat(count)
306312
.describedAs("scheduled manager count for $filter")
@@ -311,8 +317,14 @@ class WalletScenarioThen internal constructor(
311317
filter: ScheduledExecutionFilter,
312318
expectedInstallments: List<Int>,
313319
expectedTotal: Int,
320+
selectedMonths: List<YearMonth> = emptyList(),
314321
) {
315-
val entries = resolver.listScheduledExecutionEntries(filter)
322+
val entries =
323+
if (selectedMonths.isEmpty()) {
324+
resolver.listScheduledExecutionEntries(filter)
325+
} else {
326+
selectedMonths.distinct().flatMap { month -> resolver.listScheduledExecutionEntries(filter, selectedMonth = month) }
327+
}
316328
val installmentEntries = entries.filter { it.installment != null }
317329
val installments = installmentEntries.mapNotNull { it.installment }.sorted()
318330

@@ -334,8 +346,19 @@ class WalletScenarioThen internal constructor(
334346
suspend fun scheduledManagerDatesShouldBe(
335347
filter: ScheduledExecutionFilter,
336348
expectedDates: List<java.time.LocalDate>,
337-
) {
338-
val dates = resolver.listScheduledExecutionEntries(filter).map { it.date }
349+
selectedMonth: YearMonth? = null,
350+
) {
351+
val dates =
352+
when {
353+
selectedMonth != null -> resolver.listScheduledExecutionEntries(filter, selectedMonth = selectedMonth).map { it.date }
354+
expectedDates.isEmpty() -> resolver.listScheduledExecutionEntries(filter).map { it.date }
355+
else ->
356+
expectedDates
357+
.map(YearMonth::from)
358+
.distinct()
359+
.flatMap { month -> resolver.listScheduledExecutionEntries(filter, selectedMonth = month) }
360+
.map { it.date }
361+
}
339362

340363
assertThat(dates)
341364
.describedAs("scheduled manager dates for $filter")

0 commit comments

Comments
 (0)