PushTeamsToGithubJob.java

1
package edu.ucsb.cs156.frontiers.jobs;
2
3
import edu.ucsb.cs156.frontiers.entities.Course;
4
import edu.ucsb.cs156.frontiers.entities.RosterStudent;
5
import edu.ucsb.cs156.frontiers.entities.Team;
6
import edu.ucsb.cs156.frontiers.entities.TeamMember;
7
import edu.ucsb.cs156.frontiers.enums.TeamStatus;
8
import edu.ucsb.cs156.frontiers.repositories.CourseRepository;
9
import edu.ucsb.cs156.frontiers.repositories.TeamMemberRepository;
10
import edu.ucsb.cs156.frontiers.repositories.TeamRepository;
11
import edu.ucsb.cs156.frontiers.services.GithubTeamService;
12
import edu.ucsb.cs156.frontiers.services.jobs.JobContext;
13
import edu.ucsb.cs156.frontiers.services.jobs.JobContextConsumer;
14
import java.util.Optional;
15
import lombok.Builder;
16
17
@Builder
18
public class PushTeamsToGithubJob implements JobContextConsumer {
19
  Long courseId;
20
  CourseRepository courseRepository;
21
  TeamRepository teamRepository;
22
  TeamMemberRepository teamMemberRepository;
23
  GithubTeamService githubTeamService;
24
25
  @Override
26
  public Course getCourse() {
27
    Optional<Course> courseOpt = courseRepository.findById(courseId);
28 1 1. getCourse : replaced return value with null for edu/ucsb/cs156/frontiers/jobs/PushTeamsToGithubJob::getCourse → KILLED
    return courseOpt.orElse(null);
29
  }
30
31
  @Override
32
  public void accept(JobContext ctx) throws Exception {
33
    ctx.log("Starting push teams to GitHub job for course ID: " + courseId);
34
35
    // Get the course
36
    Optional<Course> courseOpt = courseRepository.findById(courseId);
37 1 1. accept : negated conditional → KILLED
    if (courseOpt.isEmpty()) {
38
      ctx.log("ERROR: Course with ID " + courseId + " not found");
39
      return;
40
    }
41
    Course course = courseOpt.get();
42
    ctx.log("Processing course: " + course.getCourseName() + " (org: " + course.getOrgName() + ")");
43
44 2 1. accept : negated conditional → KILLED
2. accept : negated conditional → KILLED
    if (course.getOrgName() == null || course.getInstallationId() == null) {
45
      ctx.log("ERROR: Course has no linked GitHub organization");
46
      return;
47
    }
48
49
    // Get the organization id
50
51
    Integer orgId = null;
52
    try {
53
      orgId = githubTeamService.getOrgId(course.getOrgName(), course);
54
55
    } catch (Exception e) {
56
      ctx.log(
57
          "ERROR: Failed to get organization ID for org: "
58
              + course.getOrgName()
59
              + " - "
60
              + e.getMessage());
61
      return;
62
    }
63
64
    // Get all teams for this course
65
    Iterable<Team> teams = teamRepository.findByCourseId(courseId);
66
67
    // First pass: Create teams on GitHub and update githubTeamId
68
    for (Team team : teams) {
69
      ctx.log("Processing team: " + team.getName());
70
      try {
71
        Integer githubTeamId = githubTeamService.createOrGetTeamId(team, course);
72 1 1. accept : negated conditional → KILLED
        if (!githubTeamId.equals(team.getGithubTeamId())) {
73 1 1. accept : removed call to edu/ucsb/cs156/frontiers/entities/Team::setGithubTeamId → KILLED
          team.setGithubTeamId(githubTeamId);
74
          teamRepository.save(team);
75
          ctx.log("Updated team '" + team.getName() + "' with GitHub team ID: " + githubTeamId);
76
        } else {
77
          ctx.log(
78
              "Team '" + team.getName() + "' already has correct GitHub team ID: " + githubTeamId);
79
        }
80
      } catch (Exception e) {
81
        ctx.log("ERROR: Failed to create/get team '" + team.getName() + "': " + e.getMessage());
82
      }
83
    }
84
85
    // Second pass: Process team members
86
    for (Team team : teams) {
87 1 1. accept : negated conditional → KILLED
      if (team.getGithubTeamId() == null) {
88
        ctx.log("Skipping team members for '" + team.getName() + "' - no GitHub team ID");
89
        continue;
90
      }
91
92
      ctx.log("Processing members for team: " + team.getName());
93
      for (TeamMember teamMember : team.getTeamMembers()) {
94
        RosterStudent student = teamMember.getRosterStudent();
95 1 1. accept : negated conditional → KILLED
        if (student.getGithubLogin() == null) {
96
          // Update status to NO_GITHUB_ID
97 1 1. accept : removed call to edu/ucsb/cs156/frontiers/entities/TeamMember::setTeamStatus → KILLED
          teamMember.setTeamStatus(TeamStatus.NO_GITHUB_ID);
98
          teamMemberRepository.save(teamMember);
99
          ctx.log(
100
              "Student " + student.getEmail() + " has no GitHub login - marked as NO_GITHUB_ID");
101
          continue;
102
        }
103
104
        try {
105
          // Check current status
106
          TeamStatus currentStatus =
107
              githubTeamService.getTeamMembershipStatus(
108
                  student.getGithubLogin(), team.getGithubTeamId(), course);
109
110 2 1. accept : negated conditional → KILLED
2. accept : negated conditional → KILLED
          if (currentStatus == TeamStatus.TEAM_MEMBER
111
              || currentStatus == TeamStatus.TEAM_MAINTAINER) {
112
            // Already a member, just update the status
113 1 1. accept : removed call to edu/ucsb/cs156/frontiers/entities/TeamMember::setTeamStatus → KILLED
            teamMember.setTeamStatus(currentStatus);
114
            teamMemberRepository.save(teamMember);
115
            ctx.log(
116
                "Student " + student.getGithubLogin() + " already has status: " + currentStatus);
117
          } else {
118
            // Add as member
119
            TeamStatus newStatus =
120
                githubTeamService.addMemberToGithubTeam(
121
                    student.getGithubLogin(), team.getGithubTeamId(), "member", course, orgId);
122 1 1. accept : removed call to edu/ucsb/cs156/frontiers/entities/TeamMember::setTeamStatus → KILLED
            teamMember.setTeamStatus(newStatus);
123
            teamMemberRepository.save(teamMember);
124
            ctx.log(
125
                "Added student " + student.getGithubLogin() + " to team with status: " + newStatus);
126
          }
127
        } catch (Exception e) {
128
          ctx.log(
129
              "ERROR: Failed to process team member "
130
                  + student.getGithubLogin()
131
                  + " for team '"
132
                  + team.getName()
133
                  + "': "
134
                  + e.getMessage());
135 1 1. accept : removed call to edu/ucsb/cs156/frontiers/entities/TeamMember::setTeamStatus → KILLED
          teamMember.setTeamStatus(TeamStatus.NOT_ORG_MEMBER);
136
          teamMemberRepository.save(teamMember);
137
        }
138
      }
139
    }
140
141
    ctx.log("Completed push teams to GitHub job for course ID: " + courseId);
142
  }
143
}

