001package edu.pdx.cs.joy.grader.canvas;
002
003import org.junit.jupiter.api.Test;
004
005import java.io.IOException;
006import java.io.InputStreamReader;
007import java.util.List;
008import java.util.Objects;
009import java.util.Optional;
010
011import static org.hamcrest.MatcherAssert.assertThat;
012import static org.hamcrest.Matchers.*;
013
014public class CanvasGradesCSVParserTest {
015
016  @Test
017  void canCreateAssignmentFromText() {
018    String assignmentText = "Name (123)";
019    GradesFromCanvas.CanvasAssignment assignment = CanvasGradesCSVParser.createAssignment(assignmentText);
020    assertThat(assignment.getName(), equalTo("Name"));
021    assertThat(assignment.getId(), equalTo(123));
022  }
023
024  @Test
025  void canCreateAssignmentFromMultiWordText() {
026    String assignmentText = "Two Names (123)";
027    GradesFromCanvas.CanvasAssignment assignment = CanvasGradesCSVParser.createAssignment(assignmentText);
028    assertThat(assignment.getName(), equalTo("Two Names"));
029    assertThat(assignment.getId(), equalTo(123));
030  }
031
032  @Test
033  void canReadAssignmentsFromCSV() throws IOException {
034    CanvasGradesCSVParser parser = createParserFromResource();
035    List<GradesFromCanvas.CanvasAssignment> assignments = parser.getAssignments();
036
037    GradesFromCanvas.CanvasAssignment endOfTermSurvey = getAssignment(assignments, "End of Term Survey");
038    assertThat(endOfTermSurvey.getId(), equalTo(897970));
039    assertThat(endOfTermSurvey.getPointsPossible(), equalTo(3.00));
040
041    GradesFromCanvas.CanvasAssignment midtermSurvey = getAssignment(assignments, "Midterm Survey");
042    assertThat(midtermSurvey.getId(), equalTo(897968));
043    assertThat(midtermSurvey.getPointsPossible(), equalTo(3.00));
044
045    GradesFromCanvas.CanvasAssignment project1POA = getAssignment(assignments, "Project 1 POA");
046    assertThat(project1POA.getId(), equalTo(897974));
047    assertThat(project1POA.getPointsPossible(), equalTo(1.00));
048  }
049
050  private CanvasGradesCSVParser createParserFromResource() throws IOException {
051    return new CanvasGradesCSVParser(new InputStreamReader(Objects.requireNonNull(getClass().getResourceAsStream("canvas.csv"))));
052  }
053
054  @Test
055  void canReadStudentsFromCSV() throws IOException {
056    CanvasGradesCSVParser parser = createParserFromResource();
057    List<GradesFromCanvas.CanvasStudent> students = parser.getGrades().getStudents();
058    assertThat(students.get(0).getFirstName(), equalTo("First1"));
059    assertThat(students.get(0).getLastName(), equalTo("Last1"));
060    assertThat(students.get(0).getLoginId(), equalTo("student1"));
061    assertThat(students.get(0).getCanvasId(), equalTo("11111"));
062    assertThat(students.get(0).getSection(), equalTo("CS-410P-021: TOP: Joy Coding Java & Android"));
063    assertThat(students.get(1).getFirstName(), equalTo("First2"));
064    assertThat(students.get(1).getLastName(), equalTo("Last2"));
065    assertThat(students.get(1).getLoginId(), equalTo("student2"));
066    assertThat(students.get(1).getCanvasId(), equalTo("22222"));
067    assertThat(students.get(1).getSection(), equalTo("CS-510-045: TOP: Joy Coding Java & Android"));
068  }
069
070  @Test
071  void testStudentIsNotReadFromCSV() throws IOException {
072    CanvasGradesCSVParser parser = createParserFromResource();
073    List<GradesFromCanvas.CanvasStudent> students = parser.getGrades().getStudents();
074    assertThat(students, hasSize(2));
075  }
076
077  @Test
078  void canReadGradesFromCSV() throws IOException {
079    CanvasGradesCSVParser parser = createParserFromResource();
080    List<GradesFromCanvas.CanvasAssignment> assignments = parser.getAssignments();
081    List<GradesFromCanvas.CanvasStudent> students = parser.getGrades().getStudents();
082
083    GradesFromCanvas.CanvasAssignment quiz1 = getAssignment(assignments, "Quiz 1: Source Code Management with GitHub");
084    assertThat(students.get(0).getScore(quiz1), equalTo(3.00));
085    assertThat(students.get(1).getScore(quiz1), equalTo(2.85));
086
087    GradesFromCanvas.CanvasAssignment quiz2 = getAssignment(assignments, "Quiz 3: Unit Testing and Test-Driven Development");
088    assertThat(students.get(0).getScore(quiz2), nullValue());
089    assertThat(students.get(1).getScore(quiz2), equalTo(2.80));
090  }
091
092  private GradesFromCanvas.CanvasAssignment getAssignment(List<GradesFromCanvas.CanvasAssignment> assignments, String assignmentName) {
093    Optional<GradesFromCanvas.CanvasAssignment> optional = assignments.stream().filter(assignment -> assignment.getName().equals(assignmentName)).findFirst();
094    return optional.orElseThrow(() -> new IllegalStateException("Can't find assignment \"" + assignmentName + "\""));
095  }
096}