TeamsController.java

1
package edu.ucsb.cs156.frontiers.controllers;
2
3
import com.opencsv.CSVReader;
4
import com.opencsv.exceptions.CsvException;
5
import edu.ucsb.cs156.frontiers.entities.Course;
6
import edu.ucsb.cs156.frontiers.entities.RosterStudent;
7
import edu.ucsb.cs156.frontiers.entities.Team;
8
import edu.ucsb.cs156.frontiers.entities.TeamMember;
9
import edu.ucsb.cs156.frontiers.errors.EntityNotFoundException;
10
import edu.ucsb.cs156.frontiers.repositories.CourseRepository;
11
import edu.ucsb.cs156.frontiers.repositories.RosterStudentRepository;
12
import edu.ucsb.cs156.frontiers.repositories.TeamMemberRepository;
13
import edu.ucsb.cs156.frontiers.repositories.TeamRepository;
14
import io.swagger.v3.oas.annotations.Operation;
15
import io.swagger.v3.oas.annotations.Parameter;
16
import io.swagger.v3.oas.annotations.tags.Tag;
17
import java.io.BufferedInputStream;
18
import java.io.IOException;
19
import java.io.InputStream;
20
import java.io.InputStreamReader;
21
import java.util.*;
22
import lombok.extern.slf4j.Slf4j;
23
import org.springframework.beans.factory.annotation.Autowired;
24
import org.springframework.http.HttpStatus;
25
import org.springframework.security.access.prepost.PreAuthorize;
26
import org.springframework.transaction.annotation.Transactional;
27
import org.springframework.web.bind.annotation.*;
28
import org.springframework.web.multipart.MultipartFile;
29
import org.springframework.web.server.ResponseStatusException;
30
31
@Tag(name = "Teams")
32
@RequestMapping("/api/teams")
33
@RestController
34
@Slf4j
35
public class TeamsController extends ApiController {
36
37
  @Autowired private TeamRepository teamRepository;
38
39
  @Autowired private TeamMemberRepository teamMemberRepository;
40
41
  @Autowired private CourseRepository courseRepository;
42
43
  @Autowired private RosterStudentRepository rosterStudentRepository;
44
45
  public record TeamMemberResult(
46
      TeamMember teamMember, TeamMemberStatus status, String rejectedEmail) {
47
    public TeamMemberResult(TeamMember teamMember, TeamMemberStatus status) {
48
      this(teamMember, status, null);
49
    }
50
51
    public TeamMemberResult(String rejectedEmail) {
52
      this(null, TeamMemberStatus.MISSING, rejectedEmail);
53
    }
54
  }
55
56
  public record TeamCreationResponse(
57
      TeamSourceType typeMatched, Integer created, Integer existing, List<String> rejected) {}
58
59
  public record TeamMemberMapping(
60
      Long teamId,
61
      String teamName,
62
      Long rosterStudentId,
63
      String email,
64
      String firstName,
65
      String lastName,
66
      String githubLogin) {
67
    public static TeamMemberMapping from(TeamMember member) {
68 1 1. from : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController$TeamMemberMapping::from → KILLED
      return new TeamMemberMapping(
69
          member.getTeam().getId(),
70
          member.getTeam().getName(),
71
          member.getRosterStudent().getId(),
72
          member.getRosterStudent().getEmail(),
73
          member.getRosterStudent().getFirstName(),
74
          member.getRosterStudent().getLastName(),
75
          member.getRosterStudent().getGithubLogin());
76
    }
77
  }
78
79
  /**
80
   * This method creates a new Team.
81
   *
82
   * @param name the name of the team
83
   * @param courseId the ID of the course this team belongs to
84
   * @return the created team
85
   */
86
  @Operation(summary = "Create a new team")
87
  @PreAuthorize("@CourseSecurity.hasManagePermissions(#root, #courseId)")
88
  @PostMapping("/post")
89
  public Team postTeam(
90
      @Parameter(name = "name") @RequestParam String name,
91
      @Parameter(name = "courseId") @RequestParam Long courseId) {
92
93
    Course course =
94
        courseRepository
95
            .findById(courseId)
96 1 1. lambda$postTeam$0 : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::lambda$postTeam$0 → KILLED
            .orElseThrow(() -> new EntityNotFoundException(Course.class, courseId));
97
98
    Team team = Team.builder().name(name).course(course).build();
99
100 1 1. postTeam : negated conditional → KILLED
    if (teamRepository.findByCourseIdAndName(course.getId(), name).isPresent()) {
101
      throw new ResponseStatusException(
102
          HttpStatus.CONFLICT, "Team with name %s already exists".formatted(name));
103
    } else {
104
      team = teamRepository.save(team);
105
    }
106
107 1 1. postTeam : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::postTeam → KILLED
    return team;
108
  }
109
110
  /**
111
   * Upload teams in CSV format (team, email) It is important to keep the code in this method
112
   * consistent with the code for adding a single roster student
113
   *
114
   * @param courseId course the teams are for
115
   * @param file csv file with roster student emails and team assignments
116
   * @return Count of students added to teams, already existing, and rejected students
117
   */
118
  @Operation(summary = "Upload team assignments; CSV in format team,email")
119
  @PreAuthorize("@CourseSecurity.hasManagePermissions(#root, #courseId)")
120
  @PostMapping(
121
      value = "/upload/csv",
122
      consumes = {"multipart/form-data"})
123
  public TeamCreationResponse uploadTeamsCsv(
124
      @Parameter(name = "courseId") @RequestParam Long courseId,
125
      @Parameter(name = "file") @RequestParam("file") MultipartFile file)
126
      throws IOException, CsvException {
127
128
    Course course =
129
        courseRepository
130
            .findById(courseId)
131 1 1. lambda$uploadTeamsCsv$1 : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::lambda$uploadTeamsCsv$1 → KILLED
            .orElseThrow(() -> new EntityNotFoundException(Course.class, courseId.toString()));
132
133
    int counts[] = {0, 0};
134
135
    List<String> failed = new ArrayList<>();
136
137
    try (InputStream inputStream = new BufferedInputStream(file.getInputStream());
138
        InputStreamReader reader = new InputStreamReader(inputStream);
139
        CSVReader csvReader = new CSVReader(reader); ) {
140
141
      String[] headers = csvReader.readNext();
142
      TeamSourceType sourceType = getRosterSourceType(headers);
143
      List<String[]> myEntries = csvReader.readAll();
144
      for (String[] row : myEntries) {
145
        TeamMemberResult rowResult = fromCSVRow(row, sourceType, course);
146 1 1. uploadTeamsCsv : negated conditional → KILLED
        if (rowResult.status == TeamMemberStatus.MISSING) {
147
          failed.add(rowResult.rejectedEmail);
148
        } else {
149 1 1. uploadTeamsCsv : Replaced integer addition with subtraction → KILLED
          counts[rowResult.status.ordinal()]++;
150
        }
151
      }
152
      return new TeamCreationResponse(
153
          sourceType,
154
          counts[TeamMemberStatus.CREATED.ordinal()],
155
          counts[TeamMemberStatus.EXISTS.ordinal()],
156
          failed);
157
    }
158
  }
159
160
  /**
161
   * This method returns a list of all teams for a course
162
   *
163
   * @return a list of all teams for a course
164
   */
165
  @Operation(summary = "List all teams")
166
  @PreAuthorize("@CourseSecurity.hasManagePermissions(#root, #courseId)")
167
  @GetMapping("/all")
168
  public Iterable<Team> allTeams(@RequestParam Long courseId) {
169
    Iterable<Team> teams = teamRepository.findByCourseId(courseId);
170 1 1. allTeams : replaced return value with Collections.emptyList for edu/ucsb/cs156/frontiers/controllers/TeamsController::allTeams → KILLED
    return teams;
171
  }
172
173
  /**
174
   * Retrieves a list of mappings between roster students and teams for a given course. Each mapping
175
   * represents a relationship between a team and its members.
176
   *
177
   * @param courseId the unique identifier of the course for which team mappings are retrieved
178
   * @return an iterable collection of {@code TeamMemberMapping} objects representing the mappings
179
   */
180
  @Operation(summary = "List the mapping of Roster Students to Teams")
181
  @PreAuthorize("@CourseSecurity.hasManagePermissions(#root, #courseId)")
182
  @GetMapping("/mapping")
183
  public Iterable<TeamMemberMapping> teamMemberMapping(@RequestParam Long courseId) {
184
    List<Team> teams =
185
        courseRepository
186
            .findById(courseId)
187 1 1. lambda$teamMemberMapping$2 : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::lambda$teamMemberMapping$2 → KILLED
            .orElseThrow(() -> new EntityNotFoundException(Course.class, courseId))
188
            .getTeams();
189
    List<TeamMemberMapping> mappings = new ArrayList<>();
190
    for (Team team : teams) {
191
      for (TeamMember member : team.getTeamMembers()) {
192
        mappings.add(TeamMemberMapping.from(member));
193
      }
194
    }
195 1 1. teamMemberMapping : replaced return value with Collections.emptyList for edu/ucsb/cs156/frontiers/controllers/TeamsController::teamMemberMapping → KILLED
    return mappings;
196
  }
197
198
  /**
199
   * This method returns a single team by its id
200
   *
201
   * @param id the id of the team
202
   * @return the team
203
   */
204
  @Operation(summary = "Get a single team")
205
  @PreAuthorize("@CourseSecurity.hasManagePermissions(#root, #courseId)")
206
  @GetMapping("")
207
  public Team getTeamById(
208
      @Parameter(name = "id") @RequestParam Long id, @RequestParam Long courseId) {
209
    Team team =
210 1 1. lambda$getTeamById$3 : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::lambda$getTeamById$3 → KILLED
        teamRepository.findById(id).orElseThrow(() -> new EntityNotFoundException(Team.class, id));
211 1 1. getTeamById : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::getTeamById → KILLED
    return team;
212
  }
213
214
  /**
215
   * This method deletes a team by its id
216
   *
217
   * @param id the id of the team to delete
218
   * @return a message indicating the team was deleted
219
   */
220
  @Operation(summary = "Delete a team")
221
  @PreAuthorize("@CourseSecurity.hasManagePermissions(#root, #courseId)")
222
  @DeleteMapping("")
223
  @Transactional
224
  public Object deleteTeam(
225
      @Parameter(name = "id") @RequestParam Long id, @RequestParam Long courseId) {
226
    Team team =
227 1 1. lambda$deleteTeam$4 : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::lambda$deleteTeam$4 → KILLED
        teamRepository.findById(id).orElseThrow(() -> new EntityNotFoundException(Team.class, id));
228
229
    // Handle team members that reference this team
230 1 1. deleteTeam : negated conditional → KILLED
    if (!team.getTeamMembers().isEmpty()) {
231
      team.getTeamMembers()
232 1 1. deleteTeam : removed call to java/util/List::forEach → KILLED
          .forEach(
233
              teamMember -> {
234
                // Remove from roster student's team members list
235
                teamMember.getRosterStudent().getTeamMembers().remove(teamMember);
236 1 1. lambda$deleteTeam$5 : removed call to edu/ucsb/cs156/frontiers/entities/TeamMember::setRosterStudent → KILLED
                teamMember.setRosterStudent(null);
237
              });
238
    }
239
240
    // Disconnect from course
241
    team.getCourse().getTeams().remove(team);
242 1 1. deleteTeam : removed call to edu/ucsb/cs156/frontiers/entities/Team::setCourse → KILLED
    team.setCourse(null);
243
244 1 1. deleteTeam : removed call to edu/ucsb/cs156/frontiers/repositories/TeamRepository::delete → KILLED
    teamRepository.delete(team);
245 1 1. deleteTeam : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::deleteTeam → KILLED
    return genericMessage("Team with id %s deleted".formatted(id));
246
  }
247
248
  /**
249
   * This method adds a roster student as a team member
250
   *
251
   * @param teamId the ID of the team
252
   * @param rosterStudentId the ID of the roster student to add
253
   * @return the created team member
254
   */
255
  @Operation(summary = "Add a roster student to a team")
256
  @PreAuthorize("@CourseSecurity.hasManagePermissions(#root, #courseId)")
257
  @PostMapping("/addMember")
258
  public TeamMember addTeamMember(
259
      @Parameter(name = "teamId") @RequestParam Long teamId,
260
      @Parameter(name = "rosterStudentId") @RequestParam Long rosterStudentId,
261
      @Parameter(name = "courseId") @RequestParam Long courseId) {
262
263
    Team team =
264
        teamRepository
265
            .findById(teamId)
266 1 1. lambda$addTeamMember$6 : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::lambda$addTeamMember$6 → KILLED
            .orElseThrow(() -> new EntityNotFoundException(Team.class, teamId));
267
268
    RosterStudent rosterStudent =
269
        rosterStudentRepository
270
            .findById(rosterStudentId)
271 1 1. lambda$addTeamMember$7 : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::lambda$addTeamMember$7 → KILLED
            .orElseThrow(() -> new EntityNotFoundException(RosterStudent.class, rosterStudentId));
272
273 1 1. addTeamMember : negated conditional → KILLED
    if (!team.getCourse().getId().equals(courseId)) {
274
      throw new ResponseStatusException(
275
          HttpStatus.BAD_REQUEST, "Team is not from course %d".formatted(courseId));
276
    }
277 1 1. addTeamMember : negated conditional → KILLED
    if (!rosterStudent.getCourse().getId().equals(courseId)) {
278
      throw new ResponseStatusException(
279
          HttpStatus.BAD_REQUEST, "Roster student is not from course %d".formatted(courseId));
280
    }
281
282 1 1. addTeamMember : negated conditional → KILLED
    if (teamMemberRepository.findByTeamAndRosterStudent(team, rosterStudent).isPresent()) {
283
      throw new ResponseStatusException(
284
          HttpStatus.CONFLICT,
285
          "Team member already exists for team %s and roster student %s"
286
              .formatted(team.getName(), rosterStudent.getEmail()));
287
    }
288
    TeamMember teamMember = TeamMember.builder().team(team).rosterStudent(rosterStudent).build();
289
    TeamMember savedTeamMember = teamMemberRepository.save(teamMember);
290
291 1 1. addTeamMember : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::addTeamMember → KILLED
    return savedTeamMember;
292
  }
293
294
  /**
295
   * This method removes a team member
296
   *
297
   * @param teamMemberId the ID of the team member to remove
298
   * @return a message indicating the team member was removed
299
   */
300
  @Operation(summary = "Remove a team member")
301
  @PreAuthorize("@CourseSecurity.hasManagePermissions(#root, #courseId)")
302
  @DeleteMapping("/removeMember")
303
  @Transactional
304
  public Object removeTeamMember(
305
      @Parameter(name = "teamMemberId") @RequestParam Long teamMemberId,
306
      @Parameter(name = "courseId") @RequestParam Long courseId) {
307
    TeamMember teamMember =
308
        teamMemberRepository
309
            .findById(teamMemberId)
310 1 1. lambda$removeTeamMember$8 : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::lambda$removeTeamMember$8 → KILLED
            .orElseThrow(() -> new EntityNotFoundException(TeamMember.class, teamMemberId));
311
    Team team = teamMember.getTeam();
312
    RosterStudent rosterStudent = teamMember.getRosterStudent();
313
    team.getTeamMembers().remove(teamMember);
314
    rosterStudent.getTeamMembers().remove(teamMember);
315 1 1. removeTeamMember : removed call to edu/ucsb/cs156/frontiers/repositories/TeamMemberRepository::delete → KILLED
    teamMemberRepository.delete(teamMember);
316
    teamRepository.save(team);
317
    rosterStudentRepository.save(rosterStudent);
318 1 1. removeTeamMember : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::removeTeamMember → KILLED
    return genericMessage("Team member with id %s deleted".formatted(teamMemberId));
319
  }
320
321
  public enum TeamSourceType {
322
    SIMPLE,
323
    UNKNOWN
324
  }
325
326
  public enum TeamMemberStatus {
327
    CREATED,
328
    EXISTS,
329
    MISSING
330
  }
331
332
  public static final String SIMPLE_HEADERS = "team,email";
333
334
  public TeamSourceType getRosterSourceType(String[] headers) {
335
336
    Map<TeamSourceType, String[]> sourceTypeToHeaders = new HashMap<>();
337
338
    sourceTypeToHeaders.put(TeamSourceType.SIMPLE, SIMPLE_HEADERS.split(","));
339
340
    for (Map.Entry<TeamSourceType, String[]> entry : sourceTypeToHeaders.entrySet()) {
341
      TeamSourceType type = entry.getKey();
342
      String[] expectedHeaders = entry.getValue();
343 2 1. getRosterSourceType : negated conditional → KILLED
2. getRosterSourceType : changed conditional boundary → KILLED
      if (headers.length >= expectedHeaders.length) {
344
        boolean matches = true;
345 2 1. getRosterSourceType : changed conditional boundary → KILLED
2. getRosterSourceType : negated conditional → KILLED
        for (int i = 0; i < expectedHeaders.length; i++) {
346 1 1. getRosterSourceType : negated conditional → KILLED
          if (!expectedHeaders[i].equalsIgnoreCase(headers[i])) {
347
            matches = false;
348
            break;
349
          }
350
        }
351 1 1. getRosterSourceType : negated conditional → KILLED
        if (matches) {
352 1 1. getRosterSourceType : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::getRosterSourceType → KILLED
          return type;
353
        }
354
      }
355
    }
356
    // If no known type matches, throw
357
    throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Unknown Roster Source Type");
358
  }
359
360
  public TeamMemberResult fromCSVRow(String[] row, TeamSourceType sourceType, Course course) {
361
    // No if statements because this is the only possible value to enter here at the moment. Replace
362
    // with if when more
363
    // Formats are added.
364 1 1. fromCSVRow : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::fromCSVRow → KILLED
    return teamMemberFromSimpleCsv(row, course);
365
  }
366
367
  public TeamMemberResult teamMemberFromSimpleCsv(String[] row, Course course) {
368
    Optional<RosterStudent> student =
369
        rosterStudentRepository.findByCourseIdAndEmail(course.getId(), row[1]);
370
    Optional<Team> team = teamRepository.findByCourseIdAndName(course.getId(), row[0]);
371 2 1. teamMemberFromSimpleCsv : negated conditional → KILLED
2. teamMemberFromSimpleCsv : negated conditional → KILLED
    if (student.isPresent() && team.isPresent()) {
372
      Optional<TeamMember> teamMember =
373
          teamMemberRepository.findByTeamAndRosterStudent(team.get(), student.get());
374 1 1. teamMemberFromSimpleCsv : negated conditional → KILLED
      if (teamMember.isPresent()) {
375 1 1. teamMemberFromSimpleCsv : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::teamMemberFromSimpleCsv → KILLED
        return new TeamMemberResult(teamMember.get(), TeamMemberStatus.EXISTS);
376
      } else {
377
        TeamMember teamMemberToSave =
378
            TeamMember.builder().team(team.get()).rosterStudent(student.get()).build();
379
        TeamMember savedTeamMember = teamMemberRepository.save(teamMemberToSave);
380 1 1. teamMemberFromSimpleCsv : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::teamMemberFromSimpleCsv → KILLED
        return new TeamMemberResult(savedTeamMember, TeamMemberStatus.CREATED);
381
      }
382 1 1. teamMemberFromSimpleCsv : negated conditional → KILLED
    } else if (student.isPresent()) {
383
      Team teamToSave = Team.builder().name(row[0]).course(course).build();
384
      teamRepository.save(teamToSave);
385
      TeamMember saveTeamMember =
386
          TeamMember.builder().team(teamToSave).rosterStudent(student.get()).build();
387
      teamMemberRepository.save(saveTeamMember);
388 1 1. teamMemberFromSimpleCsv : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::teamMemberFromSimpleCsv → KILLED
      return new TeamMemberResult(saveTeamMember, TeamMemberStatus.CREATED);
389
    } else {
390 1 1. teamMemberFromSimpleCsv : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::teamMemberFromSimpleCsv → KILLED
      return new TeamMemberResult(row[1]);
391
    }
392
  }
393
}