Mutations

28

1.1
Location : getCourse
Killed by : edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests]/[method:test_getCourse_returnsCourse_whenFound()]
replaced return value with null for edu/ucsb/cs156/frontiers/jobs/PushTeamsToGithubJob::getCourse → KILLED

37

1.1
Location : accept
Killed by : edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests]/[method:testAccept_CourseNotFound()]
negated conditional → KILLED

44

1.1
Location : accept
Killed by : edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests]/[method:test_Accept_GetOrgIdFailure()]
negated conditional → KILLED

2.2
Location : accept
Killed by : edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests]/[method:testAccept_CourseWithOrgNameButNoInstallationId()]
negated conditional → KILLED

72

1.1
Location : accept
Killed by : edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests]/[method:testAccept_SuccessfulTeamCreationAndMemberProcessing()]
negated conditional → KILLED

73

1.1
Location : accept
Killed by : edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests]/[method:testAccept_SuccessfulTeamCreationAndMemberProcessing()]
removed call to edu/ucsb/cs156/frontiers/entities/Team::setGithubTeamId → KILLED

87

1.1
Location : accept
Killed by : edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests]/[method:testAccept_TeamWithNoGithubTeamId()]
negated conditional → KILLED

95

1.1
Location : accept
Killed by : edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests]/[method:testAccept_ExistingTeamMember()]
negated conditional → KILLED

97

1.1
Location : accept
Killed by : edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests]/[method:testAccept_SuccessfulTeamCreationAndMemberProcessing()]
removed call to edu/ucsb/cs156/frontiers/entities/TeamMember::setTeamStatus → KILLED

110

1.1
Location : accept
Killed by : edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests]/[method:testAccept_ExistingTeamMaintainer()]
negated conditional → KILLED

2.2
Location : accept
Killed by : edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests]/[method:testAccept_ExistingTeamMember()]
negated conditional → KILLED

113

1.1
Location : accept
Killed by : edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests]/[method:testAccept_ExistingTeamMember()]
removed call to edu/ucsb/cs156/frontiers/entities/TeamMember::setTeamStatus → KILLED

122

1.1
Location : accept
Killed by : edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests]/[method:testAccept_SuccessfulTeamCreationAndMemberProcessing()]
removed call to edu/ucsb/cs156/frontiers/entities/TeamMember::setTeamStatus → KILLED

135

1.1
Location : accept
Killed by : edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.jobs.PushTeamsToGithubJobTests]/[method:testAccept_TeamMemberProcessingFailure()]
removed call to edu/ucsb/cs156/frontiers/entities/TeamMember::setTeamStatus → KILLED

Active mutators

Tests examined


Report generated by PIT 1.17.0