AssessmentController.java

1
package edu.ucsb.cs.scaffold.controller;
2
3
import com.fasterxml.jackson.annotation.JsonProperty;
4
import edu.ucsb.cs.scaffold.entity.Course;
5
import edu.ucsb.cs.scaffold.entity.PlAssessment;
6
import edu.ucsb.cs.scaffold.entity.PlAssessmentQuestion;
7
import edu.ucsb.cs.scaffold.entity.PlColor;
8
import edu.ucsb.cs.scaffold.entity.PlQuestion;
9
import edu.ucsb.cs.scaffold.errors.EntityNotFoundException;
10
import edu.ucsb.cs.scaffold.repository.CourseRepository;
11
import edu.ucsb.cs.scaffold.repository.PlAssessmentQuestionRepository;
12
import edu.ucsb.cs.scaffold.repository.PlAssessmentRepository;
13
import edu.ucsb.cs.scaffold.repository.PlColorRepository;
14
import edu.ucsb.cs.scaffold.repository.PlQuestionRepository;
15
import io.swagger.v3.oas.annotations.Operation;
16
import io.swagger.v3.oas.annotations.Parameter;
17
import io.swagger.v3.oas.annotations.tags.Tag;
18
import java.util.Comparator;
19
import java.util.List;
20
import java.util.Map;
21
import java.util.Objects;
22
import java.util.stream.Collectors;
23
import lombok.RequiredArgsConstructor;
24
import org.springframework.security.access.prepost.PreAuthorize;
25
import org.springframework.web.bind.annotation.GetMapping;
26
import org.springframework.web.bind.annotation.PathVariable;
27
import org.springframework.web.bind.annotation.PutMapping;
28
import org.springframework.web.bind.annotation.RequestParam;
29
import org.springframework.web.bind.annotation.RestController;
30
31
// Serves ConceptGraphPage only (via useBackend, not legacyClient.ts). Assessments/questions come
32
// from the PrairieLearn-synced pl_assessment / pl_assessment_question / pl_question tables,
33
// scoped to the course's associated PlRepo + PlInstance, instead of the old hand-seeded
34
// assessments/questions tables (which now serve only LegacyHomePage via
35
// LegacyAssessmentController at /api/legacy/assessments).
36
@Tag(name = "Assessments")
37
@RestController
38
@RequiredArgsConstructor
39
public class AssessmentController extends ApiController {
40
41
  private final CourseRepository courseRepository;
42
  private final PlAssessmentRepository plAssessmentRepository;
43
  private final PlAssessmentQuestionRepository plAssessmentQuestionRepository;
44
  private final PlQuestionRepository plQuestionRepository;
45
  private final PlColorRepository plColorRepository;
46
47
  @Operation(
48
      summary =
49
          "List the unlocked assessments available for a course's associated PrairieLearn"
50
              + " repo/instance")
51
  @GetMapping("/api/assessments")
52
  public List<AssessmentDTO> getAssessments(
53
      @Parameter(description = "Id of the course") @RequestParam Long courseId) {
54
    Course course = courseRepository.findById(courseId).orElse(null);
55 3 1. getAssessments : negated conditional → KILLED
2. getAssessments : negated conditional → KILLED
3. getAssessments : negated conditional → KILLED
    if (course == null || course.getPlRepoId() == null || course.getPlInstanceId() == null) {
56
      // No PrairieLearn repo/instance associated with this course yet (or the course doesn't
57
      // exist): the menu shows no assessments rather than erroring.
58
      return List.of();
59
    }
60
61
    Map<String, String> colorHexByName = loadColorHexByName();
62 1 1. getAssessments : replaced return value with Collections.emptyList for edu/ucsb/cs/scaffold/controller/AssessmentController::getAssessments → KILLED
    return plAssessmentRepository
63
        .findByPlRepoIdAndPlInstanceId(course.getPlRepoId(), course.getPlInstanceId())
64
        .stream()
65 2 1. lambda$getAssessments$0 : negated conditional → KILLED
2. lambda$getAssessments$0 : replaced boolean return with true for edu/ucsb/cs/scaffold/controller/AssessmentController::lambda$getAssessments$0 → KILLED
        .filter(a -> !a.isLocked())
66
        .sorted(
67
            Comparator.comparing(
68
                    PlAssessment::getPlAssessmentOrder,
69
                    Comparator.nullsLast(Comparator.naturalOrder()))
70
                .thenComparing(PlAssessment::getName))
71 1 1. lambda$getAssessments$1 : replaced return value with null for edu/ucsb/cs/scaffold/controller/AssessmentController::lambda$getAssessments$1 → KILLED
        .map(a -> toAssessmentDTO(a, colorHexByName))
72
        .toList();
73
  }
74
75
  @Operation(
76
      summary =
77
          "List all assessments (locked and unlocked) for a course, for instructor management")
78
  @PreAuthorize("@CourseSecurity.hasInstructorPermissions(#root, #courseId)")
79
  @GetMapping("/api/assessments/all")
80
  public List<AssessmentManagementDTO> getAllAssessments(
81
      @Parameter(description = "Id of the course") @RequestParam Long courseId) {
82
    Course course =
83
        courseRepository
84
            .findById(courseId)
85 1 1. lambda$getAllAssessments$2 : replaced return value with null for edu/ucsb/cs/scaffold/controller/AssessmentController::lambda$getAllAssessments$2 → KILLED
            .orElseThrow(() -> new EntityNotFoundException(Course.class, courseId));
86 2 1. getAllAssessments : negated conditional → KILLED
2. getAllAssessments : negated conditional → KILLED
    if (course.getPlRepoId() == null || course.getPlInstanceId() == null) {
87
      // No PrairieLearn repo/instance associated with this course yet: a normal,
88
      // not-yet-configured state, not an error. The modal shows no assessments to manage.
89
      return List.of();
90
    }
91
92
    Map<String, String> colorHexByName = loadColorHexByName();
93 1 1. getAllAssessments : replaced return value with Collections.emptyList for edu/ucsb/cs/scaffold/controller/AssessmentController::getAllAssessments → KILLED
    return plAssessmentRepository
94
        .findByPlRepoIdAndPlInstanceId(course.getPlRepoId(), course.getPlInstanceId())
95
        .stream()
96
        .sorted(
97
            Comparator.comparing(
98
                    PlAssessment::getPlAssessmentOrder,
99
                    Comparator.nullsLast(Comparator.naturalOrder()))
100
                .thenComparing(PlAssessment::getName))
101 1 1. lambda$getAllAssessments$3 : replaced return value with null for edu/ucsb/cs/scaffold/controller/AssessmentController::lambda$getAllAssessments$3 → KILLED
        .map(a -> toAssessmentManagementDTO(a, colorHexByName))
102
        .toList();
103
  }
104
105
  @Operation(summary = "Lock or unlock an assessment so it is hidden from or shown to students")
106
  @PreAuthorize("@CourseSecurity.hasInstructorPermissions(#root, #courseId)")
107
  @PutMapping("/api/assessments/lock")
108
  public AssessmentManagementDTO setLocked(
109
      @Parameter(description = "Id of the course") @RequestParam Long courseId,
110
      @Parameter(description = "Id of the PlAssessment") @RequestParam Long assessmentId,
111
      @Parameter(description = "true to lock (hide), false to unlock (show)") @RequestParam
112
          boolean locked) {
113
    Course course =
114
        courseRepository
115
            .findById(courseId)
116 1 1. lambda$setLocked$4 : replaced return value with null for edu/ucsb/cs/scaffold/controller/AssessmentController::lambda$setLocked$4 → KILLED
            .orElseThrow(() -> new EntityNotFoundException(Course.class, courseId));
117
    PlAssessment assessment =
118
        plAssessmentRepository
119
            .findById(assessmentId)
120 1 1. lambda$setLocked$5 : replaced return value with null for edu/ucsb/cs/scaffold/controller/AssessmentController::lambda$setLocked$5 → KILLED
            .orElseThrow(() -> new EntityNotFoundException(PlAssessment.class, assessmentId));
121
122 1 1. setLocked : negated conditional → KILLED
    if (!Objects.equals(assessment.getPlRepoId(), course.getPlRepoId())
123 1 1. setLocked : negated conditional → KILLED
        || !Objects.equals(assessment.getPlInstanceId(), course.getPlInstanceId())) {
124
      throw new IllegalArgumentException(
125
          "assessmentId %d belongs to a different course".formatted(assessmentId));
126
    }
127
128 1 1. setLocked : removed call to edu/ucsb/cs/scaffold/entity/PlAssessment::setLocked → KILLED
    assessment.setLocked(locked);
129
    plAssessmentRepository.save(assessment);
130 1 1. setLocked : replaced return value with null for edu/ucsb/cs/scaffold/controller/AssessmentController::setLocked → KILLED
    return toAssessmentManagementDTO(assessment, loadColorHexByName());
131
  }
132
133
  @Operation(
134
      summary = "List questions for an assessment, in the order they appear in the assessment")
135
  @GetMapping("/api/assessments/{assessmentId}/questions")
136
  public List<QuestionDTO> getQuestions(
137
      @Parameter(description = "Id of the PlAssessment") @PathVariable Long assessmentId) {
138
    List<PlAssessmentQuestion> joinRows =
139
        plAssessmentQuestionRepository.findByPlAssessmentIdOrderByOrdinalAsc(assessmentId);
140 1 1. getQuestions : negated conditional → KILLED
    if (joinRows.isEmpty()) {
141
      return List.of();
142
    }
143
144
    Map<Long, PlQuestion> questionsById =
145
        plQuestionRepository
146
            .findAllById(joinRows.stream().map(PlAssessmentQuestion::getPlQuestionId).toList())
147
            .stream()
148 1 1. lambda$getQuestions$6 : replaced return value with null for edu/ucsb/cs/scaffold/controller/AssessmentController::lambda$getQuestions$6 → KILLED
            .collect(Collectors.toMap(PlQuestion::getId, q -> q));
149
150 1 1. getQuestions : replaced return value with Collections.emptyList for edu/ucsb/cs/scaffold/controller/AssessmentController::getQuestions → KILLED
    return joinRows.stream()
151 1 1. lambda$getQuestions$7 : replaced return value with null for edu/ucsb/cs/scaffold/controller/AssessmentController::lambda$getQuestions$7 → KILLED
        .map(join -> questionsById.get(join.getPlQuestionId()))
152
        .filter(Objects::nonNull)
153 1 1. lambda$getQuestions$8 : replaced return value with null for edu/ucsb/cs/scaffold/controller/AssessmentController::lambda$getQuestions$8 → KILLED
        .map(q -> toQuestionDTO(q, assessmentId))
154
        .toList();
155
  }
156
157
  private static AssessmentDTO toAssessmentDTO(PlAssessment a, Map<String, String> colorHexByName) {
158 1 1. toAssessmentDTO : replaced return value with null for edu/ucsb/cs/scaffold/controller/AssessmentController::toAssessmentDTO → KILLED
    return new AssessmentDTO(
159
        String.valueOf(a.getId()),
160 1 1. toAssessmentDTO : negated conditional → KILLED
        a.getPlAssessmentId() != null ? String.valueOf(a.getPlAssessmentId()) : null,
161
        assessmentLabel(a),
162
        a.getPlAssessmentSetAbbreviation(),
163
        a.getPlAssessmentNumber(),
164
        resolveColorHex(a.getPlAssessmentSetColor(), colorHexByName));
165
  }
166
167
  private static AssessmentManagementDTO toAssessmentManagementDTO(
168
      PlAssessment a, Map<String, String> colorHexByName) {
169 1 1. toAssessmentManagementDTO : replaced return value with null for edu/ucsb/cs/scaffold/controller/AssessmentController::toAssessmentManagementDTO → KILLED
    return new AssessmentManagementDTO(
170
        String.valueOf(a.getId()),
171
        assessmentLabel(a),
172
        a.isLocked(),
173
        a.getPlAssessmentSetAbbreviation(),
174
        a.getPlAssessmentNumber(),
175
        resolveColorHex(a.getPlAssessmentSetColor(), colorHexByName));
176
  }
177
178
  private static String assessmentLabel(PlAssessment a) {
179 2 1. assessmentLabel : replaced return value with "" for edu/ucsb/cs/scaffold/controller/AssessmentController::assessmentLabel → KILLED
2. assessmentLabel : negated conditional → KILLED
    return a.getPlAssessmentTitle() != null ? a.getPlAssessmentTitle() : a.getName();
180
  }
181
182
  // Loads the pl_color name -> hex code map (populated by ReadPLColorsJob, issue #96) so that
183
  // pl_assessment_set_color (a PrairieLearn color name like "gray1") can be translated into a hex
184
  // code the frontend can use directly as a CSS background color.
185
  private Map<String, String> loadColorHexByName() {
186 1 1. loadColorHexByName : replaced return value with Collections.emptyMap for edu/ucsb/cs/scaffold/controller/AssessmentController::loadColorHexByName → KILLED
    return plColorRepository.findAll().stream()
187
        .collect(Collectors.toMap(PlColor::getColorName, PlColor::getHexCode));
188
  }
189
190
  // Translates a PrairieLearn color name (e.g. "gray1") into its hex code via the pl_color table.
191
  // Returns null if the color name is null/blank or not found (e.g. before ReadPLColorsJob has
192
  // been run), so the frontend can fall back to a default badge color.
193
  private static String resolveColorHex(String colorName, Map<String, String> colorHexByName) {
194 2 1. resolveColorHex : negated conditional → KILLED
2. resolveColorHex : negated conditional → KILLED
    if (colorName == null || colorName.isBlank()) {
195 1 1. resolveColorHex : replaced return value with "" for edu/ucsb/cs/scaffold/controller/AssessmentController::resolveColorHex → KILLED
      return null;
196
    }
197 1 1. resolveColorHex : replaced return value with "" for edu/ucsb/cs/scaffold/controller/AssessmentController::resolveColorHex → KILLED
    return colorHexByName.get(colorName);
198
  }
199
200
  private static QuestionDTO toQuestionDTO(PlQuestion q, Long assessmentId) {
201 1 1. toQuestionDTO : replaced return value with null for edu/ucsb/cs/scaffold/controller/AssessmentController::toQuestionDTO → KILLED
    return new QuestionDTO(
202
        String.valueOf(q.getId()),
203
        String.valueOf(assessmentId),
204
        q.getUuid().toString(),
205
        q.getTitle());
206
  }
207
208
  public record AssessmentDTO(
209
      String id,
210
      @JsonProperty("pl_assessment_id") String plAssessmentId,
211
      String name,
212
      @JsonProperty("pl_assessment_set_abbreviation") String plAssessmentSetAbbreviation,
213
      @JsonProperty("pl_assessment_number") String plAssessmentNumber,
214
      @JsonProperty("pl_assessment_set_color") String plAssessmentSetColor) {}
215
216
  public record AssessmentManagementDTO(
217
      String id,
218
      String name,
219
      boolean locked,
220
      @JsonProperty("pl_assessment_set_abbreviation") String plAssessmentSetAbbreviation,
221
      @JsonProperty("pl_assessment_number") String plAssessmentNumber,
222
      @JsonProperty("pl_assessment_set_color") String plAssessmentSetColor) {}
223
224
  public record QuestionDTO(
225
      String id,
226
      @JsonProperty("assessment_id") String assessmentId,
227
      @JsonProperty("pl_question_uuid") String plQuestionUuid,
228
      String title) {}
229
}

