001package edu.pdx.cs.joy.grader.canvas;
002
003import edu.pdx.cs.joy.grader.gradebook.Assignment;
004import edu.pdx.cs.joy.grader.gradebook.GradeBook;
005import edu.pdx.cs.joy.grader.gradebook.Student;
006import org.junit.jupiter.api.Test;
007
008import java.util.Optional;
009
010import static org.hamcrest.MatcherAssert.assertThat;
011import static org.hamcrest.Matchers.*;
012import static org.junit.jupiter.api.Assertions.assertThrows;
013
014public class GradesFromCanvasTest extends CanvasTestCase {
015
016  @Test
017  public void noStudentInGradebookThatMatchesD2LStudent() {
018    GradesFromCanvas grades = new GradesFromCanvas();
019    GradesFromCanvas.CanvasStudent d2lStudent = createCanvasStudent();
020    grades.addStudent(d2lStudent);
021
022    GradeBook book = new GradeBook("test");
023    Student student = new Student("studentId");
024    student.setCanvasId("notD2LId");
025    book.addStudent(student);
026
027    assertThat(grades.findStudentInGradebookForCanvasStudent(d2lStudent, book).isPresent(), is(false));
028  }
029
030  @Test
031  public void matchStudentByCanvasId() {
032    GradesFromCanvas grades = new GradesFromCanvas();
033    String canvasId = "d2lId";
034    GradesFromCanvas.CanvasStudent d2lStudent = createCanvasStudent("firstName", "lastName", "logId", canvasId);
035    grades.addStudent(d2lStudent);
036
037    GradeBook book = new GradeBook("test");
038    Student student = new Student("studentId");
039    student.setCanvasId(canvasId);
040    book.addStudent(student);
041
042    Optional<Student> found = grades.findStudentInGradebookForCanvasStudent(d2lStudent, book);
043    assertThat(found.isPresent(), equalTo(true));
044    assertThat(found.get(), equalTo(student));
045  }
046
047  @Test
048  public void matchStudentByIdAndCanvasId() {
049    String studentId = "studentId";
050    String canvasId = "canvasId";
051
052    GradesFromCanvas grades = new GradesFromCanvas();
053    GradesFromCanvas.CanvasStudent canvasStudent = createCanvasStudent("First Name", "Last Name", studentId, canvasId);
054    grades.addStudent(canvasStudent);
055
056    GradeBook book = new GradeBook("test");
057    Student student = new Student(studentId);
058    book.addStudent(student);
059
060    assertThat(grades.findStudentInGradebookForCanvasStudent(canvasStudent, book).orElse(null), equalTo(student));
061    assertThat(student.isDirty(), is(true));
062    assertThat(student.getCanvasId(), equalTo(canvasId));
063  }
064
065  @Test
066  public void matchStudentByFirstAndLastName() {
067    String firstName = "firstName";
068    String lastName = "lastName";
069    String canvasId = "canvasId";
070
071    GradesFromCanvas grades = new GradesFromCanvas();
072    GradesFromCanvas.CanvasStudent d2lStudent = createCanvasStudent(firstName, lastName, "loginId", canvasId);
073    grades.addStudent(d2lStudent);
074
075    GradeBook book = new GradeBook("test");
076    Student student = new Student("studentId");
077    student.setFirstName(firstName);
078    student.setLastName(lastName);
079    book.addStudent(student);
080    book.makeClean();
081
082    assertThat(student.getCanvasId(), is(nullValue()));
083    assertThat(student.isDirty(), is(false));
084
085    assertThat(grades.findStudentInGradebookForCanvasStudent(d2lStudent, book).orElse(null), equalTo(student));
086    assertThat(student.getCanvasId(), equalTo(canvasId));
087    assertThat(student.isDirty(), is(true));
088  }
089
090  @Test
091  public void matchStudentByFirstAndLastNameIgnoringCase() {
092    String firstName = "firstName";
093    String lastName = "lastName";
094    String canvasId = "canvasId";
095
096    GradesFromCanvas grades = new GradesFromCanvas();
097    GradesFromCanvas.CanvasStudent d2lStudent = createCanvasStudent(firstName, lastName, "loginId", canvasId);
098    grades.addStudent(d2lStudent);
099
100    GradeBook book = new GradeBook("test");
101    Student student = new Student("studentId");
102    student.setFirstName(firstName.toUpperCase());
103    student.setLastName(lastName.toLowerCase());
104    book.addStudent(student);
105    book.makeClean();
106
107    assertThat(student.getCanvasId(), is(nullValue()));
108    assertThat(student.isDirty(), is(false));
109
110    assertThat(grades.findStudentInGradebookForCanvasStudent(d2lStudent, book).orElse(null), equalTo(student));
111    assertThat(student.getCanvasId(), equalTo(canvasId));
112    assertThat(student.isDirty(), is(true));
113  }
114
115  @Test
116  public void matchStudentByNickAndLastNameIgnoringCase() {
117    String firstName = "firstName";
118    String nickName = "nickName";
119    String lastName = "lastName";
120    String canvasId = "canvasId";
121
122    GradesFromCanvas grades = new GradesFromCanvas();
123    GradesFromCanvas.CanvasStudent d2lStudent = createCanvasStudent(nickName, lastName, "loginId", canvasId);
124    grades.addStudent(d2lStudent);
125
126    GradeBook book = new GradeBook("test");
127    Student student = new Student("studentId");
128    student.setFirstName(firstName.toUpperCase());
129    student.setLastName(lastName.toLowerCase());
130    student.setNickName(nickName.toLowerCase());
131    book.addStudent(student);
132    book.makeClean();
133
134    assertThat(student.getCanvasId(), is(nullValue()));
135    assertThat(student.isDirty(), is(false));
136
137    assertThat(grades.findStudentInGradebookForCanvasStudent(d2lStudent, book).orElse(null), equalTo(student));
138    assertThat(student.getCanvasId(), equalTo(canvasId));
139    assertThat(student.isDirty(), is(true));
140  }
141  @Test
142  public void matchStudentDifferentFirstAndLastNameButSameD2LId() {
143    String canvasId = "canvasId";
144    String firstName = "firstName";
145    String lastName = "lastName";
146
147    GradesFromCanvas grades = new GradesFromCanvas();
148    GradesFromCanvas.CanvasStudent d2lStudent = createCanvasStudent(firstName, lastName, "loginId", canvasId);
149    grades.addStudent(d2lStudent);
150
151    GradeBook book = new GradeBook("test");
152    Student student = new Student("studentId");
153    student.setFirstName(firstName + "2");
154    student.setLastName(lastName + "2");
155    student.setCanvasId(canvasId);
156    book.addStudent(student);
157    book.makeClean();
158
159    assertThat(student.getCanvasId(), equalTo(canvasId));
160    assertThat(student.isDirty(), is(false));
161
162    assertThat(grades.findStudentInGradebookForCanvasStudent(d2lStudent, book).orElse(null), equalTo(student));
163    assertThat(student.getCanvasId(), equalTo(canvasId));
164    assertThat(student.isDirty(), is(false));
165  }
166
167  @Test
168  public void gradeIsSet() {
169    GradesFromCanvas.CanvasStudent student = createCanvasStudent();
170    String quizName = "quizName";
171    GradesFromCanvas.CanvasAssignment quiz = new GradesFromCanvas.CanvasAssignment(quizName, 1234);
172    double score = 3.4;
173    student.setScore(quiz, score);
174
175    assertThat(student.getScore(quiz), equalTo(score));
176  }
177
178  @Test
179  public void matchQuizWithSameName() {
180    String quizName = "quizName";
181
182    GradesFromCanvas grades = new GradesFromCanvas();
183    int canvasId = 1234;
184    GradesFromCanvas.CanvasAssignment quiz = new GradesFromCanvas.CanvasAssignment(quizName, canvasId);
185    GradesFromCanvas.CanvasStudent d2lStudent = createCanvasStudent("first", "last", "loginId", "canvasId");
186    grades.addStudent(d2lStudent);
187    d2lStudent.setScore(quiz, 3.6);
188
189    GradeBook book = new GradeBook("test");
190    Assignment assignment = new Assignment(quizName, 4.0);
191    book.addAssignment(assignment);
192
193    Assignment found = grades.findAssignmentInGradebookForCanvasQuiz(quiz, book).orElseThrow();
194    assertThat(found, equalTo(assignment));
195    assertThat(found.getCanvasId(), equalTo(canvasId));
196  }
197
198  @Test
199  public void matchQuizWithPrefixThatIsTheSameAsQuizNameInD2L() {
200    String quizName = "quizName";
201
202    GradesFromCanvas grades = new GradesFromCanvas();
203    int canvasId = 1234;
204    GradesFromCanvas.CanvasAssignment quiz = new GradesFromCanvas.CanvasAssignment(quizName + " Quiz", canvasId);
205    GradesFromCanvas.CanvasStudent d2lStudent = createCanvasStudent();
206    grades.addStudent(d2lStudent);
207    d2lStudent.setScore(quiz, 3.6);
208
209    GradeBook book = new GradeBook("test");
210    Assignment assignment = new Assignment(quizName, 4.0);
211    book.addAssignment(assignment);
212
213    Assignment found = grades.findAssignmentInGradebookForCanvasQuiz(quiz, book).orElseThrow();
214    assertThat(found, equalTo(assignment));
215    assertThat(found.getCanvasId(), equalTo(canvasId));
216  }
217
218  @Test
219  public void matchQuizWithDescriptionPrefixThatIsTheSameAsQuizNameInD2L() {
220    String quizName = "quizName";
221
222    GradesFromCanvas grades = new GradesFromCanvas();
223    GradesFromCanvas.CanvasStudent d2lStudent = createCanvasStudent();
224    GradesFromCanvas.CanvasAssignment quiz = new GradesFromCanvas.CanvasAssignment(quizName + " Quiz", 1234);
225    grades.addStudent(d2lStudent);
226    d2lStudent.setScore(quiz, 3.6);
227
228    GradeBook book = new GradeBook("test");
229    Assignment assignment = new Assignment("quiz0", 4.0);
230    assignment.setDescription(quizName);
231    book.addAssignment(assignment);
232
233    assertThat(grades.findAssignmentInGradebookForCanvasQuiz(quiz, book).orElse(null), equalTo(assignment));
234
235  }
236
237  @Test
238  void matchQuizWithDescriptionThatIsContainedInQuizNameInCanvas() {
239    String quizDescription = "Quiz Description";
240
241    GradesFromCanvas grades = new GradesFromCanvas();
242    GradesFromCanvas.CanvasStudent d2lStudent = createCanvasStudent();
243    grades.addStudent(d2lStudent);
244    String canvasQuizName = "Quiz 1: " + quizDescription + " (12345)";
245    GradesFromCanvas.CanvasAssignment quiz = new GradesFromCanvas.CanvasAssignment(canvasQuizName, 12345);
246    d2lStudent.setScore(quiz, 3.6);
247
248    GradeBook book = new GradeBook("test");
249    Assignment assignment = new Assignment("quiz1", 4.0);
250    assignment.setDescription(quizDescription);
251    book.addAssignment(assignment);
252
253    assertThat(grades.findAssignmentInGradebookForCanvasQuiz(quiz, book).orElse(null), equalTo(assignment));
254
255  }
256
257  @Test
258  void undergradSectionIsSetFromCanvasGrades() {
259    String firstName = "firstName";
260    String lastName = "lastName";
261    String section = "Section";
262
263    GradesFromCanvas grades = new GradesFromCanvas();
264    GradesFromCanvas.CanvasStudent canvasStudent = createCanvasStudent(firstName, lastName, "loginId", "canvasId", section);
265    grades.addStudent(canvasStudent);
266
267    GradeBook book = new GradeBook("test");
268    Student student = new Student("studentId");
269    student.setFirstName(firstName);
270    student.setLastName(lastName);
271    student.setEnrolledSection(Student.Section.UNDERGRADUATE);
272    book.addStudent(student);
273
274    assertThat(grades.findStudentInGradebookForCanvasStudent(canvasStudent, book).orElse(null), equalTo(student));
275    assertThat(student.getCanvasId(), equalTo("canvasId"));
276    assertThat(book.getSectionName(Student.Section.UNDERGRADUATE), equalTo(section));
277  }
278
279//  @Test
280//  void assignmentCanvasIdIsSetFromCanvasGrades() {
281//    String quizName = "quizName";
282//    int quizId = 4567;
283//
284//    GradesFromCanvas grades = new GradesFromCanvas();
285//    CanvasStudent canvasStudent = createCanvasStudent("first", "last", "loginId", "canvasId");
286//    grades.addStudent(canvasStudent);
287//    canvasStudent.setScore(quizName, 3.6);
288//
289//    CanvasAssignment canvasAssignment = new CanvasAssignment(quizName, quizId);
290//    grades.addAssignment(canvasAssignment);
291//
292//    GradeBook book = new GradeBook("test");
293//    Assignment assignment = new Assignment(quizName, 4.0);
294//    book.addAssignment(assignment);
295//
296//    assertThat(grades.findAssignmentInGradebookForCanvasQuiz(quizName, book).orElse(null), equalTo(assignment));
297//    assertThat(book.getAssignment(quizName).getCanvasId(), equalTo(quizId));
298//  }
299
300  @Test
301  void ambiguousCanvasAssignmentNameThrowsIllegalStateException() {
302    GradeBook gradebook = new GradeBook("test");
303    String quizName = "restquiz";
304    Assignment quiz = new Assignment(quizName, 3.0).setType(Assignment.AssignmentType.QUIZ).setDescription("Web and REST");
305    gradebook.addAssignment(quiz);
306
307    String projectName = "Project5";
308    Assignment project = new Assignment(projectName, 10.0).setType(Assignment.AssignmentType.PROJECT).setDescription("REST");
309    gradebook.addAssignment(project);
310
311    String assignmentInCanvas = "Quiz 5: Web and REST";
312    GradesFromCanvas.CanvasAssignment canvasAssignment = new GradesFromCanvas.CanvasAssignment(assignmentInCanvas, 12345);
313
314    GradesFromCanvas canvas = new GradesFromCanvas();
315    IllegalStateException ex =
316      assertThrows(IllegalStateException.class, () -> canvas.findAssignmentInGradebookForCanvasQuiz(canvasAssignment, gradebook));
317    String message = ex.getMessage();
318    assertThat(message, containsString(quizName));
319    assertThat(message, containsString(projectName));
320  }
321
322
323}