001package edu.pdx.cs.joy.grader.poa;
002
003import com.google.common.eventbus.Subscribe;
004import org.junit.jupiter.api.BeforeEach;
005import org.junit.jupiter.api.Test;
006import org.mockito.ArgumentCaptor;
007
008import java.time.LocalDateTime;
009import java.util.Arrays;
010
011import static org.hamcrest.MatcherAssert.assertThat;
012import static org.hamcrest.Matchers.equalTo;
013import static org.hamcrest.Matchers.notNullValue;
014import static org.mockito.Mockito.*;
015
016public class POASubmissionsPresenterTest extends POASubmissionTestCase {
017
018  private POASubmissionsView view;
019
020  @Override
021  @BeforeEach
022  public void setUp() {
023    super.setUp();
024    view = mock(POASubmissionsView.class);
025    new POASubmissionsPresenter(bus, view);
026  }
027
028  @Test
029  public void poaSubmissionDownloadedEventPopulatesPOASubmissionView() {
030    String subject = "POA for Project 1";
031    String submitter = "Test Student";
032    LocalDateTime submitTime = LocalDateTime.now();
033
034    POASubmission submission = createPOASubmission(subject, submitter, submitTime);
035    bus.post(submission);
036
037    verify(view).setPOASubmissionsDescriptions(Arrays.asList(subject));
038  }
039
040  @Test
041  public void submissionsDescriptionsAreDisplayedInOrderThatEventsWereSent() {
042    String subject1 = "POA for Project 1";
043    String subject2 = "POA for Project 2";
044    String submitter = "Test Student";
045    LocalDateTime submitTime = LocalDateTime.now();
046
047    bus.post(createPOASubmission(subject1, submitter, submitTime));
048    bus.post(createPOASubmission(subject2, submitter, submitTime));
049
050    verify(view).setPOASubmissionsDescriptions(Arrays.asList(subject1));
051    verify(view).setPOASubmissionsDescriptions(Arrays.asList(subject1, subject2));
052  }
053
054  @Test
055  public void selectingSubmissionFiresPOASubmissionSelectedEvent() {
056    // Given that there are two POA submissions
057    String subject1 = "POA for Project 1";
058    String subject2 = "POA for Project 2";
059    String submitter = "Test Student";
060    LocalDateTime submitTime = LocalDateTime.now();
061
062    POASubmissionSelectedHandler handler = mock(POASubmissionSelectedHandler.class);
063    bus.register(handler);
064
065    ArgumentCaptor<POASubmissionsView.POASubmissionSelectedListener> listener = ArgumentCaptor.forClass(POASubmissionsView.POASubmissionSelectedListener.class);
066    verify(view).addSubmissionSelectedListener(listener.capture());
067
068    bus.post(createPOASubmission(subject1, submitter, submitTime));
069    POASubmission submission = createPOASubmission(subject2, submitter, submitTime);
070    bus.post(submission);
071
072    // When the user selects the second POA submission...
073    listener.getValue().submissionSelected(1);
074
075    // Then a POASubmissionSelected event for that submission is fired
076
077    ArgumentCaptor<POASubmissionSelected> eventCaptor = ArgumentCaptor.forClass(POASubmissionSelected.class);
078    verify(handler).handle(eventCaptor.capture());
079    assertThat(eventCaptor.getValue().getSubmission(), equalTo(submission));
080
081    verifyNoMoreInteractions(handler);
082  }
083
084  @Test
085  public void displayNextPOAEventDisplaysNextPOA() {
086    // Given that there are two POA submissions
087    String subject1 = "POA for Project 1";
088    String subject2 = "POA for Project 2";
089    String submitter = "Test Student";
090    LocalDateTime submitTime = LocalDateTime.now();
091
092    POASubmissionSelectedHandler handler = mock(POASubmissionSelectedHandler.class);
093    bus.register(handler);
094
095    ArgumentCaptor<POASubmissionsView.POASubmissionSelectedListener> listener = ArgumentCaptor.forClass(POASubmissionsView.POASubmissionSelectedListener.class);
096    verify(view).addSubmissionSelectedListener(listener.capture());
097
098    POASubmission submission1 = createPOASubmission(subject1, submitter, submitTime);
099    bus.post(submission1);
100    POASubmission submission2 = createPOASubmission(subject2, submitter, submitTime);
101    bus.post(submission2);
102
103    // When a DisplayNextPOAEvent is posted
104    bus.post(new SelectNextPOAEvent());
105
106    // Then the View is updated
107    verify(view).selectPOASubmission(1);
108
109    // Then a POASubmissionSelected event for the second submission is fired
110
111    ArgumentCaptor<POASubmissionSelected> eventCaptor = ArgumentCaptor.forClass(POASubmissionSelected.class);
112    verify(handler).handle(eventCaptor.capture());
113    assertThat(eventCaptor.getValue().getSubmission(), equalTo(submission2));
114
115    verifyNoMoreInteractions(handler);
116  }
117
118  @Test
119  public void displayingNextPOAAtEndOfSubmissionListDoesNothing() {
120    // Given that there is only one POA Submission
121    String subject1 = "POA for Project 1";
122    String submitter = "Test Student";
123    LocalDateTime submitTime = LocalDateTime.now();
124
125    POASubmissionSelectedHandler handler = mock(POASubmissionSelectedHandler.class);
126    bus.register(handler);
127
128    ArgumentCaptor<POASubmissionsView.POASubmissionSelectedListener> listener = ArgumentCaptor.forClass(POASubmissionsView.POASubmissionSelectedListener.class);
129    verify(view).addSubmissionSelectedListener(listener.capture());
130
131    POASubmission submission1 = createPOASubmission(subject1, submitter, submitTime);
132    bus.post(submission1);
133
134    // When a DisplayNextPOAEvent is posted
135    bus.post(new SelectNextPOAEvent());
136
137    // Then nothing happens
138    verify(view, times(0)).selectPOASubmission(anyInt());
139
140    verifyNoMoreInteractions(handler);
141  }
142
143  private interface POASubmissionSelectedHandler {
144    @Subscribe
145    public void handle(POASubmissionSelected selected);
146  }
147
148  @Test
149  public void downloadSubmissionsInViewFiresDownloadSubmissionsEvent() {
150    ArgumentCaptor<POASubmissionsView.DownloadSubmissionsListener> listener = ArgumentCaptor.forClass(POASubmissionsView.DownloadSubmissionsListener.class);
151    verify(this.view).addDownloadSubmissionsListener(listener.capture());
152
153    DownloadSubmissionsHandler handler = mock(DownloadSubmissionsHandler.class);
154    this.bus.register(handler);
155
156    listener.getValue().downloadSubmissions();
157
158    ArgumentCaptor<DownloadPOASubmissionsRequest> event = ArgumentCaptor.forClass(DownloadPOASubmissionsRequest.class);
159    verify(handler).handleDownloadSubmissions(event.capture());
160
161    assertThat(event.getValue(), notNullValue());
162  }
163
164  public interface DownloadSubmissionsHandler {
165    @Subscribe
166    public void handleDownloadSubmissions(DownloadPOASubmissionsRequest event);
167  }
168
169}