Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Controllers Tests For Course Management #52

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,299 @@
package com.csed.knowtopia.controller;

import com.csed.knowtopia.dto.CourseDTO;
import com.csed.knowtopia.entity.Course;
import com.csed.knowtopia.entity.User;
import com.csed.knowtopia.repository.CourseRepository;
import com.csed.knowtopia.repository.ModuleRepository;
import com.csed.knowtopia.repository.LessonRepository;
import com.csed.knowtopia.repository.UserRepository;
import com.csed.knowtopia.service.JwtUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

import java.time.LocalDate;
import java.util.Optional;

import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

@SpringBootTest
@AutoConfigureMockMvc
public class CourseCrudControllerTest {

@Autowired
private MockMvc mockMvc;

@Autowired
private CourseRepository courseRepository;

@Autowired
private ModuleRepository moduleRepository;

@Autowired
private LessonRepository lessonRepository;


@Autowired
private ObjectMapper objectMapper;

@Autowired
private JwtUtil jwtUtil;

@Autowired
private UserRepository userRepository;

@BeforeEach
public void prepareForTest() {
courseRepository.deleteAll();
moduleRepository.deleteAll();
lessonRepository.deleteAll();

Course course = new Course();
course.setTitle("Test Course");
course.setDescription("Description of test course");
course.setCategory("Test Category");
course.setRating(3.0f);
course.setCreationDate(LocalDate.now());
courseRepository.save(course);
}

@AfterEach
void cleanUp() {
courseRepository.deleteAll();
userRepository.deleteAll();
}

private String mockTokenGenerate() {
userRepository.deleteAll();
User user = new User();
user.setUsername("Test User");
user.setPassword("password");
user.setEmail("[email protected]");
user.setRole("USER");
userRepository.save(user);

return jwtUtil.generateToken(user.getUsername());
}

private String mockToken_2() {
User user = new User();
user.setUsername("Test User 2");
user.setPassword("password");
user.setEmail("[email protected]");
user.setRole("USER");
userRepository.save(user);

return jwtUtil.generateToken(user.getUsername());
}

private Long mockCourse(String token) {
Optional<User> instructor = userRepository.findByUsername(jwtUtil.extractUsername(token));
Course course = new Course();
course.setTitle("Test Course");
course.setDescription("Description of test course");
course.setCategory("Test Category");
course.setRating(3.0f);
course.setInstructor(instructor.get());
course.setCreationDate(LocalDate.now());

courseRepository.save(course);

return course.getId();
}

@Test
public void testCreateCourseSuccess() throws Exception {
CourseDTO courseDTO = new CourseDTO();
courseDTO.setTitle("Spring Boot Basics");
courseDTO.setCategory("Programming");
String mockToken = mockTokenGenerate();
courseDTO.setDescription("Learn Spring Boot step by step");
mockMvc.perform(MockMvcRequestBuilders.post("/api/courses/create")
.header("Authorization", "Bearer " + mockToken) // Add the mock token
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(courseDTO)))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.jsonPath("$.title").value("Spring Boot Basics"))
.andExpect(MockMvcResultMatchers.jsonPath("$.description").value("Learn Spring Boot step by step"))
.andExpect(MockMvcResultMatchers.jsonPath("$.category").value("Programming"))
.andExpect(MockMvcResultMatchers.jsonPath("$.instructor.username").value("Test User"));
}

@Test
public void testCreateCourseUnauthorized() throws Exception {
CourseDTO courseDTO = new CourseDTO();
courseDTO.setTitle("Spring Boot Basics");
courseDTO.setDescription("Learn Spring Boot step by step");
mockMvc.perform(MockMvcRequestBuilders.post("/api/courses/create")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(courseDTO)))
.andExpect(MockMvcResultMatchers.status().isUnauthorized());
}

@Test
public void testUpdateCourseDetailsSuccess() throws Exception {
String mockToken = mockTokenGenerate();
Long courseId = mockCourse(mockToken);

CourseDTO updatedCourseDTO = new CourseDTO();
updatedCourseDTO.setTitle("Updated Course Title");
updatedCourseDTO.setDescription("Updated course description");
updatedCourseDTO.setCategory("Updated Category");
updatedCourseDTO.setRating(4.5f);

mockMvc.perform(MockMvcRequestBuilders.put("/api/courses/" + courseId)
.header("Authorization", "Bearer " + mockToken)
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(updatedCourseDTO)))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.jsonPath("$.title").value("Updated Course Title"))
.andExpect(MockMvcResultMatchers.jsonPath("$.description").value("Updated course description"))
.andExpect(MockMvcResultMatchers.jsonPath("$.category").value("Updated Category"))
.andExpect(MockMvcResultMatchers.jsonPath("$.rating").value(3.0));
}

