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}