feat(ranking): 스냅샷 job 상태 로그를 추가한다

This commit is contained in:
2026-06-09 12:32:34 +09:00
parent 32460e550c
commit 34b26d4906
2 changed files with 65 additions and 0 deletions

View File

@@ -6,13 +6,18 @@ import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingSnapshotJobSta
import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingSnapshotJobTrigger
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertThrows
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.mockito.Mockito
import org.springframework.boot.test.system.CapturedOutput
import org.springframework.boot.test.system.OutputCaptureExtension
import java.time.LocalDateTime
import java.time.ZoneId
import java.time.ZonedDateTime
@ExtendWith(OutputCaptureExtension::class)
class CreatorRankingSnapshotJobServiceTest {
@Test
@DisplayName("스케줄 실행은 집계 기간을 포함한 SCHEDULED job을 생성하고 성공 시 DONE으로 기록한다")
@@ -154,6 +159,44 @@ class CreatorRankingSnapshotJobServiceTest {
assertEquals(CreatorRankingSnapshotJobStatus.PENDING, unchanged.status)
assertEquals("keep", unchanged.lastError)
}
@Test
@DisplayName("스케줄 job 상태 변경은 job id와 상태를 로그로 남긴다")
fun shouldLogScheduledJobStatusTransitions(output: CapturedOutput) {
val refreshService = Mockito.mock(CreatorRankingSnapshotRefreshService::class.java)
val jobPort = FakeCreatorRankingSnapshotJobPort()
val now = ZonedDateTime.of(2026, 6, 8, 7, 30, 0, 0, ZoneId.of("Asia/Seoul"))
val service = CreatorRankingSnapshotJobService(refreshService, jobPort) { now }
service.refreshLastCompletedWeekByScheduledJob()
assertTrue(output.out.contains("event=creator_ranking_snapshot_job_status_changed"))
assertTrue(output.out.contains("jobId=1"))
assertTrue(output.out.contains("trigger=SCHEDULED"))
assertTrue(output.out.contains("status=PROCESSING"))
assertTrue(output.out.contains("status=DONE"))
}
@Test
@DisplayName("실패 job 상태 변경은 실패 상태와 사유를 로그로 남긴다")
fun shouldLogFailedScheduledJobStatusTransition(output: CapturedOutput) {
val refreshService = Mockito.mock(CreatorRankingSnapshotRefreshService::class.java)
val jobPort = FakeCreatorRankingSnapshotJobPort()
val now = ZonedDateTime.of(2026, 6, 8, 7, 30, 0, 0, ZoneId.of("Asia/Seoul"))
val service = CreatorRankingSnapshotJobService(refreshService, jobPort) { now }
Mockito.doThrow(IllegalStateException("aggregate failed"))
.`when`(refreshService).refreshLastCompletedWeek(now)
assertThrows(IllegalStateException::class.java) {
service.refreshLastCompletedWeekByScheduledJob()
}
assertTrue(output.out.contains("event=creator_ranking_snapshot_job_status_changed"))
assertTrue(output.out.contains("jobId=1"))
assertTrue(output.out.contains("trigger=SCHEDULED"))
assertTrue(output.out.contains("status=FAILED"))
assertTrue(output.out.contains("error=aggregate failed"))
}
}
private class FakeCreatorRankingSnapshotJobPort : CreatorRankingSnapshotJobPort {