diff --git a/src/test/java/com/pt5/pthouduan/controller/ComplainControllerTest.java b/src/test/java/com/pt5/pthouduan/controller/ComplainControllerTest.java
new file mode 100644
index 0000000..105cc8b
--- /dev/null
+++ b/src/test/java/com/pt5/pthouduan/controller/ComplainControllerTest.java
@@ -0,0 +1,132 @@
+package com.pt5.pthouduan.controller;
+
+import com.pt5.pthouduan.entity.Complain;
+import com.pt5.pthouduan.service.ComplainService;
+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.util.Arrays;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+class ComplainControllerTest {
+
+    @Mock
+    private ComplainService complainService;
+
+    @InjectMocks
+    private ComplainController complainController;
+
+    @BeforeEach
+    void setUp() {
+        MockitoAnnotations.openMocks(this);
+    }
+
+    @Test
+    void createComplain_ShouldReturnCreatedComplain() {
+        Complain complain = new Complain();
+        complain.setComplainid(1);
+        complain.setPuse(100L);
+        complain.setDuser(200L);
+        complain.setContent("Bad behavior");
+        complain.setTorrentid(123L);
+
+        when(complainService.createComplain(any(Complain.class))).thenReturn(complain);
+
+        Complain result = complainController.createComplain(complain);
+
+        assertEquals("Bad behavior", result.getContent());
+        assertEquals(100L, result.getPuse());
+        verify(complainService).createComplain(any(Complain.class));
+    }
+
+    @Test
+    void deleteComplain_ShouldReturnTrue_WhenDeleted() {
+        when(complainService.deleteComplain(1)).thenReturn(true);
+
+        boolean result = complainController.deleteComplain(1);
+
+        assertTrue(result);
+        verify(complainService).deleteComplain(1);
+    }
+
+    @Test
+    void updateComplain_ShouldReturnTrue_WhenUpdated() {
+        Complain complain = new Complain();
+        complain.setComplainid(1);
+        complain.setContent("Updated complaint");
+
+        when(complainService.updateComplain(any(Complain.class))).thenReturn(true);
+
+        boolean result = complainController.updateComplain(complain);
+
+        assertTrue(result);
+        verify(complainService).updateComplain(complain);
+    }
+
+    @Test
+    void getComplainsByTargetUser_ShouldReturnList() {
+        Complain c1 = new Complain();
+        c1.setDuser(200L);
+        c1.setContent("Cheating");
+
+        when(complainService.getComplainsByTargetUser(200L)).thenReturn(List.of(c1));
+
+        List<Complain> result = complainController.getComplainsByTargetUser(200L);
+
+        assertEquals(1, result.size());
+        assertEquals("Cheating", result.get(0).getContent());
+    }
+
+    @Test
+    void getComplainsByPostingUser_ShouldReturnList() {
+        Complain c = new Complain();
+        c.setPuse(100L);
+        c.setContent("Spam complaint");
+
+        when(complainService.getComplainsByPostingUser(100L)).thenReturn(List.of(c));
+
+        List<Complain> result = complainController.getComplainsByPostingUser(100L);
+
+        assertEquals(1, result.size());
+        assertEquals("Spam complaint", result.get(0).getContent());
+    }
+
+    @Test
+    void getAllComplains_ShouldReturnAll() {
+        Complain c1 = new Complain();
+        c1.setContent("Complain A");
+        Complain c2 = new Complain();
+        c2.setContent("Complain B");
+
+        when(complainService.getAllComplains()).thenReturn(Arrays.asList(c1, c2));
+
+        List<Complain> result = complainController.getAllComplains();
+
+        assertEquals(2, result.size());
+        assertEquals("Complain A", result.get(0).getContent());
+        assertEquals("Complain B", result.get(1).getContent());
+    }
+
+    @Test
+    void getComplainInfo_ShouldReturnComplainDetails() {
+        Complain c = new Complain();
+        c.setComplainid(1);
+        c.setPuse(100L);
+        c.setDuser(200L);
+        c.setTorrentid(500L);
+
+        when(complainService.getComplainById(1)).thenReturn(c);
+
+        Complain result = complainController.getComplainInfo(1);
+
+        assertEquals(100L, result.getPuse());
+        assertEquals(200L, result.getDuser());
+        assertEquals(500L, result.getTorrentid());
+    }
+}
