fix(agent-settlement): 스냅샷 finalize 집계를 단일 누적으로 정리한다

This commit is contained in:
2026-04-10 13:51:17 +09:00
parent 53f37b93fb
commit 83fdb3400d
2 changed files with 205 additions and 51 deletions

View File

@@ -1,5 +1,6 @@
package kr.co.vividnext.sodalive.admin.partner.agent.settlement
import kr.co.vividnext.sodalive.common.SodaException
import kr.co.vividnext.sodalive.member.Member
import kr.co.vividnext.sodalive.member.MemberRepository
import kr.co.vividnext.sodalive.member.MemberRole
@@ -13,6 +14,7 @@ import kr.co.vividnext.sodalive.partner.agent.settlement.snapshot.AgentSettlemen
import kr.co.vividnext.sodalive.partner.agent.settlement.snapshot.FinalizeAgentSettlementSnapshotRequest
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertNotNull
import org.junit.jupiter.api.Assertions.assertThrows
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
@@ -236,4 +238,68 @@ class AdminAgentSettlementSnapshotServiceTest {
Mockito.verifyNoInteractions(calculateRepository)
Mockito.verifyNoInteractions(memberRepository)
}
@Test
@DisplayName("관리자 finalize는 대상 에이전트 회원이 없으면 실패한다")
fun shouldThrowWhenFinalizingSnapshotsForMissingAgent() {
val request = FinalizeAgentSettlementSnapshotRequest(
agentId = 7L,
settlementType = AgentSettlementSnapshotType.LIVE,
startDateStr = "2026-02-20",
endDateStr = "2026-02-21"
)
val (startDate, endDate) = request.toDateRange()
Mockito.`when`(
snapshotRepository.existsByPeriodStartAndPeriodEndAndSettlementTypeAndAgentId(
startDate,
endDate,
AgentSettlementSnapshotType.LIVE,
7L
)
).thenReturn(false)
Mockito.`when`(memberRepository.findById(7L)).thenReturn(Optional.empty())
val exception = assertThrows(SodaException::class.java) {
service.finalizeSnapshots(request, finalizedByMemberId = 99L)
}
assertEquals("partner.agent.ratio.agent_not_found", exception.messageKey)
Mockito.verifyNoInteractions(calculateRepository)
Mockito.verify(snapshotRepository, Mockito.never()).saveAll(Mockito.anyList())
Mockito.verifyNoInteractions(sourceDetailRepository)
}
@Test
@DisplayName("관리자 finalize는 대상 회원이 AGENT 역할이 아니면 실패한다")
fun shouldThrowWhenFinalizingSnapshotsForNonAgentMember() {
val request = FinalizeAgentSettlementSnapshotRequest(
agentId = 7L,
settlementType = AgentSettlementSnapshotType.LIVE,
startDateStr = "2026-02-20",
endDateStr = "2026-02-21"
)
val invalidAgent = Member(password = "password", nickname = "user-a", role = MemberRole.USER)
invalidAgent.id = 7L
val (startDate, endDate) = request.toDateRange()
Mockito.`when`(
snapshotRepository.existsByPeriodStartAndPeriodEndAndSettlementTypeAndAgentId(
startDate,
endDate,
AgentSettlementSnapshotType.LIVE,
7L
)
).thenReturn(false)
Mockito.`when`(memberRepository.findById(7L)).thenReturn(Optional.of(invalidAgent))
val exception = assertThrows(SodaException::class.java) {
service.finalizeSnapshots(request, finalizedByMemberId = 99L)
}
assertEquals("partner.agent.ratio.invalid_agent", exception.messageKey)
Mockito.verifyNoInteractions(calculateRepository)
Mockito.verify(snapshotRepository, Mockito.never()).saveAll(Mockito.anyList())
Mockito.verifyNoInteractions(sourceDetailRepository)
}
}