/** * ============================================================================= * * ORCID (R) Open Source * http://orcid.org * * Copyright (c) 2012-2014 ORCID, Inc. * Licensed under an MIT-Style License (MIT) * http://orcid.org/open-source-license * * This copyright and license information (including a link to the full license) * shall be included in its entirety in all copies or substantial portion of * the software. * * ============================================================================= */ package org.orcid.frontend.web.controllers; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.io.UnsupportedEncodingException; import java.util.Arrays; import java.util.List; import java.util.Locale; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.orcid.core.manager.EmailManager; import org.orcid.core.manager.OrcidProfileManager; import org.orcid.core.manager.ProfileEntityManager; import org.orcid.core.manager.RegistrationManager; import org.orcid.jaxb.model.common_v2.Visibility; import org.orcid.jaxb.model.message.Biography; import org.orcid.jaxb.model.message.ContactDetails; import org.orcid.jaxb.model.message.CreationMethod; import org.orcid.jaxb.model.message.Email; import org.orcid.jaxb.model.message.FamilyName; import org.orcid.jaxb.model.message.GivenNames; import org.orcid.jaxb.model.message.OrcidBio; import org.orcid.jaxb.model.message.OrcidProfile; import org.orcid.jaxb.model.message.OrcidWorks; import org.orcid.jaxb.model.message.PersonalDetails; import org.orcid.jaxb.model.message.ResearcherUrl; import org.orcid.jaxb.model.message.ResearcherUrls; import org.orcid.jaxb.model.message.Url; import org.orcid.pojo.ajaxForm.Checkbox; import org.orcid.pojo.ajaxForm.Registration; import org.orcid.pojo.ajaxForm.Text; import org.orcid.test.DBUnitTest; import org.orcid.test.OrcidJUnit4ClassRunner; import org.orcid.test.TargetProxyHelper; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.web.WebAppConfiguration; import com.google.common.collect.Lists; @RunWith(OrcidJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration(locations = { "classpath:orcid-frontend-web-servlet.xml", "classpath:orcid-core-context.xml", "classpath:statistics-core-context.xml" }) public class RegistrationControllerTest extends DBUnitTest { private static final List<String> DATA_FILES = Arrays.asList("/data/EmptyEntityData.xml", "/data/SecurityQuestionEntityData.xml", "/data/SourceClientDetailsEntityData.xml", "/data/ProfileEntityData.xml", "/data/ClientDetailsEntityData.xml", "/data/RecordNameEntityData.xml", "/data/BiographyEntityData.xml"); @Resource(name = "registrationController") RegistrationController registrationController; @Mock RegistrationManager registrationManager; @Mock private HttpServletRequest servletRequest; @Mock private HttpServletResponse servletResponse; @Mock private EmailManager emailManager; @Mock private ProfileEntityManager profileEntityManager; @Mock private OrcidProfileManager orcidProfileManager; @BeforeClass public static void beforeClass() throws Exception { initDBUnitData(DATA_FILES); } @AfterClass public static void afterClass() throws Exception { removeDBUnitData(Lists.reverse(DATA_FILES)); } @Before public void before() { MockitoAnnotations.initMocks(this); TargetProxyHelper.injectIntoProxy(registrationController, "registrationManager", registrationManager); TargetProxyHelper.injectIntoProxy(registrationController, "emailManager", emailManager); TargetProxyHelper.injectIntoProxy(registrationController, "profileEntityManager", profileEntityManager); TargetProxyHelper.injectIntoProxy(registrationController, "orcidProfileManager", orcidProfileManager); } @Test public void testStripHtmlFromNames() throws UnsupportedEncodingException { HttpSession session = mock(HttpSession.class); when(servletRequest.getSession()).thenReturn(session); Text email = Text.valueOf(System.currentTimeMillis() + "@test.orcid.org"); when(registrationManager.createMinimalRegistration(Matchers.any(Registration.class), eq(false), Matchers.any(java.util.Locale.class), Matchers.anyString())).thenAnswer(new Answer<String>(){ @Override public String answer(InvocationOnMock invocation) throws Throwable { return "0000-0000-0000-0000"; } }); Registration reg = new Registration(); org.orcid.pojo.ajaxForm.Visibility fv = new org.orcid.pojo.ajaxForm.Visibility(); fv.setVisibility(Visibility.PUBLIC); reg.setActivitiesVisibilityDefault(fv); reg.setEmail(email); reg.setEmailConfirm(email); reg.setFamilyNames(Text.valueOf("<button onclick=\"alert('hello')\">Family Name</button>")); reg.setGivenNames(Text.valueOf("<button onclick=\"alert('hello')\">Given Names</button>")); reg.setPassword(Text.valueOf("1234abcd")); reg.setPasswordConfirm(Text.valueOf("1234abcd")); reg.setValNumClient(2L); reg.setValNumServer(4L); Checkbox c = new Checkbox(); c.setValue(true); reg.setTermsOfUse(c); reg.setCreationType(Text.valueOf(CreationMethod.API.value())); registrationController.setRegisterConfirm(servletRequest, servletResponse, reg); ArgumentCaptor<Registration> argument1 = ArgumentCaptor.forClass(Registration.class); ArgumentCaptor<Boolean> argument2 = ArgumentCaptor.forClass(Boolean.class); ArgumentCaptor<Locale> argument3 = ArgumentCaptor.forClass(Locale.class); ArgumentCaptor<String> argument4 = ArgumentCaptor.forClass(String.class); verify(registrationManager).createMinimalRegistration(argument1.capture(), argument2.capture(), argument3.capture(), argument4.capture()); assertNotNull(argument1.getValue()); Registration form = argument1.getValue(); assertEquals("Given Names", form.getGivenNames().getValue()); assertEquals("Family Name", form.getFamilyNames().getValue()); } @Test public void regEmailValidateUnclaimedAccountTest() { String email = "email1@test.orcid.org"; String orcid = "0000-0000-0000-0000"; when(emailManager.emailExists(email)).thenReturn(true); when(emailManager.findOrcidIdByEmail(email)).thenReturn(orcid); when(profileEntityManager.isProfileClaimedByEmail(email)).thenReturn(false); when(profileEntityManager.isDeactivated(orcid)).thenReturn(false); when(emailManager.isAutoDeprecateEnableForEmail(email)).thenReturn(true); Registration reg = new Registration(); reg.setEmail(Text.valueOf("email1@test.orcid.org")); reg.setEmailConfirm(Text.valueOf("email1@test.orcid.org")); reg = registrationController.regEmailValidate(servletRequest, reg, false, true); assertNotNull(reg); assertNotNull(reg.getEmail()); assertNotNull(reg.getEmail().getErrors()); //No errors, since the account can be auto deprecated assertTrue(reg.getEmail().getErrors().isEmpty()); } @Test public void regEmailValidateUnclaimedAccountButEnableAutoDeprecateDisableOnClientTest() { String email = "email1@test.orcid.org"; String orcid = "0000-0000-0000-0000"; when(emailManager.emailExists(email)).thenReturn(true); when(emailManager.findOrcidIdByEmail(email)).thenReturn(orcid); when(profileEntityManager.isProfileClaimedByEmail(email)).thenReturn(false); when(profileEntityManager.isDeactivated(orcid)).thenReturn(false); //Set enable auto deprecate off when(emailManager.isAutoDeprecateEnableForEmail(email)).thenReturn(false); when(servletRequest.getScheme()).thenReturn("http"); Registration reg = new Registration(); reg.setEmail(Text.valueOf("email1@test.orcid.org")); reg.setEmailConfirm(Text.valueOf("email1@test.orcid.org")); reg = registrationController.regEmailValidate(servletRequest, reg, false, true); assertNotNull(reg); assertNotNull(reg.getEmail()); assertNotNull(reg.getEmail().getErrors()); assertEquals(1, reg.getEmail().getErrors().size()); assertEquals("email1@test.orcid.org already exists in our system as an unclaimed record. Would you like to <a href=\"http://testserver.orcid.org/resend-claim?email=email1%40test.orcid.org\">resend the claim email</a>?", reg.getEmail().getErrors().get(0)); } @Test public void regEmailValidateDeactivatedAccountTest() { String email = "email1@test.orcid.org"; String orcid = "0000-0000-0000-0000"; when(emailManager.emailExists(email)).thenReturn(true); when(emailManager.findOrcidIdByEmail(email)).thenReturn(orcid); when(profileEntityManager.isProfileClaimedByEmail(email)).thenReturn(false); //Set it as deactivated when(profileEntityManager.isDeactivated(orcid)).thenReturn(true); Registration reg = new Registration(); reg.setEmail(Text.valueOf("email1@test.orcid.org")); reg.setEmailConfirm(Text.valueOf("email1@test.orcid.org")); reg = registrationController.regEmailValidate(servletRequest, reg, false, true); assertNotNull(reg); assertNotNull(reg.getEmail()); assertNotNull(reg.getEmail().getErrors()); assertEquals(1, reg.getEmail().getErrors().size()); assertTrue(reg.getEmail().getErrors().get(0).startsWith("orcid.frontend.verify.deactivated_email")); } @Test public void regEmailValidateDeactivatedAndUnclaimedAccountTest() { String email = "email1@test.orcid.org"; String orcid = "0000-0000-0000-0000"; when(emailManager.emailExists(email)).thenReturn(true); when(emailManager.findOrcidIdByEmail(email)).thenReturn(orcid); //Set it as unclaimed when(profileEntityManager.isProfileClaimedByEmail(email)).thenReturn(false); //And set it as deactivated when(profileEntityManager.isDeactivated(orcid)).thenReturn(true); when(emailManager.isAutoDeprecateEnableForEmail(email)).thenReturn(true); Registration reg = new Registration(); reg.setEmail(Text.valueOf("email1@test.orcid.org")); reg.setEmailConfirm(Text.valueOf("email1@test.orcid.org")); reg = registrationController.regEmailValidate(servletRequest, reg, false, true); assertNotNull(reg); assertNotNull(reg.getEmail()); assertNotNull(reg.getEmail().getErrors()); assertEquals(1, reg.getEmail().getErrors().size()); assertTrue(reg.getEmail().getErrors().get(0).startsWith("orcid.frontend.verify.deactivated_email")); } @Test public void regEmailValidateClaimedAccountTest() { String email = "email1@test.orcid.org"; String orcid = "0000-0000-0000-0000"; when(emailManager.emailExists(email)).thenReturn(true); when(emailManager.findOrcidIdByEmail(email)).thenReturn(orcid); //Set it as claimed when(profileEntityManager.isProfileClaimedByEmail(email)).thenReturn(true); //And set it as active when(profileEntityManager.isDeactivated(orcid)).thenReturn(false); Registration reg = new Registration(); reg.setEmail(Text.valueOf("email1@test.orcid.org")); reg.setEmailConfirm(Text.valueOf("email1@test.orcid.org")); reg = registrationController.regEmailValidate(servletRequest, reg, false, true); assertNotNull(reg); assertNotNull(reg.getEmail()); assertNotNull(reg.getEmail().getErrors()); assertEquals(1, reg.getEmail().getErrors().size()); assertTrue(reg.getEmail().getErrors().get(0).startsWith("email1@test.orcid.org already exists in our system. Would you like to")); } protected OrcidProfile createBasicProfile() { OrcidProfile profile = new OrcidProfile(); profile.setPassword("password"); profile.setVerificationCode("1234"); profile.setSecurityQuestionAnswer("random answer"); OrcidBio bio = new OrcidBio(); ContactDetails contactDetails = new ContactDetails(); contactDetails.addOrReplacePrimaryEmail(new Email("will@semantico.com")); bio.setContactDetails(contactDetails); profile.setOrcidBio(bio); PersonalDetails personalDetails = new PersonalDetails(); bio.setPersonalDetails(personalDetails); personalDetails.setGivenNames(new GivenNames("Will")); personalDetails.setFamilyName(new FamilyName("Simpson")); bio.setBiography(new Biography("Will is a software developer")); ResearcherUrls researcherUrls = new ResearcherUrls(); bio.setResearcherUrls(researcherUrls); researcherUrls.getResearcherUrl().add(new ResearcherUrl(new Url("http://www.wjrs.co.uk"),null)); OrcidWorks orcidWorks = new OrcidWorks(); profile.setOrcidWorks(orcidWorks); return profile; } }