Mutations

55

1.1
Location : getAssessments
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:getAssessments_maps_and_orders_by_pl_assessment_order_then_name_and_excludes_locked()]
negated conditional → KILLED

2.2
Location : getAssessments
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:getAssessments_returns_empty_list_when_course_not_found()]
negated conditional → KILLED

3.3
Location : getAssessments
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:getAssessments_maps_and_orders_by_pl_assessment_order_then_name_and_excludes_locked()]
negated conditional → KILLED

62

1.1
Location : getAssessments
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:getAssessments_maps_and_orders_by_pl_assessment_order_then_name_and_excludes_locked()]
replaced return value with Collections.emptyList for edu/ucsb/cs/scaffold/controller/AssessmentController::getAssessments → KILLED

65

1.1
Location : lambda$getAssessments$0
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:getAssessments_maps_and_orders_by_pl_assessment_order_then_name_and_excludes_locked()]
negated conditional → KILLED

2.2
Location : lambda$getAssessments$0
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:getAssessments_maps_and_orders_by_pl_assessment_order_then_name_and_excludes_locked()]
replaced boolean return with true for edu/ucsb/cs/scaffold/controller/AssessmentController::lambda$getAssessments$0 → KILLED

71

1.1
Location : lambda$getAssessments$1
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:getAssessments_maps_and_orders_by_pl_assessment_order_then_name_and_excludes_locked()]
replaced return value with null for edu/ucsb/cs/scaffold/controller/AssessmentController::lambda$getAssessments$1 → KILLED