Mutations

68

1.1
Location : from
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testTeamMemberMapping_success()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController$TeamMemberMapping::from → KILLED

96

1.1
Location : lambda$postTeam$0
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testPostTeam_courseNotFound()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::lambda$postTeam$0 → KILLED

100

1.1
Location : postTeam
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testPostTeam_not_unique()]
negated conditional → KILLED

107

1.1
Location : postTeam
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testPostTeam_byInstructor()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::postTeam → KILLED

131

1.1
Location : lambda$uploadTeamsCsv$1
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testUploadTeamsCsv_courseNotFound()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::lambda$uploadTeamsCsv$1 → KILLED

146

1.1
Location : uploadTeamsCsv
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testUploadTeamsCsv_success()]
negated conditional → KILLED

149

1.1
Location : uploadTeamsCsv
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testUploadTeamsCsv_success()]
Replaced integer addition with subtraction → KILLED

170

1.1
Location : allTeams
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testAllTeams_ROLE_INSTRUCTOR()]
replaced return value with Collections.emptyList for edu/ucsb/cs156/frontiers/controllers/TeamsController::allTeams → KILLED

187

1.1
Location : lambda$teamMemberMapping$2
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testTeamMemberMapping_courseNotFound()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::lambda$teamMemberMapping$2 → KILLED

