package uk.ac.ox.zoo.seeg.abraid.mp.publicsite.web.user.registration;
import net.tanesha.recaptcha.ReCaptcha;
import net.tanesha.recaptcha.ReCaptchaResponse;
import org.junit.Test;
import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.Expert;
import uk.ac.ox.zoo.seeg.abraid.mp.publicsite.domain.JsonExpertBasic;
import uk.ac.ox.zoo.seeg.abraid.mp.publicsite.validator.ExpertValidationRulesChecker;
import javax.servlet.ServletRequest;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.anyListOf;
import static org.mockito.Mockito.*;
/**
* Tests for RegistrationControllerValidator.
* Copyright (c) 2014 University of Oxford
*/
public class RegistrationControllerValidatorTest {
@Test
public void createValidationCaptchaCallsReCaptchaMethodWithCorrectTheme() throws Exception {
// Arrange
ReCaptcha mockCaptcha = mock(ReCaptcha.class);
when(mockCaptcha.createRecaptchaHtml(anyString(), anyString(), anyInt())).thenReturn("expected");
RegistrationControllerValidator target =
new RegistrationControllerValidator(mock(ExpertValidationRulesChecker.class), mockCaptcha);
// Act
String result = target.createValidationCaptcha();
// Assert
assertThat(result).isEqualTo("expected");
verify(mockCaptcha).createRecaptchaHtml(eq((String) null), eq("clean"), eq((Integer) null));
}
@Test
public void validateBasicFieldsChecksEmail() throws Exception {
// Arrange
ExpertValidationRulesChecker checker = mock(ExpertValidationRulesChecker.class);
RegistrationControllerValidator target = new RegistrationControllerValidator(checker, mock(ReCaptcha.class));
Expert expert = mockExpertBasic();
when(expert.getEmail()).thenReturn("email");
// Act
target.validateBasicFields(expert);
// Assert
verify(checker).checkEmail(eq(expert.getEmail()), anyListOf(String.class));
}
@Test
public void validateBasicFieldsChecksPassword() throws Exception {
// Arrange
ExpertValidationRulesChecker checker = mock(ExpertValidationRulesChecker.class);
RegistrationControllerValidator target = new RegistrationControllerValidator(checker, mock(ReCaptcha.class));
Expert expert = mockExpertBasic();
when(expert.getPassword()).thenReturn("password");
// Act
target.validateBasicFields(expert);
// Assert
verify(checker).checkPassword(eq(expert.getPassword()), anyListOf(String.class));
}
@Test
public void validateDetailsFieldsChecksName() throws Exception {
// Arrange
ExpertValidationRulesChecker checker = mock(ExpertValidationRulesChecker.class);
RegistrationControllerValidator target = new RegistrationControllerValidator(checker, mock(ReCaptcha.class));
Expert expert = mockExpertDetails();
when(expert.getName()).thenReturn("name");
// Act
target.validateDetailsFields(expert);
// Assert
verify(checker).checkName(eq(expert.getName()), anyListOf(String.class));
}
@Test
public void validateDetailsFieldsChecksJobTitle() throws Exception {
// Arrange
ExpertValidationRulesChecker checker = mock(ExpertValidationRulesChecker.class);
RegistrationControllerValidator target =
new RegistrationControllerValidator(checker, mock(ReCaptcha.class));
Expert expert = mockExpertDetails();
when(expert.getJobTitle()).thenReturn("job");
// Act
target.validateDetailsFields(expert);
// Assert
verify(checker).checkJobTitle(eq(expert.getJobTitle()), anyListOf(String.class));
}
@Test
public void validateDetailsFieldsChecksInstitution() throws Exception {
// Arrange
ExpertValidationRulesChecker checker = mock(ExpertValidationRulesChecker.class);
RegistrationControllerValidator target =
new RegistrationControllerValidator(checker, mock(ReCaptcha.class));
Expert expert = mockExpertDetails();
when(expert.getInstitution()).thenReturn("institute");
// Act
target.validateDetailsFields(expert);
// Assert
verify(checker).checkInstitution(eq(expert.getInstitution()), anyListOf(String.class));
}
@Test
public void validateTransientFieldsChecksPasswordsConfirmation() throws Exception {
// Arrange
ReCaptcha mockCaptcha = mock(ReCaptcha.class);
ServletRequest mockRequest = mock(ServletRequest.class);
ReCaptchaResponse mockResponse = mock(ReCaptchaResponse.class);
when(mockCaptcha.checkAnswer(anyString(), anyString(), anyString())).thenReturn(mockResponse);
when(mockResponse.isValid()).thenReturn(true);
when(mockRequest.getRemoteAddr()).thenReturn("");
ExpertValidationRulesChecker checker = mock(ExpertValidationRulesChecker.class);
RegistrationControllerValidator target =
new RegistrationControllerValidator(checker, mockCaptcha);
JsonExpertBasic expert = mockJsonExpertBasic();
when(expert.getPassword()).thenReturn("abc123q");
when(expert.getPasswordConfirmation()).thenReturn("abc123Q");
// Act
target.validateTransientFields(expert, mockRequest);
// Assert
verify(checker).checkPasswordConfirmation(eq("abc123q"), eq("abc123Q"), anyListOf(String.class));
}
@Test
public void validateTransientFieldsVerifiesCaptchaCorrectly() throws Exception {
// Arrange
ReCaptcha mockCaptcha = mock(ReCaptcha.class);
ServletRequest mockRequest = mock(ServletRequest.class);
ReCaptchaResponse mockResponse = mock(ReCaptchaResponse.class);
when(mockCaptcha.checkAnswer(anyString(), anyString(), anyString())).thenReturn(mockResponse);
when(mockResponse.isValid()).thenReturn(false);
when(mockRequest.getRemoteAddr()).thenReturn("expected address");
RegistrationControllerValidator target =
new RegistrationControllerValidator(mock(ExpertValidationRulesChecker.class), mockCaptcha);
JsonExpertBasic expert = mockJsonExpertBasic();
// Act
List<String> result = target.validateTransientFields(expert, mockRequest);
// Assert
assertThat(result).contains("Captcha incorrect.");
verify(mockCaptcha)
.checkAnswer("expected address", expert.getCaptchaChallenge(), expert.getCaptchaResponse());
}
private static Expert mockExpertBasic() {
Expert result = mock(Expert.class);
when(result.getEmail()).thenReturn("a@b.com");
when(result.getPassword()).thenReturn("qwe123Q");
return result;
}
private static Expert mockExpertDetails() {
Expert result = mock(Expert.class);
when(result.getName()).thenReturn("Louis Pasteur");
when(result.getJobTitle()).thenReturn("Microbiologist");
when(result.getInstitution()).thenReturn("Pasteur Institute");
return result;
}
private static JsonExpertBasic mockJsonExpertBasic() {
JsonExpertBasic result = mock(JsonExpertBasic.class);
when(result.getEmail()).thenReturn("a@b.com");
when(result.getPassword()).thenReturn("qwe123Q");
when(result.getPasswordConfirmation()).thenReturn("qwe123Q");
when(result.getCaptchaChallenge()).thenReturn("challenge");
when(result.getCaptchaResponse()).thenReturn("response");
return result;
}
}