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}