上传图片等功能
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