add comment, reward, total

Change-Id: Ib3d9f5f11b51e4bbf4dc5a553315ff3fd9110efb
diff --git a/src/test/java/com/g9/g9backend/controller/CommentControllerTest.java b/src/test/java/com/g9/g9backend/controller/CommentControllerTest.java
new file mode 100644
index 0000000..d9f9f87
--- /dev/null
+++ b/src/test/java/com/g9/g9backend/controller/CommentControllerTest.java
@@ -0,0 +1,68 @@
+package com.g9.g9backend.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.g9.g9backend.pojo.Comment;
+import com.g9.g9backend.pojo.DTO.GetCommentDTO;
+import com.g9.g9backend.service.CommentService;
+import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentMatchers;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+
+import org.springframework.http.ResponseEntity;
+
+import java.util.Collections;
+import java.util.Date;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
+import static org.mockito.BDDMockito.given;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+@ExtendWith(MockitoExtension.class)
+public class CommentControllerTest {
+
+    @Mock
+    private CommentService commentService;
+
+    @InjectMocks
+    private CommentController commentController;
+
+    @Test
+    void testPostComment() {
+        Comment comment = new Comment();
+        ResponseEntity<String> response = commentController.postComment(comment);
+        verify(commentService).save(comment);
+        assertEquals(200, response.getStatusCode().value());
+    }
+
+    @Test
+    void testDeleteComment() {
+        Integer id = 1;
+        ResponseEntity<String> response = commentController.deleteComment(id);
+        verify(commentService).removeById(id);
+        assertEquals(204, response.getStatusCode().value());
+    }
+
+    @Test
+    void testGetCommentWithResourceType() {
+        Comment comment = new Comment();
+        comment.setCommentId(1);
+        comment.setUserId(2);
+        comment.setReplyId(null);
+        comment.setContent("Test");
+        comment.setCreateAt(new Date());
+        comment.setResourceId(1);
+
+        Page<Comment> page = new Page<>();
+        page.setRecords(Collections.singletonList(comment));
+
+        given(commentService.page(ArgumentMatchers.<Page<Comment>>any(), ArgumentMatchers.<LambdaQueryWrapper<Comment>>any())).willReturn(page);
+
+        ResponseEntity<GetCommentDTO> response = commentController.getComment(1, 1, 10, "资源");
+        assertEquals(200, response.getStatusCode().value());
+        assertEquals(1, response.getBody().getRecords().size());
+    }
+}
diff --git a/src/test/java/com/g9/g9backend/controller/RewardControllerTest.java b/src/test/java/com/g9/g9backend/controller/RewardControllerTest.java
new file mode 100644
index 0000000..7f560f7
--- /dev/null
+++ b/src/test/java/com/g9/g9backend/controller/RewardControllerTest.java
@@ -0,0 +1,135 @@
+package com.g9.g9backend.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.g9.g9backend.pojo.Reward;
+import com.g9.g9backend.service.RewardService;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+
+import java.util.Collections;
+import java.util.Date;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+public class RewardControllerTest {
+
+    private MockMvc mockMvc;
+
+    @InjectMocks
+    private RewardController rewardController;
+
+    @Mock
+    private RewardService rewardService;
+
+    private final ObjectMapper objectMapper = new ObjectMapper();
+
+    @BeforeEach
+    public void setUp() {
+        MockitoAnnotations.openMocks(this);
+        mockMvc = MockMvcBuilders.standaloneSetup(rewardController).build();
+    }
+
+    @Test
+    public void testPostReward() throws Exception {
+        Reward reward = new Reward();
+        reward.setRewardName("测试悬赏");
+
+        mockMvc.perform(post("/reward")
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(objectMapper.writeValueAsString(reward)))
+                .andExpect(status().isOk());
+    }
+
+    @Test
+    public void testDeleteReward() throws Exception {
+        mockMvc.perform(delete("/reward")
+                        .param("rewardId", "1"))
+                .andExpect(status().isNoContent());
+    }
+
+    @Test
+    public void testGetReward_sortByPrice() throws Exception {
+        Reward reward = new Reward();
+        reward.setRewardId(1);
+        reward.setRewardName("测试");
+        reward.setPrice(100);
+        reward.setCreateAt(new Date());
+
+        Page<Reward> page = new Page<>(1, 10);
+        page.setRecords(Collections.singletonList(reward));
+        page.setTotal(1);
+
+        when(rewardService.page(any(), any())).thenReturn(page);
+
+        mockMvc.perform(get("/reward")
+                        .param("pageNumber", "1")
+                        .param("rows", "10")
+                        .param("searchValue", "")
+                        .param("option", "赏金最高"))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.records[0].rewardId").value(1));
+    }
+
+    @Test
+    public void testGetRewardInfo() throws Exception {
+        Reward reward = new Reward();
+        reward.setRewardId(1);
+        reward.setRewardName("详情测试");
+
+        when(rewardService.getById(1)).thenReturn(reward);
+
+        mockMvc.perform(get("/reward/info")
+                        .param("rewardId", "1"))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.rewardId").value(1));
+    }
+
+    @Test
+    public void testPutReward() throws Exception {
+        Reward oldReward = new Reward();
+        oldReward.setRewardId(1);
+
+        when(rewardService.getById(1)).thenReturn(oldReward);
+
+        Reward updateRequest = new Reward();
+        updateRequest.setRewardId(1);
+        updateRequest.setRewardName("更新名称");
+        updateRequest.setRewardDescription("更新描述");
+        updateRequest.setPrice(500);
+        updateRequest.setRewardPicture("pic.png");
+
+        mockMvc.perform(put("/reward/info")
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(objectMapper.writeValueAsString(updateRequest)))
+                .andExpect(status().isOk());
+    }
+
+    @Test
+    public void testPutRewardCompletion() throws Exception {
+        Reward existing = new Reward();
+        existing.setRewardId(1);
+
+        when(rewardService.getById(1)).thenReturn(existing);
+
+        Reward completed = new Reward();
+        completed.setRewardId(1);
+        completed.setCompletedBy(2);
+        completed.setCompletedAt(new Date());
+        completed.setResourceId(3);
+
+        mockMvc.perform(post("/reward/completion")
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(objectMapper.writeValueAsString(completed)))
+                .andExpect(status().isOk());
+    }
+}
diff --git a/src/test/java/com/g9/g9backend/controller/TotalControllerTest.java b/src/test/java/com/g9/g9backend/controller/TotalControllerTest.java
new file mode 100644
index 0000000..35c2484
--- /dev/null
+++ b/src/test/java/com/g9/g9backend/controller/TotalControllerTest.java
@@ -0,0 +1,53 @@
+package com.g9.g9backend.controller;
+
+import com.g9.g9backend.service.ResourceService;
+import com.g9.g9backend.service.ThreadService;
+import com.g9.g9backend.service.UserPurchaseService;
+import com.g9.g9backend.service.UserUploadService;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.http.ResponseEntity;
+
+@ExtendWith(MockitoExtension.class)
+public class TotalControllerTest {
+
+    @Mock
+    private ThreadService threadService;
+
+    @Mock
+    private UserPurchaseService userPurchaseService;
+
+    @Mock
+    private UserUploadService userUploadService;
+
+    @Mock
+    private ResourceService resourceService;
+
+    @InjectMocks
+    private TotalController totalController;
+
+    @Test
+    void testGetTotalInfo() {
+        when(threadService.count()).thenReturn(10L);
+        when(userPurchaseService.count()).thenReturn(20L);
+        when(userUploadService.count()).thenReturn(5L);
+        when(resourceService.count()).thenReturn(50L);
+
+        ResponseEntity<TotalController.Info> response = totalController.getTotalInfo();
+
+        assertEquals(200, response.getStatusCode().value());
+        TotalController.Info info = response.getBody();
+        assertNotNull(info);
+        assertEquals(10L, info.getThreadCount());
+        assertEquals(20L, info.getDownloadCount());
+        assertEquals(5L, info.getAuthorCount());
+        assertEquals(50L, info.getResourceCount());
+    }
+}