195

1.1
Location : teamMemberMapping
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testTeamMemberMapping_success()]
replaced return value with Collections.emptyList for edu/ucsb/cs156/frontiers/controllers/TeamsController::teamMemberMapping → KILLED

210

1.1
Location : lambda$getTeamById$3
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testGetTeamById_teamDoesNotExist()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::lambda$getTeamById$3 → KILLED

211

1.1
Location : getTeamById
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testGetTeamById()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::getTeamById → KILLED

227

1.1
Location : lambda$deleteTeam$4
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testDeleteTeam_teamDoesNotExist()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::lambda$deleteTeam$4 → KILLED

230

1.1
Location : deleteTeam
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testDeleteTeam_success()]
negated conditional → KILLED

232

1.1
Location : deleteTeam
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testDeleteTeam_success()]
removed call to java/util/List::forEach → KILLED

236

1.1
Location : lambda$deleteTeam$5
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testDeleteTeam_success()]
removed call to edu/ucsb/cs156/frontiers/entities/TeamMember::setRosterStudent → KILLED

242

1.1
Location : deleteTeam
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testDeleteTeam_withEmptyTeamMembers()]
removed call to edu/ucsb/cs156/frontiers/entities/Team::setCourse → KILLED

244

1.1
Location : deleteTeam
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testDeleteTeam_withEmptyTeamMembers()]
removed call to edu/ucsb/cs156/frontiers/repositories/TeamRepository::delete → KILLED

