package org.gbif.ipt.service.registry.impl; import org.gbif.api.model.common.DOI; import org.gbif.ipt.config.ConfigWarnings; import org.gbif.ipt.model.Ipt; import org.gbif.ipt.model.Organisation; import org.gbif.ipt.model.Resource; import org.gbif.ipt.model.User; import org.gbif.ipt.model.VersionHistory; import org.gbif.ipt.model.voc.DOIRegistrationAgency; import org.gbif.ipt.model.voc.IdentifierStatus; import org.gbif.ipt.model.voc.PublicationStatus; import org.gbif.ipt.service.admin.RegistrationManager; import org.gbif.ipt.service.manage.ResourceManager; import org.gbif.ipt.service.registry.RegistryManager; import org.gbif.ipt.struts2.SimpleTextProvider; import org.gbif.ipt.utils.DOIUtils; import org.gbif.ipt.utils.IptMockBaseTest; import org.gbif.metadata.eml.Eml; import org.gbif.utils.HttpUtil; import java.math.BigDecimal; import java.util.Date; import java.util.List; import java.util.UUID; import javax.xml.parsers.ParserConfigurationException; import com.google.common.collect.Lists; import org.apache.log4j.Logger; import org.junit.Before; import org.junit.Test; import org.xml.sax.SAXException; 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 static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; /** * Integration tests hitting sandbox registry (legacy) web services. */ public class RegistryManagerImplIT extends IptMockBaseTest { // logging private static final Logger LOG = Logger.getLogger(RegistryManagerImplTest.class); // organisation below must exist in sandbox registry! private static final String ORGANISATION_UUID = "62922b92-69d1-4c4b-831c-b23d5412a124"; private static final String ORGANISATION_PASSWORD = "password"; private static final String ORGANISATION_NAME = "Test Organisation Jenkins"; private RegistryManager manager; private ResourceManager resourceManager; @Before public void setup() throws SAXException, ParserConfigurationException { ConfigWarnings mockConfigWarnings = mock(ConfigWarnings.class); SimpleTextProvider mockSimpleTextProvider = mock(SimpleTextProvider.class); RegistrationManager mockRegistrationManager = mock(RegistrationManager.class); resourceManager = mock(ResourceManager.class); // manager that issues real http requests manager = new RegistryManagerImpl(cfg, dataDir, new HttpUtil(buildHttpClient()), buildSaxFactory(), mockConfigWarnings, mockSimpleTextProvider, mockRegistrationManager, resourceManager); } @Test public void testRegisterResource() { try { // construct organisation Organisation organisation = new Organisation(); organisation.setKey(ORGANISATION_UUID); organisation.setName(ORGANISATION_NAME); organisation.setPassword(ORGANISATION_PASSWORD); // construct IPT Ipt ipt = new Ipt(); ipt.setCreated(new Date()); ipt.setDescription("a unit test mock IPT"); ipt.setPrimaryContactName("Ms. IPT Admin"); ipt.setPrimaryContactEmail("gbif@mailinator.com"); ipt.setPrimaryContactType("technical"); ipt.setLanguage("en"); ipt.setName("Mock IPT"); ipt.setWsPassword("wsPassword"); // register IPT String iptKey = manager.registerIPT(ipt, organisation); LOG.info("IPT registered successfully, key=" + iptKey); ipt.setKey(iptKey); ipt.setOrganisationKey(ORGANISATION_UUID); // construct resource Resource res = new Resource(); User user = new User(); user.setFirstname("Mock Name"); user.setEmail("mocking@themock.org"); res.setCreator(user); res.setShortname("mock"); res.setTitle("Möck rèşürçe wíŧħ ƒũñňÿ ćĥåřæċŧëŗş"); res.setCreated(new Date()); res.setSubtype("occurrence test"); // mock assigning a DOI to the resource. To be assigned/registered, the last published version DOI must be public VersionHistory history = new VersionHistory(new BigDecimal("1.1"), new Date(), PublicationStatus.PUBLIC); history.setModifiedBy(user); DOI doi = DOIUtils.mintDOI(DOIRegistrationAgency.DATACITE, "10.5072"); history.setDoi(doi); history.setStatus(IdentifierStatus.PUBLIC); res.setDoi(doi); res.setIdentifierStatus(IdentifierStatus.PUBLIC); res.addVersionHistory(history); assertTrue(res.isAlreadyAssignedDoi()); res.setLastPublished(new Date()); Eml eml = new Eml(); List<String> description = Lists.newArrayList(); description.add( "An IPT unit test resource that can be deleted. Testing unicode characters like ą ć ę ł ń ś ź ż (for polish) ť ů ž č ď ě ň ř š (for czech) and other taken from http://www.alanflavell.org.uk/unicode/unidata.html ᠀᠔ᡎᢥ(mongolian) ⅛ Ⅳ ⅸ ↂ (numbers) ∀ ∰ ⊇ ⋩ (maths) CJK Symbols and Punctuation U+3000 – U+303F (12288–12351) 々 〒 〣 〰 Hiragana U+3040 – U+309F (12352–12447) あ ぐ る ゞ Katakana U+30A0 – U+30FF (12448–12543) ア ヅ ヨ ヾ Bopomofo U+3100 – U+312F (12544–12591) ㄆ ㄓ ㄝ ㄩ Hangul Compatibility Jamo U+3130 – U+318F (12592–12687) ㄱ ㄸ ㅪ ㆍ Kanbun U+3190 – U+319F (12688–12703) ㆐ ㆕ ㆚ ㆟ Bopomofo Extended U+31A0 – U+32BF (12704–12735) ㆠ ㆧ ㆯ ㆷ Katakana Phonetic Extensions U+31F0 – U+31FF (12784–12799) ㇰ ㇵ ㇺ ㇿ Enclosed CJK Letters and Months U+3200 – U+32FF (12800–13055) ㈔ ㈲ ㊧ ㋮ CJK Compatibility U+3300 – U+33FF (13056–13311) ㌃ ㍻ ㎡ ㏵ CJK Unified Ideographs Extension A U+3400 – U+4DB5 (13312–19893) 㐅 㒅 㝬 㿜 Yijing Hexagram Symbols U+4DC0 – U+4DFF (19904–19967) ䷂ ䷫ ䷴ ䷾ CJK Unified Ideographs U+4E00 – U+9FFF (19968–40959) 一 憨 田 龥 Yi Syllables U+A000 – U+A48F (40960–42127) ꀀ ꅴ ꊩ ꒌ Yi Radicals U+A490 – U+A4CF (42128–42191) ꒐ ꒡ ꒰ ꓆ "); eml.setAbstract(description); res.setEml(eml); // register resource UUID uuid = manager.register(res, organisation, ipt); assertNotNull(uuid); LOG.info("Resource registered successfully, key=" + uuid.toString()); // apply result of registration res.setKey(uuid); res.setStatus(PublicationStatus.REGISTERED); // update resource assertTrue(res.isRegistered()); manager.updateResource(res, iptKey); // mock resourceManager returning registered resource in list of resources List<Resource> registeredResources = Lists.newArrayList(); registeredResources.add(res); when(resourceManager.list(PublicationStatus.REGISTERED)).thenReturn(registeredResources); // update IPT, which updates IPT registration and all registered resources registrations also manager.updateIpt(ipt); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } @Test public void testValidateOrganisation() { try { // validate organisation "Test Organisation Jenkins" exists in sandbox registry assertTrue(manager.validateOrganisation(ORGANISATION_UUID, ORGANISATION_PASSWORD)); // ensure validate using invalid key or invalid password works as expected assertFalse(manager.validateOrganisation("INVALID92-69d1-4c4b-831c-b23d5412a124", ORGANISATION_PASSWORD)); assertFalse(manager.validateOrganisation(ORGANISATION_UUID, "INVALID")); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } }