package com.tourguide.modules.user.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.tourguide.common.api.PageResponse; import com.tourguide.modules.order.dto.VisitorOrderStatRow; import com.tourguide.modules.order.mapper.TourOrderMapper; import com.tourguide.modules.review.dto.VisitorReviewStatRow; import com.tourguide.modules.review.mapper.OrderReviewMapper; import com.tourguide.modules.user.dto.MiniUserDetailResponse; import com.tourguide.modules.user.dto.MiniUserResponse; import com.tourguide.modules.user.entity.MiniUser; import com.tourguide.modules.user.mapper.MiniUserMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; 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.when; class MiniUserServiceStatsTest { private MiniUserMapper userMapper; private TourOrderMapper orderMapper; private OrderReviewMapper reviewMapper; private MiniUserService userService; @BeforeEach void setUp() { userMapper = mock(MiniUserMapper.class); orderMapper = mock(TourOrderMapper.class); reviewMapper = mock(OrderReviewMapper.class); userService = new MiniUserService(userMapper, orderMapper, reviewMapper); } @Test void pageShouldReturnVisitorOrderCount() { MiniUser user = miniUser(7L); Page page = new Page(1, 10); page.setRecords(Collections.singletonList(user)); page.setTotal(1L); when(userMapper.selectPage(any(), any())).thenReturn(page); when(orderMapper.selectVisitorOrderStats(any())).thenReturn(Collections.singletonList(orderStat(7L, 1L))); when(reviewMapper.selectVisitorReviewStats(any())).thenReturn(Collections.emptyList()); PageResponse response = userService.page(1, 10, null, null, null, null); assertThat(response.getRecords()).hasSize(1); assertThat(response.getRecords().get(0).getOrderCount()).isEqualTo(1L); } @Test void detailShouldReturnVisitorConsumptionStats() { MiniUser user = miniUser(7L); when(userMapper.selectById(7L)).thenReturn(user); when(orderMapper.selectVisitorOrderStats(any())).thenReturn(Collections.singletonList(orderStat(7L, 1L))); when(reviewMapper.selectVisitorReviewStats(any())).thenReturn(Collections.singletonList(reviewStat(7L, 2L))); MiniUserDetailResponse response = userService.detail(7L); assertThat(response.getOrderCount()).isEqualTo(1L); assertThat(response.getTotalConsumption()).isEqualByComparingTo("36.00"); assertThat(response.getReviewCount()).isEqualTo(2L); } private MiniUser miniUser(Long id) { MiniUser user = new MiniUser(); user.setId(id); user.setUsername("mini_" + id); user.setNickname("Visitor " + id); user.setStatus(1); return user; } private VisitorOrderStatRow orderStat(Long visitorId, Long orderCount) { VisitorOrderStatRow row = new VisitorOrderStatRow(); row.setVisitorId(visitorId); row.setOrderCount(orderCount); row.setTotalConsumption(new BigDecimal("36.00")); return row; } private VisitorReviewStatRow reviewStat(Long visitorId, Long reviewCount) { VisitorReviewStatRow row = new VisitorReviewStatRow(); row.setVisitorId(visitorId); row.setReviewCount(reviewCount); return row; } }