245

1.1
Location : deleteTeam
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testDeleteTeam_withEmptyTeamMembers()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::deleteTeam → KILLED

266

1.1
Location : lambda$addTeamMember$6
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testAddTeamMember_teamNotFound()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::lambda$addTeamMember$6 → KILLED

271

1.1
Location : lambda$addTeamMember$7
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testAddTeamMember_rosterStudentNotFound()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::lambda$addTeamMember$7 → KILLED

273

1.1
Location : addTeamMember
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testAddTeamMember_differing_course_team()]
negated conditional → KILLED

277

1.1
Location : addTeamMember
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testAddTeamMember_differing_course_roster_student()]
negated conditional → KILLED

282

1.1
Location : addTeamMember
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testAddTeamMember_alreadyexists()]
negated conditional → KILLED

291

1.1
Location : addTeamMember
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testAddTeamMember_success()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::addTeamMember → KILLED

310

1.1
Location : lambda$removeTeamMember$8
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testRemoveTeamMember_teamMemberDoesNotExist()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::lambda$removeTeamMember$8 → KILLED

315

1.1
Location : removeTeamMember
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testRemoveTeamMember_success()]
removed call to edu/ucsb/cs156/frontiers/repositories/TeamMemberRepository::delete → KILLED

318

1.1
Location : removeTeamMember
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testRemoveTeamMember_success()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::removeTeamMember → KILLED

