package org.gbif.occurrence.processor.interpreting; import org.gbif.api.model.occurrence.Occurrence; import org.gbif.api.model.occurrence.VerbatimOccurrence; import org.gbif.api.model.registry.Organization; import org.gbif.api.vocabulary.Country; import org.gbif.api.vocabulary.License; import org.gbif.api.vocabulary.OccurrenceIssue; import org.gbif.dwc.terms.DcTerm; import org.gbif.dwc.terms.DwcTerm; import org.gbif.occurrence.processor.guice.OccurrenceProcessorModule; import org.gbif.occurrence.processor.guice.ProcessorConfiguration; import org.gbif.occurrence.processor.interpreting.result.OccurrenceInterpretationResult; import java.net.URI; import java.util.UUID; import com.google.common.collect.Sets; import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Injector; import org.junit.BeforeClass; import org.junit.Test; import org.mockito.Mockito; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class OccurrenceInterpreterTest { private static class OccurrenceProcessorMockModule extends AbstractModule { private ProcessorConfiguration cfg; public OccurrenceProcessorMockModule(ProcessorConfiguration cfg){ this.cfg = cfg; } @Override protected void configure() { Organization organizationMock = new Organization(); organizationMock.setKey(UUID.randomUUID()); organizationMock.setTitle("Mock organization"); DatasetInfoInterpreter datasetInfoInterpreterMock = Mockito.mock(DatasetInfoInterpreter.class); Mockito.when(datasetInfoInterpreterMock.getOrgCountry(Mockito.anyObject())).thenReturn(Country.DENMARK); Mockito.when(datasetInfoInterpreterMock.getDatasetLicense(Mockito.anyObject())).thenReturn(License.CC_BY_4_0); Mockito.when(datasetInfoInterpreterMock.getOrgByDataset(Mockito.anyObject())).thenReturn(organizationMock); bind(DatasetInfoInterpreter.class).toInstance(datasetInfoInterpreterMock); install(new OccurrenceProcessorModule(cfg)); } } private static OccurrenceInterpreter occurrenceInterpreter; @BeforeClass public static void initOccurrenceInterpreter() { ProcessorConfiguration cfg = new ProcessorConfiguration(); cfg.api.url = URI.create("http://api.gbif.org/v1/"); Injector injector = Guice.createInjector(new OccurrenceProcessorMockModule(cfg)); occurrenceInterpreter = injector.getInstance(OccurrenceInterpreter.class); } @Test public void testOccurrenceInterpretation() { VerbatimOccurrence verbatimOccurrence = new VerbatimOccurrence(); verbatimOccurrence.setVerbatimField(DwcTerm.verbatimLatitude, "10.123"); verbatimOccurrence.setVerbatimField(DwcTerm.verbatimLongitude, "55.678"); verbatimOccurrence.setDatasetKey(UUID.randomUUID()); verbatimOccurrence.setCrawlId(8); OccurrenceInterpretationResult result = occurrenceInterpreter.interpret(verbatimOccurrence, null); assertTrue(result.getUpdated().getIssues().containsAll(Sets.newHashSet(OccurrenceIssue.GEODETIC_DATUM_ASSUMED_WGS84, OccurrenceIssue.COUNTRY_DERIVED_FROM_COORDINATES, OccurrenceIssue.TAXON_MATCH_NONE, OccurrenceIssue.BASIS_OF_RECORD_INVALID))); assertEquals(8, result.getUpdated().getCrawlId().intValue()); } /** * https://github.com/gbif/portal-feedback/issues/136 */ @Test public void testOccurrenceInterpretationCeratiaceae() { VerbatimOccurrence v = new VerbatimOccurrence(); v.setVerbatimField(DwcTerm.verbatimLatitude, "10.123"); v.setVerbatimField(DwcTerm.verbatimLongitude, "55.678"); v.setDatasetKey(UUID.randomUUID()); v.setVerbatimField(DwcTerm.kingdom, "Chromista"); v.setVerbatimField(DwcTerm.phylum, "Dinophyta"); v.setVerbatimField(DwcTerm.class_, "Dinophyceae"); v.setVerbatimField(DwcTerm.order, "Peridiniales"); v.setVerbatimField(DwcTerm.family, "Ceratiaceae"); v.setVerbatimField(DwcTerm.genus, "Ceratium"); v.setVerbatimField(DwcTerm.scientificName, "Ceratium hirundinella"); v.setVerbatimField(DwcTerm.taxonRank, "species"); v.setVerbatimField(DwcTerm.verbatimEventDate, "Tue Aug 04 2015 12:22:35 GMT-0400 (EDT)"); v.setVerbatimField(DwcTerm.taxonID, "345252"); v.setVerbatimField(DwcTerm.collectionCode, "Observations"); v.setVerbatimField(DwcTerm.verbatimLocality, "2–28 Bonemill Rd, Mansfield, CT, US"); v.setVerbatimField(DcTerm.rightsHolder, "Karolina Fucikova"); v.setVerbatimField(DwcTerm.basisOfRecord, "HumanObservation"); v.setVerbatimField(DwcTerm.identificationID, "3443749"); v.setVerbatimField(DwcTerm.decimalLatitude, "41.803398"); v.setVerbatimField(DcTerm.modified, "2015-08-04T19:34:01Z"); v.setVerbatimField(DwcTerm.eventTime, "16:22:35Z"); v.setVerbatimField(DwcTerm.recordedBy, "Karolina Fucikova"); v.setVerbatimField(DcTerm.license, "http://creativecommons.org/licenses/by-nc/4.0/"); v.setVerbatimField(DwcTerm.coordinateUncertaintyInMeters, "24"); v.setVerbatimField(DcTerm.identifier, "1831763"); v.setVerbatimField(DwcTerm.occurrenceID, "http://www.inaturalist.org/observations/1831763"); v.setVerbatimField(DwcTerm.eventDate, "2015-08-04T12:22:35-04:00"); v.setVerbatimField(DwcTerm.catalogNumber, "1831763"); v.setVerbatimField(DwcTerm.establishmentMeans, "wild"); v.setVerbatimField(DwcTerm.decimalLongitude, "-72.280233"); v.setVerbatimField(DcTerm.references, "http://www.inaturalist.org/observations/1831763"); v.setVerbatimField(DwcTerm.institutionCode, "iNaturalist"); v.setVerbatimField(DwcTerm.countryCode, "US"); v.setVerbatimField(DwcTerm.dateIdentified, "2015-08-04T17:15:02Z"); v.setVerbatimField(DcTerm.rights, "© Karolina Fucikova some rights reserved"); OccurrenceInterpretationResult result = occurrenceInterpreter.interpret(v, null); Occurrence o = result.getUpdated(); assertEquals(7598904, (int)o.getTaxonKey()); assertEquals(7479242, (int)o.getFamilyKey()); } }