解决合并冲突,并实现种子junit单元测试

Change-Id: Ifff1a63aed76b380ea4767a1e6e1f31f3e9c0882
diff --git a/ruoyi-admin/src/test/java/com/ruoyi/web/controller/BT/TorrentControllerTest.java b/ruoyi-admin/src/test/java/com/ruoyi/web/controller/BT/TorrentControllerTest.java
new file mode 100644
index 0000000..54ea48e
--- /dev/null
+++ b/ruoyi-admin/src/test/java/com/ruoyi/web/controller/BT/TorrentControllerTest.java
@@ -0,0 +1,176 @@
+package com.ruoyi.web.controller.BT;
+
+import com.github.pagehelper.PageInfo;
+import com.ruoyi.common.core.domain.entity.SysUser;
+
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.web.Server.BT.TorrentCommentService;
+import com.ruoyi.web.Server.BT.TorrentService;
+import com.ruoyi.web.Server.BT.TrackerURLService;
+import com.ruoyi.web.Server.sys.UserCredentialService;
+import com.ruoyi.web.Server.sys.UserService;
+import com.ruoyi.web.controller.common.base.ResPage;
+import com.ruoyi.web.dao.BT.SuggestDao;
+import com.ruoyi.web.dao.BT.TagDao;
+import com.ruoyi.web.dao.BT.TorrentDao;
+import com.ruoyi.web.domain.BT.*;
+
+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.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.mock.web.MockMultipartFile;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+import com.ruoyi.web.controller.common.base.PageUtil;
+
+
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
+
+@ExtendWith(MockitoExtension.class) // 使用 Mockito 扩展
+class TorrentControllerTest {
+
+    @Mock // 模拟依赖的 DAO
+    private TagDao tagDao;
+    @Mock // 模拟依赖的 DAO
+    private TorrentDao torrentDao;
+
+    @Mock // 模拟依赖的 Service
+    private SuggestDao suggestDao;
+
+    @Mock
+    private TorrentService torrentService;
+
+    @Mock
+    private TorrentCommentService torrentCommentService;
+
+    @Mock
+    private UserService userService;
+
+    @Mock
+    private TrackerURLService trackerURLService;
+
+    @Mock
+    private UserCredentialService userCredentialService;
+
+    @Mock
+    private PageUtil pageUtil;
+
+    @InjectMocks // 注入被测试的 Controller
+    private TorrentController torrentController;
+
+    private MockMvc mockMvc;
+    private ObjectMapper objectMapper;
+
+    @BeforeEach
+    void setUp() {
+
+        // 创建 LoginUser 实例时使用 int 类型的 userId 和 deptId
+        LoginUser loginUser = new LoginUser(
+                1,
+                1,
+                new SysUser(),
+                new HashSet<>()
+        );
+
+        mockMvc = MockMvcBuilders.standaloneSetup(torrentController).build();
+        objectMapper = new ObjectMapper();
+    }
+
+
+    @Test
+    void testSuggestWithoutKeyword() throws Exception {
+        // 执行请求(q参数为空)
+        mockMvc.perform(get("/torrent/suggest"))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.data").isArray())
+                .andExpect(jsonPath("$.data").isEmpty());
+    }
+
+    @Test
+    void testAudit() throws Exception {
+        TorrentAuditParam param = new TorrentAuditParam();
+        param.setId(1);
+        param.setStatus(1);
+        mockMvc.perform(post("/torrent/audit")
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(objectMapper.writeValueAsString(param)))
+                .andExpect(status().isOk());
+        verify(torrentService, times(1)).audit(param);
+    }
+
+
+    @Test
+    void testCreateCredential() throws Exception {
+        mockMvc.perform(post("/torrent/create_credential"))
+                .andExpect(status().isOk());
+        verify(torrentService, times(1)).createCredential(Math.toIntExact(0)); // 假设用户ID为1
+    }
+
+    @Test
+    void testUpdate() throws Exception {
+        TorrentEntity entity = new TorrentEntity();
+        entity.setId(1);
+        entity.setTitle("Updated");
+        entity.setStatus(1);
+        mockMvc.perform(post("/torrent/update")
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(objectMapper.writeValueAsString(entity)))
+                .andExpect(status().isOk());
+        verify(torrentService, times(1)).update(entity);
+    }
+
+    @Test
+    void testDelete() throws Exception {
+        mockMvc.perform(post("/torrent/delete")
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(objectMapper.writeValueAsString(new Integer[]{1, 2})))
+                .andExpect(status().isOk());
+        verify(torrentService, times(1)).remove(any(Integer[].class));
+    }
+
+    @Test
+    void testTracker() throws Exception {
+        when(trackerURLService.getAnnounce(anyString())).thenReturn("http://tracker.test/announce");
+        when(userService.getPasskey(Math.toIntExact(0))).thenReturn("test-passkey");
+
+        mockMvc.perform(post("/torrent/tracker"))
+                .andExpect(jsonPath("$.data").value("http://tracker.test/announce"));
+    }
+
+    @Test
+    void testDownload() throws Exception {
+        TorrentEntity entity = new TorrentEntity();
+        entity.setId(1);
+        entity.setFilename("test.torrent");
+        when(torrentService.getById(1)).thenReturn(entity);
+        when(torrentService.fetch(1, null)).thenReturn("torrent-bytes".getBytes());
+
+        mockMvc.perform(get("/torrent/download")
+                        .param("id", "1"))
+                .andExpect(status().isOk());
+        verify(torrentService, times(1)).incrementLeechers(1);
+    }
+
+}
\ No newline at end of file
diff --git a/ruoyi-admin/src/test/java/com/ruoyi/web/controller/bounty/BountyControllerTest.java b/ruoyi-admin/src/test/java/com/ruoyi/web/controller/bounty/BountyControllerTest.java
index 121d59e..04c4b19 100644
--- a/ruoyi-admin/src/test/java/com/ruoyi/web/controller/bounty/BountyControllerTest.java
+++ b/ruoyi-admin/src/test/java/com/ruoyi/web/controller/bounty/BountyControllerTest.java
@@ -14,6 +14,8 @@
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
 import org.springframework.http.MediaType;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.context.SecurityContextHolder;
