diff --git a/src/test/java/com/pt5/pthouduan/controller/RequestResourcesControllerTest.java b/src/test/java/com/pt5/pthouduan/controller/RequestResourcesControllerTest.java
new file mode 100644
index 0000000..322b4f9
--- /dev/null
+++ b/src/test/java/com/pt5/pthouduan/controller/RequestResourcesControllerTest.java
@@ -0,0 +1,157 @@
+package com.pt5.pthouduan.controller;
+
+import com.pt5.pthouduan.entity.request_resources;
+import com.pt5.pthouduan.service.RequestResourcesService;
+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 java.time.LocalDateTime;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+class RequestResourcesControllerTest {
+
+    @Mock
+    private RequestResourcesService requestResourcesService;
+
+    @InjectMocks
+    private RequestResourcesController requestResourcesController;
+
+    @BeforeEach
+    void setUp() {
+        MockitoAnnotations.openMocks(this);
+    }
+
+    @Test
+    void updateMoney_ShouldReturnTrue_WhenSuccess() {
+        when(requestResourcesService.updateMoney(1, 100)).thenReturn(true);
+
+        boolean result = requestResourcesController.updateMoney(1, 100);
+
+        assertTrue(result);
+        verify(requestResourcesService).updateMoney(1, 100);
+    }
+
+    @Test
+    void deleteRequest_ShouldReturnTrue_WhenSuccess() {
+        when(requestResourcesService.deleteRequest(1)).thenReturn(true);
+
+        boolean result = requestResourcesController.deleteRequest(1);
+
+        assertTrue(result);
+        verify(requestResourcesService).deleteRequest(1);
+    }
+
+    @Test
+    void findByName_ShouldReturnMatchingRequests() {
+        request_resources req = new request_resources();
+        req.setName("Urgent Help");
+
+        when(requestResourcesService.findByName("Urgent Help")).thenReturn(List.of(req));
+
+        List<request_resources> result = requestResourcesController.findByName("Urgent Help");
+
+        assertEquals(1, result.size());
+        assertEquals("Urgent Help", result.get(0).getName());
+    }
+
+    @Test
+    void findByUserid_ShouldReturnUserRequests() {
+        request_resources req = new request_resources();
+        req.setUserid(123L);
+
+        when(requestResourcesService.findByUserid(123L)).thenReturn(List.of(req));
+
+        List<request_resources> result = requestResourcesController.findByUserid(123L);
+
+        assertEquals(1, result.size());
+        assertEquals(123L, result.get(0).getUserid());
+    }
+
+    @Test
+    void getTotalMoneyByName_ShouldReturnCorrectSum() {
+        when(requestResourcesService.calculateTotalMoneyByName("Education")).thenReturn(500);
+
+        int total = requestResourcesController.getTotalMoneyByName("Education");
+
+        assertEquals(500, total);
+    }
+
+    @Test
+    void findByLoaduser_ShouldReturnLoaduserRequests() {
+        request_resources req = new request_resources();
+        req.setLoaduser(456L);
+
+        when(requestResourcesService.findByLoaduser(456L)).thenReturn(List.of(req));
+
+        List<request_resources> result = requestResourcesController.findByLoaduser(456L);
+
+        assertEquals(1, result.size());
+        assertEquals(456L, result.get(0).getLoaduser());
+    }
+
+    @Test
+    void updateLoaduserByName_ShouldReturnTrue_WhenSuccess() {
+        when(requestResourcesService.updateLoaduserByName("Medical", 789L)).thenReturn(true);
+
+        boolean result = requestResourcesController.updateLoaduserByName("Medical", 789L);
+
+        assertTrue(result);
+    }
+
+    @Test
+    void updateTorrentid_ShouldReturnTrue_WhenSuccess() {
+        when(requestResourcesService.updateTorrentid(1, 999L)).thenReturn(true);
+
+        boolean result = requestResourcesController.updateTorrentid(1, 999L);
+
+        assertTrue(result);
+    }
+
+    @Test
+    void getTorrentid_ShouldReturnCorrectValue() {
+        request_resources req = new request_resources();
+        req.setTorrentid(888L);
+
+        when(requestResourcesService.findByRequestid(1)).thenReturn(req);
+
+        Long result = requestResourcesController.getTorrentid(1);
+
+        assertEquals(888L, result);
+    }
+
+    @Test
+    void getInfoByRequestId_ShouldReturnInfoMap() {
+        request_resources req = new request_resources();
+        req.setMoney(200);
+        req.setLoaduser(101L);
+        req.setTorrentid(555L);
+
+        when(requestResourcesService.findByRequestid(1)).thenReturn(req);
+
+        var result = requestResourcesController.getInfoByRequestId(1);
+
+        assertEquals(200, result.get("money"));
+        assertEquals(101L, result.get("loaduser"));
+        assertEquals(555L, result.get("torrentid"));
+    }
+
+    @Test
+    void getAllRequests_ShouldReturnAllRequests() {
+        request_resources r1 = new request_resources();
+        r1.setRequestid(1);
+        request_resources r2 = new request_resources();
+        r2.setRequestid(2);
+
+        when(requestResourcesService.getAllRequests()).thenReturn(List.of(r1, r2));
+
+        List<request_resources> result = requestResourcesController.getAllRequests();
+
+        assertEquals(2, result.size());
+    }
+}