343

1.1
Location : getRosterSourceType
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testUploadTeamsCsv_unknownSourceType()]
negated conditional → KILLED

2.2
Location : getRosterSourceType
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testUploadTeamsCsv_success()]
changed conditional boundary → KILLED

345

1.1
Location : getRosterSourceType
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testUploadTeamsCsv_success()]
changed conditional boundary → KILLED

2.2
Location : getRosterSourceType
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testUploadTeamsCsv_unknownSourceType_loopfill()]
negated conditional → KILLED

346

1.1
Location : getRosterSourceType
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testUploadTeamsCsv_success()]
negated conditional → KILLED

351

1.1
Location : getRosterSourceType
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testUploadTeamsCsv_unknownSourceType_loopfill()]
negated conditional → KILLED

352

1.1
Location : getRosterSourceType
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testUploadTeamsCsv_success()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::getRosterSourceType → KILLED

364

1.1
Location : fromCSVRow
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testUploadTeamsCsv_success()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::fromCSVRow → KILLED

371

1.1
Location : teamMemberFromSimpleCsv
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testUploadTeamsCsv_success()]
negated conditional → KILLED

2.2
Location : teamMemberFromSimpleCsv
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testUploadTeamsCsv_success()]
negated conditional → KILLED

374

1.1
Location : teamMemberFromSimpleCsv
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testUploadTeamsCsv_success()]
negated conditional → KILLED

375

1.1
Location : teamMemberFromSimpleCsv
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testUploadTeamsCsv_success()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::teamMemberFromSimpleCsv → KILLED

380

1.1
Location : teamMemberFromSimpleCsv
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testUploadTeamsCsv_success()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::teamMemberFromSimpleCsv → KILLED

382

1.1
Location : teamMemberFromSimpleCsv
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testUploadTeamsCsv_success()]
negated conditional → KILLED

388

1.1
Location : teamMemberFromSimpleCsv
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testUploadTeamsCsv_success()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::teamMemberFromSimpleCsv → KILLED

390

1.1
Location : teamMemberFromSimpleCsv
Killed by : edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.TeamsControllerTests]/[method:testUploadTeamsCsv_success()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/TeamsController::teamMemberFromSimpleCsv → KILLED

Active mutators

Tests examined


Report generated by PIT 1.17.0