feat(ranking): 스냅샷 job 저장소를 추가한다
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
package kr.co.vividnext.sodalive.v2.ranking.adapter.out.persistence
|
||||
|
||||
import kr.co.vividnext.sodalive.configs.QueryDslConfig
|
||||
import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingSnapshotJobRecord
|
||||
import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingSnapshotJobStatus
|
||||
import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingSnapshotJobTrigger
|
||||
import org.junit.jupiter.api.Assertions.assertEquals
|
||||
import org.junit.jupiter.api.DisplayName
|
||||
import org.junit.jupiter.api.Test
|
||||
import org.springframework.beans.factory.annotation.Autowired
|
||||
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest
|
||||
import org.springframework.context.annotation.Import
|
||||
import java.time.LocalDateTime
|
||||
|
||||
@DataJpaTest(
|
||||
properties = [
|
||||
"spring.cache.type=none",
|
||||
"spring.datasource.url=jdbc:h2:mem:testdb;MODE=MySQL;NON_KEYWORDS=VALUE"
|
||||
]
|
||||
)
|
||||
@Import(QueryDslConfig::class)
|
||||
class DefaultCreatorRankingSnapshotJobRepositoryTest @Autowired constructor(
|
||||
private val repository: CreatorRankingSnapshotJobRepository
|
||||
) {
|
||||
private val adapter = DefaultCreatorRankingSnapshotJobRepository(repository)
|
||||
|
||||
@Test
|
||||
@DisplayName("스냅샷 job은 기간, 트리거, 상태, 처리 시각, 실패 사유를 저장하고 조회한다")
|
||||
fun shouldSaveAndFindSnapshotJobHistoryByPeriodAndStatus() {
|
||||
val startAt = LocalDateTime.of(2026, 5, 31, 15, 0)
|
||||
val endAt = LocalDateTime.of(2026, 6, 7, 15, 0)
|
||||
|
||||
val saved = adapter.save(
|
||||
CreatorRankingSnapshotJobRecord(
|
||||
aggregationStartAtUtc = startAt,
|
||||
aggregationEndAtUtc = endAt,
|
||||
trigger = CreatorRankingSnapshotJobTrigger.SCHEDULED,
|
||||
status = CreatorRankingSnapshotJobStatus.PENDING,
|
||||
lastError = null,
|
||||
processingStartedAt = null,
|
||||
processedAt = null
|
||||
)
|
||||
)
|
||||
val savedId = saved.id!!
|
||||
assertEquals(CreatorRankingSnapshotJobStatus.PENDING, adapter.findById(savedId)?.status)
|
||||
|
||||
val processingStartedAt = LocalDateTime.of(2026, 6, 8, 7, 30)
|
||||
adapter.markProcessing(savedId, processingStartedAt)
|
||||
val processingJob = adapter.findById(savedId)
|
||||
assertEquals(CreatorRankingSnapshotJobStatus.PROCESSING, processingJob?.status)
|
||||
assertEquals(processingStartedAt, processingJob?.processingStartedAt)
|
||||
|
||||
val processedAt = LocalDateTime.of(2026, 6, 8, 7, 31)
|
||||
adapter.markDone(savedId, processedAt)
|
||||
val failed = adapter.save(
|
||||
CreatorRankingSnapshotJobRecord(
|
||||
aggregationStartAtUtc = startAt.minusWeeks(1),
|
||||
aggregationEndAtUtc = endAt.minusWeeks(1),
|
||||
trigger = CreatorRankingSnapshotJobTrigger.SCHEDULED,
|
||||
status = CreatorRankingSnapshotJobStatus.FAILED,
|
||||
lastError = "aggregate failed",
|
||||
processingStartedAt = LocalDateTime.of(2026, 6, 1, 7, 30),
|
||||
processedAt = LocalDateTime.of(2026, 6, 1, 7, 31)
|
||||
)
|
||||
)
|
||||
|
||||
val jobs = adapter.findByPeriodAndStatuses(
|
||||
aggregationStartAtUtc = startAt,
|
||||
aggregationEndAtUtc = endAt,
|
||||
statuses = listOf(CreatorRankingSnapshotJobStatus.DONE)
|
||||
)
|
||||
val failedJob = adapter.findById(failed.id!!)
|
||||
|
||||
assertEquals(1, jobs.size)
|
||||
assertEquals(CreatorRankingSnapshotJobTrigger.SCHEDULED, jobs.single().trigger)
|
||||
assertEquals(CreatorRankingSnapshotJobStatus.DONE, jobs.single().status)
|
||||
assertEquals(processingStartedAt, jobs.single().processingStartedAt)
|
||||
assertEquals(processedAt, jobs.single().processedAt)
|
||||
assertEquals(null, jobs.single().lastError)
|
||||
assertEquals(CreatorRankingSnapshotJobStatus.FAILED, failedJob?.status)
|
||||
assertEquals("aggregate failed", failedJob?.lastError)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user