/**
* =============================================================================
*
* 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;
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.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.Resource;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.orcid.core.BaseTest;
import org.orcid.core.exception.OrcidClientGroupManagementException;
import org.orcid.core.utils.SecurityContextTestUtils;
import org.orcid.jaxb.model.clientgroup.ClientType;
import org.orcid.jaxb.model.clientgroup.MemberType;
import org.orcid.jaxb.model.clientgroup.OrcidClient;
import org.orcid.jaxb.model.clientgroup.OrcidClientGroup;
import org.orcid.jaxb.model.clientgroup.RedirectUri;
import org.orcid.jaxb.model.clientgroup.RedirectUriType;
import org.orcid.jaxb.model.clientgroup.RedirectUris;
import org.orcid.jaxb.model.message.ScopePathType;
import org.orcid.persistence.jpa.entities.ClientDetailsEntity;
import org.orcid.test.TargetProxyHelper;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;
/**
*
* @author Will Simpson
*
*/
public class OrcidClientGroupManagerTest extends BaseTest {
@Resource
private OrcidProfileManager orcidProfileManager;
@Resource
private OrcidClientGroupManager orcidClientGroupManager;
@Resource
private TransactionTemplate transactionTemplate;
@Resource
private ClientDetailsManager clientDetailsManager;
@Mock
private OrcidIndexManager orcidIndexManager;
private OrcidClientGroup group = null;
private final String email = "orcid-admin@elsevier.com";
{
group = new OrcidClientGroup();
group.setGroupName("Elsevier");
group.setEmail(email);
group.setType(MemberType.PREMIUM);
OrcidClient client1 = new OrcidClient();
client1.setType(ClientType.UPDATER);
client1.setDisplayName("Ecological Complexity");
client1.setWebsite("http://www.journals.elsevier.com/ecological-complexity");
client1.setIdp("IdP-1");
client1.setShortDescription("An International Journal on Biocomplexity in the Environment and Theoretical Ecology");
RedirectUris rUris = new RedirectUris();
RedirectUri r1 = new RedirectUri();
r1.setScope(Arrays.asList(ScopePathType.fromValue("/orcid-profile/create"), ScopePathType.fromValue("/orcid-bio/read-limited")));
r1.setType(RedirectUriType.GRANT_READ_WIZARD);
r1.setValue("http://www.journals.elsevier.com/ecological-complexity/orcid-callback");
rUris.getRedirectUri().add(r1);
client1.setRedirectUris(rUris);
OrcidClient client2 = new OrcidClient();
client2.setType(ClientType.UPDATER);
client2.setDisplayName("Ecological Economics");
client2.setWebsite("http://www.journals.elsevier.com/ecological-economics");
client2.setIdp("IdP-2");
client2.setShortDescription("The Transdisciplinary Journal of the International Society for Ecological Economics (ISEE)");
RedirectUris rUris2 = new RedirectUris();
RedirectUri r2 = new RedirectUri();
r2.setScope(Arrays.asList(ScopePathType.fromValue("/orcid-bio/read-limited")));
r2.setType(RedirectUriType.DEFAULT);
r2.setValue("http://www.journals.elsevier.com/ecological-economics/orcid-callback");
rUris2.getRedirectUri().add(r2);
client2.setRedirectUris(rUris2);
group.getOrcidClient().add(client1);
group.getOrcidClient().add(client2);
}
@Before
public void initMocks() throws Exception {
removeDBUnitData(Collections.<String> emptyList());
TargetProxyHelper.injectIntoProxy(orcidProfileManager, "orcidIndexManager", orcidIndexManager);
SecurityContextTestUtils.setUpSecurityContextForAnonymous();
group.setEmail(group.getEmail() + System.currentTimeMillis());
}
@After
public void after() {
group.setEmail(email);
}
@Test
public void testCreateOrcidClientGroup() {
OrcidClientGroup createdGroup = orcidClientGroupManager.createOrUpdateOrcidClientGroup(group);
assertNotNull(createdGroup);
assertEquals(group.getGroupName(), createdGroup.getGroupName());
assertEquals(group.getEmail(), createdGroup.getEmail());
assertNotNull(createdGroup.getGroupOrcid());
List<OrcidClient> createdClients = createdGroup.getOrcidClient();
assertNotNull(createdClients);
assertEquals(2, createdClients.size());
Map<String, OrcidClient> createdClientsMappedByName = new HashMap<String, OrcidClient>();
for (OrcidClient createdClient : createdClients) {
assertNotNull(createdClient.getClientId());
assertNotNull(createdClient.getClientSecret());
assertNotNull(createdClient.getIdp());
createdClientsMappedByName.put(createdClient.getDisplayName(), createdClient);
}
OrcidClient complexityClient = createdClientsMappedByName.get("Ecological Complexity");
assertNotNull(complexityClient);
assertEquals("http://www.journals.elsevier.com/ecological-complexity", complexityClient.getWebsite());
assertEquals("An International Journal on Biocomplexity in the Environment and Theoretical Ecology", complexityClient.getShortDescription());
List<RedirectUri> createdRedirectUris = complexityClient.getRedirectUris().getRedirectUri();
assertNotNull(createdRedirectUris);
assertEquals(1, createdRedirectUris.size());
assertEquals("http://www.journals.elsevier.com/ecological-complexity/orcid-callback", createdRedirectUris.get(0).getValue());
assertEquals("grant-read-wizard", createdRedirectUris.get(0).getType().value());
List<ScopePathType> scopesForRedirect = createdRedirectUris.get(0).getScope();
assertTrue(scopesForRedirect.size() == 2);
assertTrue(scopesForRedirect.contains(ScopePathType.ORCID_PROFILE_CREATE) && scopesForRedirect.contains(ScopePathType.ORCID_BIO_READ_LIMITED));
assertEquals("http://www.journals.elsevier.com/ecological-complexity/orcid-callback", createdRedirectUris.get(0).getValue());
assertEquals("grant-read-wizard", createdRedirectUris.get(0).getType().value());
// Look up client details directly to check scopes
ClientDetailsEntity complexityEntity = clientDetailsManager.findByClientId(complexityClient.getClientId());
Set<String> clientScopeTypes = complexityEntity.getScope();
assertNotNull(clientScopeTypes);
assertTrue(clientScopeTypes.contains("/orcid-bio/update"));
assertTrue(clientScopeTypes.contains("/orcid-bio/read-limited"));
assertTrue(clientScopeTypes.contains("/orcid-works/read-limited"));
assertFalse(clientScopeTypes.contains("/orcid-profile/create"));
assertTrue(clientScopeTypes.contains("/authenticate"));
}
@Test
public void testCreateOrcidCreatorClientGroup() {
OrcidClientGroup createdGroup = orcidClientGroupManager.createOrUpdateOrcidClientGroup(group);
assertNotNull(createdGroup);
assertEquals(group.getGroupName(), createdGroup.getGroupName());
assertEquals(group.getEmail(), createdGroup.getEmail());
assertNotNull(createdGroup.getGroupOrcid());
List<OrcidClient> createdClients = createdGroup.getOrcidClient();
assertNotNull(createdClients);
assertEquals(2, createdClients.size());
Map<String, OrcidClient> createdClientsMappedByName = new HashMap<String, OrcidClient>();
for (OrcidClient createdClient : createdClients) {
assertNotNull(createdClient.getClientId());
assertNotNull(createdClient.getClientSecret());
assertNotNull(createdClient.getIdp());
createdClientsMappedByName.put(createdClient.getDisplayName(), createdClient);
}
OrcidClient complexityClient = createdClientsMappedByName.get("Ecological Complexity");
assertNotNull(complexityClient);
assertEquals("http://www.journals.elsevier.com/ecological-complexity", complexityClient.getWebsite());
assertEquals("An International Journal on Biocomplexity in the Environment and Theoretical Ecology", complexityClient.getShortDescription());
List<RedirectUri> createdRedirectUris = complexityClient.getRedirectUris().getRedirectUri();
assertNotNull(createdRedirectUris);
assertEquals(1, createdRedirectUris.size());
assertEquals("http://www.journals.elsevier.com/ecological-complexity/orcid-callback", createdRedirectUris.get(0).getValue());
// Look up client details directly to check scopes
ClientDetailsEntity complexityEntity = clientDetailsManager.findByClientId(complexityClient.getClientId());
Set<String> clientScopeTypes = complexityEntity.getScope();
assertNotNull(clientScopeTypes);
assertTrue(clientScopeTypes.contains("/orcid-profile/read-limited"));
assertTrue(clientScopeTypes.contains("/orcid-bio/read-limited"));
assertTrue(clientScopeTypes.contains("/orcid-works/read-limited"));
}
@Test
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void testUpdateOrcidClientGroup() {
OrcidClientGroup createdGroup = transactionTemplate.execute(new TransactionCallback<OrcidClientGroup>() {
public OrcidClientGroup doInTransaction(TransactionStatus status) {
return orcidClientGroupManager.createOrUpdateOrcidClientGroup(group);
}
});
createdGroup.setEmail("admin@somethingelse.com");
for (OrcidClient createdClient : createdGroup.getOrcidClient()) {
if ("Ecological Complexity".equals(createdClient.getDisplayName())) {
createdClient.setWebsite("wwww.ecologicalcomplexity.com");
}
}
OrcidClientGroup updatedGroup = orcidClientGroupManager.createOrUpdateOrcidClientGroup(createdGroup);
assertNotNull(updatedGroup);
assertEquals("Elsevier", updatedGroup.getGroupName());
assertEquals("admin@somethingelse.com", updatedGroup.getEmail());
assertNotNull(updatedGroup.getGroupOrcid());
List<OrcidClient> updatedClients = updatedGroup.getOrcidClient();
assertNotNull(updatedClients);
assertEquals(2, updatedClients.size());
Map<String, OrcidClient> updatedClientsMappedByName = new HashMap<String, OrcidClient>();
for (OrcidClient upatedClient : updatedClients) {
assertNotNull(upatedClient.getClientId());
assertNotNull(upatedClient.getClientSecret());
updatedClientsMappedByName.put(upatedClient.getDisplayName(), upatedClient);
}
OrcidClient complexityClient = updatedClientsMappedByName.get("Ecological Complexity");
assertNotNull(complexityClient);
assertEquals("wwww.ecologicalcomplexity.com", complexityClient.getWebsite());
assertEquals("An International Journal on Biocomplexity in the Environment and Theoretical Ecology", complexityClient.getShortDescription());
List<RedirectUri> updatedRedirectUris = complexityClient.getRedirectUris().getRedirectUri();
assertNotNull(updatedRedirectUris);
assertEquals(1, updatedRedirectUris.size());
Collections.sort(updatedRedirectUris, new Comparator<RedirectUri>() {
public int compare(RedirectUri redirectUri1, RedirectUri redirectUri2) {
return ((String) redirectUri1.getValue()).compareToIgnoreCase((String) redirectUri1.getValue());
}
});
assertEquals("http://www.journals.elsevier.com/ecological-complexity/orcid-callback", updatedRedirectUris.get(0).getValue());
List<ScopePathType> scopesForRedirect = updatedRedirectUris.get(0).getScope();
assertTrue(scopesForRedirect.size() == 2);
assertTrue(scopesForRedirect.contains(ScopePathType.ORCID_PROFILE_CREATE) && scopesForRedirect.contains(ScopePathType.ORCID_BIO_READ_LIMITED));
}
@Test
public void testGetOrcidClientList() {
OrcidClientGroup createdGroup = orcidClientGroupManager.createOrUpdateOrcidClientGroup(group);
createdGroup = orcidClientGroupManager.retrieveOrcidClientGroup(createdGroup.getGroupOrcid());
assertNotNull(createdGroup);
assertNotNull(createdGroup.getOrcidClient());
assertEquals(2, createdGroup.getOrcidClient().size());
}
@Test
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void testAddMoreThanOneClientToBasicGroup() {
final OrcidClientGroup group = new OrcidClientGroup();
group.setGroupName("Elsevier");
group.setEmail("basic-member@elsevier.com" + System.currentTimeMillis());
group.setType(MemberType.BASIC);
OrcidClientGroup createdGroup = transactionTemplate.execute(new TransactionCallback<OrcidClientGroup>() {
public OrcidClientGroup doInTransaction(TransactionStatus status) {
return orcidClientGroupManager.createOrUpdateOrcidClientGroup(group);
}
});
RedirectUris redirectUris = new RedirectUris();
RedirectUri redirectUri = new RedirectUri("http://uri.com");
redirectUris.getRedirectUri().add(redirectUri);
OrcidClient client1 = new OrcidClient();
client1.setDisplayName("Name");
client1.setRedirectUris(redirectUris);
client1.setShortDescription("Description");
client1.setType(ClientType.UPDATER);
client1.setWebsite("http://site.com");
// Add one client
try {
orcidClientGroupManager.createAndPersistClientProfile(createdGroup.getGroupOrcid(), client1);
} catch (OrcidClientGroupManagementException e) {
fail();
}
OrcidClient client2 = new OrcidClient();
client2.setDisplayName("Name");
client2.setRedirectUris(redirectUris);
client2.setShortDescription("Description");
client2.setType(ClientType.UPDATER);
client2.setWebsite("http://site.com");
// Add other client should fail
try {
orcidClientGroupManager.createAndPersistClientProfile(createdGroup.getGroupOrcid(), client2);
fail();
} catch (OrcidClientGroupManagementException e) {
}
}
@Test
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void testAddCreatorToBasicGroup() {
final OrcidClientGroup group = new OrcidClientGroup();
group.setGroupName("Elsevier");
group.setEmail("basic-member@elsevier.com" + System.currentTimeMillis());
group.setType(MemberType.PREMIUM);
OrcidClientGroup createdGroup = transactionTemplate.execute(new TransactionCallback<OrcidClientGroup>() {
public OrcidClientGroup doInTransaction(TransactionStatus status) {
return orcidClientGroupManager.createOrUpdateOrcidClientGroup(group);
}
});
RedirectUris redirectUris = new RedirectUris();
RedirectUri redirectUri = new RedirectUri("http://uri.com");
redirectUris.getRedirectUri().add(redirectUri);
OrcidClient client1 = new OrcidClient();
client1.setDisplayName("Name");
client1.setRedirectUris(redirectUris);
client1.setShortDescription("Description");
client1.setType(ClientType.CREATOR);
client1.setWebsite("http://site.com");
// Add one creator client to a basic group should fail
try {
OrcidClient orcidClient = orcidClientGroupManager.createAndPersistClientProfile(createdGroup.getGroupOrcid(), client1);
assertEquals(ClientType.UPDATER, orcidClient.getType());
} catch (OrcidClientGroupManagementException e) {
}
}
@Test
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void testAddMoreThanOneClientToBasicInstitutionGroup() {
final OrcidClientGroup group = new OrcidClientGroup();
group.setGroupName("Elsevier");
group.setEmail("basic-institution-member@elsevier.com" + System.currentTimeMillis());
group.setType(MemberType.BASIC_INSTITUTION);
OrcidClientGroup createdGroup = transactionTemplate.execute(new TransactionCallback<OrcidClientGroup>() {
public OrcidClientGroup doInTransaction(TransactionStatus status) {
return orcidClientGroupManager.createOrUpdateOrcidClientGroup(group);
}
});
RedirectUris redirectUris = new RedirectUris();
RedirectUri redirectUri = new RedirectUri("http://uri.com");
redirectUris.getRedirectUri().add(redirectUri);
OrcidClient client1 = new OrcidClient();
client1.setDisplayName("Name");
client1.setRedirectUris(redirectUris);
client1.setShortDescription("Description");
client1.setType(ClientType.CREATOR);
client1.setWebsite("http://site.com");
// Add one client
try {
orcidClientGroupManager.createAndPersistClientProfile(createdGroup.getGroupOrcid(), client1);
} catch (OrcidClientGroupManagementException e) {
fail();
}
OrcidClient client2 = new OrcidClient();
client2.setDisplayName("Name");
client2.setRedirectUris(redirectUris);
client2.setShortDescription("Description");
client2.setType(ClientType.CREATOR);
client2.setWebsite("http://site.com");
// Add other client should fail
try {
orcidClientGroupManager.createAndPersistClientProfile(createdGroup.getGroupOrcid(), client2);
fail();
} catch (OrcidClientGroupManagementException e) {
}
}
@Test
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void testAddUpdaterToBasicInstitutionGroup() {
final OrcidClientGroup group = new OrcidClientGroup();
group.setGroupName("Elsevier");
group.setEmail("basic-institution-member@elsevier.com" + System.currentTimeMillis());
group.setType(MemberType.BASIC_INSTITUTION);
OrcidClientGroup createdGroup = transactionTemplate.execute(new TransactionCallback<OrcidClientGroup>() {
public OrcidClientGroup doInTransaction(TransactionStatus status) {
return orcidClientGroupManager.createOrUpdateOrcidClientGroup(group);
}
});
RedirectUris redirectUris = new RedirectUris();
RedirectUri redirectUri = new RedirectUri("http://uri.com");
redirectUris.getRedirectUri().add(redirectUri);
OrcidClient client1 = new OrcidClient();
client1.setDisplayName("Name");
client1.setRedirectUris(redirectUris);
client1.setShortDescription("Description");
client1.setType(ClientType.UPDATER);
client1.setWebsite("http://site.com");
// Add one creator client to a basic group should fail
try {
OrcidClient orcidClient = orcidClientGroupManager.createAndPersistClientProfile(createdGroup.getGroupOrcid(), client1);
assertEquals(orcidClient.getType(), ClientType.CREATOR);
} catch (OrcidClientGroupManagementException e) {
}
}
@Test
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void testAddCreatorToPremiumGroup() {
final OrcidClientGroup group = new OrcidClientGroup();
group.setGroupName("Elsevier");
group.setEmail("premium-member@elsevier.com" + System.currentTimeMillis());
group.setType(MemberType.PREMIUM);
OrcidClientGroup createdGroup = transactionTemplate.execute(new TransactionCallback<OrcidClientGroup>() {
public OrcidClientGroup doInTransaction(TransactionStatus status) {
return orcidClientGroupManager.createOrUpdateOrcidClientGroup(group);
}
});
RedirectUris redirectUris = new RedirectUris();
RedirectUri redirectUri = new RedirectUri("http://uri.com");
redirectUris.getRedirectUri().add(redirectUri);
OrcidClient client1 = new OrcidClient();
client1.setDisplayName("Name");
client1.setRedirectUris(redirectUris);
client1.setShortDescription("Description");
client1.setType(ClientType.CREATOR);
client1.setWebsite("http://site.com");
// Add one creator client to a premium group should fail
try {
OrcidClient orcidClient = orcidClientGroupManager.createAndPersistClientProfile(createdGroup.getGroupOrcid(), client1);
assertEquals(orcidClient.getType(), ClientType.PREMIUM_UPDATER);
} catch (OrcidClientGroupManagementException e) {
}
}
@Test
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void testAddUpdaterToPremiumInstitutionGroup() {
final OrcidClientGroup group = new OrcidClientGroup();
group.setGroupName("Elsevier");
group.setEmail("premium-institution-member@elsevier.com" + System.currentTimeMillis());
group.setType(MemberType.PREMIUM_INSTITUTION);
OrcidClientGroup createdGroup = transactionTemplate.execute(new TransactionCallback<OrcidClientGroup>() {
public OrcidClientGroup doInTransaction(TransactionStatus status) {
return orcidClientGroupManager.createOrUpdateOrcidClientGroup(group);
}
});
RedirectUris redirectUris = new RedirectUris();
RedirectUri redirectUri = new RedirectUri("http://uri.com");
redirectUris.getRedirectUri().add(redirectUri);
OrcidClient client1 = new OrcidClient();
client1.setDisplayName("Name");
client1.setRedirectUris(redirectUris);
client1.setShortDescription("Description");
client1.setType(ClientType.UPDATER);
client1.setWebsite("http://site.com");
// Add one creator client to a premium group should fail
try {
OrcidClient orcidClient = orcidClientGroupManager.createAndPersistClientProfile(createdGroup.getGroupOrcid(), client1);
assertEquals(orcidClient.getType(), ClientType.PREMIUM_CREATOR);
} catch (OrcidClientGroupManagementException e) {
}
}
@Test
public void testUpdateGroup() {
final OrcidClientGroup createdGroup = transactionTemplate.execute(new TransactionCallback<OrcidClientGroup>() {
public OrcidClientGroup doInTransaction(TransactionStatus status) {
return orcidClientGroupManager.createOrUpdateOrcidClientGroup(group);
}
});
assertNotNull(createdGroup);
assertEquals(MemberType.PREMIUM, createdGroup.getType());
Set<String> premiumScopes = orcidClientGroupManager.premiumUpdaterScopes();
//Get existing clients
List<ClientDetailsEntity> clients = clientDetailsManager.findByGroupId(createdGroup.getGroupOrcid());
assertEquals(2, clients.size());
for(ClientDetailsEntity clientDetails : clients) {
assertEquals(ClientType.PREMIUM_UPDATER, clientDetails.getClientType());
assertTrue(clientDetails.isScoped());
assertEquals(premiumScopes.size(), clientDetails.getScope().size());
}
//Update the group type
createdGroup.setType(MemberType.PREMIUM_INSTITUTION);
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
orcidClientGroupManager.updateGroup(createdGroup);
}
});
Set<String> premiumInstitutionScopes = orcidClientGroupManager.premiumCreatorScopes();
clients = clientDetailsManager.findByGroupId(createdGroup.getGroupOrcid());
assertEquals(2, clients.size());
for(ClientDetailsEntity clientDetails : clients) {
assertEquals(ClientType.PREMIUM_CREATOR, clientDetails.getClientType());
assertTrue(clientDetails.isScoped());
assertEquals(premiumInstitutionScopes.size(), clientDetails.getScope().size());
}
}
}