diff --git a/src/test/java/fr/univ_lille/gitlab/classrooms/assignments/grading/AssignmentGradeServiceImplTest.java b/src/test/java/fr/univ_lille/gitlab/classrooms/assignments/grading/AssignmentGradeServiceImplTest.java index 686a67b..c2f4358 100644 --- a/src/test/java/fr/univ_lille/gitlab/classrooms/assignments/grading/AssignmentGradeServiceImplTest.java +++ b/src/test/java/fr/univ_lille/gitlab/classrooms/assignments/grading/AssignmentGradeServiceImplTest.java @@ -3,6 +3,8 @@ package fr.univ_lille.gitlab.classrooms.assignments.grading; import fr.univ_lille.gitlab.classrooms.assignments.StudentExerciseAssignment; import fr.univ_lille.gitlab.classrooms.assignments.grading.junit.JUnitAssignmentGrade; import fr.univ_lille.gitlab.classrooms.assignments.grading.junit.reports.TestReportParser; +import org.assertj.core.data.TemporalOffset; +import org.assertj.core.data.TemporalUnitOffset; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; @@ -13,6 +15,7 @@ import org.springframework.core.io.ClassPathResource; import java.io.IOException; import java.io.InputStream; import java.time.ZonedDateTime; +import java.time.temporal.ChronoUnit; import static org.assertj.core.api.Assertions.*; @@ -64,7 +67,7 @@ class AssignmentGradeServiceImplTest { assertThat(testSuite.getErrors()).isZero(); assertThat(testSuite.getSkipped()).isZero(); - assertThat(studentExerciseAssignment.getSubmissionDate()).isEqualToIgnoringSeconds(ZonedDateTime.now()); + assertThat(studentExerciseAssignment.getSubmissionDate()).isCloseTo(ZonedDateTime.now(), within(10, ChronoUnit.SECONDS)); assertThat(studentExerciseAssignment.getScore()).isEqualTo(10); assertThat(studentExerciseAssignment.getMaxScore()).isEqualTo(10); } @@ -79,7 +82,7 @@ class AssignmentGradeServiceImplTest { assignmentGradeService.gradeAssignmentWithJUnitReport(studentExerciseAssignment, firstReportInputStream); assignmentGradeService.gradeAssignmentWithJUnitReport(studentExerciseAssignment, secondReportInputStream); - assertThat(studentExerciseAssignment.getSubmissionDate()).isEqualToIgnoringSeconds(ZonedDateTime.now()); + assertThat(studentExerciseAssignment.getSubmissionDate()).isCloseTo(ZonedDateTime.now(), within(10, ChronoUnit.SECONDS)); assertThat(studentExerciseAssignment.getScore()).isEqualTo(18); assertThat(studentExerciseAssignment.getMaxScore()).isEqualTo(18); } @@ -113,7 +116,7 @@ class AssignmentGradeServiceImplTest { assertThat(testSuite.getErrors()).isZero(); assertThat(testSuite.getSkipped()).isZero(); - assertThat(studentExerciseAssignment.getSubmissionDate()).isEqualToIgnoringSeconds(ZonedDateTime.now()); + assertThat(studentExerciseAssignment.getSubmissionDate()).isCloseTo(ZonedDateTime.now(), within(10, ChronoUnit.SECONDS)); assertThat(studentExerciseAssignment.getScore()).isEqualTo(1); assertThat(studentExerciseAssignment.getMaxScore()).isEqualTo(2); } -- 2.51.2 From 1cfbd2f2b7844a500ab8c1ae5980f84983386dc0 Mon Sep 17 00:00:00 2001 From: Julien WITTOUCK Date: Wed, 6 Sep 2023 15:55:09 +0200 Subject: [PATCH 2/4] =?UTF-8?q?=F0=9F=94=8A=20:=20add=20more=20logs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../grading/AssignmentGradingController.java | 13 +++++++++++-- .../grading/AssignmentGradingControllerMVCTest.java | 4 ++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/grading/AssignmentGradingController.java b/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/grading/AssignmentGradingController.java index 40451fc..4cdb3e0 100644 --- a/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/grading/AssignmentGradingController.java +++ b/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/grading/AssignmentGradingController.java @@ -15,6 +15,8 @@ import java.security.Principal; @RequestMapping("/api/assignments/") class AssignmentGradingController { + private static final System.Logger LOGGER = System.getLogger(AssignmentGradingController.class.getName()); + private final StudentAssignmentService studentAssignmentService; private final AssignmentGradeService assignmentGradeService; @@ -38,22 +40,29 @@ class AssignmentGradingController { @RequestParam("file") MultipartFile testResultsFile) throws IOException { // this ressource only works with gitlab id token authentication if (!(authenticationPrincipal instanceof JwtAuthenticationToken jwtToken)) { + LOGGER.log(System.Logger.Level.ERROR, "Forbidden access to /api/assignments/submit/junit"); throw new ResponseStatusException(HttpStatus.FORBIDDEN); } // get the gitlab project id from the authentication token if(! jwtToken.getTokenAttributes().containsKey("project_id")){ - throw new ResponseStatusException(HttpStatus.NOT_FOUND); + LOGGER.log(System.Logger.Level.ERROR, "No project_id found in authentication token"); + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "No project_id found in authentication token"); } var gitlabProjectId = Long.parseLong(jwtToken.getTokenAttributes().get("project_id").toString()); // find the associated exercise assignment var exerciseAssignment = this.studentAssignmentService.getByGitlabProjectId(gitlabProjectId) - .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND)); + .orElseThrow(() -> { + var message = "Student Exercise Assignment not found for student '%s', project '%s'".formatted(student.getName(), gitlabProjectId); + LOGGER.log(System.Logger.Level.ERROR, message); + return new ResponseStatusException(HttpStatus.NOT_FOUND, message ); + }); // grade using the test report try { this.assignmentGradeService.gradeAssignmentWithJUnitReport(exerciseAssignment, testResultsFile.getInputStream()); } catch (AssignmentGradingException e) { + LOGGER.log(System.Logger.Level.ERROR, "Error when grading assignment for student '%s', project '%s'".formatted(student.getName(), gitlabProjectId)); throw new ResponseStatusException(500, e.getMessage(), e); } diff --git a/src/test/java/fr/univ_lille/gitlab/classrooms/assignments/grading/AssignmentGradingControllerMVCTest.java b/src/test/java/fr/univ_lille/gitlab/classrooms/assignments/grading/AssignmentGradingControllerMVCTest.java index 8fff8d0..b8a12f3 100644 --- a/src/test/java/fr/univ_lille/gitlab/classrooms/assignments/grading/AssignmentGradingControllerMVCTest.java +++ b/src/test/java/fr/univ_lille/gitlab/classrooms/assignments/grading/AssignmentGradingControllerMVCTest.java @@ -82,7 +82,7 @@ class AssignmentGradingControllerMVCTest { mockMvc.perform( multipart("/api/assignments/submit/junit") .file(mockMultipartFile) - .with(jwt().jwt(builder -> builder.claim("project_id", 12))) + .with(jwt().jwt(builder -> builder.claim("project_id", 12).claim("user_login", "luke.skywalker"))) ) .andExpect(status().is4xxClientError()) .andExpect(status().is(404)); @@ -100,7 +100,7 @@ class AssignmentGradingControllerMVCTest { mockMvc.perform( multipart("/api/assignments/submit/junit") .file(mockMultipartFile) - .with(jwt().jwt(builder -> builder.claim("project_id", 12))) + .with(jwt().jwt(builder -> builder.claim("project_id", 12).claim("user_login", "luke.skywalker"))) ) .andExpect(status().is2xxSuccessful()) .andExpect(status().is(200)); -- 2.51.2 From ff1c96a5ebf1a9d6f21847e13b1fc811fecb0dd4 Mon Sep 17 00:00:00 2001 From: Julien WITTOUCK Date: Wed, 6 Sep 2023 16:09:54 +0200 Subject: [PATCH 3/4] =?UTF-8?q?=E2=9C=A8=20:=20update=20gitlab=20project?= =?UTF-8?q?=20id=20and=20url=20when=20re-accepting=20assignment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit in case the project was re-created --- .../assignments/AssignmentServiceImpl.java | 7 ++++++- .../assignments/AssignmentServiceImplTest.java | 15 +++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/AssignmentServiceImpl.java b/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/AssignmentServiceImpl.java index 6dba271..f223a97 100644 --- a/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/AssignmentServiceImpl.java +++ b/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/AssignmentServiceImpl.java @@ -51,7 +51,12 @@ class AssignmentServiceImpl implements AssignmentService { if (assignment instanceof ExerciseAssignment exerciseAssignment) { // create the project in gitlab var project = gitlab.createStudentProject(exerciseAssignment, student); - if (this.studentAssignmentRepository.existsByAssignmentAndStudent(exerciseAssignment, student)) { + var existingStudentExercise = this.studentAssignmentRepository.findByAssignmentAndStudent(exerciseAssignment, student); + if (existingStudentExercise != null) { + var existingStudentExerciseAssignment = ((StudentExerciseAssignment) existingStudentExercise); + existingStudentExerciseAssignment.setGitlabProjectId(project.getId()); + existingStudentExerciseAssignment.setGitlabProjectUrl(project.getWebUrl()); + this.studentAssignmentRepository.save(existingStudentExerciseAssignment); return; } // create the student exercise assignment diff --git a/src/test/java/fr/univ_lille/gitlab/classrooms/assignments/AssignmentServiceImplTest.java b/src/test/java/fr/univ_lille/gitlab/classrooms/assignments/AssignmentServiceImplTest.java index 4851970..ee0f1cc 100644 --- a/src/test/java/fr/univ_lille/gitlab/classrooms/assignments/AssignmentServiceImplTest.java +++ b/src/test/java/fr/univ_lille/gitlab/classrooms/assignments/AssignmentServiceImplTest.java @@ -112,7 +112,7 @@ class AssignmentServiceImplTest { } @Test - void acceptAssignment_shouldDoNothing_ifExerciseAssignmentIsAlreadyAccepted() throws GitLabApiException, GitLabException { + void acceptAssignment_shouldUpdateGitlabInfo_ifExerciseAssignmentIsAlreadyAccepted() throws GitLabApiException, GitLabException { var teacher = new ClassroomUser(); var classroom = new Classroom(); @@ -126,10 +126,21 @@ class AssignmentServiceImplTest { var student = new ClassroomUser(); student.setName("luke.skywalker"); - when(studentAssignmentRepository.existsByAssignmentAndStudent(assignment, student)).thenReturn(true); + var studentExerciseAssignment = new StudentExerciseAssignment(); + + var project = new Project(); + project.setId(65L); + project.setWebUrl("web_url"); + when(gitlab.createStudentProject(assignment, student)).thenReturn(project); + + when(studentAssignmentRepository.findByAssignmentAndStudent(assignment, student)).thenReturn(studentExerciseAssignment); this.assignmentService.acceptAssigment(assignment, student); + assertThat(studentExerciseAssignment.getGitlabProjectId()).isEqualTo(65L); + assertThat(studentExerciseAssignment.getGitlabProjectUrl()).isEqualTo("web_url"); + + verify(studentAssignmentRepository).save(studentExerciseAssignment); verifyNoMoreInteractions(studentAssignmentRepository); } -- 2.51.2 From 1a039a433d906354e4b7cfc2f3199e9e27b7ed1b Mon Sep 17 00:00:00 2001 From: Julien WITTOUCK Date: Wed, 6 Sep 2023 16:14:41 +0200 Subject: [PATCH 4/4] =?UTF-8?q?=F0=9F=94=96=20:=20version=200.0.10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 10 ++++++++++ pom.xml | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e8a278..c95d2a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog + +## 0.0.10 (2023-09-06) + +### Added + +- ✨ : update gitlab project id and url when re-accepting assignment [ff1c96a] +- 🔊 : add more logs [1cfbd2f] +- ✅ : stabilize temporal tests [40ce037] + + ## 0.0.9 (2023-09-06) diff --git a/pom.xml b/pom.xml index a0bdefa..be517c5 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ fr.univ-lille gitlab-classrooms - 0.0.9 + 0.0.10 gitlab-classrooms GitLab Classroom is a modest clone of GitHub Classroom, aimed at GitLab.