package org.gbif.checklistbank.service.mybatis;
import org.gbif.api.model.Constants;
import org.gbif.api.model.checklistbank.NameUsage;
import org.gbif.api.model.checklistbank.NameUsageMetrics;
import org.gbif.api.model.checklistbank.ParsedName;
import org.gbif.api.model.checklistbank.VerbatimNameUsage;
import org.gbif.api.service.checklistbank.NameUsageService;
import org.gbif.api.vocabulary.NameType;
import org.gbif.api.vocabulary.NameUsageIssue;
import org.gbif.api.vocabulary.Origin;
import org.gbif.api.vocabulary.Rank;
import org.gbif.checklistbank.model.UsageExtensions;
import org.gbif.checklistbank.service.DatasetImportService;
import org.gbif.checklistbank.service.ImporterCallback;
import org.gbif.checklistbank.service.mybatis.guice.Mybatis;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import com.google.common.collect.Lists;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
public class DatasetImportServiceMyBatisIT extends MyBatisServiceITBase<DatasetImportService> {
public DatasetImportServiceMyBatisIT() {
super(DatasetImportService.class, Mybatis.class);
}
private final Integer USAGE_ID = 555555;
/**
* pro parte usages are synced differently and not tested here
*/
@Test
public void testRegularImport() throws ExecutionException, InterruptedException {
ParsedName pn = new ParsedName();
pn.setGenusOrAbove("Abies");
pn.setSpecificEpithet("alba");
pn.setAuthorship("Mill.");
pn.setScientificName(pn.fullName());
pn.setType(NameType.SCIENTIFIC);
NameUsage u = new NameUsage();
u.setKey(USAGE_ID);
u.setScientificName(pn.getScientificName());
u.setCanonicalName(pn.canonicalName());
u.setNameType(pn.getType());
u.setAuthorship(pn.getAuthorship());
u.setRank(Rank.SPECIES);
u.setDatasetKey(Constants.NUB_DATASET_KEY);
u.setOrigin(Origin.SOURCE);
u.getIssues().add(NameUsageIssue.CONFLICTING_BASIONYM_COMBINATION);
u.getIssues().add(NameUsageIssue.ACCEPTED_NAME_MISSING);
UsageExtensions ext = new UsageExtensions();
VerbatimNameUsage v = new VerbatimNameUsage();
NameUsageMetrics m = new NameUsageMetrics();
DummyData data = new DummyData(u, pn, ext, v, m);
Future<?> f = service.sync(u.getDatasetKey(), data, Lists.newArrayList(1));
f.get();
NameUsageService usageService = getInstance(NameUsageService.class);
NameUsage u2 = usageService.get(USAGE_ID, null);
u2.setLastInterpreted(null);
// name key is newly assigned
u.setNameKey(u2.getNameKey());
u.setNameKey(u2.getNameKey());
assertNotNull(u.getNameKey());
assertFalse(u2.getIssues().isEmpty());
assertEquals(u, u2);
}
class DummyData implements ImporterCallback {
private final NameUsage u;
private final ParsedName pn;
private final UsageExtensions ext;
private final VerbatimNameUsage v;
private final NameUsageMetrics m;
DummyData(NameUsage u, ParsedName pn, UsageExtensions ext, VerbatimNameUsage v, NameUsageMetrics m) {
this.u = u;
this.pn = pn;
this.ext = ext;
this.v = v;
this.m = m;
}
@Override
public NameUsage readUsage(long id) {
return u;
}
@Override
public ParsedName readName(long id) {
return pn;
}
@Override
public boolean isInsert(NameUsage usage) {
return true;
}
@Override
public UsageExtensions readExtensions(long id) {
return ext;
}
@Override
public NameUsageMetrics readMetrics(long id) {
return m;
}
@Override
public VerbatimNameUsage readVerbatim(long id) {
return v;
}
@Override
public List<Integer> readParentKeys(long id) {
return Lists.newArrayList();
}
@Override
public void reportUsageKey(long id, int usageKey) {
}
@Override
public void reportNewFuture(Future<List<Integer>> future) {
}
}
}