package edu.pdx.cs410J.grader.poa; import com.google.common.eventbus.Subscribe; import edu.pdx.cs410J.ParserException; import edu.pdx.cs410J.grader.*; import org.junit.Test; import org.mockito.ArgumentCaptor; import java.io.File; import java.io.IOException; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.any; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.equalTo; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; public class GradeBookFileManagerTest extends EventBusTestCase { @Override public void setUp() { super.setUp(); new GradeBookFileManager(this.bus); } @Test public void gradeBookLoadedOnLoadGradeBookEvent() throws IOException { String gradeBookName = "Test Grade Book"; File file = writeGradeBookToFile(gradeBookName); GradeBookLoadedHandler handler = mock(GradeBookLoadedHandler.class); this.bus.register(handler); this.bus.post(new LoadGradeBook(file)); ArgumentCaptor<GradeBookLoaded> event = ArgumentCaptor.forClass(GradeBookLoaded.class); verify(handler).handle(event.capture()); assertThat(event.getValue().getGradeBook().getClassName(), equalTo(gradeBookName)); } protected File writeGradeBookToFile(String gradeBookName) throws IOException { File file = File.createTempFile("testGradeBook", "xml"); GradeBook book = new GradeBook(gradeBookName); XmlDumper dumper = new XmlDumper(file); dumper.dump(book); return file; } private interface GradeBookLoadedHandler { @Subscribe void handle(GradeBookLoaded event); } @Test public void unhandledExceptionEventPublishedWhenLoadingBadGradeBook() throws IOException { File badFile = File.createTempFile("badGradeBook", "xml"); UnhandledExceptionEventHandler handler = mock(UnhandledExceptionEventHandler.class); this.bus.register(handler); this.unhandledExceptionHandler = this::doNotFailTestWhenUnhandledExceptionEncountered; this.bus.post(new LoadGradeBook(badFile)); ArgumentCaptor<UnhandledExceptionEvent> event = ArgumentCaptor.forClass(UnhandledExceptionEvent.class); verify(handler).handle(event.capture()); assertThat(event.getValue().getUnhandledException(), any(Throwable.class)); } private interface UnhandledExceptionEventHandler { @Subscribe void handle(UnhandledExceptionEvent event); } @Test public void gradeBookSavedToFileOnSaveGradeBookEvent() throws IOException, ParserException { String gradeBookName = "Test Grade Book"; File file = writeGradeBookToFile(gradeBookName); GradeBookLoadedHandler handler = mock(GradeBookLoadedHandler.class); this.bus.register(handler); this.bus.post(new LoadGradeBook(file)); ArgumentCaptor<GradeBookLoaded> event = ArgumentCaptor.forClass(GradeBookLoaded.class); verify(handler).handle(event.capture()); GradeBook book = event.getValue().getGradeBook(); Assignment poa = new Assignment("poa", 1.0); book.addAssignment(poa); this.bus.post(new SaveGradeBook(book)); book = readGradeBookFromFile(file); assertThat(book.getAssignmentNames(), contains(poa.getName())); } private GradeBook readGradeBookFromFile(File file) throws IOException, ParserException { XmlGradeBookParser parser = new XmlGradeBookParser(file); return parser.parse(); } }