001package edu.pdx.cs.joy.grader.poa; 002 003import com.google.common.eventbus.Subscribe; 004import edu.pdx.cs.joy.grader.gradebook.Assignment; 005import edu.pdx.cs.joy.grader.gradebook.Grade; 006import edu.pdx.cs.joy.grader.gradebook.GradeBook; 007import edu.pdx.cs.joy.grader.gradebook.Student; 008import org.junit.jupiter.api.BeforeEach; 009import org.junit.jupiter.api.Test; 010import org.junit.jupiter.api.io.TempDir; 011import org.mockito.ArgumentCaptor; 012 013import java.io.File; 014import java.io.IOException; 015 016import static org.hamcrest.MatcherAssert.assertThat; 017import static org.hamcrest.Matchers.*; 018import static org.mockito.Mockito.mock; 019import static org.mockito.Mockito.verify; 020 021public class GradeBookPresenterTest extends EventBusTestCase { 022 023 private GradeBookView view; 024 025 @Override 026 @BeforeEach 027 public void setUp() { 028 super.setUp(); 029 030 view = mock(GradeBookView.class); 031 new GradeBookPresenter(this.bus, this.view); 032 } 033 034 @Test 035 public void gradeBookNameDisplayedWhenLoaded() { 036 String className = "Test Class"; 037 GradeBook book = new GradeBook(className); 038 bus.post(new GradeBookLoaded(book)); 039 040 verify(view).setGradeBookName(className); 041 } 042 043 @Test 044 public void loadGradeBookEventPublishedWhenFileProvidedByView(@TempDir File tempDir) throws IOException { 045 LoadGradeBookHandler handler = mock(LoadGradeBookHandler.class); 046 bus.register(handler); 047 048 ArgumentCaptor<GradeBookView.FileSelectedListener> listener = ArgumentCaptor.forClass(GradeBookView.FileSelectedListener.class); 049 verify(view).addGradeBookFileListener(listener.capture()); 050 051 File file = new File(tempDir, "testGradeBook.xml"); 052 listener.getValue().fileSelected(file); 053 054 ArgumentCaptor<LoadGradeBook> event = ArgumentCaptor.forClass(LoadGradeBook.class); 055 verify(handler).handle(event.capture()); 056 057 assertThat(event.getValue().getFile(), equalTo(file)); 058 } 059 060 private interface LoadGradeBookHandler { 061 @Subscribe 062 public void handle(LoadGradeBook loadGradeBook); 063 } 064 065 @Test 066 public void gradeBookIsUpdatedOnRecordGradeEventForLateSubmission() { 067 GradeBook book = new GradeBook("Test"); 068 Student student = new Student("studentId"); 069 book.addStudent(student); 070 Assignment poa = new Assignment("poa", 1.0); 071 book.addAssignment(poa); 072 bus.post(new GradeBookLoaded(book)); 073 074 boolean isLate = true; 075 double score = 0.5; 076 this.bus.post(new RecordGradeEvent(score, student, poa, isLate)); 077 078 Grade grade = student.getGrade(poa.getName()); 079 assertThat(grade, notNullValue()); 080 assertThat(grade.getScore(), equalTo(score)); 081 assertThat(student.getLate(), contains(poa.getName())); 082 083 } 084 085 @Test 086 public void gradeBookIsUpdatedOnRecordGradeEventForOnTimeSubmission() { 087 GradeBook book = new GradeBook("Test"); 088 Student student = new Student("studentId"); 089 book.addStudent(student); 090 Assignment poa = new Assignment("poa", 1.0); 091 book.addAssignment(poa); 092 bus.post(new GradeBookLoaded(book)); 093 094 boolean isLate = false; 095 double score = 0.6; 096 this.bus.post(new RecordGradeEvent(score, student, poa, isLate)); 097 098 Grade grade = student.getGrade(poa.getName()); 099 assertThat(grade, notNullValue()); 100 assertThat(grade.getScore(), equalTo(score)); 101 assertThat(student.getLate(), not(contains(poa.getName()))); 102 } 103 104 @Test 105 public void gradeBookIsUpdatedOnRecordGradeEventForExistingGrade() { 106 GradeBook book = new GradeBook("Test"); 107 Student student = new Student("studentId"); 108 book.addStudent(student); 109 Assignment poa = new Assignment("poa", 1.0); 110 book.addAssignment(poa); 111 student.setGrade(poa, 0.9); 112 bus.post(new GradeBookLoaded(book)); 113 114 boolean isLate = false; 115 double newScore = 0.6; 116 this.bus.post(new RecordGradeEvent(newScore, student, poa, isLate)); 117 118 Grade grade = student.getGrade(poa.getName()); 119 assertThat(grade, notNullValue()); 120 assertThat(grade.getScore(), equalTo(newScore)); 121 assertThat(student.getLate(), not(contains(poa.getName()))); 122 } 123 124 @Test 125 public void recordingGradeEnablesSaveGradeBookInView() { 126 GradeBook book = new GradeBook("Test"); 127 Student student = new Student("studentId"); 128 book.addStudent(student); 129 Assignment poa = new Assignment("poa", 1.0); 130 book.addAssignment(poa); 131 student.setGrade(poa, 0.9); 132 bus.post(new GradeBookLoaded(book)); 133 134 verify(view).canSaveGradeBook(false); 135 136 boolean isLate = false; 137 double newScore = 0.6; 138 this.bus.post(new RecordGradeEvent(newScore, student, poa, isLate)); 139 140 verify(view).canSaveGradeBook(true); 141 } 142 143 @Test 144 public void savingGradeBookInViewPublishesSaveGradeBookEvent() throws IOException { 145 ArgumentCaptor<GradeBookView.SaveGradeBookListener> listener = ArgumentCaptor.forClass(GradeBookView.SaveGradeBookListener.class); 146 verify(this.view).addSaveGradeBookListener(listener.capture()); 147 148 GradeBook book = new GradeBook("Test"); 149 Student student = new Student("studentId"); 150 book.addStudent(student); 151 Assignment poa = new Assignment("poa", 1.0); 152 book.addAssignment(poa); 153 student.setGrade(poa, 0.9); 154 bus.post(new GradeBookLoaded(book)); 155 156 SaveGradeBookEventHandler eventHandler = mock(SaveGradeBookEventHandler.class); 157 bus.register(eventHandler); 158 159 listener.getValue().saveGradeBook(); 160 161 ArgumentCaptor<SaveGradeBook> event = ArgumentCaptor.forClass(SaveGradeBook.class); 162 verify(eventHandler).saveGradeBook(event.capture()); 163 164 assertThat(event.getValue().getGradeBook(), equalTo(book)); 165 } 166 167 public interface SaveGradeBookEventHandler { 168 @Subscribe 169 public void saveGradeBook(SaveGradeBook event); 170 } 171}