follow+sendMessage

Change-Id: I3e9bbcc89dfc53b9651fd8722da1b445a597629a
diff --git a/src/test/java/com/example/g8backend/service/UserServiceImplTest.java b/src/test/java/com/example/g8backend/service/UserServiceImplTest.java
new file mode 100644
index 0000000..96cf868
--- /dev/null
+++ b/src/test/java/com/example/g8backend/service/UserServiceImplTest.java
@@ -0,0 +1,149 @@
+package com.example.g8backend.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.example.g8backend.entity.Follow;
+import com.example.g8backend.entity.Message;
+import com.example.g8backend.entity.User;
+import com.example.g8backend.mapper.FollowMapper;
+import com.example.g8backend.mapper.MessageMapper;
+import com.example.g8backend.mapper.UserMapper;
+import com.example.g8backend.service.impl.UserServiceImpl;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.test.util.ReflectionTestUtils;
+
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.Mockito.*;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+
+@ExtendWith(MockitoExtension.class)
+public class UserServiceImplTest {
+
+    @Mock
+    private UserMapper userMapper;
+
+    @Mock
+    private FollowMapper followMapper;
+
+    @Mock
+    private MessageMapper messageMapper;
+
+    @InjectMocks
+    private UserServiceImpl userService;
+
+    private User user1;
+    private User user2;
+    private Follow follow;
+    private Message message;
+
+    @BeforeEach
+    void setUp() {
+        user1 = new User().setUserId(1L).setUserName("user1");
+        user2 = new User().setUserId(2L).setUserName("user2");
+        ReflectionTestUtils.setField(userService, "baseMapper", userMapper);
+
+        follow = new Follow().setFollowerId(1L).setFollowedId(2L);
+        message = new Message()
+                .setMessageId(100L)
+                .setSenderId(1L)
+                .setReceiverId(2L)
+                .setContent("Hello")
+                .setIsRead(false)
+                .setSentAt(LocalDateTime.now());
+    }
+
+    // ------------------------- 关注功能测试 -------------------------
+    @Test
+    void followUser_Success() {
+        // 模拟Mapper行为
+        when(followMapper.insert(any(Follow.class))).thenReturn(1);
+
+        // 测试关注
+        boolean result = userService.followUser(1L, 2L);
+        assertTrue(result);
+        verify(followMapper, times(1)).insert(any(Follow.class));
+    }
+
+    @Test
+    void followUser_SelfFollow_Fail() {
+        // 尝试关注自己
+        boolean result = userService.followUser(1L, 1L);
+        assertFalse(result);
+        verify(followMapper, never()).insert((Follow) any());
+    }
+
+    @Test
+    void unfollowUser_Success() {
+        // 模拟Mapper行为
+        when(followMapper.deleteByPair(1L, 2L)).thenReturn(1);
+
+        // 测试取消关注
+        boolean result = userService.unfollowUser(1L, 2L);
+        assertTrue(result);
+        verify(followMapper, times(1)).deleteByPair(1L, 2L);
+    }
+
+
+    @Test
+    void getFollowers_EmptyList() {
+        // 模拟无粉丝
+        when(followMapper.selectFollowers(1L)).thenReturn(Collections.emptyList());
+
+        // 测试获取粉丝列表
+        List<User> followers = userService.getFollowers(1L);
+        assertTrue(followers.isEmpty());
+    }
+
+    // ------------------------- 私信功能测试 -------------------------
+    @Test
+    void sendMessage_Success() {
+        // 模拟用户存在
+        when(userMapper.selectById(2L)).thenReturn(user2);
+        when(messageMapper.insert(any(Message.class))).thenAnswer(invocation -> {
+            Message msg = invocation.getArgument(0);
+            msg.setMessageId(100L);
+            return 1;
+        });
+
+        // 测试发送消息
+        Long messageId = userService.sendMessage(1L, 2L, "Hello");
+        assertNotNull(messageId);
+        verify(messageMapper, times(1)).insert(any(Message.class));
+    }
+
+    @Test
+    void sendMessage_ReceiverNotExist_ThrowException() {
+        // 模拟用户不存在
+        when(userMapper.selectById(99L)).thenReturn(null);
+
+        // 测试异常
+        assertThrows(RuntimeException.class, () ->
+                userService.sendMessage(1L, 99L, "Hello")
+        );
+        verify(messageMapper, never()).insert((Message) any());
+    }
+
+    @Test
+    void getMessageHistory_SortedByTime() {
+        // 模拟历史消息
+        Message oldMessage = message.setSentAt(LocalDateTime.now().minusHours(1));
+        when(messageMapper.selectUserMessages(1L))
+                .thenReturn(Arrays.asList(oldMessage, message));
+
+        // 测试按时间倒序排序
+        List<Message> history = userService.getMessageHistory(1L);
+        assertEquals(message.getMessageId(), history.get(0).getMessageId());
+    }
+}
\ No newline at end of file