/**
* =============================================================================
*
* 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.mockito.Mockito.doNothing;
import static org.mockito.Mockito.when;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.annotation.Resource;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
import org.mockito.Matchers;
import org.mockito.Mock;
import org.orcid.core.BaseTest;
import org.orcid.persistence.jpa.entities.ClientDetailsEntity;
import org.orcid.persistence.jpa.entities.IdentifierTypeEntity;
import org.orcid.persistence.jpa.entities.SourceEntity;
import org.orcid.pojo.IdentifierType;
import org.orcid.test.TargetProxyHelper;
import org.springframework.test.annotation.Rollback;
import org.springframework.transaction.annotation.Transactional;
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class IdentifierTypeManagerTest extends BaseTest {
private static final String CLIENT_1_ID = "APP-6666666666666666";
private static final List<String> DATA_FILES = Arrays.asList("/data/SecurityQuestionEntityData.xml", "/data/SourceClientDetailsEntityData.xml",
"/data/ProfileEntityData.xml", "/data/ClientDetailsEntityData.xml");
@BeforeClass
public static void initDBUnitData() throws Exception {
initDBUnitData(DATA_FILES);
}
@AfterClass
public static void removeDBUnitData() throws Exception {
removeDBUnitData(DATA_FILES);
}
@Mock
private SourceManager sourceManager;
@Mock
private OrcidSecurityManager securityManager;
@Resource
private IdentifierTypeManager idTypeMan;
private List<String> v2Ids = Arrays.asList(new String[]{"pdb","kuid", "lensid","cienciaiul"});
@Before
public void before() throws Exception {
TargetProxyHelper.injectIntoProxy(idTypeMan, "sourceManager", sourceManager);
TargetProxyHelper.injectIntoProxy(idTypeMan, "securityManager", securityManager);
doNothing().when(securityManager).checkSource(Matchers.any(IdentifierTypeEntity.class));
when(sourceManager.retrieveSourceEntity()).thenReturn(new SourceEntity(new ClientDetailsEntity(CLIENT_1_ID)));
}
@Test
public void test0FetchEntities(){
Map<String,IdentifierType> map = idTypeMan.fetchIdentifierTypesByAPITypeName(null);
assertEquals(34+v2Ids.size(), map.size());
checkExists(map,"other-id");
for (String id : v2Ids){
checkExists(map, id);
}
}
private void checkExists(Map<String, IdentifierType> map, String id) {
assertTrue(map.containsKey(id));
assertEquals(id,map.get(id).getName());
assertNotNull(map.get(id).getPutCode());
}
@Test
public void test1FetchIdentifier(){
IdentifierType id = idTypeMan.fetchIdentifierTypeByDatabaseName("DOI",Locale.FRANCE);
assertEquals("doi",id.getName());
assertEquals("doi: Identificateur dobjet numérique",id.getDescription());
id = idTypeMan.fetchIdentifierTypeByDatabaseName("OTHER_ID",null);
assertEquals("other-id",id.getName());
assertFalse(id.getCaseSensitive());
assertEquals("Other identifier type",id.getDescription());
}
@Test
@Transactional
@Rollback
public void test2CreateAndUpdateIdentifier(){
IdentifierType id = idTypeMan.createIdentifierType(createIdentifierType(1));
assertNotNull(id);
assertNotNull(id.getPutCode());
assertTrue(new Date().after(id.getDateCreated()));
id = idTypeMan.fetchIdentifierTypeByDatabaseName("TEST1",null);
assertNotNull(id);
id = idTypeMan.fetchIdentifierTypeByDatabaseName("TEST1",null);
Date last = id.getLastModified();
id.setValidationRegex("test");
id = idTypeMan.updateIdentifierType(id);
assertTrue(last.before(id.getLastModified()));
id = idTypeMan.fetchIdentifierTypeByDatabaseName("TEST1",null);
assertEquals("test1",id.getName());
assertEquals("test",id.getValidationRegex());
assertTrue(last.getTime() < id.getLastModified().getTime());
}
public void testPrefixSearch(){
List<IdentifierType> types = idTypeMan.queryByPrefix("do", null);
boolean foundDOI = false;
boolean foundASIN = false;
boolean foundScopus = false;
for (IdentifierType t: types){
if (t.getName().equals("doi"))
foundDOI = true;
if (t.getName().equals("asin-tld")) // has "domain" in the description
foundASIN = true;
if (t.getName().equals("eid"))
foundScopus = true;
}
assertTrue(foundDOI);
assertTrue(foundASIN);
assertFalse(foundScopus);
}
private IdentifierType createIdentifierType(int seed){
IdentifierType id = new IdentifierType();
id.setName("test"+seed);
id.setDeprecated(true);
id.setResolutionPrefix("prefix"+seed);
id.setValidationRegex("validation"+seed);
id.setDateCreated(new Date(10,10,10));
id.setLastModified(new Date(11,11,11));
ClientDetailsEntity client = new ClientDetailsEntity();
client.setClientName(CLIENT_1_ID);
id.setSourceClient(client);
id.setPrimaryUse("pu"+seed);
id.setCaseSensitive(true);
return id;
}
}