package edu.pdx.cs410J.grader.poa;
import com.google.common.eventbus.Subscribe;
import edu.pdx.cs410J.grader.GradeBook;
import edu.pdx.cs410J.grader.Student;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import java.time.LocalDateTime;
import java.util.Arrays;
import static edu.pdx.cs410J.grader.poa.StudentsView.SelectStudentHandler;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.mockito.Mockito.*;
public class StudentsPresenterTest extends POASubmissionTestCase {
private StudentsView view;
private GradeBook book;
private Student student0;
private Student student1;
private Student student2;
@Override
public void setUp() {
super.setUp();
this.view = mock(StudentsView.class);
new StudentsPresenter(this.bus, this.view);
this.book = new GradeBook("Test Grade Book");
student0 = new Student("0").setFirstName("First0").setLastName("Last0").setEmail("email0@mail.com");
book.addStudent(student0);
student1 = new Student("1").setFirstName("First1").setLastName("Last1").setEmail("email1@mail.com");
book.addStudent(student1);
student2 = new Student("2").setFirstName("First2").setLastName("Last2").setEmail("email2@mail.com");
book.addStudent(student2);
}
@Test
public void viewIsPopulatedWhenGradeBookLoaded() {
this.bus.post(new GradeBookLoaded(book));
verify(this.view).setStudents(Arrays.asList("<unknown student>", "First0 Last0 <email0@mail.com>", "First1 Last1 <email1@mail.com>", "First2 Last2 <email2@mail.com>"));
}
@Test
public void studentsAreListedInAlphabeticalOrderByLastName() {
GradeBook book = new GradeBook("Test In Alphabetical Order");
book.addStudent(new Student("4").setFirstName("First1").setLastName("Last1").setEmail("email1@mail.com"));
book.addStudent(new Student("3").setFirstName("First3").setLastName("Last3").setEmail("email3@mail.com"));
book.addStudent(new Student("1").setFirstName("First2").setLastName("Last2").setEmail("email2@mail.com"));
this.bus.post(new GradeBookLoaded(book));
verify(this.view).setStudents(Arrays.asList("<unknown student>", "First1 Last1 <email1@mail.com>", "First2 Last2 <email2@mail.com>", "First3 Last3 <email3@mail.com>"));
}
@Test
public void firstStudentIsSelectedWhenGradeBookLoaded() {
this.bus.post(new GradeBookLoaded(book));
verify(this.view).setSelectedStudentIndex(0);
}
@Test
public void selectingStudentInViewFiresStudentSelectedEvent() {
ArgumentCaptor<SelectStudentHandler> viewHandler = ArgumentCaptor.forClass(SelectStudentHandler.class);
verify(this.view).addSelectStudentHandler(viewHandler.capture());
StudentSelectedEventHandler eventHandler = mock(StudentSelectedEventHandler.class);
this.bus.register(eventHandler);
this.bus.post(new GradeBookLoaded(book));
viewHandler.getValue().studentSelected(2);
ArgumentCaptor<StudentSelectedEvent> event = ArgumentCaptor.forClass(StudentSelectedEvent.class);
verify(eventHandler).handle(event.capture());
assertThat(event.getValue().getSelectedStudent(), equalTo(student1));
}
@Test
public void selectingStudentInAlphabetizedViewFiresStudentSelectedEvent() {
ArgumentCaptor<SelectStudentHandler> viewHandler = ArgumentCaptor.forClass(SelectStudentHandler.class);
verify(this.view).addSelectStudentHandler(viewHandler.capture());
StudentSelectedEventHandler eventHandler = mock(StudentSelectedEventHandler.class);
this.bus.register(eventHandler);
GradeBook book = new GradeBook("Test In Alphabetical Order");
book.addStudent(new Student("4").setFirstName("First1").setLastName("Last1").setEmail("email1@mail.com"));
book.addStudent(new Student("3").setFirstName("First3").setLastName("Last3").setEmail("email3@mail.com"));
Student student2 = new Student("1").setFirstName("First2").setLastName("Last2").setEmail("email2@mail.com");
book.addStudent(student2);
this.bus.post(new GradeBookLoaded(book));
viewHandler.getValue().studentSelected(2);
ArgumentCaptor<StudentSelectedEvent> event = ArgumentCaptor.forClass(StudentSelectedEvent.class);
verify(eventHandler).handle(event.capture());
assertThat(event.getValue().getSelectedStudent(), equalTo(student2));
}
@Test
public void selectingUnknownStudentInViewFiresNullStudentSelectedEvent() {
ArgumentCaptor<SelectStudentHandler> viewHandler = ArgumentCaptor.forClass(SelectStudentHandler.class);
verify(this.view).addSelectStudentHandler(viewHandler.capture());
StudentSelectedEventHandler eventHandler = mock(StudentSelectedEventHandler.class);
this.bus.register(eventHandler);
this.bus.post(new GradeBookLoaded(book));
viewHandler.getValue().studentSelected(0);
ArgumentCaptor<StudentSelectedEvent> event = ArgumentCaptor.forClass(StudentSelectedEvent.class);
verify(eventHandler).handle(event.capture());
assertThat(event.getValue().getSelectedStudent(), equalTo(null));
}
private interface StudentSelectedEventHandler {
@Subscribe
void handle(StudentSelectedEvent event);
}
@Test
public void submissionWithMatchingStudentNameFiresStudentSelectedEvent() {
StudentSelectedEventHandler eventHandler = mock(StudentSelectedEventHandler.class);
this.bus.register(eventHandler);
this.bus.post(new GradeBookLoaded(this.book));
POASubmission submission =
createPOASubmission("Subject", student1.getFirstName() + " " + student1.getLastName() + " <wrong@mail.com>", LocalDateTime.now());
this.bus.post(new POASubmissionSelected(submission));
verify(this.view).setSelectedStudentIndex(2);
ArgumentCaptor<StudentSelectedEvent> event = ArgumentCaptor.forClass(StudentSelectedEvent.class);
verify(eventHandler).handle(event.capture());
assertThat(event.getValue().getSelectedStudent(), equalTo(student1));
}
@Test
public void submissionWithMatchingStudentEmailFiresStudentSelectedEvent() {
StudentSelectedEventHandler eventHandler = mock(StudentSelectedEventHandler.class);
this.bus.register(eventHandler);
this.bus.post(new GradeBookLoaded(this.book));
POASubmission submission =
createPOASubmission("Subject", student2.getEmail(), LocalDateTime.now());
this.bus.post(new POASubmissionSelected(submission));
verify(this.view).setSelectedStudentIndex(3);
ArgumentCaptor<StudentSelectedEvent> event = ArgumentCaptor.forClass(StudentSelectedEvent.class);
verify(eventHandler).handle(event.capture());
assertThat(event.getValue().getSelectedStudent(), equalTo(student2));
}
@Test
public void submissionByNonMatchingStudentFiresUnknownStudentSelectedEvent() {
StudentSelectedEventHandler eventHandler = mock(StudentSelectedEventHandler.class);
this.bus.register(eventHandler);
this.bus.post(new GradeBookLoaded(this.book));
POASubmission submission =
createPOASubmission("Subject", "Unknown Student <unknown@mail.com>", LocalDateTime.now());
this.bus.post(new POASubmissionSelected(submission));
verify(this.view, times(2)).setSelectedStudentIndex(0);
ArgumentCaptor<StudentSelectedEvent> event = ArgumentCaptor.forClass(StudentSelectedEvent.class);
verify(eventHandler).handle(event.capture());
assertThat(event.getValue().getSelectedStudent(), equalTo(null));
}
}