package com.tcm.training.admin.system.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.tcm.training.admin.member.entity.AppUser; import com.tcm.training.admin.member.mapper.UserMapper; import com.tcm.training.admin.system.dto.UserFeedbackSubmitRequest; import com.tcm.training.admin.system.entity.UserFeedback; import com.tcm.training.admin.system.mapper.UserFeedbackMapper; import com.tcm.training.admin.system.mapper.UserFeedbackQueryMapper; import com.tcm.training.admin.system.vo.UserFeedbackListItemVO; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import java.time.LocalDateTime; import java.util.Collections; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class UserFeedbackAppServiceTest { @Mock private UserFeedbackMapper userFeedbackMapper; @Mock private UserFeedbackQueryMapper userFeedbackQueryMapper; @Mock private UserMapper userMapper; @InjectMocks private UserFeedbackAppService userFeedbackAppService; @Captor private ArgumentCaptor userFeedbackCaptor; @Test void submitShouldPersistTrimmedFeedback() { AppUser user = new AppUser(); user.setId(1L); when(userMapper.selectById(1L)).thenReturn(user); doAnswer(invocation -> { UserFeedback item = invocation.getArgument(0); item.setId(10L); return 1; }).when(userFeedbackMapper).insert(any(UserFeedback.class)); UserFeedbackSubmitRequest request = new UserFeedbackSubmitRequest(); request.setContent(" 收不到验证码 "); request.setContact(" 13800138000 "); userFeedbackAppService.submit(1L, request); verify(userFeedbackMapper).insert(userFeedbackCaptor.capture()); assertEquals(1L, userFeedbackCaptor.getValue().getAppUserId()); assertEquals("收不到验证码", userFeedbackCaptor.getValue().getContent()); assertEquals("13800138000", userFeedbackCaptor.getValue().getContact()); } @Test void submitShouldAllowBlankContact() { AppUser user = new AppUser(); user.setId(2L); when(userMapper.selectById(2L)).thenReturn(user); UserFeedbackSubmitRequest request = new UserFeedbackSubmitRequest(); request.setContent("课程卡顿"); request.setContact(" "); userFeedbackAppService.submit(2L, request); verify(userFeedbackMapper).insert(userFeedbackCaptor.capture()); assertNull(userFeedbackCaptor.getValue().getContact()); } @Test void submitShouldRejectInvalidContact() { AppUser user = new AppUser(); user.setId(3L); when(userMapper.selectById(3L)).thenReturn(user); UserFeedbackSubmitRequest request = new UserFeedbackSubmitRequest(); request.setContent("问题"); request.setContact("abc"); IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> userFeedbackAppService.submit(3L, request)); assertEquals("请输入正确的手机号或邮箱", exception.getMessage()); } @Test void submitShouldRejectMissingUser() { when(userMapper.selectById(100L)).thenReturn(null); UserFeedbackSubmitRequest request = new UserFeedbackSubmitRequest(); request.setContent("问题"); IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> userFeedbackAppService.submit(100L, request)); assertEquals("用户不存在", exception.getMessage()); } @Test void pageShouldTrimContentKeyword() { UserFeedbackListItemVO item = new UserFeedbackListItemVO(); item.setId(1L); item.setNickname("王志强"); item.setContact("14725836904"); item.setContent("反馈内容"); item.setCreatedAt(LocalDateTime.of(2026, 3, 26, 10, 0, 0)); IPage result = new Page(1, 10); result.setRecords(Collections.singletonList(item)); result.setTotal(1); when(userFeedbackQueryMapper.selectUserFeedbackPage(any(Page.class), eq("验证码"))).thenReturn(result); assertEquals(1, userFeedbackAppService.page(1, 10, " 验证码 ").getList().size()); } }