85

1.1
Location : lambda$getAllAssessments$2
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:getAllAssessments_returns_404_when_course_not_found()]
replaced return value with null for edu/ucsb/cs/scaffold/controller/AssessmentController::lambda$getAllAssessments$2 → KILLED

86

1.1
Location : getAllAssessments
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:getAllAssessments_returns_both_locked_and_unlocked_assessments()]
negated conditional → KILLED

2.2
Location : getAllAssessments
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:getAllAssessments_returns_both_locked_and_unlocked_assessments()]
negated conditional → KILLED

93

1.1
Location : getAllAssessments
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:getAllAssessments_returns_both_locked_and_unlocked_assessments()]
replaced return value with Collections.emptyList for edu/ucsb/cs/scaffold/controller/AssessmentController::getAllAssessments → KILLED

101

1.1
Location : lambda$getAllAssessments$3
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:getAllAssessments_returns_both_locked_and_unlocked_assessments()]
replaced return value with null for edu/ucsb/cs/scaffold/controller/AssessmentController::lambda$getAllAssessments$3 → KILLED

116

1.1
Location : lambda$setLocked$4
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:setLocked_returns_404_when_course_not_found()]
replaced return value with null for edu/ucsb/cs/scaffold/controller/AssessmentController::lambda$setLocked$4 → KILLED

