统计用户当月上传量下载量功能

Change-Id: I2b5b29d3b8f34e2071f15d66fed6759997b063d4
diff --git a/src/test/java/com/pt5/pthouduan/ControllerTest/TrafficControllerTest.java b/src/test/java/com/pt5/pthouduan/ControllerTest/TrafficControllerTest.java
new file mode 100644
index 0000000..81bbe7e
--- /dev/null
+++ b/src/test/java/com/pt5/pthouduan/ControllerTest/TrafficControllerTest.java
@@ -0,0 +1,84 @@
+package com.pt5.pthouduan.ControllerTest;
+
+
+import com.pt5.pthouduan.controller.TrafficController;
+import com.pt5.pthouduan.entity.UserTrafficStat;
+import com.pt5.pthouduan.mapper.UserTrafficMapper;
+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.time.LocalDate;
+
+import static org.mockito.ArgumentMatchers.anyString;
+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.result.MockMvcResultMatchers.*;
+
+class TrafficControllerTest {
+
+    private MockMvc mockMvc;
+
+    @Mock
+    private UserTrafficMapper userTrafficMapper; // 模拟 Mapper
+
+    @InjectMocks
+    private TrafficController trafficController; // 注入 Controller
+
+    @BeforeEach
+    void setUp() {
+        MockitoAnnotations.openMocks(this); // 初始化 Mock
+        mockMvc = MockMvcBuilders.standaloneSetup(trafficController).build(); // 构建 MockMvc
+    }
+
+    @Test
+    void getUserTrafficStats_shouldReturnStats_whenPasskeyAndDatesAreValid() throws Exception {
+        // 准备测试数据
+        String passkey = "test-passkey";
+        LocalDate startDate = LocalDate.of(2023, 1, 1);
+        LocalDate endDate = LocalDate.of(2023, 1, 31);
+
+        UserTrafficStat mockStats = new UserTrafficStat();
+        mockStats.setTotalUploaded(1024L);
+        mockStats.setTotalDownloaded(2048L);
+
+        // 模拟 Mapper 行为
+        when(userTrafficMapper.getUserTrafficStats(anyString(), any(LocalDate.class), any(LocalDate.class)))
+                .thenReturn(mockStats);
+
+        // 发起 GET 请求并验证响应
+        mockMvc.perform(get("/api/traffic/user-stats")
+                        .param("passkey", passkey)
+                        .param("startDate", startDate.toString())
+                        .param("endDate", endDate.toString())
+                        .contentType(MediaType.APPLICATION_JSON))
+                .andExpect(status().isOk()); // 预期 HTTP 200
+    }
+
+    @Test
+    void getUserTrafficStats_shouldReturn400_whenPasskeyIsMissing() throws Exception {
+        // 不传 passkey,预期返回 400 Bad Request
+        mockMvc.perform(get("/api/traffic/user-stats")
+                        .param("startDate", "2023-01-01")
+                        .param("endDate", "2023-01-31")
+                        .contentType(MediaType.APPLICATION_JSON))
+                .andExpect(status().isBadRequest());
+    }
+
+    @Test
+    void getUserTrafficStats_shouldReturn400_whenDatesAreInvalid() throws Exception {
+        // 传入无效日期格式,预期返回 400 Bad Request
+        mockMvc.perform(get("/api/traffic/user-stats")
+                        .param("passkey", "test-passkey")
+                        .param("startDate", "2023-01-01-invalid")
+                        .param("endDate", "2023-01-31")
+                        .contentType(MediaType.APPLICATION_JSON))
+                .andExpect(status().isBadRequest());
+    }
+}
\ No newline at end of file