From ba3a8fd913cee7a7cf541b11aaea5a91b3482f3c Mon Sep 17 00:00:00 2001 From: Julien WITTOUCK Date: Fri, 4 Aug 2023 17:56:30 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20:=20add=20quiz=20results=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../quiz/QuizEditionController.java | 11 +++ .../gitlab/classrooms/quiz/QuizResult.java | 17 ++++ .../classrooms/quiz/QuizScoreRepository.java | 3 + .../classrooms/quiz/QuizScoreService.java | 2 + .../classrooms/quiz/QuizScoreServiceImpl.java | 6 ++ src/main/resources/templates/quiz/list.html | 29 +++++-- .../resources/templates/quiz/results.html | 82 +++++++++++++++++++ .../quiz/QuizEditionControllerMVCTest.java | 28 +++++++ .../classrooms/quiz/QuizResultTest.java | 36 ++++++++ 9 files changed, 206 insertions(+), 8 deletions(-) create mode 100644 src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizResult.java create mode 100644 src/main/resources/templates/quiz/results.html create mode 100644 src/test/java/fr/univ_lille/gitlab/classrooms/quiz/QuizResultTest.java diff --git a/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizEditionController.java b/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizEditionController.java index ea750ad..51355bc 100644 --- a/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizEditionController.java +++ b/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizEditionController.java @@ -51,4 +51,15 @@ public class QuizEditionController { model.addAttribute("successMessage", "Quiz successfully saved"); return QUIZ_EDIT_PAGE; } + + @GetMapping("/{quizId}/results") + public String viewQuizResults(Model model, @PathVariable String quizId) { + var quizEntity = this.quizRepository.findById(quizId).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND)); + model.addAttribute("quiz", quizEntity); + + var quizResult = this.quizScoreService.getQuizResult(quizId); + model.addAttribute("quizResult", quizResult); + + return "quiz/results"; + } } diff --git a/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizResult.java b/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizResult.java new file mode 100644 index 0000000..b67e730 --- /dev/null +++ b/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizResult.java @@ -0,0 +1,17 @@ +package fr.univ_lille.gitlab.classrooms.quiz; + +import java.util.Collection; + +public record QuizResult(Collection quizScores) { + + public double average(){ + return quizScores.stream().mapToLong(it -> it.score) + .average() + .orElse(0); + } + + public long questionCount(){ + return quizScores.stream().findFirst().map(it -> it.maxScore).orElse(0L); + } + +} diff --git a/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizScoreRepository.java b/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizScoreRepository.java index 69c7547..ef73fca 100644 --- a/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizScoreRepository.java +++ b/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizScoreRepository.java @@ -2,5 +2,8 @@ package fr.univ_lille.gitlab.classrooms.quiz; import org.springframework.data.repository.CrudRepository; +import java.util.Collection; + public interface QuizScoreRepository extends CrudRepository { + Collection findByQuizId(String quizId); } diff --git a/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizScoreService.java b/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizScoreService.java index ffa5db6..1932a8f 100644 --- a/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizScoreService.java +++ b/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizScoreService.java @@ -6,4 +6,6 @@ public interface QuizScoreService { void registerScoreForStudent(Quiz quiz, String studentId); Optional getPreviousQuizSubmission(String quizId, String studentId); + + QuizResult getQuizResult(String quizId); } diff --git a/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizScoreServiceImpl.java b/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizScoreServiceImpl.java index d966815..af8de85 100644 --- a/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizScoreServiceImpl.java +++ b/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizScoreServiceImpl.java @@ -28,4 +28,10 @@ class QuizScoreServiceImpl implements QuizScoreService { public Optional getPreviousQuizSubmission(String quizId, String studentId) { return quizScoreRepository.findById(new QuizScoreId(quizId, studentId)); } + + @Override + public QuizResult getQuizResult(String quizId) { + var quizScores = quizScoreRepository.findByQuizId(quizId); + return new QuizResult(quizScores); + } } diff --git a/src/main/resources/templates/quiz/list.html b/src/main/resources/templates/quiz/list.html index ec06636..af46de4 100644 --- a/src/main/resources/templates/quiz/list.html +++ b/src/main/resources/templates/quiz/list.html @@ -37,14 +37,27 @@
- - - - - - - View as a student - + +
diff --git a/src/main/resources/templates/quiz/results.html b/src/main/resources/templates/quiz/results.html new file mode 100644 index 0000000..58e9df6 --- /dev/null +++ b/src/main/resources/templates/quiz/results.html @@ -0,0 +1,82 @@ + + + + + +
+ +
+
+
+

