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}