From 727b31bed049fe79d7f982961f32f8e3a4a40fdb Mon Sep 17 00:00:00 2001 From: commoner02 <77.shuvo.joy@gmail.com> Date: Mon, 16 Feb 2026 00:29:40 +0600 Subject: [PATCH 1/2] workflow file modified with test branch --- .github/workflows/workflow.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index f30eef9..0d02270 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -2,9 +2,9 @@ name: Spring Boot CI/CD on: push: - branches: [ "dev", "feature/*", "fix/*" ] + branches: [ "dev", "feature/*", "fix/*", test/*" ] pull_request: - branches: [ "main", "dev" ] + branches: [ "main" ] jobs: build-and-test: From ece59156308e7be862190395c3193076480acedc Mon Sep 17 00:00:00 2001 From: commoner02 <77.shuvo.joy@gmail.com> Date: Mon, 16 Feb 2026 11:44:14 +0600 Subject: [PATCH 2/2] some edge case tests added --- .../service/UserService.java | 13 ++++++++ .../controller/AuthControllerTest.java | 8 +++++ .../controller/StudentControllerTest.java | 31 +++++++++++++++++++ .../controller/TeacherControllerTest.java | 28 ++++++++++++++++- .../repository/CourseRepositoryTest.java | 1 - .../service/UserServiceTest.java | 30 +++++++++++++++++- 6 files changed, 108 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/shuvocse21/StudentManagementApp/service/UserService.java b/src/main/java/com/shuvocse21/StudentManagementApp/service/UserService.java index 26a79a1..cbabb97 100644 --- a/src/main/java/com/shuvocse21/StudentManagementApp/service/UserService.java +++ b/src/main/java/com/shuvocse21/StudentManagementApp/service/UserService.java @@ -28,6 +28,19 @@ public class UserService { public User registerStudent(String username, String password, String email, String studentId, String phone, String address) { + if (username == null || username.trim().isEmpty()) { + throw new IllegalArgumentException("Username cannot be empty"); + } + if (password == null || password.trim().isEmpty()) { + throw new IllegalArgumentException("Password cannot be empty"); + } + if (email == null || email.trim().isEmpty()) { + throw new IllegalArgumentException("Email cannot be empty"); + } + if (studentId == null || studentId.trim().isEmpty()) { + throw new IllegalArgumentException("Student ID cannot be empty"); + } + if (userRepository.existsByUsername(username)) { throw new RuntimeException("Username already exists"); } diff --git a/src/test/java/com/shuvocse21/StudentManagementApp/controller/AuthControllerTest.java b/src/test/java/com/shuvocse21/StudentManagementApp/controller/AuthControllerTest.java index 5236b63..86486a1 100644 --- a/src/test/java/com/shuvocse21/StudentManagementApp/controller/AuthControllerTest.java +++ b/src/test/java/com/shuvocse21/StudentManagementApp/controller/AuthControllerTest.java @@ -72,4 +72,12 @@ void registerTeacher_Post() throws Exception { .andExpect(redirectedUrl("/login")) .andExpect(flash().attributeExists("success")); } + + // Test unauthenticated user accessing protected page + @Test + void unauthenticatedUser_AccessingDashboard_ShouldRedirectToLogin() throws Exception { + mockMvc.perform(get("/dashboard")) + .andExpect(status().is3xxRedirection()) + .andExpect(redirectedUrlPattern("**/login")); + } } \ No newline at end of file diff --git a/src/test/java/com/shuvocse21/StudentManagementApp/controller/StudentControllerTest.java b/src/test/java/com/shuvocse21/StudentManagementApp/controller/StudentControllerTest.java index fe986e0..e17f95d 100644 --- a/src/test/java/com/shuvocse21/StudentManagementApp/controller/StudentControllerTest.java +++ b/src/test/java/com/shuvocse21/StudentManagementApp/controller/StudentControllerTest.java @@ -75,4 +75,35 @@ void updateProfile() throws Exception { .andExpect(redirectedUrl("/student/dashboard")) .andExpect(flash().attributeExists("success")); } + + @Test + @WithMockUser(roles = "TEACHER") + void teacher_AccessingStudentDashboard_ShouldBeForbidden() throws Exception { + mockMvc.perform(get("/student/dashboard")) + .andExpect(status().isForbidden()); + } + + @Test + @WithMockUser(username = "student2", roles = "STUDENT") + void dashboard_WithIncompleteStudentData_ShouldStillLoad() throws Exception { + User mockUser = new User(); + mockUser.setId(2L); + mockUser.setUsername("student2"); + + // Create StudentDTO with DEFAULT values (not null) + StudentDTO mockStudent = new StudentDTO(); + mockStudent.setUsername("student2"); + mockStudent.setStudentId(""); // Empty but not null + mockStudent.setEmail(""); // Empty but not null + mockStudent.setPhone(""); // Empty but not null + mockStudent.setAddress(""); // Empty but not null + mockStudent.setCourseCodes(new ArrayList<>()); // Empty list, not null + + when(userService.getUserByUsername("student2")).thenReturn(mockUser); + when(userService.getStudentDTOByUserId(2L)).thenReturn(mockStudent); + + mockMvc.perform(get("/student/dashboard")) + .andExpect(status().isOk()) + .andExpect(view().name("student/dashboard")); + } } \ No newline at end of file diff --git a/src/test/java/com/shuvocse21/StudentManagementApp/controller/TeacherControllerTest.java b/src/test/java/com/shuvocse21/StudentManagementApp/controller/TeacherControllerTest.java index 86d66b0..5902aa9 100644 --- a/src/test/java/com/shuvocse21/StudentManagementApp/controller/TeacherControllerTest.java +++ b/src/test/java/com/shuvocse21/StudentManagementApp/controller/TeacherControllerTest.java @@ -29,7 +29,6 @@ class TeacherControllerTest { @MockBean private StudentRepository studentRepository; - // ESSENTIAL METHODS (Filled) @Test @WithMockUser(roles = "TEACHER") void dashboard() throws Exception { @@ -83,6 +82,33 @@ void enrollStudent() throws Exception { .andExpect(flash().attributeExists("success")); } + @Test + @WithMockUser(roles = "STUDENT") + void student_AccessingTeacherDashboard_ShouldBeForbidden() throws Exception { + mockMvc.perform(get("/teacher/dashboard")) + .andExpect(status().isForbidden()); + } + + @Test + @WithMockUser(roles = "TEACHER") + void deleteStudent_WithInvalidId_ShouldHandleGracefully() throws Exception { + mockMvc.perform(get("/teacher/delete-student/9999")) + .andExpect(status().is3xxRedirection()) + .andExpect(redirectedUrl("/teacher/students")); + } + + @Test + @WithMockUser(roles = "TEACHER") + void enrollStudent_WithInvalidIds_ShouldShowError() throws Exception { + mockMvc.perform(post("/teacher/enroll-student") + .with(csrf()) + .param("studentId", "9999") + .param("courseId", "9999")) + .andExpect(status().is3xxRedirection()) + .andExpect(redirectedUrl("/teacher/enroll-student")); + + } + // NON-ESSENTIAL METHODS (Blank) @Test void showAddStudentForm() { } diff --git a/src/test/java/com/shuvocse21/StudentManagementApp/repository/CourseRepositoryTest.java b/src/test/java/com/shuvocse21/StudentManagementApp/repository/CourseRepositoryTest.java index 7102750..7e32a34 100644 --- a/src/test/java/com/shuvocse21/StudentManagementApp/repository/CourseRepositoryTest.java +++ b/src/test/java/com/shuvocse21/StudentManagementApp/repository/CourseRepositoryTest.java @@ -54,5 +54,4 @@ void findByTeacherId() { .containsExactlyInAnyOrder("MATH201", "PHY201"); } - // NON-ESSENTIAL METHODS (None needed for this file) } \ No newline at end of file diff --git a/src/test/java/com/shuvocse21/StudentManagementApp/service/UserServiceTest.java b/src/test/java/com/shuvocse21/StudentManagementApp/service/UserServiceTest.java index 1900f8c..b7f6c66 100644 --- a/src/test/java/com/shuvocse21/StudentManagementApp/service/UserServiceTest.java +++ b/src/test/java/com/shuvocse21/StudentManagementApp/service/UserServiceTest.java @@ -42,7 +42,6 @@ void setUp() { testStudent.setStudentId("S1001"); } - // ESSENTIAL METHODS @Test void registerStudent() { when(userRepository.existsByUsername("newstudent")).thenReturn(false); @@ -98,6 +97,35 @@ void enrollStudentInCourse() { assertThat(testStudent.getCourses()).contains(testCourse); } + @Test + void enrollStudentInCourse_CourseNotFound_ShouldThrowException() { + when(studentRepository.findById(1L)).thenReturn(Optional.of(testStudent)); + when(courseRepository.findById(999L)).thenReturn(Optional.empty()); + + assertThatThrownBy(() -> + userService.enrollStudentInCourse(1L, 999L)) + .isInstanceOf(RuntimeException.class) + .hasMessageContaining("not found"); + } + + @Test + void enrollStudentInCourse_StudentNotFound_ShouldThrowException() { + when(studentRepository.findById(999L)).thenReturn(Optional.empty()); + + assertThatThrownBy(() -> + userService.enrollStudentInCourse(999L, 1L)) + .isInstanceOf(RuntimeException.class) + .hasMessageContaining("not found"); + } + + @Test + void registerStudent_WithEmptyFields_ShouldFail() { + + assertThatThrownBy(() -> + userService.registerStudent("", "", "", "", "", "")) + .isInstanceOf(Exception.class); + } + // NON-ESSENTIAL METHODS (Blank) @Test void getUserByUsername() { }