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.GradeBook; 006import org.junit.jupiter.api.BeforeEach; 007import org.junit.jupiter.api.Test; 008import org.mockito.ArgumentCaptor; 009 010import java.time.LocalDateTime; 011import java.util.Arrays; 012 013import static org.hamcrest.MatcherAssert.assertThat; 014import static org.hamcrest.Matchers.*; 015import static org.mockito.Mockito.*; 016 017public class POAAssignmentsPresenterTest extends POASubmissionTestCase { 018 019 private POAAssignmentsView view; 020 private GradeBook book; 021 private Assignment assignment0; 022 private Assignment assignment1; 023 private Assignment assignment2; 024 025 @Override 026 @BeforeEach 027 public void setUp() { 028 super.setUp(); 029 030 this.view = mock(POAAssignmentsView.class); 031 032 new POAAssignmentsPresenter(this.bus, this.view); 033 034 book = new GradeBook("Test Grade Book"); 035 assignment0 = new Assignment("POA 0", 1.0).setType(Assignment.AssignmentType.POA); 036 book.addAssignment(assignment0); 037 assignment1 = new Assignment("POA 1", 1.0).setType(Assignment.AssignmentType.POA); 038 book.addAssignment(assignment1); 039 assignment2 = new Assignment("POA 2", 1.0).setType(Assignment.AssignmentType.POA); 040 book.addAssignment(assignment2); 041 book.addAssignment(new Assignment("Quiz 0", 3.0).setType(Assignment.AssignmentType.QUIZ)); 042 } 043 044 @Test 045 public void assignmentListPopulatedInViewWhenGradeBookLoaded() { 046 this.bus.post(new GradeBookLoaded(book)); 047 048 verify(this.view).setAssignments(Arrays.asList("POA 0", "POA 1", "POA 2")); 049 verify(this.view).setSelectedAssignment(0); 050 } 051 052 @Test 053 public void assignmentSelectedFireWhenAssignmentSelectedInView() { 054 ArgumentCaptor<POAAssignmentsView.AssignmentSelectedHandler> viewHandler = ArgumentCaptor.forClass(POAAssignmentsView.AssignmentSelectedHandler.class); 055 verify(this.view).addAssignmentSelectedHandler(viewHandler.capture()); 056 057 AssignmentSelectedEventHandler eventHandler = mock(AssignmentSelectedEventHandler.class); 058 this.bus.register(eventHandler); 059 060 this.bus.post(new GradeBookLoaded(book)); 061 062 viewHandler.getValue().assignmentSelected(1); 063 064 ArgumentCaptor<AssignmentSelectedEvent> event = ArgumentCaptor.forClass(AssignmentSelectedEvent.class); 065 verify(eventHandler).handle(event.capture()); 066 067 assertThat(event.getValue().getAssignment(), equalTo(assignment1)); 068 } 069 070 private interface AssignmentSelectedEventHandler { 071 @Subscribe 072 void handle(AssignmentSelectedEvent event); 073 } 074 075 @Test 076 public void initiallySelectAssignmentWhoseDueDateHasMostRecentlyPassed() { 077 assignment0.setDueDate(LocalDateTime.now().minusDays(3)); 078 assignment1.setDueDate(LocalDateTime.now().minusDays(2)); 079 assignment2.setDueDate(LocalDateTime.now().plusDays(2)); 080 081 this.bus.post(new GradeBookLoaded(book)); 082 083 verify(this.view).setSelectedAssignment(1); 084 } 085 086 087 @Test 088 public void selectAssignmentWhenPOASubmittedWithAssignmentNumberInSubject() { 089 AssignmentSelectedEventHandler eventHandler = mock(AssignmentSelectedEventHandler.class); 090 this.bus.register(eventHandler); 091 092 this.bus.post(new GradeBookLoaded(book)); 093 094 POASubmission submission = createPOASubmission("POA for Project 2", "me", LocalDateTime.now()); 095 this.bus.post(new POASubmissionSelected(submission)); 096 097 verify(this.view).setSelectedAssignment(2); 098 099 ArgumentCaptor<AssignmentSelectedEvent> event = ArgumentCaptor.forClass(AssignmentSelectedEvent.class); 100 verify(eventHandler).handle(event.capture()); 101 102 assertThat(event.getValue().getAssignment(), equalTo(assignment2)); 103 } 104 105 @Test 106 public void testFindNumbersInString() { 107 assertThat(POAAssignmentsPresenter.findNumbersInString("POA for Project 1"), hasItem("1")); 108 assertThat(POAAssignmentsPresenter.findNumbersInString("Project 5 POA"), hasItem("5")); 109 assertThat(POAAssignmentsPresenter.findNumbersInString("POA for Project 42"), hasItem("42")); 110 assertThat(POAAssignmentsPresenter.findNumbersInString("3 for Project 42"), hasItems("3", "42")); 111 } 112 113 @Test 114 public void populateDueDateInViewWhenGradeBookLoaded() { 115 assignment0.setDueDate(LocalDateTime.now().minusDays(3)); 116 assignment1.setDueDate(LocalDateTime.now().minusDays(2)); 117 assignment2.setDueDate(LocalDateTime.now().plusDays(2)); 118 119 this.bus.post(new GradeBookLoaded(book)); 120 121 verify(this.view).setSelectedAssignmentDueDate(POAAssignmentsPresenter.formatDueDate(assignment1)); 122 } 123 124 @Test 125 public void populateDueDateInViewWhenAssignmentSelected() { 126 assignment0.setDueDate(LocalDateTime.now().minusDays(2)); 127 assignment1.setDueDate(LocalDateTime.now().minusDays(3)); 128 129 ArgumentCaptor<POAAssignmentsView.AssignmentSelectedHandler> viewHandler = ArgumentCaptor.forClass(POAAssignmentsView.AssignmentSelectedHandler.class); 130 verify(this.view).addAssignmentSelectedHandler(viewHandler.capture()); 131 132 AssignmentSelectedEventHandler eventHandler = mock(AssignmentSelectedEventHandler.class); 133 this.bus.register(eventHandler); 134 135 this.bus.post(new GradeBookLoaded(book)); 136 verify(this.view).setSelectedAssignmentDueDate(POAAssignmentsPresenter.formatDueDate(assignment0)); 137 138 viewHandler.getValue().assignmentSelected(1); 139 140 verify(this.view).setSelectedAssignmentDueDate(POAAssignmentsPresenter.formatDueDate(assignment1)); 141 } 142 143 @Test 144 public void clearDueDateInViewWhenAssignmentHasNoDueDate() { 145 assignment0.setDueDate(LocalDateTime.now().minusDays(2)); 146 assignment1.setDueDate(null); 147 148 ArgumentCaptor<POAAssignmentsView.AssignmentSelectedHandler> viewHandler = ArgumentCaptor.forClass(POAAssignmentsView.AssignmentSelectedHandler.class); 149 verify(this.view).addAssignmentSelectedHandler(viewHandler.capture()); 150 151 AssignmentSelectedEventHandler eventHandler = mock(AssignmentSelectedEventHandler.class); 152 this.bus.register(eventHandler); 153 154 this.bus.post(new GradeBookLoaded(book)); 155 verify(this.view).setSelectedAssignmentDueDate(POAAssignmentsPresenter.formatDueDate(assignment0)); 156 157 viewHandler.getValue().assignmentSelected(1); 158 159 verify(this.view).setSelectedAssignmentDueDate(""); 160 } 161 162 @Test 163 public void noAssignmentSelectedWhenGradeBookHasNoPOAAssignments() { 164 this.bus.post(new GradeBookLoaded(new GradeBook("No POA assignments"))); 165 166 verify(this.view, never()).setAssignments(anyList()); 167 verify(this.view, never()).setSelectedAssignment(anyInt()); 168 verify(this.view, never()).setSelectedAssignmentDueDate(any()); 169 } 170 171}