package edu.pdx.cs410J.grader.poa; import com.google.common.eventbus.Subscribe; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import java.time.LocalDateTime; import java.util.Arrays; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.notNullValue; import static org.mockito.Mockito.*; public class POASubmissionsPresenterTest extends POASubmissionTestCase { private POASubmissionsView view; @Override @Before public void setUp() { super.setUp(); view = mock(POASubmissionsView.class); new POASubmissionsPresenter(bus, view); } @Test public void poaSubmissionDownloadedEventPopulatesPOASubmissionView() { String subject = "POA for Project 1"; String submitter = "Test Student"; LocalDateTime submitTime = LocalDateTime.now(); POASubmission submission = createPOASubmission(subject, submitter, submitTime); bus.post(submission); verify(view).setPOASubmissionsDescriptions(Arrays.asList(subject)); } @Test public void submissionsDescriptionsAreDisplayedInOrderThatEventsWereSent() { String subject1 = "POA for Project 1"; String subject2 = "POA for Project 2"; String submitter = "Test Student"; LocalDateTime submitTime = LocalDateTime.now(); bus.post(createPOASubmission(subject1, submitter, submitTime)); bus.post(createPOASubmission(subject2, submitter, submitTime)); verify(view).setPOASubmissionsDescriptions(Arrays.asList(subject1)); verify(view).setPOASubmissionsDescriptions(Arrays.asList(subject1, subject2)); } @Test public void selectingSubmissionFiresPOASubmissionSelectedEvent() { // Given that there are two POA submissions String subject1 = "POA for Project 1"; String subject2 = "POA for Project 2"; String submitter = "Test Student"; LocalDateTime submitTime = LocalDateTime.now(); POASubmissionSelectedHandler handler = mock(POASubmissionSelectedHandler.class); bus.register(handler); ArgumentCaptor<POASubmissionsView.POASubmissionSelectedListener> listener = ArgumentCaptor.forClass(POASubmissionsView.POASubmissionSelectedListener.class); verify(view).addSubmissionSelectedListener(listener.capture()); bus.post(createPOASubmission(subject1, submitter, submitTime)); POASubmission submission = createPOASubmission(subject2, submitter, submitTime); bus.post(submission); // When the user selects the second POA submission... listener.getValue().submissionSelected(1); // Then a POASubmissionSelected event for that submission is fired ArgumentCaptor<POASubmissionSelected> eventCaptor = ArgumentCaptor.forClass(POASubmissionSelected.class); verify(handler).handle(eventCaptor.capture()); assertThat(eventCaptor.getValue().getSubmission(), equalTo(submission)); verifyNoMoreInteractions(handler); } @Test public void displayNextPOAEventDisplaysNextPOA() { // Given that there are two POA submissions String subject1 = "POA for Project 1"; String subject2 = "POA for Project 2"; String submitter = "Test Student"; LocalDateTime submitTime = LocalDateTime.now(); POASubmissionSelectedHandler handler = mock(POASubmissionSelectedHandler.class); bus.register(handler); ArgumentCaptor<POASubmissionsView.POASubmissionSelectedListener> listener = ArgumentCaptor.forClass(POASubmissionsView.POASubmissionSelectedListener.class); verify(view).addSubmissionSelectedListener(listener.capture()); POASubmission submission1 = createPOASubmission(subject1, submitter, submitTime); bus.post(submission1); POASubmission submission2 = createPOASubmission(subject2, submitter, submitTime); bus.post(submission2); // When a DisplayNextPOAEvent is posted bus.post(new SelectNextPOAEvent()); // Then the View is updated verify(view).selectPOASubmission(1); // Then a POASubmissionSelected event for the second submission is fired ArgumentCaptor<POASubmissionSelected> eventCaptor = ArgumentCaptor.forClass(POASubmissionSelected.class); verify(handler).handle(eventCaptor.capture()); assertThat(eventCaptor.getValue().getSubmission(), equalTo(submission2)); verifyNoMoreInteractions(handler); } @Test public void displayingNextPOAAtEndOfSubmissionListDoesNothing() { // Given that there is only one POA Submission String subject1 = "POA for Project 1"; String submitter = "Test Student"; LocalDateTime submitTime = LocalDateTime.now(); POASubmissionSelectedHandler handler = mock(POASubmissionSelectedHandler.class); bus.register(handler); ArgumentCaptor<POASubmissionsView.POASubmissionSelectedListener> listener = ArgumentCaptor.forClass(POASubmissionsView.POASubmissionSelectedListener.class); verify(view).addSubmissionSelectedListener(listener.capture()); POASubmission submission1 = createPOASubmission(subject1, submitter, submitTime); bus.post(submission1); // When a DisplayNextPOAEvent is posted bus.post(new SelectNextPOAEvent()); // Then nothing happens verify(view, times(0)).selectPOASubmission(anyInt()); verifyNoMoreInteractions(handler); } private interface POASubmissionSelectedHandler { @Subscribe public void handle(POASubmissionSelected selected); } @Test public void downloadSubmissionsInViewFiresDownloadSubmissionsEvent() { ArgumentCaptor<POASubmissionsView.DownloadSubmissionsListener> listener = ArgumentCaptor.forClass(POASubmissionsView.DownloadSubmissionsListener.class); verify(this.view).addDownloadSubmissionsListener(listener.capture()); DownloadSubmissionsHandler handler = mock(DownloadSubmissionsHandler.class); this.bus.register(handler); listener.getValue().downloadSubmissions(); ArgumentCaptor<DownloadPOASubmissionsRequest> event = ArgumentCaptor.forClass(DownloadPOASubmissionsRequest.class); verify(handler).handleDownloadSubmissions(event.capture()); assertThat(event.getValue(), notNullValue()); } public interface DownloadSubmissionsHandler { @Subscribe public void handleDownloadSubmissions(DownloadPOASubmissionsRequest event); } }