package com.tourguide.modules.finance.service; import com.tourguide.modules.user.mapper.GuideUserMapper; import com.tourguide.modules.user.mapper.GuideTeamMapper; import com.tourguide.modules.user.entity.GuideTeam; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.math.BigDecimal; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; class GuideWithdrawableBalanceServiceTest { private GuideUserMapper guideUserMapper; private GuideTeamMapper teamMapper; private GuideWithdrawableBalanceService service; @BeforeEach void setUp() { guideUserMapper = mock(GuideUserMapper.class); teamMapper = mock(GuideTeamMapper.class); service = new GuideWithdrawableBalanceService(guideUserMapper, teamMapper); } @Test void shouldReadStoredGuideBalance() { when(guideUserMapper.selectBalance(8L)).thenReturn(new BigDecimal("504.30")); assertThat(service.getAvailableAmount(8L)).isEqualByComparingTo("504.30"); } @Test void shouldAtomicallyDebitStoredBalance() { when(guideUserMapper.decreaseBalance(8L, new BigDecimal("80.00"))).thenReturn(1); assertThat(service.debit(8L, new BigDecimal("80"))).isTrue(); verify(guideUserMapper).decreaseBalance(8L, new BigDecimal("80.00")); } @Test void shouldReadAndAtomicallyDebitTeamBalance() { GuideTeam team = new GuideTeam(); team.setBalance(new BigDecimal("504.30")); when(teamMapper.selectById(6L)).thenReturn(team); when(teamMapper.decreaseBalance(6L, new BigDecimal("80.00"))).thenReturn(1); assertThat(service.getAvailableTeamAmount(6L)).isEqualByComparingTo("504.30"); assertThat(service.debitTeam(6L, new BigDecimal("80"))).isTrue(); verify(teamMapper).decreaseBalance(6L, new BigDecimal("80.00")); } }