CourseController.java

1
package edu.ucsb.cs156.happiercows.controllers;
2
3
import edu.ucsb.cs156.happiercows.entities.Course;
4
import edu.ucsb.cs156.happiercows.enums.School;
5
import edu.ucsb.cs156.happiercows.errors.EntityNotFoundException;
6
import edu.ucsb.cs156.happiercows.models.CourseDTO;
7
import edu.ucsb.cs156.happiercows.repositories.CourseRepository;
8
import io.swagger.v3.oas.annotations.tags.Tag;
9
import io.swagger.v3.oas.annotations.Operation;
10
import io.swagger.v3.oas.annotations.Parameter;
11
import lombok.extern.slf4j.Slf4j;
12
import org.springframework.beans.factory.annotation.Autowired;
13
import org.springframework.security.access.prepost.PreAuthorize;
14
import org.springframework.web.bind.annotation.*;
15
16
import java.util.Arrays;
17
import java.util.List;
18
import java.util.stream.Collectors;
19
20
@Slf4j
21
@Tag(name = "Course")
22
@RequestMapping("/api/course")
23
@RestController
24
public class CourseController extends ApiController {
25
    @Autowired
26
    private CourseRepository courseRepository;
27
28
    /**
29
     * This method returns a list of all courses.
30
     * 
31
     * @return a list of all courses
32
     */
33
    @Operation(summary = "List all courses")
34
    @PreAuthorize("hasRole('ROLE_USER')")
35
    @GetMapping("/all")
36
    public Iterable<Course> allOrganisations() {
37
        Iterable<Course> courses = courseRepository.findAll();
38 1 1. allOrganisations : replaced return value with Collections.emptyList for edu/ucsb/cs156/happiercows/controllers/CourseController::allOrganisations → KILLED
        return courses;
39
    }
40
41
    /**
42
     * The schools offered in the Course create/edit dropdown. Only "active"
43
     * schools are returned; see {@link School} for schools kept in the
44
     * codebase as examples but not yet offered to users.
45
     *
46
     * @return the list of active schools
47
     */
48
    @Operation(summary = "List the schools available for a course")
49
    @PreAuthorize("hasRole('ROLE_USER')")
50
    @GetMapping("/schools")
51
    public List<School> getActiveSchools() {
52 1 1. getActiveSchools : replaced return value with Collections.emptyList for edu/ucsb/cs156/happiercows/controllers/CourseController::getActiveSchools → KILLED
        return Arrays.stream(School.values())
53
                .filter(School::isActive)
54
                .collect(Collectors.toList());
55
    }
56
57
    @Operation(summary = "Get a course by id")
58
    @PreAuthorize("hasRole('ROLE_ADMIN')")
59
    @GetMapping("/{id}")
60
    public Course getCourseById(
61
            @Parameter(name = "id") @PathVariable Long id) {
62
        Course course = courseRepository.findById(id)
63 1 1. lambda$getCourseById$0 : replaced return value with null for edu/ucsb/cs156/happiercows/controllers/CourseController::lambda$getCourseById$0 → KILLED
                .orElseThrow(() -> new EntityNotFoundException(Course.class, id));
64 1 1. getCourseById : replaced return value with null for edu/ucsb/cs156/happiercows/controllers/CourseController::getCourseById → KILLED
        return course;
65
    }
66
67
    @Operation(summary = "Create a course")
68
    @PreAuthorize("hasRole('ROLE_ADMIN')")
69
    @PostMapping("")
70
    public Course postCourse(
71
            @Parameter(name = "course") @RequestBody CourseDTO courseDTO) {
72
        Course savedCourse = courseRepository.save(courseDTO.toCourse());
73 1 1. postCourse : replaced return value with null for edu/ucsb/cs156/happiercows/controllers/CourseController::postCourse → KILLED
        return savedCourse;
74
    }
75
76
    @Operation(summary = "Update a single course")
77
    @PreAuthorize("hasRole('ROLE_ADMIN')")
78
    @PutMapping("/{id}")
79
    public Course updateCourse(
80
    	@Parameter(name = "id") @PathVariable Long id, @RequestBody CourseDTO courseDTO) {
81
        Course course = courseRepository.findById(id)
82 1 1. lambda$updateCourse$1 : replaced return value with null for edu/ucsb/cs156/happiercows/controllers/CourseController::lambda$updateCourse$1 → KILLED
                .orElseThrow(() -> new EntityNotFoundException(Course.class, id));
83
    
84 1 1. updateCourse : removed call to edu/ucsb/cs156/happiercows/entities/Course::setCode → KILLED
	course.setCode(courseDTO.getCode());
85 1 1. updateCourse : removed call to edu/ucsb/cs156/happiercows/entities/Course::setName → KILLED
	course.setName(courseDTO.getName());
86 1 1. updateCourse : removed call to edu/ucsb/cs156/happiercows/entities/Course::setTerm → KILLED
	course.setTerm(courseDTO.getTerm());
87 1 1. updateCourse : removed call to edu/ucsb/cs156/happiercows/entities/Course::setSchool → KILLED
	course.setSchool(courseDTO.getSchool());
88
89
	courseRepository.save(course);
90
91 1 1. updateCourse : replaced return value with null for edu/ucsb/cs156/happiercows/controllers/CourseController::updateCourse → KILLED
	return course;
92
	}
93
94
    @Operation(summary = "Delete a single course")
95
    @PreAuthorize("hasRole('ROLE_ADMIN')")
96
    @DeleteMapping("/{id}")
97
    public Object deleteCourse(
98
        @Parameter(name = "id") @PathVariable Long id){
99
	Course course = courseRepository.findById(id)
100 1 1. lambda$deleteCourse$2 : replaced return value with null for edu/ucsb/cs156/happiercows/controllers/CourseController::lambda$deleteCourse$2 → KILLED
                .orElseThrow(() -> new EntityNotFoundException(Course.class, id));
101
102 1 1. deleteCourse : removed call to edu/ucsb/cs156/happiercows/repositories/CourseRepository::delete → KILLED
	courseRepository.delete(course);
103 1 1. deleteCourse : replaced return value with null for edu/ucsb/cs156/happiercows/controllers/CourseController::deleteCourse → KILLED
	return genericMessage("Course with id %s deleted".formatted(id));
104
	}
105
}