120

1.1
Location : lambda$setLocked$5
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:setLocked_returns_404_when_assessment_not_found()]
replaced return value with null for edu/ucsb/cs/scaffold/controller/AssessmentController::lambda$setLocked$5 → KILLED

122

1.1
Location : setLocked
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:setLocked_can_lock_an_assessment()]
negated conditional → KILLED

123

1.1
Location : setLocked
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:setLocked_returns_400_when_only_pl_instance_id_differs()]
negated conditional → KILLED

128

1.1
Location : setLocked
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:setLocked_can_lock_an_assessment()]
removed call to edu/ucsb/cs/scaffold/entity/PlAssessment::setLocked → KILLED

130

1.1
Location : setLocked
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:setLocked_can_lock_an_assessment()]
replaced return value with null for edu/ucsb/cs/scaffold/controller/AssessmentController::setLocked → KILLED

140

1.1
Location : getQuestions
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:getQuestions_returns_questions_in_ordinal_order_and_skips_orphaned_join_rows()]
negated conditional → KILLED

148

1.1
Location : lambda$getQuestions$6
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:getQuestions_returns_questions_in_ordinal_order_and_skips_orphaned_join_rows()]
replaced return value with null for edu/ucsb/cs/scaffold/controller/AssessmentController::lambda$getQuestions$6 → KILLED

