1 package org.cateproject.controller.user;
2
3 import org.easymock.EasyMock;
4 import org.junit.Assert;
5 import org.junit.Before;
6 import org.junit.Test;
7
8 import org.springframework.security.provisioning.UserDetailsManager;
9 import org.springframework.validation.BindException;
10 import org.springframework.validation.FieldError;
11 import org.unitils.UnitilsJUnit4;
12 import org.unitils.easymock.annotation.Mock;
13 import org.unitils.inject.annotation.InjectInto;
14 import org.unitils.inject.annotation.TestedObject;
15
16 import com.octo.captcha.service.image.ImageCaptchaService;
17
18 public class RegistrationFormValidatorTest extends UnitilsJUnit4 {
19
20 @Mock
21 @InjectInto(property = "userDetailsManager")
22 private UserDetailsManager userDetailsManager;
23
24 @Mock
25 @InjectInto(property = "imageCaptchaService")
26 private ImageCaptchaService imageCaptchaService;
27
28 @Mock
29 @InjectInto(property = "passwordValidator")
30 private PasswordValidator passwordValidator;
31
32 @TestedObject
33 private RegistrationFormValidator registrationFormValidator;
34
35 private BindException errors;
36
37 private RegistrationForm form;
38
39 @Before
40 public void setUp() {
41 registrationFormValidator = new RegistrationFormValidator();
42 userDetailsManager = EasyMock.createMock(UserDetailsManager.class);
43 imageCaptchaService = EasyMock.createMock(ImageCaptchaService.class);
44 passwordValidator = EasyMock.createMock(PasswordValidator.class);
45
46 form = new RegistrationForm();
47 form.setUserName("ben");
48 form.setPassword("sPePhAz6");
49 form.setConfirmPassword("sPePhAz6");
50 form.setEmailAddress("benjamin.clark@ic.ac.uk");
51 form.setCaptchaId("xyz");
52 form.setCaptchaResponse("123");
53
54 errors = new BindException(form,"form");
55 }
56
57 @Test
58 public void testValidatorWithCorrectData() throws Exception {
59 EasyMock.expect(imageCaptchaService.validateResponseForID(EasyMock.eq("xyz"), EasyMock.eq("123"))).andReturn(true).anyTimes();
60 EasyMock.expect(userDetailsManager.userExists(EasyMock.eq("ben"))).andReturn(Boolean.FALSE);
61 EasyMock.expect(passwordValidator.checkPassword(EasyMock.eq("sPePhAz6"))).andReturn(PasswordMessage.PASSWORD_OK);
62 EasyMock.replay(imageCaptchaService,userDetailsManager,passwordValidator);
63
64 registrationFormValidator.validate(form, errors);
65 EasyMock.verify(imageCaptchaService,userDetailsManager,passwordValidator);
66
67 Assert.assertFalse(errors.hasErrors());
68 }
69
70 @Test
71 public void testValidatorWithWeakPassword() throws Exception {
72 EasyMock.expect(imageCaptchaService.validateResponseForID(EasyMock.eq("xyz"), EasyMock.eq("123"))).andReturn(true).anyTimes();
73 EasyMock.expect(userDetailsManager.userExists(EasyMock.eq("ben"))).andReturn(Boolean.FALSE);
74 EasyMock.expect(passwordValidator.checkPassword(EasyMock.eq("ben"))).andReturn(PasswordMessage.PASSWORD_TOO_SHORT);
75 EasyMock.replay(imageCaptchaService,userDetailsManager,passwordValidator);
76
77 form.setPassword("ben");
78 form.setConfirmPassword("ben");
79
80 registrationFormValidator.validate(form, errors);
81
82 EasyMock.verify(imageCaptchaService,userDetailsManager,passwordValidator);
83
84 Assert.assertTrue(errors.hasErrors());
85 Assert.assertTrue(errors.hasFieldErrors("password"));
86 FieldError fieldError = errors.getFieldError("password");
87 Assert.assertEquals(fieldError.getCode(),"PasswordValidator.tooShort");
88 }
89
90 @Test
91 public void testValidatorWithNonMatchingPassword() throws Exception {
92 EasyMock.expect(imageCaptchaService.validateResponseForID(EasyMock.eq("xyz"), EasyMock.eq("123"))).andReturn(true).anyTimes();
93 EasyMock.expect(userDetailsManager.userExists(EasyMock.eq("ben"))).andReturn(Boolean.FALSE);
94 EasyMock.expect(passwordValidator.checkPassword(EasyMock.eq("sPePhAz6"))).andReturn(PasswordMessage.PASSWORD_OK);
95
96 EasyMock.replay(imageCaptchaService,userDetailsManager,passwordValidator);
97
98 form.setPassword("sPePhAz6");
99 form.setConfirmPassword("tPePhAz6");
100
101 registrationFormValidator.validate(form, errors);
102 EasyMock.verify(imageCaptchaService,userDetailsManager,passwordValidator);
103
104 Assert.assertTrue(errors.hasErrors());
105 Assert.assertTrue(errors.hasFieldErrors("confirmPassword"));
106 FieldError fieldError = errors.getFieldError("confirmPassword");
107 Assert.assertEquals(fieldError.getCode(),"passwords.do.not.match");
108 }
109
110 @Test
111 public void testValidatorWithExistingUsername() throws Exception {
112 EasyMock.expect(imageCaptchaService.validateResponseForID(EasyMock.eq("xyz"), EasyMock.eq("123"))).andReturn(true).anyTimes();
113 EasyMock.expect(userDetailsManager.userExists(EasyMock.eq("bill"))).andReturn(Boolean.TRUE);
114 EasyMock.expect(passwordValidator.checkPassword(EasyMock.eq("sPePhAz6"))).andReturn(PasswordMessage.PASSWORD_OK);
115 EasyMock.replay(imageCaptchaService,userDetailsManager,passwordValidator);
116
117 form.setUserName("bill");
118
119 registrationFormValidator.validate(form, errors);
120 EasyMock.verify(imageCaptchaService,userDetailsManager,passwordValidator);
121
122 Assert.assertTrue(errors.hasErrors());
123 Assert.assertTrue(errors.hasFieldErrors("username"));
124 FieldError fieldError = errors.getFieldError("username");
125 Assert.assertEquals(fieldError.getCode(),"invalid.username");
126 }
127
128 @Test
129 public void testValidatorWithInvalidEmail() throws Exception {
130 EasyMock.expect(imageCaptchaService.validateResponseForID(EasyMock.eq("xyz"), EasyMock.eq("123"))).andReturn(true).anyTimes();
131 EasyMock.expect(userDetailsManager.userExists(EasyMock.eq("ben"))).andReturn(Boolean.FALSE);
132 EasyMock.expect(passwordValidator.checkPassword(EasyMock.eq("sPePhAz6"))).andReturn(PasswordMessage.PASSWORD_OK);
133 EasyMock.replay(imageCaptchaService,userDetailsManager,passwordValidator);
134
135 form.setEmailAddress("invalid.email");
136
137 registrationFormValidator.validate(form, errors);
138 EasyMock.verify(imageCaptchaService,userDetailsManager,passwordValidator);
139
140 Assert.assertTrue(errors.hasErrors());
141 Assert.assertTrue(errors.hasFieldErrors("emailAddress"));
142 FieldError fieldError = errors.getFieldError("emailAddress");
143 Assert.assertEquals(fieldError.getCode(),"invalid.emailAddress");
144 }
145 }