@Test
public void testUpdateCourseDetailsUnauthorized() throws Exception {
String mockToken = mockTokenGenerate();
Long courseId = mockCourse(mockToken);

CourseDTO updatedCourseDTO = new CourseDTO();
updatedCourseDTO.setTitle("Updated Course Title");
updatedCourseDTO.setDescription("Updated course description");
updatedCourseDTO.setCategory("Updated Category");
updatedCourseDTO.setRating(4.5f);

mockMvc.perform(MockMvcRequestBuilders.put("/api/courses/" + courseId)
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(updatedCourseDTO)))
.andExpect(MockMvcResultMatchers.status().isUnauthorized());
}

@Test
public void testUpdateCourseDetailsNotFound() throws Exception {
String mockToken = mockTokenGenerate();

CourseDTO updatedCourseDTO = new CourseDTO();
updatedCourseDTO.setTitle("Updated Course Title");
updatedCourseDTO.setDescription("Updated course description");
updatedCourseDTO.setCategory("Updated Category");
updatedCourseDTO.setRating(4.5f);

mockMvc.perform(MockMvcRequestBuilders.put("/api/courses/100000")
.header("Authorization", "Bearer " + mockToken)
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(updatedCourseDTO)))
.andExpect(MockMvcResultMatchers.status().isNotFound());
}

@Test
public void testUpdateCourseDetailsNotInstructor() throws Exception {
String mockToken = mockTokenGenerate();
Long courseId = mockCourse(mockToken);

String mockToken2 = mockToken_2();
CourseDTO updatedCourseDTO = new CourseDTO();
updatedCourseDTO.setTitle("Updated Course Title");
updatedCourseDTO.setDescription("Updated course description");
updatedCourseDTO.setCategory("Updated Category");
updatedCourseDTO.setRating(4.5f);

mockMvc.perform(MockMvcRequestBuilders.put("/api/courses/" + courseId)
.header("Authorization", "Bearer " + mockToken2)
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(updatedCourseDTO)))
.andExpect(MockMvcResultMatchers.status().isUnauthorized());
}

@Test
public void testDeleteCourseSuccess() throws Exception {
String mockToken = mockTokenGenerate();
Long courseId = mockCourse(mockToken);

mockMvc.perform(MockMvcRequestBuilders.delete("/api/courses/" + courseId) // Assuming course ID 1 exists
.header("Authorization", "Bearer " + mockToken))
.andExpect(MockMvcResultMatchers.status().isOk());

// Verify the course is deleted
assertFalse(courseRepository.findById(1L).isPresent());

// Verify cascading deletion for associated modules and lessons
assertTrue(moduleRepository.findByCourseId(1L).isEmpty());
}

@Test
public void testDeleteCourseUnauthorized() throws Exception {
String mockToken = mockTokenGenerate();
Long courseId = mockCourse(mockToken);

mockMvc.perform(MockMvcRequestBuilders.delete("/api/courses/" + courseId)) // Assuming course ID 1 exists
.andExpect(MockMvcResultMatchers.status().isUnauthorized());
}

@Test
public void testDeleteCourseNotFound() throws Exception {
String mockToken = mockTokenGenerate();

mockMvc.perform(MockMvcRequestBuilders.delete("/api/courses/100000")
.header("Authorization", "Bearer " + mockToken))
.andExpect(MockMvcResultMatchers.status().isNotFound());
}

@Test
public void testDeleteNotInstructor() throws Exception {
String mockToken = mockTokenGenerate();
Long courseId = mockCourse(mockToken);

String mockToken2 = mockToken_2();
mockMvc.perform(MockMvcRequestBuilders.delete("/api/courses/" + courseId)
.header("Authorization", "Bearer " + mockToken2))
.andExpect(MockMvcResultMatchers.status().isUnauthorized());
}

@Test
public void testFetchCoursesByInstructorSuccess() throws Exception {
// Mocking token and user
String mockToken = mockTokenGenerate();

// Creating and assigning courses to the instructor
Long courseId1 = mockCourse(mockToken);
Long courseId2 = mockCourse(mockToken);

mockMvc.perform(MockMvcRequestBuilders.get("/api/courses/instructor/fetch")
.header("Authorization", "Bearer " + mockToken))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.jsonPath("$").isArray())
.andExpect(MockMvcResultMatchers.jsonPath("$[0].id").value(courseId1))
.andExpect(MockMvcResultMatchers.jsonPath("$[1].id").value(courseId2))
.andExpect(MockMvcResultMatchers.jsonPath("$[0].instructor.username").value("Test User"))
.andExpect(MockMvcResultMatchers.jsonPath("$[1].instructor.username").value("Test User"));
}

@Test
public void testFetchCoursesByInstructorUnauthorized() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/api/courses/instructor/fetch"))
.andExpect(MockMvcResultMatchers.status().isUnauthorized());
}

@Test
public void testFetchCoursesByInstructorNoCourses() throws Exception {
// Mocking token and user
String mockToken = mockTokenGenerate();

mockMvc.perform(MockMvcRequestBuilders.get("/api/courses/instructor/fetch")
.header("Authorization", "Bearer " + mockToken))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.jsonPath("$").isEmpty());
}

}
Loading
Loading