package com.tourguide.modules.order.service; import com.tourguide.modules.operation.dto.PlatformSettingsResponse; import com.tourguide.modules.operation.service.PlatformSettingsService; import com.tourguide.modules.order.entity.TourOrder; import com.tourguide.modules.user.entity.GuideTeam; import com.tourguide.modules.user.entity.GuideUser; import com.tourguide.modules.user.mapper.GuideTeamMapper; import com.tourguide.modules.user.service.GuideUserService; 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.mock; import static org.mockito.Mockito.when; class GuideOrderEarningSnapshotServiceTest { private GuideTeamMapper teamMapper; private PlatformSettingsService settingsService; private GuideOrderEarningSnapshotService service; @BeforeEach void setUp() { teamMapper = mock(GuideTeamMapper.class); settingsService = mock(PlatformSettingsService.class); service = new GuideOrderEarningSnapshotService( mock(GuideUserService.class), teamMapper, settingsService); } @Test void shouldUsePlatformCommissionForPersonalGuide() { PlatformSettingsResponse settings = new PlatformSettingsResponse(); settings.setCommissionRate(new BigDecimal("15.00")); when(settingsService.getSettings()).thenReturn(settings); GuideUser guide = new GuideUser(); TourOrder order = paidOrder("100.00"); service.apply(order, guide); assertThat(order.getCommissionSource()).isEqualTo("PERSONAL"); assertThat(order.getCommissionTeamId()).isNull(); assertThat(order.getCommissionRate()).isEqualByComparingTo("15.00"); assertThat(order.getGuideEarningAmount()).isEqualByComparingTo("85.00"); } @Test void shouldUseTeamCommissionForTeamGuide() { GuideUser guide = new GuideUser(); guide.setTeamId(6L); GuideTeam team = new GuideTeam(); team.setId(6L); team.setStatus(1); team.setCommissionRatio(new BigDecimal("20.00")); when(teamMapper.selectById(6L)).thenReturn(team); TourOrder order = paidOrder("100.00"); service.apply(order, guide); assertThat(order.getCommissionSource()).isEqualTo("TEAM"); assertThat(order.getCommissionTeamId()).isEqualTo(6L); assertThat(order.getCommissionRate()).isEqualByComparingTo("20.00"); assertThat(order.getGuideEarningAmount()).isEqualByComparingTo("80.00"); } private TourOrder paidOrder(String amount) { TourOrder order = new TourOrder(); order.setAmount(new BigDecimal(amount)); order.setPaymentAmount(new BigDecimal(amount)); return order; } }