150

1.1
Location : getQuestions
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:getQuestions_returns_questions_in_ordinal_order_and_skips_orphaned_join_rows()]
replaced return value with Collections.emptyList for edu/ucsb/cs/scaffold/controller/AssessmentController::getQuestions → KILLED

151

1.1
Location : lambda$getQuestions$7
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:getQuestions_returns_questions_in_ordinal_order_and_skips_orphaned_join_rows()]
replaced return value with null for edu/ucsb/cs/scaffold/controller/AssessmentController::lambda$getQuestions$7 → KILLED

153

1.1
Location : lambda$getQuestions$8
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:getQuestions_returns_questions_in_ordinal_order_and_skips_orphaned_join_rows()]
replaced return value with null for edu/ucsb/cs/scaffold/controller/AssessmentController::lambda$getQuestions$8 → KILLED

158

1.1
Location : toAssessmentDTO
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:getAssessments_maps_and_orders_by_pl_assessment_order_then_name_and_excludes_locked()]
replaced return value with null for edu/ucsb/cs/scaffold/controller/AssessmentController::toAssessmentDTO → KILLED

160

1.1
Location : toAssessmentDTO
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:getAssessments_maps_and_orders_by_pl_assessment_order_then_name_and_excludes_locked()]
negated conditional → KILLED

