/** * ============================================================================= * * 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.core.manager.impl; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsNot.not; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.Arrays; import java.util.Date; import java.util.Map; import javax.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.orcid.core.manager.EmailManager; import org.orcid.core.manager.OrcidProfileManager; import org.orcid.core.manager.RegistrationManager; import org.orcid.jaxb.model.message.Claimed; 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.OrcidHistory; import org.orcid.jaxb.model.message.OrcidProfile; import org.orcid.jaxb.model.message.PersonalDetails; import org.orcid.jaxb.model.message.Source; import org.orcid.jaxb.model.message.SubmissionDate; 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.utils.DateUtils; import org.orcid.utils.OrcidStringUtils; import org.springframework.security.oauth2.common.exceptions.InvalidRequestException; import org.springframework.test.context.ContextConfiguration; @RunWith(OrcidJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:orcid-core-context.xml" }) public class RegistrationManagerImplTest extends DBUnitTest { private static final String CLIENT_ID_AUTODEPRECATE_ENABLED = "APP-5555555555555555"; private static final String CLIENT_ID_AUTODEPRECATE_DISABLED = "APP-5555555555555556"; @Resource RegistrationManager registrationManager; @Resource EmailManager emailManager; @Resource OrcidProfileManager orcidProfileManager; @BeforeClass public static void initDBUnitData() throws Exception { initDBUnitData(Arrays.asList("/data/SecurityQuestionEntityData.xml", "/data/SourceClientDetailsEntityData.xml")); } @AfterClass public static void removeDBUnitData() throws Exception { removeDBUnitData(Arrays.asList("/data/SourceClientDetailsEntityData.xml", "/data/SecurityQuestionEntityData.xml")); } @Test public void testCreateMinimalRegistration() { String email = "new_user_" + System.currentTimeMillis() + "@test.orcid.org"; Registration form = createRegistrationForm(email, true); String userOrcid = registrationManager.createMinimalRegistration(form, true, java.util.Locale.ENGLISH, "0.0.0.0"); assertNotNull(userOrcid); assertTrue(OrcidStringUtils.isValidOrcid(userOrcid)); Map<String, String> map = emailManager.findOricdIdsByCommaSeparatedEmails(email); assertNotNull(map); assertEquals(userOrcid, map.get(email)); } @Test public void testCreateMinimalRegistrationWithExistingClaimedEmail() { //Create the user String email = "new_user_" + System.currentTimeMillis() + "@test.orcid.org"; Registration form = createRegistrationForm(email, true); String userOrcid = registrationManager.createMinimalRegistration(form, true, java.util.Locale.ENGLISH, "0.0.0.0"); assertNotNull(userOrcid); assertTrue(OrcidStringUtils.isValidOrcid(userOrcid)); //Then try to create it again form = createRegistrationForm(email, true); try { registrationManager.createMinimalRegistration(form, true, java.util.Locale.ENGLISH, "0.0.0.0"); fail(); } catch(InvalidRequestException e) { assertEquals("Unable to register user due: Email " + email + " already exists and is claimed, so, it can't be used again", e.getMessage()); } catch(Exception e) { fail(); } } @Test public void testCreateMinimalRegistrationWithExistingUnclaimedEmailNotAutoDeprecatable() { //Create the user, but set it as unclaimed String email = "new_user_" + System.currentTimeMillis() + "@test.orcid.org"; //Create a record by a member OrcidProfile orcidProfile = createBasicProfile(email, false, CLIENT_ID_AUTODEPRECATE_DISABLED); orcidProfile = orcidProfileManager.createOrcidProfile(orcidProfile, true, true); assertNotNull(orcidProfile); assertNotNull(orcidProfile.getOrcidIdentifier()); assertNotNull(orcidProfile.getOrcidIdentifier().getPath()); try { Registration form = createRegistrationForm(email, true); registrationManager.createMinimalRegistration(form, true, java.util.Locale.ENGLISH, "0.0.0.0"); fail(); } catch(InvalidRequestException e) { assertEquals("Unable to register user due: Autodeprecate is not enabled for " + email, e.getMessage()); } catch(Exception e) { fail(); } } @Test public void testCreateMinimalRegistrationWithExistingEmailThatCanBeAutoDeprecated() { //Create the user, but set it as unclaimed String email = "new_user_" + System.currentTimeMillis() + "@test.orcid.org"; //Create a record by a member OrcidProfile orcidProfile = createBasicProfile(email, false, CLIENT_ID_AUTODEPRECATE_ENABLED); orcidProfile = orcidProfileManager.createOrcidProfile(orcidProfile, true, true); assertNotNull(orcidProfile); assertNotNull(orcidProfile.getOrcidIdentifier()); assertNotNull(orcidProfile.getOrcidIdentifier().getPath()); String orcidBefore = orcidProfile.getOrcidIdentifier().getPath(); Map<String, String> map1 = emailManager.findOricdIdsByCommaSeparatedEmails(email); assertNotNull(map1); assertEquals(orcidBefore, map1.get(email)); //Then try to create it again, this time claimed and without source Registration form = createRegistrationForm(email, true); String orcidAfter = registrationManager.createMinimalRegistration(form, true, java.util.Locale.ENGLISH, "0.0.0.0"); assertTrue(OrcidStringUtils.isValidOrcid(orcidAfter)); assertThat(orcidAfter, is(not(equalTo(orcidBefore)))); Map<String, String> map2 = emailManager.findOricdIdsByCommaSeparatedEmails(email); assertNotNull(map2); assertEquals(orcidAfter, map2.get(email)); } @Test public void testPasswordIsCommon() { assertTrue(registrationManager.passwordIsCommon("baseball")); assertTrue(registrationManager.passwordIsCommon("dragon")); assertTrue(registrationManager.passwordIsCommon("football")); assertTrue(registrationManager.passwordIsCommon("monkey")); assertTrue(registrationManager.passwordIsCommon("shadow")); assertTrue(registrationManager.passwordIsCommon("password")); assertFalse(registrationManager.passwordIsCommon("132871384164578961349")); assertFalse(registrationManager.passwordIsCommon("advkuwAFdaAdf387922")); assertFalse(registrationManager.passwordIsCommon("%@@$£&£$%^!@SSDFgwjhsad")); } private Registration createRegistrationForm(String email, boolean claimed) { Registration registration = new Registration(); registration.setPassword(Text.valueOf("password")); registration.setEmail(Text.valueOf(email)); registration.setFamilyNames(Text.valueOf("User")); registration.setGivenNames(Text.valueOf("New")); registration.setCreationType(Text.valueOf(CreationMethod.DIRECT.value())); return registration; } private OrcidProfile createBasicProfile(String email, boolean claimed, String sourceId) { OrcidProfile profile = new OrcidProfile(); profile.setPassword("password"); profile.setVerificationCode("1234"); OrcidBio bio = new OrcidBio(); ContactDetails contactDetails = new ContactDetails(); contactDetails.addOrReplacePrimaryEmail(new Email(email)); bio.setContactDetails(contactDetails); profile.setOrcidBio(bio); PersonalDetails personalDetails = new PersonalDetails(); bio.setPersonalDetails(personalDetails); personalDetails.setGivenNames(new GivenNames("New")); personalDetails.setFamilyName(new FamilyName("User")); OrcidHistory orcidHistory = new OrcidHistory(); orcidHistory.setClaimed(new Claimed(claimed)); orcidHistory.setCreationMethod(CreationMethod.DIRECT); orcidHistory.setSubmissionDate(new SubmissionDate(DateUtils.convertToXMLGregorianCalendar(new Date()))); profile.setOrcidHistory(orcidHistory); //Set the source profile.getOrcidHistory().setSource(new Source(sourceId)); return profile; } }