上传图片等功能

Change-Id: Ibb728cdd5ca0326f5d73b0b13fa535f66d6d0405
diff --git a/src/main/java/com/ptp/ptplatform/controller/HelpCommentController.java b/src/main/java/com/ptp/ptplatform/controller/HelpCommentController.java
index c937428..6ee5d81 100644
--- a/src/main/java/com/ptp/ptplatform/controller/HelpCommentController.java
+++ b/src/main/java/com/ptp/ptplatform/controller/HelpCommentController.java
@@ -1,13 +1,19 @@
 package com.ptp.ptplatform.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.ptp.ptplatform.entity.HelpComment;
 import com.ptp.ptplatform.service.HelpCommentService;
 import com.ptp.ptplatform.utils.Result;
 import lombok.AllArgsConstructor;
+import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.File;
+import java.io.IOException;
 import java.time.LocalDateTime;
 import java.util.List;
+import java.util.UUID;
 
 @RestController
 @RequestMapping("/help/comments")
@@ -28,29 +34,65 @@
         return Result.ok().data("replies", replies);
     }
 
-    @PostMapping("/{commentId}/replies")
+    @PostMapping(value = "/{commentId}/replies", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
     public Result addReply(@PathVariable int commentId,
-                           @RequestBody HelpComment reply) {
+                           @RequestParam("authorId") String authorId,
+                           @RequestParam("content") String content,
+                           @RequestParam(value = "image", required = false) MultipartFile image) {
+        // 校验父评论是否存在
         HelpComment parentComment = commentService.getById(commentId);
         if (parentComment == null) {
             return Result.error(404).setMessage("被回复的评论不存在");
         }
 
-        // 设置完整字段
+        // 构造回复评论对象
+        HelpComment reply = new HelpComment();
         reply.setPostId(parentComment.getPostId());
         reply.setParentId(commentId);
-        reply.setAuthorId(reply.getAuthorId());
+        reply.setAuthorId(authorId);              // String 类型
         reply.setReplyTo(parentComment.getAuthorId());
-        reply.setCreateTime(LocalDateTime.now()); // 设置创建时间
-        reply.setLikeCount(0); // 初始化点赞数
+        reply.setContent(content);
+        reply.setCreateTime(LocalDateTime.now());
+        reply.setLikeCount(0);
 
+        // 可选:处理图片上传
+        if (image != null && !image.isEmpty()) {
+            try {
+                String fileExt = image.getOriginalFilename()
+                        .substring(image.getOriginalFilename().lastIndexOf('.') + 1);
+                String fileName = UUID.randomUUID() + "." + fileExt;
+
+                String uploadDir = System.getProperty("user.dir") + File.separator + "uploads";
+                File dir = new File(uploadDir);
+                if (!dir.exists()) dir.mkdirs();
+
+                File dest = new File(dir, fileName);
+                image.transferTo(dest);
+
+                // 保存相对访问路径
+                reply.setImageUrl("/uploads/" + fileName);
+            } catch (IOException e) {
+                return Result.error(404).setMessage("图片上传失败:" + e.getMessage());
+            }
+        }
+
+        // 保存到数据库
         commentService.save(reply);
 
-        // 返回完整的评论数据
+        // 返回新回复及其父评论 ID
         return Result.ok()
                 .data("reply", reply)
-                .data("parentCommentId", commentId); // 同时返回父评论ID
+                .data("parentCommentId", commentId);
     }
 
 
+        // 删除评论
+        @PostMapping("/delete/{commentId}")
+        public Result deletePost(@PathVariable int commentId) {
+            commentService.remove(new QueryWrapper<HelpComment>().eq("post_id", commentId));
+            boolean removed = commentService.removeById(commentId);
+            return removed ? Result.ok() : Result.error(404).setMessage("删除评论失败");
+        }
+
+
 }
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/controller/HelpPostController.java b/src/main/java/com/ptp/ptplatform/controller/HelpPostController.java
index 646ed76..a40efb7 100644
--- a/src/main/java/com/ptp/ptplatform/controller/HelpPostController.java
+++ b/src/main/java/com/ptp/ptplatform/controller/HelpPostController.java
@@ -7,15 +7,16 @@
 import com.ptp.ptplatform.service.HelpPostService;
 import com.ptp.ptplatform.utils.Result;
 import lombok.AllArgsConstructor;
+import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.File;
+import java.io.IOException;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @RestController
 @RequestMapping("/help/posts")
@@ -92,30 +93,85 @@
         return Result.ok();
     }
 
-    @PostMapping("/{Id}/comments")
+//    @PostMapping("/{Id}/comments")
+//    public Result comment(@PathVariable int Id,
+//                          @RequestBody HelpComment comment) {
+//        // 设置评论信息
+//        comment.setPostId(Id);
+//        comment.setCreateTime(LocalDateTime.now());
+//        comment.setLikeCount(0); // 初始化点赞数
+//        comment.setParentId(0);  // 默认父评论ID
+//        comment.setReplyTo(null); // 主评论 replyTo=null
+//
+//        // 保存评论
+//        boolean saved = commentService.save(comment);
+//        if (!saved) {
+//            return Result.error(404).setMessage("评论保存失败");
+//        }
+//
+//        // 更新回复数
+//        postService.incrementReplyCount(Id);
+//
+//        // 获取更新后的完整评论(包含数据库生成的ID和时间)
+//        HelpComment newComment = commentService.getById(comment.getId());
+//
+//        return Result.ok()
+//                .data("comment", newComment)  // 返回完整评论数据
+//                .data("newReplyCount", postService.getById(Id).getReplyCount());
+//    }
+
+    @PostMapping(value = "/{Id}/comments", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
     public Result comment(@PathVariable int Id,
-                          @RequestBody HelpComment comment) {
-        // 设置评论信息
+                          @RequestParam("authorId") String authorId,
+                          @RequestParam("content") String content,
+                          @RequestParam(value = "image", required = false) MultipartFile image) {
+
+        HelpComment comment = new HelpComment();
         comment.setPostId(Id);
+        comment.setAuthorId(authorId); // 类型为 String
+        comment.setContent(content);
         comment.setCreateTime(LocalDateTime.now());
-        comment.setLikeCount(0); // 初始化点赞数
-        comment.setParentId(0);  // 默认父评论ID
-        comment.setReplyTo(null); // 主评论 replyTo=null
+        comment.setLikeCount(0);
+        comment.setParentId(0);
+        comment.setReplyTo(null);
+
+        if (image != null && !image.isEmpty()) {
+            try {
+                String fileExt = image.getOriginalFilename()
+                        .substring(image.getOriginalFilename().lastIndexOf(".") + 1);
+                String fileName = UUID.randomUUID() + "." + fileExt;
+
+                String uploadDir = System.getProperty("user.dir") + File.separator + "uploads";
+                File dir = new File(uploadDir);
+                if (!dir.exists()) dir.mkdirs();
+
+                File dest = new File(dir, fileName);
+                image.transferTo(dest);
+
+                comment.setImageUrl("/uploads/" + fileName);
+            } catch (IOException e) {
+                return Result.error(404).setMessage("图片上传失败:" + e.getMessage());
+            }
+        }
 
         // 保存评论
         boolean saved = commentService.save(comment);
-        if (!saved) {
-            return Result.error(404).setMessage("评论保存失败");
-        }
+        if (!saved) return Result.error(500).setMessage("评论保存失败");
 
-        // 更新回复数
         postService.incrementReplyCount(Id);
-
-        // 获取更新后的完整评论(包含数据库生成的ID和时间)
         HelpComment newComment = commentService.getById(comment.getId());
 
         return Result.ok()
-                .data("comment", newComment)  // 返回完整评论数据
+                .data("comment", newComment)
                 .data("newReplyCount", postService.getById(Id).getReplyCount());
     }
+
+    // 删除帖子
+    @PostMapping("/delete/{Id}")
+    public Result deletePost(@PathVariable int Id) {
+        commentService.remove(new QueryWrapper<HelpComment>().eq("post_id", Id));
+        boolean removed = postService.removeById(Id);
+        return removed ? Result.ok() : Result.error(404).setMessage("删除帖子失败");
+    }
+
 }
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/controller/TorrentCommentController.java b/src/main/java/com/ptp/ptplatform/controller/TorrentCommentController.java
index 1140ff7..4388eb5 100644
--- a/src/main/java/com/ptp/ptplatform/controller/TorrentCommentController.java
+++ b/src/main/java/com/ptp/ptplatform/controller/TorrentCommentController.java
@@ -1,5 +1,6 @@
 package com.ptp.ptplatform.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.ptp.ptplatform.entity.TorrentComment;
 import com.ptp.ptplatform.service.TorrentCommentService;
 import com.ptp.ptplatform.utils.Result;
@@ -52,4 +53,12 @@
                 .data("parentCommentId", commentId); // 同时返回父评论ID
     }
 
+    // 删除评论
+    @PostMapping("/delete/{commentId}")
+    public Result deletePost(@PathVariable int commentId) {
+        commentService.remove(new QueryWrapper<TorrentComment>().eq("post_id", commentId));
+        boolean removed = commentService.removeById(commentId);
+        return removed ? Result.ok() : Result.error(404).setMessage("删除评论失败");
+    }
+
 }
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/controller/TorrentController.java b/src/main/java/com/ptp/ptplatform/controller/TorrentController.java
index 436ecdd..028f5c8 100644
--- a/src/main/java/com/ptp/ptplatform/controller/TorrentController.java
+++ b/src/main/java/com/ptp/ptplatform/controller/TorrentController.java
@@ -129,7 +129,7 @@
 
         return Result.ok()
                 .data("comment", newComment)  // 返回完整评论数据
-                .data("newReplyCount", postService.getById(Id).getReplay_count());
+                .data("newReplyCount", postService.getById(Id).getReply_count());
     }
 
     @PostConstruct //启动项目时候自动启动tracker服务器
diff --git a/src/main/java/com/ptp/ptplatform/entity/HelpComment.java b/src/main/java/com/ptp/ptplatform/entity/HelpComment.java
index 5821868..c067fe3 100644
--- a/src/main/java/com/ptp/ptplatform/entity/HelpComment.java
+++ b/src/main/java/com/ptp/ptplatform/entity/HelpComment.java
@@ -21,6 +21,7 @@
     private LocalDateTime createTime;
     private Integer parentId;  // 新增字段,用于回复功能,0表示主评论,非0表示回复某条评论
     private String replyTo;
+    private String ImageUrl;
 
     @TableField(exist = false)
     private List<HelpComment> replies = new ArrayList<>(); // 必须初始化
diff --git a/src/main/java/com/ptp/ptplatform/entity/TORRENT.java b/src/main/java/com/ptp/ptplatform/entity/TORRENT.java
index afbb264..c9d1c94 100644
--- a/src/main/java/com/ptp/ptplatform/entity/TORRENT.java
+++ b/src/main/java/com/ptp/ptplatform/entity/TORRENT.java
@@ -31,7 +31,7 @@
     private String username; // 创建用户

     private String filePath;

     private int like_count;

-    private int replay_count;

+    private int reply_count;

 

     @TableField(value = "create_time") // 使用@TableField注解处理时间字段

     private Date createTime; // 创建时间

@@ -49,7 +49,7 @@
         this.username = username;

         this.filePath = filePath;

         this.like_count = 0;

-        this.replay_count = 0;