Mutations

38

1.1
Location : allOrganisations
Killed by : edu.ucsb.cs156.happiercows.controllers.CourseControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.happiercows.controllers.CourseControllerTests]/[method:logged_in_user_can_get_all_courses()]
replaced return value with Collections.emptyList for edu/ucsb/cs156/happiercows/controllers/CourseController::allOrganisations → KILLED

52

1.1
Location : getActiveSchools
Killed by : edu.ucsb.cs156.happiercows.controllers.CourseControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.happiercows.controllers.CourseControllerTests]/[method:logged_in_user_can_get_active_schools()]
replaced return value with Collections.emptyList for edu/ucsb/cs156/happiercows/controllers/CourseController::getActiveSchools → KILLED

63

1.1
Location : lambda$getCourseById$0
Killed by : edu.ucsb.cs156.happiercows.controllers.CourseControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.happiercows.controllers.CourseControllerTests]/[method:admin_cannot_get_course_when_it_does_not_exist()]
replaced return value with null for edu/ucsb/cs156/happiercows/controllers/CourseController::lambda$getCourseById$0 → KILLED

64

1.1
Location : getCourseById
Killed by : edu.ucsb.cs156.happiercows.controllers.CourseControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.happiercows.controllers.CourseControllerTests]/[method:admin_can_get_course_by_id()]
replaced return value with null for edu/ucsb/cs156/happiercows/controllers/CourseController::getCourseById → KILLED

73

1.1
Location : postCourse
Killed by : edu.ucsb.cs156.happiercows.controllers.CourseControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.happiercows.controllers.CourseControllerTests]/[method:admin_can_post_new_course()]
replaced return value with null for edu/ucsb/cs156/happiercows/controllers/CourseController::postCourse → KILLED

82

1.1
Location : lambda$updateCourse$1
Killed by : edu.ucsb.cs156.happiercows.controllers.CourseControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.happiercows.controllers.CourseControllerTests]/[method:admin_cannot_edit_course_that_does_not_exist()]
replaced return value with null for edu/ucsb/cs156/happiercows/controllers/CourseController::lambda$updateCourse$1 → KILLED

84

1.1
Location : updateCourse
Killed by : edu.ucsb.cs156.happiercows.controllers.CourseControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.happiercows.controllers.CourseControllerTests]/[method:admin_can_edit_an_existing_course_school()]
removed call to edu/ucsb/cs156/happiercows/entities/Course::setCode → KILLED

85

1.1
Location : updateCourse
Killed by : edu.ucsb.cs156.happiercows.controllers.CourseControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.happiercows.controllers.CourseControllerTests]/[method:admin_can_edit_an_existing_course_school()]
removed call to edu/ucsb/cs156/happiercows/entities/Course::setName → KILLED

86

1.1
Location : updateCourse
Killed by : edu.ucsb.cs156.happiercows.controllers.CourseControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.happiercows.controllers.CourseControllerTests]/[method:admin_can_edit_an_existing_course_school()]
removed call to edu/ucsb/cs156/happiercows/entities/Course::setTerm → KILLED

87

1.1
Location : updateCourse
Killed by : edu.ucsb.cs156.happiercows.controllers.CourseControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.happiercows.controllers.CourseControllerTests]/[method:admin_can_edit_an_existing_course_school()]
removed call to edu/ucsb/cs156/happiercows/entities/Course::setSchool → KILLED

91

1.1
Location : updateCourse
Killed by : edu.ucsb.cs156.happiercows.controllers.CourseControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.happiercows.controllers.CourseControllerTests]/[method:admin_can_edit_an_existing_course_school()]
replaced return value with null for edu/ucsb/cs156/happiercows/controllers/CourseController::updateCourse → KILLED

100

1.1
Location : lambda$deleteCourse$2
Killed by : edu.ucsb.cs156.happiercows.controllers.CourseControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.happiercows.controllers.CourseControllerTests]/[method:admin_tries_to_delete_non_existant_course_and_gets_right_error_message()]
replaced return value with null for edu/ucsb/cs156/happiercows/controllers/CourseController::lambda$deleteCourse$2 → KILLED

102

1.1
Location : deleteCourse
Killed by : edu.ucsb.cs156.happiercows.controllers.CourseControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.happiercows.controllers.CourseControllerTests]/[method:admin_can_delete_a_course()]
removed call to edu/ucsb/cs156/happiercows/repositories/CourseRepository::delete → KILLED

103

1.1
Location : deleteCourse
Killed by : edu.ucsb.cs156.happiercows.controllers.CourseControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.happiercows.controllers.CourseControllerTests]/[method:admin_can_delete_a_course()]
replaced return value with null for edu/ucsb/cs156/happiercows/controllers/CourseController::deleteCourse → KILLED

Active mutators

Tests examined


Report generated by PIT 1.17.0