169

1.1
Location : toAssessmentManagementDTO
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:setLocked_can_lock_an_assessment()]
replaced return value with null for edu/ucsb/cs/scaffold/controller/AssessmentController::toAssessmentManagementDTO → KILLED

179

1.1
Location : assessmentLabel
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:setLocked_can_lock_an_assessment()]
replaced return value with "" for edu/ucsb/cs/scaffold/controller/AssessmentController::assessmentLabel → KILLED

2.2
Location : assessmentLabel
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:setLocked_can_lock_an_assessment()]
negated conditional → KILLED

186

1.1
Location : loadColorHexByName
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:getAllAssessments_returns_both_locked_and_unlocked_assessments()]
replaced return value with Collections.emptyMap for edu/ucsb/cs/scaffold/controller/AssessmentController::loadColorHexByName → KILLED

194

1.1
Location : resolveColorHex
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:getAllAssessments_returns_both_locked_and_unlocked_assessments()]
negated conditional → KILLED

2.2
Location : resolveColorHex
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:getAllAssessments_returns_both_locked_and_unlocked_assessments()]
negated conditional → KILLED

195

1.1
Location : resolveColorHex
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:setLocked_can_lock_an_assessment()]
replaced return value with "" for edu/ucsb/cs/scaffold/controller/AssessmentController::resolveColorHex → KILLED

197

1.1
Location : resolveColorHex
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:getAllAssessments_returns_both_locked_and_unlocked_assessments()]
replaced return value with "" for edu/ucsb/cs/scaffold/controller/AssessmentController::resolveColorHex → KILLED

201

1.1
Location : toQuestionDTO
Killed by : edu.ucsb.cs.scaffold.controller.AssessmentControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs.scaffold.controller.AssessmentControllerTests]/[method:getQuestions_returns_questions_in_ordinal_order_and_skips_orphaned_join_rows()]
replaced return value with null for edu/ucsb/cs/scaffold/controller/AssessmentController::toQuestionDTO → KILLED

Active mutators

Tests examined


Report generated by PIT 1.17.0