+        this.reply_count = 0;

     }

 

     public void setLikeCount(int like_count) {

diff --git a/src/test/java/com/ptp/ptplatform/controller/HelpCommentControllerTest.java b/src/test/java/com/ptp/ptplatform/controller/HelpCommentControllerTest.java
index 2450c6e..f637e39 100644
--- a/src/test/java/com/ptp/ptplatform/controller/HelpCommentControllerTest.java
+++ b/src/test/java/com/ptp/ptplatform/controller/HelpCommentControllerTest.java
@@ -1,5 +1,6 @@
 package com.ptp.ptplatform.controller;

 

+import com.baomidou.mybatisplus.core.conditions.Wrapper;

 import com.ptp.ptplatform.entity.HelpComment;

 import com.ptp.ptplatform.service.HelpCommentService;

 import com.ptp.ptplatform.utils.Result;

@@ -8,13 +9,14 @@
 import org.mockito.InjectMocks;

 import org.mockito.Mock;

 import org.mockito.MockitoAnnotations;

-import org.springframework.http.ResponseEntity;

+import org.springframework.mock.web.MockMultipartFile;

 

 import java.time.LocalDateTime;

 import java.util.Arrays;

 import java.util.List;

 

 import static org.junit.jupiter.api.Assertions.*;

+import static org.mockito.ArgumentMatchers.any;

 import static org.mockito.Mockito.*;

 

 class HelpCommentControllerTest {

@@ -32,14 +34,11 @@
 

     @Test

     void likeComment_ShouldReturnSuccess() {

-        // Arrange

         int commentId = 1;

         doNothing().when(commentService).incrementLike(commentId);

 

-        // Act

         Result result = commentController.like(commentId);

 

-        // Assert

         assertEquals(200, result.getCode());

         assertEquals("成功", result.getMessage());

         verify(commentService, times(1)).incrementLike(commentId);

@@ -47,89 +46,99 @@
 

     @Test

     void getReplies_ShouldReturnReplies() {

-        // Arrange

         int commentId = 1;

+        HelpComment r1 = new HelpComment();

+        r1.setId(2); r1.setPostId(1); r1.setParentId(commentId);

+        r1.setAuthorId("user2"); r1.setContent("Reply 1");

+        r1.setCreateTime(LocalDateTime.now()); r1.setLikeCount(0);

+        r1.setReplyTo("user1");

 

-        HelpComment reply1 = new HelpComment();

-        reply1.setId(2);

-        reply1.setPostId(1);

-        reply1.setParentId(commentId);

-        reply1.setAuthorId("user2");

-        reply1.setContent("Reply 1");

-        reply1.setCreateTime(LocalDateTime.now());

-        reply1.setLikeCount(0);

-        reply1.setReplyTo("user1");

+        HelpComment r2 = new HelpComment();

+        r2.setId(3); r2.setPostId(1); r2.setParentId(commentId);

+        r2.setAuthorId("user3"); r2.setContent("Reply 2");

+        r2.setCreateTime(LocalDateTime.now()); r2.setLikeCount(0);

+        r2.setReplyTo("user1");

 

-        HelpComment reply2 = new HelpComment();

-        reply2.setId(3);

-        reply2.setPostId(1);

-        reply2.setParentId(commentId);

-        reply2.setAuthorId("user3");

-        reply2.setContent("Reply 2");

-        reply2.setCreateTime(LocalDateTime.now());

-        reply2.setLikeCount(0);

-        reply2.setReplyTo("user1");

-

-        List<HelpComment> mockReplies = Arrays.asList(reply1, reply2);

+        List<HelpComment> mockReplies = Arrays.asList(r1, r2);

         when(commentService.getReplies(commentId)).thenReturn(mockReplies);

 

-        // Act

         Result result = commentController.getReplies(commentId);

 

-        // Assert

         assertEquals(200, result.getCode());

-        assertEquals(mockReplies, result.getData().get("replies"));

+        @SuppressWarnings("unchecked")

+        List<HelpComment> ret = (List<HelpComment>) result.getData().get("replies");

+        assertEquals(mockReplies, ret);

         verify(commentService, times(1)).getReplies(commentId);

     }

 

     @Test

-    void addReply_ShouldReturnSuccess_WhenParentCommentExists() {

-        // Arrange

-        int commentId = 1;

+    void addReplyWithoutImage_ShouldReturnSuccess() {

+        int commentId = 5;

+        String authorId = "userX";

+        String content = "no image reply";

 

-        HelpComment parentComment = new HelpComment();

-        parentComment.setId(commentId);

-        parentComment.setPostId(1);

-        parentComment.setParentId(0);

-        parentComment.setAuthorId("user1");

-        parentComment.setContent("Parent comment");

-        parentComment.setCreateTime(LocalDateTime.now());

-        parentComment.setLikeCount(5);

-        parentComment.setReplyTo(null);

+        HelpComment parent = new HelpComment();

+        parent.setId(commentId);

+        parent.setAuthorId("userParent");

+        parent.setPostId(10);

+        when(commentService.getById(commentId)).thenReturn(parent);

 

-        HelpComment reply = new HelpComment();

-        reply.setAuthorId("user2");

-        reply.setContent("Test reply");

-

-        when(commentService.getById(commentId)).thenReturn(parentComment);

         when(commentService.save(any(HelpComment.class))).thenReturn(true);

 

-        // Act

-        Result result = commentController.addReply(commentId, reply);

+        Result result = commentController.addReply(commentId, authorId, content, null);

 

-        // Assert

         assertEquals(200, result.getCode());

-        assertNotNull(result.getData().get("reply"));

+        HelpComment reply = (HelpComment) result.getData().get("reply");

+        assertNotNull(reply);

+        assertEquals(authorId, reply.getAuthorId());

+        assertEquals(content, reply.getContent());

+        assertNull(reply.getImageUrl());

         assertEquals(commentId, result.getData().get("parentCommentId"));

         verify(commentService, times(1)).save(any(HelpComment.class));

     }

 

     @Test

-    void addReply_ShouldReturnError_WhenParentCommentNotExists() {

-        // Arrange

-        int commentId = 1;

-        HelpComment reply = new HelpComment();

-        reply.setAuthorId("user2");

-        reply.setContent("Test reply");

+    void addReplyWithImage_ShouldReturnSuccess() {

+        int commentId = 8;

+        String authorId = "userY";

+        String content = "with image reply";

 

+        HelpComment parent = new HelpComment();

+        parent.setId(commentId);

+        parent.setAuthorId("userParent");

+        parent.setPostId(20);

+        when(commentService.getById(commentId)).thenReturn(parent);

+

+        byte[] data = {0x1, 0x2};

+        MockMultipartFile image = new MockMultipartFile(

+                "image", "test.png", "image/png", data

+        );

+

+        when(commentService.save(any(HelpComment.class))).thenReturn(true);

+

+        Result result = commentController.addReply(commentId, authorId, content, image);

+

+        assertEquals(200, result.getCode());

+        HelpComment reply = (HelpComment) result.getData().get("reply");

+        assertNotNull(reply);

+        assertEquals(authorId, reply.getAuthorId());

+        assertEquals(content, reply.getContent());

+        assertNotNull(reply.getImageUrl());

+        assertTrue(reply.getImageUrl().startsWith("/uploads/"));

+        assertEquals(commentId, result.getData().get("parentCommentId"));

+        verify(commentService, times(1)).save(any(HelpComment.class));

+    }

+

+    @Test

+    void addReply_ShouldReturnError_WhenParentNotExist() {

+        int commentId = 99;

         when(commentService.getById(commentId)).thenReturn(null);

 

-        // Act

-        Result result = commentController.addReply(commentId, reply);

+        Result result = commentController.addReply(commentId, "any", "content", null);

 

-        // Assert

         assertEquals(500, result.getCode());

         assertEquals("被回复的评论不存在", result.getMessage());

-        verify(commentService, never()).save(any(HelpComment.class));

+        verify(commentService, never()).save(any());

     }

-}
\ No newline at end of file
+

+}

diff --git a/src/test/java/com/ptp/ptplatform/controller/HelpPostControllerTest.java b/src/test/java/com/ptp/ptplatform/controller/HelpPostControllerTest.java
index 877289b..0098abb 100644
--- a/src/test/java/com/ptp/ptplatform/controller/HelpPostControllerTest.java
+++ b/src/test/java/com/ptp/ptplatform/controller/HelpPostControllerTest.java
@@ -1,7 +1,6 @@
 package com.ptp.ptplatform.controller;

 

 import com.baomidou.mybatisplus.core.conditions.Wrapper;

-import com.baomidou.mybatisplus.core.metadata.IPage;

 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

 import com.ptp.ptplatform.entity.HelpComment;

 import com.ptp.ptplatform.entity.HelpPost;

@@ -10,9 +9,12 @@
 import com.ptp.ptplatform.utils.Result;

 import org.junit.jupiter.api.BeforeEach;

 import org.junit.jupiter.api.Test;

+import org.mockito.ArgumentCaptor;

 import org.mockito.InjectMocks;

 import org.mockito.Mock;

 import org.mockito.MockitoAnnotations;

+import org.springframework.mock.web.MockMultipartFile;

+import org.springframework.web.multipart.MultipartFile;

 

 import java.time.LocalDateTime;

 import java.util.Arrays;

@@ -20,6 +22,7 @@
 

 import static org.junit.jupiter.api.Assertions.*;

 import static org.mockito.ArgumentMatchers.any;

+import static org.mockito.ArgumentMatchers.anyInt;

 import static org.mockito.Mockito.*;

 

 class HelpPostControllerTest {

@@ -40,9 +43,7 @@
 

     @Test

     void getPost_ShouldReturnPostWithComments_WhenPostExists() {

-        // Arrange

         int postId = 1;

-

         HelpPost post = new HelpPost();

         post.setId(postId);

         post.setTitle("Test Post");

@@ -50,130 +51,202 @@
         post.setAuthorId("user1");

         post.setCreateTime(LocalDateTime.now());

 

-        HelpComment comment1 = new HelpComment();

-        comment1.setId(1);

-        comment1.setPostId(postId);

-        comment1.setParentId(0);

-        comment1.setAuthorId("user2");

-        comment1.setContent("Comment 1");

-        comment1.setCreateTime(LocalDateTime.now());

+        HelpComment c1 = new HelpComment();

+        c1.setId(1); c1.setPostId(postId); c1.setParentId(0);

+        c1.setAuthorId("user2"); c1.setContent("Comment 1");

+        c1.setCreateTime(LocalDateTime.now());

 

-        HelpComment comment2 = new HelpComment();

-        comment2.setId(2);

-        comment2.setPostId(postId);

-        comment2.setParentId(0);

-        comment2.setAuthorId("user3");

-        comment2.setContent("Comment 2");

-        comment2.setCreateTime(LocalDateTime.now());

+        HelpComment c2 = new HelpComment();

+        c2.setId(2); c2.setPostId(postId); c2.setParentId(0);

+        c2.setAuthorId("user3"); c2.setContent("Comment 2");

+        c2.setCreateTime(LocalDateTime.now());

 

-        List<HelpComment> allComments = Arrays.asList(comment1, comment2);

+        List<HelpComment> comments = Arrays.asList(c1, c2);

 

         when(postService.getById(postId)).thenReturn(post);

-        // 明确指定使用 Wrapper 参数的 list 方法

-        when(commentService.list(any(Wrapper.class))).thenReturn(allComments);

+        // 避免重载二义性,明确 stub list(Wrapper)

+        doReturn(comments)

+                .when(commentService)

+                .list(any(Wrapper.class));

 

-        // Act

         Result result = postController.getPost(postId);

 

-        // Assert

         assertEquals(200, result.getCode());

         assertEquals(post, result.getData().get("post"));

-        List<?> comments = (List<?>) result.getData().get("comments");

-        assertNotNull(comments);

-        assertEquals(2, comments.size());

+        @SuppressWarnings("unchecked")

+        List<HelpComment> ret = (List<HelpComment>) result.getData().get("comments");

+        assertEquals(2, ret.size());

+

         verify(postService, times(1)).getById(postId);

         verify(commentService, times(1)).list(any(Wrapper.class));

     }

 

     @Test

     void listPosts_ShouldReturnPaginatedPosts() {

-        // Arrange

-        int page = 1;

-        int size = 5;

+        int page = 1, size = 5;

+        HelpPost p1 = new HelpPost(); p1.setId(1); p1.setAuthorId("u1");

+        HelpPost p2 = new HelpPost(); p2.setId(2); p2.setAuthorId("u2");

+        List<HelpPost> posts = Arrays.asList(p1, p2);

 

-        HelpPost post1 = new HelpPost();

-        post1.setId(1);

-        post1.setTitle("Post 1");

-        post1.setContent("Content 1");

-        post1.setAuthorId("user1");

-        post1.setCreateTime(LocalDateTime.now());

-

-        HelpPost post2 = new HelpPost();

-        post2.setId(2);

-        post2.setTitle("Post 2");

-        post2.setContent("Content 2");

-        post2.setAuthorId("user2");

-        post2.setCreateTime(LocalDateTime.now());

-

-        List<HelpPost> posts = Arrays.asList(post1, post2);

-        Page<HelpPost> pageResult = new Page<>(page, size, posts.size());

-        pageResult.setRecords(posts);

+        Page<HelpPost> pageResult = new Page<>(page, size);

+        pageResult.setRecords(posts).setTotal(posts.size());

 

         when(postService.page(any(Page.class), any())).thenReturn(pageResult);

 

-        // Act

         Result result = postController.listPosts(page, size);

 

-        // Assert

         assertEquals(200, result.getCode());

         assertEquals(posts, result.getData().get("records"));

-        assertEquals((long)posts.size(), ((Long)result.getData().get("total")).longValue()); // 修改为比较long值

+        assertEquals((long) posts.size(), result.getData().get("total"));

+

         verify(postService, times(1)).page(any(Page.class), any());

     }

 

     @Test

     void getPost_ShouldReturnError_WhenPostNotExists() {

-        // Arrange

         int postId = 1;

         when(postService.getById(postId)).thenReturn(null);

 

-        // Act

         Result result = postController.getPost(postId);

 

-        // Assert

         assertEquals(500, result.getCode());

         assertEquals("帖子不存在", result.getMessage());

-        verify(postService, times(1)).getById(postId);

 

+        verify(postService, times(1)).getById(postId);

     }

 

     @Test

     void likePost_ShouldReturnSuccess() {

-        // Arrange

         int postId = 1;

         doNothing().when(postService).incrementLike(postId);

 

-        // Act

         Result result = postController.likePost(postId);

 

-        // Assert

         assertEquals(200, result.getCode());

         verify(postService, times(1)).incrementLike(postId);

     }

 

     @Test

-    void addComment_ShouldReturnSuccess() {

-        // Arrange

-        int postId = 1;

+    void deletePost_ShouldReturnSuccess_WhenPostRemoved() {

+        int postId = 42;

+        // remove 返回 boolean,而非 void

+        when(commentService.remove(any(Wrapper.class))).thenReturn(true);

+        when(postService.removeById(postId)).thenReturn(true);

 

-        HelpComment comment = new HelpComment();

-        comment.setId(1); // 添加ID设置

-        comment.setContent("Test comment");

-        comment.setAuthorId("user2");

-        comment.setCreateTime(LocalDateTime.now());

+        Result result = postController.deletePost(postId);

 

-        when(postService.getById(postId)).thenReturn(new HelpPost());

-        when(commentService.save(any(HelpComment.class))).thenReturn(true);

-        when(commentService.getById(anyInt())).thenReturn(comment);

-        when(postService.getById(anyInt())).thenReturn(new HelpPost()); // 添加这行

-

-        // Act

-        Result result = postController.comment(postId, comment);

-

-        // Assert

         assertEquals(200, result.getCode());

-        assertNotNull(result.getData().get("comment"));

+        verify(commentService, times(1)).remove(any(Wrapper.class));

+        verify(postService, times(1)).removeById(postId);

+    }

+    @Test

+    void deletePost_ShouldReturnError_WhenPostRemoveFails() {

+        int postId = 42;

+        when(commentService.remove(any(Wrapper.class))).thenReturn(true);

+        when(postService.removeById(postId)).thenReturn(false);

+

+        Result result = postController.deletePost(postId);

+

+        assertEquals(500, result.getCode());

+        assertEquals("删除帖子失败", result.getMessage());

+        verify(commentService, times(1)).remove(any(Wrapper.class));

+        verify(postService, times(1)).removeById(postId);

+    }

+

+    @Test

+    void addCommentWithoutImage_ShouldReturnSuccess() {

+        int postId    = 7;

+        String author = "user2";

+        String content= "Hello";

+

+        // 这是我们希望最后返回的那个对象

+        HelpComment saved = new HelpComment();

+        saved.setId(99);

+        saved.setPostId(postId);

+        saved.setAuthorId(author);

+        saved.setContent(content);

+        saved.setImageUrl(null);

+

+        // 1) stub save(...):拦截到 comment,将它的 id 设为 99

+        doAnswer(invocation -> {

+            HelpComment arg = invocation.getArgument(0);

+            arg.setId(saved.getId());

+            return true;

+        }).when(commentService).save(any(HelpComment.class));

+

+        // 2) stub getById(99) -> saved

+        when(commentService.getById(saved.getId())).thenReturn(saved);

+

+        // 回复数的模拟

+        doNothing().when(postService).incrementReplyCount(postId);

+        HelpPost stubPost = new HelpPost();

+        stubPost.setReplyCount(5);

+        when(postService.getById(postId)).thenReturn(stubPost);

+

+        // 调用接口

+        Result result = postController.comment(postId, author, content, null);

+

+        // 断言

+        assertEquals(200, result.getCode());

+        assertEquals(saved, result.getData().get("comment"));

+        assertEquals(5,     result.getData().get("newReplyCount"));

+

         verify(commentService, times(1)).save(any(HelpComment.class));

+        verify(postService,   times(1)).incrementReplyCount(postId);

+    }

+

+    @Test

+    void addCommentWithImage_ShouldReturnSuccess() throws Exception {

+        int postId    = 8;

+        String author = "user3";

+        String content= "With Image";

+

+        // 准备一个小文件

+        MockMultipartFile mockFile = new MockMultipartFile(

+                "image", "test.jpg", "image/jpeg", new byte[]{1,2,3}

+        );

+

+        // 我们要“拿回”给前端的对象

+        HelpComment saved = new HelpComment();

+        saved.setId(100);

+        saved.setPostId(postId);

+        saved.setAuthorId(author);

+        saved.setContent(content);

+        saved.setImageUrl("/uploads/whatever.jpg");

+

+        // 1) save(...) 时给 comment 赋 id=100

+        doAnswer(invocation -> {

+            HelpComment arg = invocation.getArgument(0);

+            arg.setId(saved.getId());

+            // 同时把 imageUrl 塞一下,模拟上传后持久化时已经写入

+            arg.setImageUrl(saved.getImageUrl());

+            return true;

+        }).when(commentService).save(any(HelpComment.class));

+

+        // 2) getById(100) -> saved

+        when(commentService.getById(saved.getId())).thenReturn(saved);

+

+        // 回复数

+        doNothing().when(postService).incrementReplyCount(postId);

+        HelpPost stubPost = new HelpPost();

+        stubPost.setReplyCount(10);

+        when(postService.getById(postId)).thenReturn(stubPost);

+

+        // 调用

+        Result result = postController.comment(postId, author, content, mockFile);

+

+        assertEquals(200, result.getCode());

+        assertEquals(saved, result.getData().get("comment"));

+        assertEquals(10,    result.getData().get("newReplyCount"));

+

+        // 并且真正保存的对象也带上了 imageUrl

+        ArgumentCaptor<HelpComment> captor = ArgumentCaptor.forClass(HelpComment.class);

+        verify(commentService).save(captor.capture());

+        HelpComment toSave = captor.getValue();

+        assertEquals(saved.getImageUrl(), toSave.getImageUrl());

+

         verify(postService, times(1)).incrementReplyCount(postId);

     }

-}
\ No newline at end of file
+

+

+}

diff --git a/uploads/1110a6dc-b6b6-4408-b33f-97afacded945.jpg b/uploads/1110a6dc-b6b6-4408-b33f-97afacded945.jpg
new file mode 100644
index 0000000..aed2973
--- /dev/null
+++ b/uploads/1110a6dc-b6b6-4408-b33f-97afacded945.jpg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/uploads/4876d616-3494-4aed-896e-01edf4e0f6a6.jpg b/uploads/4876d616-3494-4aed-896e-01edf4e0f6a6.jpg
new file mode 100644
index 0000000..aed2973
--- /dev/null
+++ b/uploads/4876d616-3494-4aed-896e-01edf4e0f6a6.jpg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/uploads/5fb50a1b-c4d7-42cf-82c5-92438d94b1c1.png b/uploads/5fb50a1b-c4d7-42cf-82c5-92438d94b1c1.png
new file mode 100644
index 0000000..71bd63e
--- /dev/null
+++ b/uploads/5fb50a1b-c4d7-42cf-82c5-92438d94b1c1.png
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/uploads/69c706c7-6ae4-4e2c-9c22-6d0e8874b228.jpg b/uploads/69c706c7-6ae4-4e2c-9c22-6d0e8874b228.jpg
new file mode 100644
index 0000000..aed2973
--- /dev/null
+++ b/uploads/69c706c7-6ae4-4e2c-9c22-6d0e8874b228.jpg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/uploads/77032da9-b19b-4bad-a5f4-97bb656ad462.jpg b/uploads/77032da9-b19b-4bad-a5f4-97bb656ad462.jpg
new file mode 100644
index 0000000..aed2973
--- /dev/null
+++ b/uploads/77032da9-b19b-4bad-a5f4-97bb656ad462.jpg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/uploads/82d39fb4-7a1e-491f-8a62-e14f796629fe.jpg b/uploads/82d39fb4-7a1e-491f-8a62-e14f796629fe.jpg
new file mode 100644
index 0000000..4a7a6e2
--- /dev/null
+++ b/uploads/82d39fb4-7a1e-491f-8a62-e14f796629fe.jpg
Binary files differ
diff --git a/uploads/8dcddc1c-ec93-4ffb-881d-1531a3b3f3e0.png b/uploads/8dcddc1c-ec93-4ffb-881d-1531a3b3f3e0.png
new file mode 100644
index 0000000..71bd63e
--- /dev/null
+++ b/uploads/8dcddc1c-ec93-4ffb-881d-1531a3b3f3e0.png
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/uploads/ac46e0ec-891b-4cfb-bece-799f30cbb1f9.jpg b/uploads/ac46e0ec-891b-4cfb-bece-799f30cbb1f9.jpg
new file mode 100644
index 0000000..aed2973
--- /dev/null
+++ b/uploads/ac46e0ec-891b-4cfb-bece-799f30cbb1f9.jpg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/uploads/bad196f2-d2a7-4f24-8cf9-6d450f82daf1.jpg b/uploads/bad196f2-d2a7-4f24-8cf9-6d450f82daf1.jpg
new file mode 100644
index 0000000..4a7a6e2
--- /dev/null
+++ b/uploads/bad196f2-d2a7-4f24-8cf9-6d450f82daf1.jpg
Binary files differ