@@ -28,7 +30,6 @@
 import static org.mockito.Mockito.*;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
-
 @ExtendWith(MockitoExtension.class)
 class BountyControllerTest {
 
@@ -43,17 +44,7 @@
 
     @BeforeEach
     void setUp() {
-        // 创建模拟的安全上下文
-        SysUser sysUser = new SysUser();
-        sysUser.setUserId(1L);
-        sysUser.setUserName("testUser");
-
-        LoginUser loginUser = new LoginUser(1L, 1L, sysUser, new HashSet<>());
-
-        UsernamePasswordAuthenticationToken authToken =
-                new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
-        SecurityContextHolder.getContext().setAuthentication(authToken);
-
+        // 移除手动创建的SecurityContext,使用Spring Security测试支持
         mockMvc = MockMvcBuilders.standaloneSetup(bountyController).build();
         objectMapper = new ObjectMapper();
     }
diff --git a/ruoyi-admin/src/test/java/com/ruoyi/web/controller/bounty/BountySubmissionControllerTest.java b/ruoyi-admin/src/test/java/com/ruoyi/web/controller/bounty/BountySubmissionControllerTest.java
index b7f7f99..49b4034 100644
--- a/ruoyi-admin/src/test/java/com/ruoyi/web/controller/bounty/BountySubmissionControllerTest.java
+++ b/ruoyi-admin/src/test/java/com/ruoyi/web/controller/bounty/BountySubmissionControllerTest.java
@@ -18,6 +18,7 @@
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
 import org.springframework.mock.web.MockMultipartFile;
diff --git a/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostCenterControllerTest.java b/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostCenterControllerTest.java
index ba1400d..e83c2a5 100644
--- a/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostCenterControllerTest.java
+++ b/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostCenterControllerTest.java
@@ -14,6 +14,7 @@
 import org.mockito.Mock;
 import org.mockito.MockedStatic;
 import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
 import org.springframework.http.MediaType;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.context.SecurityContextHolder;
@@ -30,7 +31,8 @@
 import static org.mockito.Mockito.*;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
-
+import org.springframework.boot.test.context.SpringBootTestContextBootstrapper;
+import org.springframework.test.context.BootstrapWith;
 /**
  * PostCenterController 单元测试
  * 
diff --git a/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostCommentControllerTest.java b/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostCommentControllerTest.java
index 8e81d5a..2833c1e 100644
--- a/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostCommentControllerTest.java
+++ b/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostCommentControllerTest.java
@@ -13,6 +13,7 @@
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
 import org.springframework.http.MediaType;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.context.SecurityContextHolder;
@@ -27,7 +28,8 @@
 import static org.mockito.Mockito.*;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
-
+import org.springframework.boot.test.context.SpringBootTestContextBootstrapper;
+import org.springframework.test.context.BootstrapWith;
 /**
  * PostCommentController 单元测试
  * 
diff --git a/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostControllerTest.java b/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostControllerTest.java
index 34b2992..c076265 100644
--- a/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostControllerTest.java
+++ b/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostControllerTest.java
@@ -20,6 +20,7 @@
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
 import org.springframework.http.MediaType;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.context.SecurityContextHolder;
@@ -34,7 +35,8 @@
 import static org.mockito.Mockito.*;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
-
+import org.springframework.boot.test.context.SpringBootTestContextBootstrapper;
+import org.springframework.test.context.BootstrapWith;
 /**
  * PostController 单元测试
  * 
diff --git a/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostTagControllerTest.java b/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostTagControllerTest.java
index a2f3fbb..8107f84 100644
--- a/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostTagControllerTest.java
+++ b/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostTagControllerTest.java
@@ -12,6 +12,7 @@
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
 import org.springframework.http.MediaType;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.context.SecurityContextHolder;
@@ -27,7 +28,8 @@
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
 import static org.mockito.Mockito.lenient;
-
+import org.springframework.boot.test.context.SpringBootTestContextBootstrapper;
+import org.springframework.test.context.BootstrapWith;
 /**
  * PostTagController 单元测试
  * 
diff --git a/ruoyi-admin/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/ruoyi-admin/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
new file mode 100644
index 0000000..4d8fe83
--- /dev/null
+++ b/ruoyi-admin/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
@@ -0,0 +1 @@
+org.mockito.internal.creation.bytebuddy.SubclassByteBuddyMockMaker
\ No newline at end of file