package com.tourguide.modules.order.service; import com.baomidou.mybatisplus.core.MybatisConfiguration; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.tourguide.modules.order.domain.OrderStatus; import com.tourguide.modules.order.domain.RefundStatus; import com.tourguide.modules.order.dto.GuideEarningsResponse; import com.tourguide.modules.order.entity.TourOrder; import com.tourguide.modules.order.mapper.TourOrderMapper; import com.tourguide.modules.user.entity.GuideUser; import com.tourguide.modules.user.service.GuideUserService; import org.apache.ibatis.builder.MapperBuilderAssistant; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import java.math.BigDecimal; import java.util.Collections; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; class GuideEarningsServiceTest { private TourOrderMapper orderMapper; private GuideEarningsService service; @BeforeEach void setUp() { initializeTableInfo(); orderMapper = mock(TourOrderMapper.class); GuideUserService guideUserService = mock(GuideUserService.class); GuideUser guide = new GuideUser(); guide.setId(8L); guide.setStatus(1); when(guideUserService.findEnabledById(8L)).thenReturn(guide); service = new GuideEarningsService(orderMapper, guideUserService); } @Test void shouldUsePaidAmountForSummaryAndDetails() { TourOrder order = new TourOrder(); order.setId(10L); order.setPaymentAmount(new BigDecimal("100.00")); order.setGuideEarningAmount(new BigDecimal("90.00")); Page page = new Page<>(1, 50); page.setRecords(Collections.singletonList(order)); page.setTotal(1); when(orderMapper.selectGuideEarningSum(any(), any(), any())) .thenReturn(new BigDecimal("100.00")); when(orderMapper.selectPage(any(Page.class), any())).thenReturn(page); when(orderMapper.selectGuideEarningScenics(8L)).thenReturn(Collections.emptyList()); GuideEarningsResponse response = service.get(8L, null, null, null, 1, 50); assertThat(response.getTodayEarnings()).isEqualByComparingTo("100.00"); assertThat(response.getMonthEarnings()).isEqualByComparingTo("100.00"); assertThat(response.getRecords()).hasSize(1); assertThat(response.getRecords().get(0).getOrderAmount()) .isEqualByComparingTo("100.00"); assertThat(response.getRecords().get(0).getEarningAmount()) .isEqualByComparingTo("100.00"); } @Test void shouldIncludePartialRefundOrderAndUseRemainingPaidAmount() { TourOrder order = new TourOrder(); order.setId(11L); order.setStatus(OrderStatus.CANCELLED.getCode()); order.setRefundStatus(RefundStatus.PARTIAL.getCode()); order.setPaymentAmount(new BigDecimal("100.00")); order.setRefundedAmount(new BigDecimal("20.00")); order.setGuideEarningAmount(new BigDecimal("90.00")); Page page = new Page<>(1, 50); page.setRecords(Collections.singletonList(order)); page.setTotal(1); when(orderMapper.selectGuideEarningSum(any(), any(), any())) .thenReturn(new BigDecimal("80.00")); when(orderMapper.selectPage(any(Page.class), any())).thenReturn(page); when(orderMapper.selectGuideEarningScenics(8L)).thenReturn(Collections.emptyList()); GuideEarningsResponse response = service.get(8L, null, null, null, 1, 50); assertThat(response.getTodayEarnings()).isEqualByComparingTo("80.00"); assertThat(response.getMonthEarnings()).isEqualByComparingTo("80.00"); assertThat(response.getRecords()).hasSize(1); assertThat(response.getRecords().get(0).getEarningAmount()) .isEqualByComparingTo("80.00"); ArgumentCaptor> queryCaptor = ArgumentCaptor.forClass(LambdaQueryWrapper.class); verify(orderMapper).selectPage(any(Page.class), queryCaptor.capture()); assertThat(queryCaptor.getValue().getSqlSegment()) .contains("status") .contains("refund_status") .contains("GREATEST("); } private static void initializeTableInfo() { if (TableInfoHelper.getTableInfo(TourOrder.class) == null) { TableInfoHelper.initTableInfo( new MapperBuilderAssistant(new MybatisConfiguration(), ""), TourOrder.class); } } }