diff --git a/src/test/java/com/pt5/pthouduan/controller/ActivityControllerTest.java b/src/test/java/com/pt5/pthouduan/controller/ActivityControllerTest.java
new file mode 100644
index 0000000..3d737a9
--- /dev/null
+++ b/src/test/java/com/pt5/pthouduan/controller/ActivityControllerTest.java
@@ -0,0 +1,140 @@
+package com.pt5.pthouduan.controller;
+
+import com.pt5.pthouduan.entity.Activity;
+import com.pt5.pthouduan.service.ActivityService;
+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.Arrays;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.*;
+
+class ActivityControllerTest {
+
+    @Mock
+    private ActivityService activityService;
+
+    @InjectMocks
+    private ActivityController activityController;
+
+    @BeforeEach
+    void setUp() {
+        MockitoAnnotations.openMocks(this);
+    }
+
+    @Test
+    void getVisibleActivityPreviews_ShouldReturnPreviewList() {
+        Activity fullActivity = new Activity();
+        fullActivity.setActivityid(1);
+        fullActivity.setTitle("Test");
+        fullActivity.setContent("Content");
+        fullActivity.setAward(10);
+        fullActivity.setPhoto("/activity/photo.jpg");
+        fullActivity.setTime(LocalDateTime.now());
+
+        when(activityService.findByIsShow(0)).thenReturn(Arrays.asList(fullActivity));
+
+        List<Activity> result = activityController.getVisibleActivityPreviews();
+
+        assertEquals(1, result.size());
+        assertEquals("Test", result.get(0).getTitle());
+        assertEquals("/activity/photo.jpg", result.get(0).getPhoto());
+    }
+
+    @Test
+    void getVisibleActivities_ShouldReturnList() {
+        Activity activity = new Activity();
+        activity.setActivityid(1);
+        activity.setTitle("Visible Activity");
+
+        when(activityService.findByIsShow(0)).thenReturn(List.of(activity));
+
+        List<Activity> result = activityController.getVisibleActivities();
+
+        assertEquals(1, result.size());
+        assertEquals("Visible Activity", result.get(0).getTitle());
+    }
+
+    @Test
+    void createActivity_ShouldReturnTrue_WhenSaved() {
+        when(activityService.save(any(Activity.class))).thenReturn(true);
+
+        boolean result = activityController.createActivity(
+                "New Title", "New Content", null, 0, 5
+        );
+
+        assertTrue(result);
+        verify(activityService).save(any(Activity.class));
+    }
+
+    @Test
+    void deleteActivity_ShouldReturnTrue_WhenDeleted() {
+        when(activityService.removeById(1)).thenReturn(true);
+
+        boolean result = activityController.deleteActivity(1);
+
+        assertTrue(result);
+        verify(activityService).removeById(1);
+    }
+
+    @Test
+    void getAllActivities_ShouldReturnAllActivities() {
+        Activity a1 = new Activity();
+        a1.setTitle("A1");
+
+        Activity a2 = new Activity();
+        a2.setTitle("A2");
+
+        when(activityService.list()).thenReturn(List.of(a1, a2));
+
+        List<Activity> result = activityController.getAllActivities();
+
+        assertEquals(2, result.size());
+        assertEquals("A1", result.get(0).getTitle());
+        assertEquals("A2", result.get(1).getTitle());
+    }
+
+    @Test
+    void searchActivitiesByTitle_ShouldReturnMatchingActivities() {
+        Activity match = new Activity();
+        match.setTitle("Matched");
+
+        when(activityService.searchByTitle("Match")).thenReturn(List.of(match));
+
+        List<Activity> result = activityController.searchActivitiesByTitle("Match");
+
+        assertEquals(1, result.size());
+        assertEquals("Matched", result.get(0).getTitle());
+    }
+
+    @Test
+    void updateActivity_ShouldReturnTrue_WhenSuccessful() {
+        Activity existing = new Activity();
+        existing.setActivityid(1);
+        existing.setTitle("Old");
+
+        when(activityService.getById(1)).thenReturn(existing);
+        when(activityService.updateById(any(Activity.class))).thenReturn(true);
+
+        boolean result = activityController.updateActivity(1, "New Title", "New Content", null, 1, 10);
+
+        assertTrue(result);
+        verify(activityService).updateById(any(Activity.class));
+    }
+
+    @Test
+    void updateActivity_ShouldReturnFalse_WhenActivityNotFound() {
+        when(activityService.getById(999)).thenReturn(null);
+
+        boolean result = activityController.updateActivity(999, "Title", "Content", null, 0, 0);
+
+        assertFalse(result);
+    }
+}
