/*************************************************************************** * Copyright 2010 Global Biodiversity Information Facility Secretariat * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. ***************************************************************************/ package org.gbif.ipt.validation; import org.gbif.api.vocabulary.Language; import org.gbif.ipt.action.BaseAction; import org.gbif.ipt.config.AppConfig; import org.gbif.ipt.model.Organisation; import org.gbif.ipt.model.Resource; import org.gbif.ipt.model.voc.MetadataSection; import org.gbif.ipt.service.admin.RegistrationManager; import org.gbif.ipt.struts2.SimpleTextProvider; import org.gbif.metadata.eml.Agent; import org.gbif.metadata.eml.BBox; import org.gbif.metadata.eml.Collection; import org.gbif.metadata.eml.Eml; import org.gbif.metadata.eml.EmlFactory; import org.gbif.metadata.eml.MaintenanceUpdateFrequency; import org.gbif.metadata.eml.UserId; import org.gbif.utils.file.FileUtils; import java.io.IOException; import java.text.ParseException; import java.util.ArrayList; 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.commons.lang3.RandomStringUtils; import org.junit.Before; import org.junit.Test; import org.xml.sax.SAXException; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class EmlValidatorTest { private EmlValidator validator; private Resource resource; private Eml eml; private Agent badAgent; private BaseAction action; private Organisation organisation; @Before public void before() throws IOException, SAXException, ParserConfigurationException { AppConfig mockCfg = mock(AppConfig.class); SimpleTextProvider mockTextProvider = mock(SimpleTextProvider.class); RegistrationManager mockRegistrationManager = mock(RegistrationManager.class); // instance of EmlValidator using mock AppConfig, RegistrationManager, and SimpleTextProvider validator = new EmlValidator(mockCfg, mockRegistrationManager, mockTextProvider); // instance of BaseAction action = new BaseAction(mockTextProvider, mockCfg, mockRegistrationManager); // load sample eml, and set on resource resource = new Resource(); organisation = new Organisation(); organisation.setName("NHM"); UUID organisationKey = UUID.randomUUID(); organisation.setKey(organisationKey.toString()); // mock organisation lookup by key when(mockRegistrationManager.get(any(UUID.class))).thenReturn(organisation); resource.setOrganisation(organisation); resource.setCoreType(Resource.CoreRowType.CHECKLIST.toString()); resource.setUpdateFrequency(MaintenanceUpdateFrequency.ANNUALLY.toString()); eml = EmlFactory.build(FileUtils.classpathStream("data/eml.xml")); resource.setEml(eml); // create incomplete Agent (no last name, org name, or position) badAgent = new Agent(); badAgent.setFirstName("John"); } @Test public void testInteger() { assertFalse(EmlValidator.isValidInteger("0.1")); assertFalse(EmlValidator.isValidInteger("1,1")); assertFalse(EmlValidator.isValidInteger("gbif")); assertFalse(EmlValidator.isValidInteger("0-0")); assertFalse(EmlValidator.isValidInteger(".")); assertFalse(EmlValidator.isValidInteger(" ")); assertFalse(EmlValidator.isValidInteger("1 1")); assertFalse(EmlValidator.isValidInteger("12 alpha")); assertTrue(EmlValidator.isValidInteger("0")); assertTrue(EmlValidator.isValidInteger("-1")); assertTrue(EmlValidator.isValidInteger("123445556")); } @Test public void testPhone() { assertTrue(EmlValidator.isValidPhoneNumber("4916213056")); assertTrue(EmlValidator.isValidPhoneNumber("49 162 130 5624 - 0")); assertTrue(EmlValidator.isValidPhoneNumber("0049 (162) 130 5624 - 0")); assertTrue(EmlValidator.isValidPhoneNumber("+49 (162) 130 5624 - 0")); assertTrue(EmlValidator.isValidPhoneNumber("001/432/4342321233")); assertTrue(EmlValidator.isValidPhoneNumber("+49 (30) 567-9876 ext 55")); assertTrue(EmlValidator.isValidPhoneNumber("+49 (30) 999-0000 Ext. 55")); assertTrue(EmlValidator.isValidPhoneNumber("3210049,33")); assertTrue(EmlValidator.isValidPhoneNumber("32134214.")); // bad numbers assertFalse(EmlValidator.isValidPhoneNumber("675343545 && 788789977")); assertFalse(EmlValidator.isValidPhoneNumber("*45 2117 8990")); } @Test public void testURL() { assertNull(EmlValidator.formatURL(null)); assertNull(EmlValidator.formatURL("- - - ")); assertNull(EmlValidator.formatURL("//**##")); assertNull(EmlValidator.formatURL(" ")); assertNull(EmlValidator.formatURL("ftp://ftp.gbif.org //h")); assertNotNull(EmlValidator.formatURL("www.gbif.com")); assertEquals("http://www.gbif.com", EmlValidator.formatURL("www.gbif.com")); assertEquals("http://gbif.com", EmlValidator.formatURL("gbif.com")); assertNotNull(EmlValidator.formatURL("torrent://www.gbif.org")); assertNotNull(EmlValidator.formatURL("ftp://ftp.gbif.org")); assertNotNull(EmlValidator.formatURL("http://www.gbif.org")); assertNotNull(EmlValidator.formatURL("hhttp://ipt.sibcolombia.net/iavh/resource.do?r=flora_tame_arauca_2013")); } @Test public void testURI() { assertFalse(EmlValidator.isWellFormedURI(null)); assertFalse(EmlValidator.isWellFormedURI("http://ipt.bio.aq/resource.do?r=fossil_ diversity_ of_ the_ Early_ Cr")); assertFalse(EmlValidator.isWellFormedURI("//**##")); assertFalse(EmlValidator.isWellFormedURI(" ")); assertFalse(EmlValidator.isWellFormedURI("ftp://ftp.gbif.org //h")); assertTrue(EmlValidator.isWellFormedURI("www.gbif.com")); assertTrue(EmlValidator.isWellFormedURI("torrent://www.gbif.org")); assertTrue(EmlValidator.isWellFormedURI("ftp://ftp.gbif.org")); assertTrue(EmlValidator.isWellFormedURI("http://www.gbif.org")); } @Test public void testBasicPart() { // valid assertTrue(validator.isValid(resource, MetadataSection.BASIC_SECTION)); } @Test public void testBasicPartTitleMissing() { // invalid eml.setTitle(null); assertFalse(validator.isValid(resource, MetadataSection.BASIC_SECTION)); } @Test public void testBasicPartDescriptionMissing() { // invalid List<String> description = Lists.newArrayList(); eml.setDescription(description); assertFalse(validator.isValid(resource, MetadataSection.BASIC_SECTION)); description.add("shrt"); assertFalse(validator.isValid(resource, MetadataSection.BASIC_SECTION)); // valid description.clear(); description.add("long_enough"); assertTrue(validator.isValid(resource, MetadataSection.BASIC_SECTION)); } @Test public void testBasicPartIntellectualRightsMissing() { // invalid eml.setIntellectualRights(""); assertFalse(validator.isValid(resource, MetadataSection.BASIC_SECTION)); // valid eml.setIntellectualRights("CC-BY"); assertTrue(validator.isValid(resource, MetadataSection.BASIC_SECTION)); eml.setIntellectualRights( "This work is licensed under a <a href=\"http://creativecommons.org/licenses/by/4.0/legalcode\">Creative Commons Attribution (CC-BY) 4.0 License</a>."); assertTrue(validator.isValid(resource, MetadataSection.METHODS_SECTION)); } @Test public void testBasicPartPublishingOrganisationMissing() { // invalid resource.setOrganisation(null); assertFalse(validator.isValid(resource, MetadataSection.BASIC_SECTION)); // valid resource.setOrganisation(organisation); assertTrue(validator.isValid(resource, MetadataSection.BASIC_SECTION)); } @Test public void testBasicPartCoreTypeMissing() { // invalid resource.setCoreType(null); assertFalse(validator.isValid(resource, MetadataSection.BASIC_SECTION)); // valid resource.setCoreType(Resource.CoreRowType.OCCURRENCE.toString()); assertTrue(validator.isValid(resource, MetadataSection.BASIC_SECTION)); } @Test public void testBasicPartUpdateFrequencyMissing() { // valid, because will set to default "unkown" eml.setUpdateFrequency(null); resource.setUpdateFrequency(null); assertTrue(validator.isValid(resource, MetadataSection.BASIC_SECTION)); assertEquals("unkown", eml.getUpdateFrequency().getIdentifier()); // valid, because will reuse auto-publishing interval as update frequency eml.setUpdateFrequency(null); resource.setUpdateFrequency(MaintenanceUpdateFrequency.DAILY.getIdentifier()); assertTrue(validator.isValid(resource, MetadataSection.BASIC_SECTION)); assertEquals("daily", eml.getUpdateFrequency().getIdentifier()); } @Test public void testBasicPartDefaultsSet() { // valid assertTrue(validator.isValid(resource, MetadataSection.BASIC_SECTION)); eml.setLanguage(null); eml.setMetadataLanguage(null); eml.setUpdateFrequency(null); resource.setUpdateFrequency(null); resource.setEml(eml); resource.setCoreType(Resource.CoreRowType.OCCURRENCE.toString()); // still valid assertTrue(validator.isValid(resource, MetadataSection.BASIC_SECTION)); // defaults correct? assertEquals("eng", resource.getEml().getLanguage()); assertEquals("eng", resource.getEml().getMetadataLanguage()); assertEquals("unkown", eml.getUpdateFrequency().getIdentifier()); } /** * Tests that aN EML file with coordinates that use ',' as decimal separator is interpreted incorrectly as world bbox. */ @Test public void testDecimalGeographicIssues() { try { Eml emlWithIssues = EmlFactory.build(FileUtils.classpathStream("data/emlGeographicIssues.xml")); assertEquals(emlWithIssues.getGeospatialCoverages().get(0).getBoundingCoordinates(), BBox.newWorldInstance()); } catch (IOException e) { fail(); } catch (SAXException e) { fail(); } catch (ParserConfigurationException e) { e.printStackTrace(); } } /** * The Basic section requires at least one contact. This test ensures the validation for contact is working * checking that each contact has a last name and if a user id has been specified, that it contains both parts: * directory and identifier. */ @Test public void testBasicPartContactIncomplete() { // invalid eml.addContact(badAgent); assertFalse(validator.isValid(resource, MetadataSection.BASIC_SECTION)); badAgent.setLastName("Smith"); // valid assertTrue(validator.isValid(resource, MetadataSection.BASIC_SECTION)); // no user ids to begin assertTrue(badAgent.getUserIds().isEmpty()); // set invalid user id, because it doesn't contain directory UserId invalidId = new UserId("", "1234-5678-9101-1213"); badAgent.getUserIds().add(invalidId); assertFalse(badAgent.getUserIds().isEmpty()); assertFalse(validator.isValid(resource, MetadataSection.BASIC_SECTION)); // make user id valid by setting its directory badAgent.getUserIds().get(0).setDirectory("http://orcid.org"); assertTrue(validator.isValid(resource, MetadataSection.BASIC_SECTION)); // clear user ids badAgent.getUserIds().clear(); assertTrue(badAgent.getUserIds().isEmpty()); // this time, set invalid user id, because it doesn't contain identifier invalidId = new UserId("http://orcid.org", ""); badAgent.getUserIds().add(invalidId); assertFalse(badAgent.getUserIds().isEmpty()); assertFalse(validator.isValid(resource, MetadataSection.BASIC_SECTION)); // make user id valid by setting its identifier badAgent.getUserIds().get(0).setIdentifier("1234-5678-9101-1213"); assertTrue(validator.isValid(resource, MetadataSection.BASIC_SECTION)); } /** * The Basic section requires at least one creator. This test ensures the validation for creator is working * checking that each creator has a last name and if a user id has been specified, that it contains both parts: * directory and identifier. */ @Test public void testBasicPartCreatorIncomplete() { // invalid eml.addCreator(badAgent); assertFalse(validator.isValid(resource, MetadataSection.BASIC_SECTION)); badAgent.setLastName("Smith"); // valid assertTrue(validator.isValid(resource, MetadataSection.BASIC_SECTION)); // no user ids to begin assertTrue(badAgent.getUserIds().isEmpty()); // set invalid user id, because it doesn't contain directory UserId invalidId = new UserId("", "1234-5678-9101-1213"); badAgent.getUserIds().add(invalidId); assertFalse(badAgent.getUserIds().isEmpty()); assertFalse(validator.isValid(resource, MetadataSection.BASIC_SECTION)); // make user id valid by setting its directory badAgent.getUserIds().get(0).setDirectory("http://orcid.org"); assertTrue(validator.isValid(resource, MetadataSection.BASIC_SECTION)); // clear user ids badAgent.getUserIds().clear(); assertTrue(badAgent.getUserIds().isEmpty()); // this time, set invalid user id, because it doesn't contain identifier invalidId = new UserId("http://orcid.org", ""); badAgent.getUserIds().add(invalidId); assertFalse(badAgent.getUserIds().isEmpty()); assertFalse(validator.isValid(resource, MetadataSection.BASIC_SECTION)); // make user id valid by setting its identifier badAgent.getUserIds().get(0).setIdentifier("1234-5678-9101-1213"); assertTrue(validator.isValid(resource, MetadataSection.BASIC_SECTION)); } /** * The Basic section requires at least one metadata provider. This test ensures the validation for metadata provider * is working checking that each metadata provider has a last name and if a user id has been specified, that it * contains both parts: directory and identifier. */ @Test public void testBasicPartMetaProviderIncomplete() { // invalid eml.addMetadataProvider(badAgent); assertFalse(validator.isValid(resource, MetadataSection.BASIC_SECTION)); badAgent.setLastName("Smith"); // valid assertTrue(validator.isValid(resource, MetadataSection.BASIC_SECTION)); // no user ids to begin assertTrue(badAgent.getUserIds().isEmpty()); // set invalid user id, because it doesn't contain directory UserId invalidId = new UserId("", "1234-5678-9101-1213"); badAgent.getUserIds().add(invalidId); assertFalse(badAgent.getUserIds().isEmpty()); assertFalse(validator.isValid(resource, MetadataSection.BASIC_SECTION)); // make user id valid by setting its directory badAgent.getUserIds().get(0).setDirectory("http://orcid.org"); assertTrue(validator.isValid(resource, MetadataSection.BASIC_SECTION)); // clear user ids badAgent.getUserIds().clear(); assertTrue(badAgent.getUserIds().isEmpty()); // this time, set invalid user id, because it doesn't contain identifier invalidId = new UserId("http://orcid.org", ""); badAgent.getUserIds().add(invalidId); assertFalse(badAgent.getUserIds().isEmpty()); assertFalse(validator.isValid(resource, MetadataSection.BASIC_SECTION)); // make user id valid by setting its identifier badAgent.getUserIds().get(0).setIdentifier("1234-5678-9101-1213"); assertTrue(validator.isValid(resource, MetadataSection.BASIC_SECTION)); } @Test public void testGeoPart() { // valid assertTrue(validator.isValid(resource, MetadataSection.GEOGRAPHIC_COVERAGE_SECTION)); } @Test public void testGeoPartDescriptionIncomplete() { // invalid eml.getGeospatialCoverages().get(0).setDescription(""); assertFalse(validator.isValid(resource, MetadataSection.GEOGRAPHIC_COVERAGE_SECTION)); } @Test public void testGeoPartBoundingBoxIncomplete() { // invalid BBox box = new BBox(); box.getMin().setLongitude(null); eml.getGeospatialCoverages().get(0).setBoundingCoordinates(box); assertFalse(validator.isValid(resource, MetadataSection.GEOGRAPHIC_COVERAGE_SECTION)); } @Test public void testTaxCovPart() { // valid assertTrue(validator.isValid(resource, MetadataSection.TAXANOMIC_COVERAGE_SECTION)); } @Test public void testTaxCovPartScientificNameIncomplete() { // invalid eml.getTaxonomicCoverages().get(0).getTaxonKeywords().get(0).setScientificName(null); assertFalse(validator.isValid(resource, MetadataSection.TAXANOMIC_COVERAGE_SECTION)); } @Test public void testTempCovPart() { // valid assertTrue(validator.isValid(resource, MetadataSection.TEMPORAL_COVERAGE_SECTION)); } @Test public void testTempCovPartRangeIncomplete() throws ParseException { // invalid eml.getTemporalCoverages().get(0).setStartDate(null); eml.getTemporalCoverages().get(0).setEndDate(new Date()); assertFalse(validator.isValid(resource, MetadataSection.TEMPORAL_COVERAGE_SECTION)); } @Test public void testTempCovPartSingleDateIncomplete() throws ParseException { // 1st is empty, but next 3 aren't = INVALID eml.getTemporalCoverages().get(0).setStartDate(null); eml.getTemporalCoverages().get(0).setEndDate(null); eml.getTemporalCoverages().get(0).setFormationPeriod(null); eml.getTemporalCoverages().get(0).setLivingTimePeriod(null); assertFalse(validator.isValid(resource, MetadataSection.TEMPORAL_COVERAGE_SECTION)); } @Test public void testKeywordsPart() { // valid assertTrue(validator.isValid(resource, MetadataSection.KEYWORDS_SECTION)); } @Test public void testKeywordsPartThesaurusIncomplete() { // invalid eml.getKeywords().get(0).setKeywordThesaurus(null); assertFalse(validator.isValid(resource, MetadataSection.KEYWORDS_SECTION)); } @Test public void testKeywordsPartKeywordListIncomplete() { // invalid eml.getKeywords().get(0).setKeywords(new ArrayList<String>()); assertFalse(validator.isValid(resource, MetadataSection.KEYWORDS_SECTION)); } @Test public void testPartiesPart() { // valid assertTrue(validator.isValid(resource, MetadataSection.PARTIES_SECTION)); } @Test public void testPartiesPartIncomplete() { // invalid eml.getAssociatedParties().clear(); eml.getAssociatedParties().add(badAgent); assertFalse(validator.isValid(resource, MetadataSection.PARTIES_SECTION)); } @Test public void testPartiesPartFirstPartyIncomplete() { // add emtpy party at top, with remaining 13 valid parties eml.getAssociatedParties().add(0, new Agent()); assertFalse(validator.isValid(resource, MetadataSection.PARTIES_SECTION)); } @Test public void testProjectPart() { // valid assertTrue(validator.isValid(resource, MetadataSection.PROJECT_SECTION)); } @Test public void testProjectPartTitleIncomplete() { // invalid eml.getProject().setTitle(null); assertFalse(validator.isValid(resource, MetadataSection.PROJECT_SECTION)); } @Test public void testProjectPartPersonnelMissing() { assertNotNull(eml.getProject().getTitle()); eml.getProject().getPersonnel().clear(); assertTrue(eml.getProject().getPersonnel().isEmpty()); assertFalse(validator.isValid(resource, MetadataSection.PROJECT_SECTION)); } @Test public void testProjectPartPersonnelNameIncomplete() { assertNotNull(eml.getProject().getTitle()); eml.getProject().getPersonnel().clear(); assertTrue(eml.getProject().getPersonnel().isEmpty()); // invalid, because agent is missing last name eml.getProject().addProjectPersonnel(badAgent); assertFalse(eml.getProject().getPersonnel().isEmpty()); assertFalse(validator.isValid(resource, MetadataSection.PROJECT_SECTION)); } /** * The Project section requires at least one personnel. This test ensures the validation for personnel is working * checking that each personnel has a last name and if a user id has been specified, that it contains both parts: * directory and identifier. */ @Test public void testProjectPartPersonnelUseridIncomplete() { assertNotNull(eml.getProject().getTitle()); assertEquals(1, eml.getProject().getPersonnel().size()); Agent personnel = eml.getProject().getPersonnel().get(0); // no user ids to begin assertTrue(personnel.getUserIds().isEmpty()); // set invalid user id, because it doesn't contain directory UserId invalidId = new UserId("", "1234-5678-9101-1213"); personnel.getUserIds().add(invalidId); assertFalse(personnel.getUserIds().isEmpty()); assertFalse(validator.isValid(resource, MetadataSection.PROJECT_SECTION)); // make user id valid by setting its directory personnel.getUserIds().get(0).setDirectory("http://orcid.org"); assertTrue(validator.isValid(resource, MetadataSection.PROJECT_SECTION)); // clear user ids personnel.getUserIds().clear(); assertTrue(personnel.getUserIds().isEmpty()); // this time, set invalid user id, because it doesn't contain identifier invalidId = new UserId("http://orcid.org", ""); personnel.getUserIds().add(invalidId); assertFalse(personnel.getUserIds().isEmpty()); assertFalse(validator.isValid(resource, MetadataSection.PROJECT_SECTION)); // make user id valid by setting its identifier personnel.getUserIds().get(0).setIdentifier("1234-5678-9101-1213"); assertTrue(validator.isValid(resource, MetadataSection.PROJECT_SECTION)); } @Test public void testMethodsPart() { // valid assertTrue(validator.isValid(resource, MetadataSection.METHODS_SECTION)); } @Test public void testMethodsPartStudyExtentIncomplete() { // invalid eml.setSampleDescription("Non empty"); eml.setStudyExtent(""); assertFalse(validator.isValid(resource, MetadataSection.METHODS_SECTION)); } @Test public void testMethodsPartSampleDescriptionIncomplete() { // invalid eml.setSampleDescription(""); eml.setStudyExtent("Non empty"); assertFalse(validator.isValid(resource, MetadataSection.METHODS_SECTION)); } @Test public void testMethodsPartStepIncomplete() { // invalid eml.getMethodSteps().set(0, ""); assertFalse(validator.isValid(resource, MetadataSection.METHODS_SECTION)); } @Test public void testCitationsPart() { // valid assertTrue(validator.isValid(resource, MetadataSection.CITATIONS_SECTION)); } @Test public void testCitationsPartCitationMissing() { // invalid eml.getCitation().setCitation(""); assertFalse(validator.isValid(resource, MetadataSection.CITATIONS_SECTION)); eml.getCitation().setCitation(null); assertFalse(validator.isValid(resource, MetadataSection.CITATIONS_SECTION)); } @Test public void testCitationIdentifiersInvalid() { // valid identifiers 2 - 100 eml.getCitation().setIdentifier(RandomStringUtils.randomAlphabetic(2)); assertTrue(validator.isValid(resource, MetadataSection.CITATIONS_SECTION)); eml.getCitation().setIdentifier(RandomStringUtils.randomAlphabetic(100)); assertTrue(validator.isValid(resource, MetadataSection.CITATIONS_SECTION)); eml.getCitation().setIdentifier(RandomStringUtils.randomAlphabetic(75)); assertTrue(validator.isValid(resource, MetadataSection.CITATIONS_SECTION)); // invalid identifiers less than 2, or greater than 100 eml.getCitation().setIdentifier("a"); assertFalse(validator.isValid(resource, MetadataSection.CITATIONS_SECTION)); eml.getCitation().setIdentifier(RandomStringUtils.randomAlphabetic(110)); assertFalse(validator.isValid(resource, MetadataSection.CITATIONS_SECTION)); } @Test public void testCitationsPartBiblioCitationMissing() { // invalid eml.getBibliographicCitations().get(0).setCitation(null); assertFalse(validator.isValid(resource, MetadataSection.CITATIONS_SECTION)); } @Test public void testCollectionPart() { // valid assertTrue(validator.isValid(resource, MetadataSection.COLLECTIONS_SECTION)); } @Test public void testCollectionPartCollectionNameIncomplete() { // invalid Collection collection = new Collection(); collection.setCollectionName(null); eml.addCollection(collection); assertFalse(validator.isValid(resource, MetadataSection.COLLECTIONS_SECTION)); } @Test public void testCollectionPartCollectionIdIncompleteButValid() { // valid Collection collection = new Collection(); collection.setCollectionName("Birds"); collection.setCollectionId(null); eml.addCollection(collection); assertTrue(validator.isValid(resource, MetadataSection.COLLECTIONS_SECTION)); } @Test public void testCollectionPartParentCollectionIdIncompleteButValid() { // valid Collection collection = new Collection(); collection.setCollectionName("Birds"); collection.setParentCollectionId(null); eml.addCollection(collection); assertTrue(validator.isValid(resource, MetadataSection.COLLECTIONS_SECTION)); } @Test public void testCollectionCuratorialIncomplete() { // invalid - doesn't exceed min length 2 eml.getJgtiCuratorialUnits().get(0).setUnitType("m"); assertFalse(validator.isValid(resource, MetadataSection.COLLECTIONS_SECTION)); } @Test public void testPhysicalPart() { // valid assertTrue(validator.isValid(resource, MetadataSection.PHYSICAL_SECTION)); } @Test public void testPhysicalPartDistributionUrlInvalid() { // invalid eml.getPhysicalData().get(0).setDistributionUrl("[hppt]"); assertFalse(validator.isValid(resource, MetadataSection.PHYSICAL_SECTION)); } @Test public void testPhysicalPartNameIncomplete() { // invalid eml.getPhysicalData().get(0).setName(null); assertFalse(validator.isValid(resource, MetadataSection.PHYSICAL_SECTION)); } @Test public void testPhysicalCharSetIncomplete() { // invalid eml.getPhysicalData().get(0).setCharset(null); assertFalse(validator.isValid(resource, MetadataSection.PHYSICAL_SECTION)); } @Test public void testPhysicalDistributionIncomplete() { // invalid eml.getPhysicalData().get(0).setDistributionUrl(null); assertFalse(validator.isValid(resource, MetadataSection.PHYSICAL_SECTION)); } @Test public void testPhysicalFormatIncomplete() { // invalid eml.getPhysicalData().get(0).setFormat(null); assertFalse(validator.isValid(resource, MetadataSection.PHYSICAL_SECTION)); } @Test public void testPhysicalResourceHomepageInvalid() { // invalid eml.setDistributionUrl("[]"); assertFalse(validator.isValid(resource, MetadataSection.PHYSICAL_SECTION)); } @Test public void testAdditionalPart() { // valid assertTrue(validator.isValid(resource, MetadataSection.ADDITIONAL_SECTION)); } @Test public void testAdditionalPartAlternateIdIncomplete() { // invalid eml.getAlternateIdentifiers().set(0, "1"); assertFalse(validator.isValid(resource, MetadataSection.ADDITIONAL_SECTION)); } /** * All sections of new Eml instance are empty, except the basic mandatory elements. Validation is skipped for each * section other than the basic metadata section, and the document is valid. */ @Test public void testAreAllSectionsValid() { Resource resource = new Resource(); Eml empty = new Eml(); resource.setEml(empty); // populate basic mandatory elements Organisation organisation = new Organisation(); organisation.setName("NHM"); resource.setOrganisation(organisation); resource.setCoreType(Resource.CoreRowType.CHECKLIST.toString()); resource.setUpdateFrequency(MaintenanceUpdateFrequency.ANNUALLY.toString()); empty.setTitle("Title"); empty.addDescriptionPara("Description"); empty.setMetadataLanguage(Language.FRENCH.getIso3LetterCode()); empty.setLanguage(Language.SPANISH.getIso3LetterCode()); empty.setIntellectualRights("CC-BY"); Agent agent = new Agent(); agent.setLastName("Smith"); empty.addContact(agent); empty.addCreator(agent); empty.addMetadataProvider(agent); assertTrue(validator.areAllSectionsValid(action, resource)); } }