name results.

+

List of all quiz submissions.

+
+
+ + +
+ + + +

No quiz submission found

+
+ +
+
+
+
Total Submissions
+
12
+
+
+
Avg. Score
+
12 / 20
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + +
NameResultDate
+
+
+ + + + +
+
+
Lindsay Walton
+
lindsay.walton@example.com
+
+
+
+
8/10
+
+
date
+
+
+
+
+
+ +
+ + diff --git a/src/test/java/fr/univ_lille/gitlab/classrooms/quiz/QuizEditionControllerMVCTest.java b/src/test/java/fr/univ_lille/gitlab/classrooms/quiz/QuizEditionControllerMVCTest.java index b42f9fa..7f458da 100644 --- a/src/test/java/fr/univ_lille/gitlab/classrooms/quiz/QuizEditionControllerMVCTest.java +++ b/src/test/java/fr/univ_lille/gitlab/classrooms/quiz/QuizEditionControllerMVCTest.java @@ -88,6 +88,27 @@ class QuizEditionControllerMVCTest { .andExpect(status().isOk()); } + @Test + void shouldSeeQuizResults() throws Exception { + var quiz = new QuizEntity(); + quiz.setName("death-star-quiz"); + quiz.setMarkdownContent(""" + # who build the Death Star ? + (x) the Galactic Empire + ( ) Sauron + """); + when(quizRepository.findById("death-star-quiz")).thenReturn(Optional.of(quiz)); + + + mockMvc.perform(get("/quiz/death-star-quiz/results")) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(view().name("quiz/results")) + .andExpect(model().attributeExists("quiz")) + .andExpect(model().attributeExists("quizResult")) + .andExpect(model().attribute("quiz", hasProperty("name", equalTo("death-star-quiz")))); + } + } @Nested @@ -122,6 +143,13 @@ class QuizEditionControllerMVCTest { .andExpect(status().isForbidden()); } + @Test + void shouldNotSeeQuizResult() throws Exception { + mockMvc.perform(post("/quiz/death-star-quiz/results")) + .andDo(print()) + .andExpect(status().isForbidden()); + } + } } diff --git a/src/test/java/fr/univ_lille/gitlab/classrooms/quiz/QuizResultTest.java b/src/test/java/fr/univ_lille/gitlab/classrooms/quiz/QuizResultTest.java new file mode 100644 index 0000000..b1bb5e9 --- /dev/null +++ b/src/test/java/fr/univ_lille/gitlab/classrooms/quiz/QuizResultTest.java @@ -0,0 +1,36 @@ +package fr.univ_lille.gitlab.classrooms.quiz; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class QuizResultTest { + + @Test + void shouldComputeAverage(){ + var score1 = new QuizScore(); + score1.score = 10L; + + var score2 = new QuizScore(); + score2.score = 0L; + + var result = new QuizResult(List.of(score1, score2)); + + assertThat(result.average()).isEqualTo(5); + } + + @Test + void shouldGiveQuestionCount(){ + var score1 = new QuizScore(); + score1.score = 10L; + score1.maxScore = 20L; + + var result = new QuizResult(List.of(score1)); + + assertThat(result.questionCount()).isEqualTo(20); + } + +} -- 2.51.2