/** * ============================================================================= * * 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; /** * @author Angel Montenegro (amontenegro) Date: 29/08/2013 */ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.Arrays; import javax.annotation.Resource; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.MockitoAnnotations; import org.orcid.core.manager.OrcidClientGroupManager; import org.orcid.core.oauth.OrcidProfileUserDetails; import org.orcid.core.security.OrcidWebRole; import org.orcid.jaxb.model.clientgroup.MemberType; import org.orcid.jaxb.model.message.OrcidType; import org.orcid.persistence.dao.ClientDetailsDao; import org.orcid.persistence.dao.ProfileDao; import org.orcid.persistence.jpa.entities.ProfileEntity; import org.orcid.pojo.ajaxForm.Client; import org.orcid.pojo.ajaxForm.Member; import org.orcid.pojo.ajaxForm.PojoUtil; import org.orcid.pojo.ajaxForm.RedirectUri; import org.orcid.pojo.ajaxForm.Text; import org.orcid.test.DBUnitTest; import org.orcid.test.OrcidJUnit4ClassRunner; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @RunWith(OrcidJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration(locations = { "classpath:orcid-core-context.xml", "classpath:orcid-frontend-web-servlet.xml", "classpath:statistics-core-context.xml" }) @Transactional(propagation = Propagation.REQUIRES_NEW) public class ManageMembersControllerTest extends DBUnitTest { @Resource ManageMembersController manageMembers; @Resource private ProfileDao profileDao; @Resource OrcidClientGroupManager orcidClientGroupManager; @Resource GroupAdministratorController groupAdministratorController; @Resource ClientDetailsDao clientDetailsDao; @Before public void beforeInstance() { SecurityContextHolder.getContext().setAuthentication(getAuthentication()); MockitoAnnotations.initMocks(this); } @BeforeClass public static void beforeClass() throws Exception { initDBUnitData(Arrays.asList("/data/EmptyEntityData.xml", "/data/PremiumInstitutionMemberData.xml")); } @AfterClass public static void afterClass() throws Exception { removeDBUnitData(Arrays.asList("/data/PremiumInstitutionMemberData.xml")); } protected Authentication getAuthentication() { OrcidProfileUserDetails details = new OrcidProfileUserDetails("5555-5555-5555-0000", "premium_institution@group.com", "", OrcidType.GROUP, MemberType.PREMIUM_INSTITUTION); UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(details, "5555-5555-5555-0000", Arrays.asList(OrcidWebRole.ROLE_GROUP)); return auth; } @Test public void createMemberProfileWithInvalidEmailsTest() throws Exception { ProfileEntity profile = profileDao.find("5555-5555-5555-0000"); assertNotNull(profile); assertNotNull(profile.getPrimaryEmail()); String existingEmail = profile.getPrimaryEmail().getId(); assertNotNull(existingEmail); Member group = new Member(); group.setGroupName(Text.valueOf("Group Name")); group.setType(Text.valueOf("basic")); group.setSalesforceId(Text.valueOf("")); // Validate already existing email address group.setEmail(Text.valueOf(existingEmail)); group = manageMembers.createMember(group); assertEquals(1, group.getErrors().size()); assertEquals(manageMembers.getMessage("group.email.already_used", new ArrayList<String>()), group.getErrors().get(0)); // Validate empty email address group.setEmail(Text.valueOf("")); group = manageMembers.createMember(group); assertEquals(1, group.getErrors().size()); assertEquals(manageMembers.getMessage("NotBlank.group.email", new ArrayList<String>()), group.getErrors().get(0)); // Validate invalid email address group.setEmail(Text.valueOf("invalidemail")); group = manageMembers.createMember(group); assertEquals(1, group.getErrors().size()); assertEquals(manageMembers.getMessage("group.email.invalid_email", new ArrayList<String>()), group.getErrors().get(0)); } @Test public void createMemberProfileWithInvalidGroupNameTest() throws Exception { Member group = new Member(); group.setEmail(Text.valueOf("group@email.com")); group.setType(Text.valueOf("basic")); group.setSalesforceId(Text.valueOf("")); // Validate empty group name group.setGroupName(Text.valueOf("")); group = manageMembers.createMember(group); assertEquals(1, group.getErrors().size()); assertEquals(manageMembers.getMessage("NotBlank.group.name", new ArrayList<String>()), group.getErrors().get(0)); // validate too long group name - 151 chars group.setGroupName(Text .valueOf("1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901")); group = manageMembers.createMember(group); assertEquals(1, group.getErrors().size()); assertEquals(manageMembers.getMessage("group.name.too_long", new ArrayList<String>()), group.getErrors().get(0)); } @Test public void createMemberProfileWithInvalidTypeTest() throws Exception { Member group = new Member(); group.setEmail(Text.valueOf("group@email.com")); group.setGroupName(Text.valueOf("Group Name")); group.setSalesforceId(Text.valueOf("")); // Validate empty type group.setType(Text.valueOf("")); group = manageMembers.createMember(group); assertEquals(1, group.getErrors().size()); assertEquals(manageMembers.getMessage("NotBlank.group.type", new ArrayList<String>()), group.getErrors().get(0)); // Validate invalid type group.setType(Text.valueOf("invalid")); group = manageMembers.createMember(group); assertEquals(1, group.getErrors().size()); assertEquals(manageMembers.getMessage("group.type.invalid", new ArrayList<String>()), group.getErrors().get(0)); } @Test public void createMemberProfileWithInvalidSalesforceIdTest() throws Exception { Member group = new Member(); group.setEmail(Text.valueOf("group@email.com")); group.setGroupName(Text.valueOf("Group Name")); group.setType(Text.valueOf("basic")); // Validate empty type group.setSalesforceId(Text.valueOf("1")); group = manageMembers.createMember(group); assertEquals(1, group.getErrors().size()); assertEquals(manageMembers.getMessage("group.salesforce_id.invalid_length", new ArrayList<String>()), group.getErrors().get(0)); // Validate invalid type group.setSalesforceId(Text.valueOf("1234567890abcd!")); group = manageMembers.createMember(group); assertEquals(1, group.getErrors().size()); assertEquals(manageMembers.getMessage("group.salesforce_id.invalid", new ArrayList<String>()), group.getErrors().get(0)); } @Test public void createMemberProfileTest() throws Exception { Member group = new Member(); group.setEmail(Text.valueOf("group@email.com")); group.setGroupName(Text.valueOf("Group Name")); group.setType(Text.valueOf("premium-institution")); group.setSalesforceId(Text.valueOf("")); group = manageMembers.createMember(group); assertEquals(0, group.getErrors().size()); assertFalse(PojoUtil.isEmpty(group.getGroupOrcid())); } @Test public void findMemberByOrcidTest() throws Exception { Member group = new Member(); group.setEmail(Text.valueOf("group@email.com")); group.setGroupName(Text.valueOf("Group Name")); group.setType(Text.valueOf("premium-institution")); group.setSalesforceId(Text.valueOf("1234567890abcde")); group = manageMembers.createMember(group); assertEquals(0, group.getErrors().size()); assertFalse(PojoUtil.isEmpty(group.getGroupOrcid())); // Test find by orcid String orcid = group.getGroupOrcid().getValue(); Member newGroup = manageMembers.findMember(orcid); assertNotNull(newGroup); assertFalse(PojoUtil.isEmpty(newGroup.getGroupOrcid())); assertFalse(PojoUtil.isEmpty(newGroup.getEmail())); assertFalse(PojoUtil.isEmpty(newGroup.getSalesforceId())); assertFalse(PojoUtil.isEmpty(newGroup.getGroupName())); assertEquals("group@email.com", newGroup.getEmail().getValue()); assertEquals("Group Name", newGroup.getGroupName().getValue()); assertEquals("1234567890abcde", newGroup.getSalesforceId().getValue()); assertEquals(orcid, newGroup.getGroupOrcid().getValue()); // Test find by email Member newGroup2 = manageMembers.findMember("group@email.com"); assertNotNull(newGroup2); assertFalse(PojoUtil.isEmpty(newGroup2.getGroupOrcid())); assertFalse(PojoUtil.isEmpty(newGroup2.getEmail())); assertFalse(PojoUtil.isEmpty(newGroup2.getSalesforceId())); assertFalse(PojoUtil.isEmpty(newGroup2.getGroupName())); assertEquals("group@email.com", newGroup2.getEmail().getValue()); assertEquals("Group Name", newGroup2.getGroupName().getValue()); assertEquals("1234567890abcde", newGroup2.getSalesforceId().getValue()); assertEquals(orcid, newGroup2.getGroupOrcid().getValue()); } @Test public void editMemberTest() throws Exception { Member group = new Member(); group.setEmail(Text.valueOf("group@email.com")); group.setGroupName(Text.valueOf("Group Name")); group.setType(Text.valueOf("premium-institution")); group.setSalesforceId(Text.valueOf("1234567890abcde")); group = manageMembers.createMember(group); assertEquals(0, group.getErrors().size()); assertFalse(PojoUtil.isEmpty(group.getGroupOrcid())); group.setEmail(Text.valueOf("new_email@user.com")); group.setSalesforceId(Text.valueOf("")); group.setGroupName(Text.valueOf("Updated Group Name")); manageMembers.updateMember(group); Member updatedGroup = manageMembers.findMember(group.getGroupOrcid().getValue()); assertNotNull(updatedGroup); assertEquals(group.getGroupOrcid().getValue(), updatedGroup.getGroupOrcid().getValue()); assertEquals("Updated Group Name", updatedGroup.getGroupName().getValue()); } @Test public void editMemberWithInvalidEmailTest() throws Exception { //Create one member Member group = new Member(); group.setEmail(Text.valueOf("group@email.com")); group.setGroupName(Text.valueOf("Group Name")); group.setType(Text.valueOf("premium-institution")); group.setSalesforceId(Text.valueOf("1234567890abcde")); group = manageMembers.createMember(group); assertNotNull(group); assertEquals(0, group.getErrors().size()); //Try to create another member with the same email group = new Member(); group.setEmail(Text.valueOf("group@email.com")); group.setGroupName(Text.valueOf("Group Name")); group.setType(Text.valueOf("premium-institution")); group.setSalesforceId(Text.valueOf("1234567890abcde")); group = manageMembers.createMember(group); assertNotNull(group); assertEquals(1, group.getErrors().size()); assertEquals(manageMembers.getMessage("group.email.already_used", new ArrayList<String>()), group.getErrors().get(0)); } @Test public void editMemberWithInvalidSalesforceIdTest() throws Exception { //Create one member Member group = new Member(); group.setEmail(Text.valueOf("group@email.com")); group.setGroupName(Text.valueOf("Group Name")); group.setType(Text.valueOf("premium-institution")); group.setSalesforceId(Text.valueOf("1234567890abcde")); group = manageMembers.createMember(group); assertNotNull(group); assertEquals(0, group.getErrors().size()); //Try to create another member with the same email group = new Member(); group.setEmail(Text.valueOf("group2@email.com")); group.setGroupName(Text.valueOf("Group Name")); group.setType(Text.valueOf("premium-institution")); group.setSalesforceId(Text.valueOf("1234567890abcd!")); group = manageMembers.createMember(group); assertNotNull(group); assertEquals(1, group.getErrors().size()); assertEquals(manageMembers.getMessage("group.salesforce_id.invalid", new ArrayList<String>()), group.getErrors().get(0)); } @Test public void findClientTest() throws Exception { //Client with all redirect uris default Client client_0002 = manageMembers.findClient("APP-0000000000000002"); assertNotNull(client_0002); assertNotNull(client_0002.getDisplayName()); assertEquals("Client # 2", client_0002.getDisplayName().getValue()); assertNotNull(client_0002.getRedirectUris()); assertEquals(1, client_0002.getRedirectUris().size()); assertEquals("http://www.google.com/APP-0000000000000002/redirect/oauth", client_0002.getRedirectUris().get(0).getValue().getValue()); //Client with redirect uri not default Client client_0003 = manageMembers.findClient("APP-0000000000000003"); assertNotNull(client_0003); assertNotNull(client_0003.getDisplayName()); assertEquals("Client # 3", client_0003.getDisplayName().getValue()); assertNotNull(client_0003.getRedirectUris()); assertEquals(2, client_0003.getRedirectUris().size()); RedirectUri rUri1 = client_0003.getRedirectUris().get(0); if("http://www.google.com/APP-0000000000000003/redirect/oauth".equals(rUri1.getValue().getValue())) { assertNotNull(rUri1.getType()); assertEquals("default", rUri1.getType().getValue()); assertNotNull(rUri1.getScopes()); assertEquals(0, rUri1.getScopes().size()); } else if ("http://www.google.com/APP-0000000000000003/redirect/oauth/grant_read_wizard".equals(rUri1.getValue().getValue())) { assertNotNull(rUri1.getType()); assertEquals("grant-read-wizard", rUri1.getType().getValue()); assertNotNull(rUri1.getScopes()); assertEquals(1, rUri1.getScopes().size()); assertEquals("/funding/read-limited", rUri1.getScopes().get(0)); } else { fail("Invalid redirect uri: " + rUri1.getValue().getValue()); } RedirectUri rUri2 = client_0003.getRedirectUris().get(1); if("http://www.google.com/APP-0000000000000003/redirect/oauth".equals(rUri2.getValue().getValue())) { assertNotNull(rUri2.getType()); assertEquals("default", rUri2.getType().getValue()); assertNotNull(rUri2.getScopes()); assertEquals(1, rUri2.getScopes().size()); assertEquals("", rUri2.getScopes().get(0)); } else if ("http://www.google.com/APP-0000000000000003/redirect/oauth/grant_read_wizard".equals(rUri2.getValue().getValue())) { assertNotNull(rUri2.getType()); assertEquals("grant-read-wizard", rUri2.getType().getValue()); assertNotNull(rUri2.getScopes()); assertEquals(1, rUri2.getScopes().size()); assertEquals("/funding/read-limited", rUri2.getScopes().get(0)); } else { fail("Invalid redirect uri: " + rUri2.getValue().getValue()); } } @Test public void editClientWithInvalidRedirectUriTest() throws Exception { //Client with all redirect uris default Client client_0002 = manageMembers.findClient("APP-0000000000000002"); assertNotNull(client_0002); RedirectUri rUri = new RedirectUri(); rUri.setType(Text.valueOf("default")); rUri.setValue(Text.valueOf("1.com")); client_0002.getRedirectUris().add(rUri); client_0002 = manageMembers.updateClient(client_0002); assertNotNull(client_0002); assertEquals(1, client_0002.getErrors().size()); assertEquals(manageMembers.getMessage("common.invalid_url"), client_0002.getErrors().get(0)); } @Test public void editMemberDoesntChangePersistentTokenEnabledValueTest() throws Exception { Client clientWithPersistentTokensEnabled = manageMembers.findClient("APP-0000000000000001"); assertNotNull(clientWithPersistentTokensEnabled); assertNotNull(clientWithPersistentTokensEnabled.getDisplayName()); assertEquals("Client # 1", clientWithPersistentTokensEnabled.getDisplayName().getValue()); assertNotNull(clientWithPersistentTokensEnabled.getPersistentTokenEnabled()); assertTrue(clientWithPersistentTokensEnabled.getPersistentTokenEnabled().getValue()); clientWithPersistentTokensEnabled.getDisplayName().setValue("Updated Name"); manageMembers.updateClient(clientWithPersistentTokensEnabled); Client updatedClient = manageMembers.findClient("APP-0000000000000001"); assertNotNull(updatedClient); assertNotNull(updatedClient.getDisplayName()); assertEquals("Updated Name", updatedClient.getDisplayName().getValue()); assertNotNull(updatedClient.getPersistentTokenEnabled()); assertTrue(updatedClient.getPersistentTokenEnabled().getValue()); } @Test public void editGroupTypeTest() throws Exception { Member group_0000 = manageMembers.findMember("5555-5555-5555-0000"); assertNotNull(group_0000); assertNotNull(group_0000.getType()); assertEquals(MemberType.PREMIUM_INSTITUTION.value(), group_0000.getType().getValue()); // Update group type to basic group_0000.setType(Text.valueOf(MemberType.BASIC.value())); manageMembers.updateMember(group_0000); group_0000 = manageMembers.findMember("5555-5555-5555-0000"); assertNotNull(group_0000); assertNotNull(group_0000.getType()); assertEquals(MemberType.BASIC.value(), group_0000.getType().getValue()); } }