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 static org.hamcrest.MatcherAssert.assertThat;
009import static org.hamcrest.Matchers.equalTo;
010import static org.mockito.Mockito.*;
011
012public class EmailCredentialsPresenterTest extends EventBusTestCase {
013
014  private EmailCredentialsView view;
015  private EmailCredentialsPresenter presenter;
016
017  @Override
018  @BeforeEach
019  public void setUp() {
020    super.setUp();
021
022    this.view = mock(EmailCredentialsView.class);
023
024    presenter = new EmailCredentialsPresenter(bus, view);
025  }
026
027  @Test
028  public void downloadingSubmissionsDisplaysEmailCredentialsView() {
029    this.bus.post(new DownloadPOASubmissionsRequest());
030
031    verify(this.view).setIsVisible(true);
032  }
033
034  @Test
035  public void downloadingSubmissionsDisplaysStatusMessage() {
036    StatusMessageListener listener = mock(StatusMessageListener.class);
037    this.bus.register(listener);
038
039    this.bus.post(new DownloadPOASubmissionsRequest());
040
041    ArgumentCaptor<StatusMessage> captor = ArgumentCaptor.forClass(StatusMessage.class);
042    verify(listener).handleStatusMessage(captor.capture());
043
044    StatusMessage status = captor.getValue();
045    assertThat(status.getStatusMessage(), equalTo(EmailCredentialsPresenter.ENTER_CREDENTIALS_MESSAGE));
046  }
047
048  @Test
049  void downloadingSubmissionsWithNoCredentialsDoesNotPopulateView() {
050    this.bus.post(new DownloadPOASubmissionsRequest());
051
052    verify(this.view, never()).setEmailAddress(any(String.class));
053    verify(this.view, never()).setPassword(any(String.class));
054  }
055
056  @Test
057  void downloadingSubmissionsWithCredentialsPopulatesView() {
058    String email = "me@me.com";
059    String password = "password";
060    this.bus.post(new DownloadPOASubmissionsRequest(email, password));
061
062    verify(this.view).setEmailAddress(eq(email));
063    verify(this.view).setPassword(eq(password));
064  }
065
066  @Test
067  public void emailAddressInViewIsSavedToPresenter() {
068    ArgumentCaptor<EmailCredentialsView.EmailAddressValueListener> emailAddress = ArgumentCaptor.forClass(EmailCredentialsView.EmailAddressValueListener.class);
069    verify(this.view).addEmailAddressValueListener(emailAddress.capture());
070
071    String address = "me@email.com";
072    emailAddress.getValue().setEmailAddress(address);
073
074    assertThat(presenter.getEmailAddress(), equalTo(address));
075  }
076
077  @Test
078  public void passwordInViewIsSavedToPresenter() {
079    ArgumentCaptor<EmailCredentialsView.PasswordValueListener> passwordCaptor = ArgumentCaptor.forClass(EmailCredentialsView.PasswordValueListener.class);
080    verify(this.view).addPasswordValueListener(passwordCaptor.capture());
081
082    String password = "password";
083    passwordCaptor.getValue().setPassword(password);
084
085    assertThat(presenter.getPassword(), equalTo(password));
086  }
087
088  @Test
089  public void enteringCredentialsInViewFiresEmailCredentialsEvent() {
090    ArgumentCaptor<EmailCredentialsView.SubmitCredentialsListener> submitListener = ArgumentCaptor.forClass(EmailCredentialsView.SubmitCredentialsListener.class);
091    verify(this.view).addSubmitCredentialsListener(submitListener.capture());
092
093    EmailCredentialsListener listener = mock(EmailCredentialsListener.class);
094    this.bus.register(listener);
095
096    String emailAddress = "me@email.com";
097    this.presenter.setEmailAddress(emailAddress);
098    String password = "password";
099    this.presenter.setPassword(password);
100
101    submitListener.getValue().submitCredentials();
102
103    ArgumentCaptor<EmailCredentials> credentials = ArgumentCaptor.forClass(EmailCredentials.class);
104    verify(listener).emailCredentials(credentials.capture());
105
106    assertThat(credentials.getValue().getEmailAddress(), equalTo(emailAddress));
107    assertThat(credentials.getValue().getPassword(), equalTo(password));
108  }
109
110  public interface EmailCredentialsListener {
111    @Subscribe
112    void emailCredentials(EmailCredentials event);
113  }
114
115  private interface StatusMessageListener {
116    @Subscribe
117    void handleStatusMessage(StatusMessage status);
118  }
119}