package org.activityinfo.ui.client.importer;
import com.bedatadriven.rebar.time.calendar.LocalDate;
import com.extjs.gxt.ui.client.Style;
import com.extjs.gxt.ui.client.data.SortInfo;
import com.google.common.base.Charsets;
import com.google.common.collect.Sets;
import com.google.common.io.Resources;
import org.activityinfo.core.server.type.converter.JvmConverterFactory;
import org.activityinfo.core.shared.criteria.ClassCriteria;
import org.activityinfo.model.form.FormInstance;
import org.activityinfo.core.shared.form.tree.FormTreePrettyPrinter;
import org.activityinfo.core.shared.form.tree.Hierarchy;
import org.activityinfo.core.shared.form.tree.HierarchyPrettyPrinter;
import org.activityinfo.core.shared.importing.model.ImportModel;
import org.activityinfo.core.shared.importing.strategy.FieldImportStrategies;
import org.activityinfo.core.shared.importing.validation.ValidatedRowTable;
import org.activityinfo.fixtures.InjectionSupport;
import org.activityinfo.legacy.shared.adapter.LocationClassAdapter;
import org.activityinfo.legacy.shared.command.Filter;
import org.activityinfo.legacy.shared.command.GetSites;
import org.activityinfo.legacy.shared.command.result.SiteResult;
import org.activityinfo.legacy.shared.model.SiteDTO;
import org.activityinfo.model.formTree.FieldPath;
import org.activityinfo.model.formTree.FormTree;
import org.activityinfo.model.legacy.CuidAdapter;
import org.activityinfo.model.resource.ResourceId;
import org.activityinfo.server.database.OnDataSet;
import org.activityinfo.ui.client.component.importDialog.Importer;
import org.activityinfo.ui.client.component.importDialog.data.PastedTable;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.io.IOException;
import java.util.List;
import java.util.Set;
import static com.google.common.io.Resources.getResource;
import static org.activityinfo.core.client.PromiseMatchers.assertResolves;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;
@RunWith(InjectionSupport.class)
@OnDataSet("/dbunit/nfi-import.db.xml")
public class ImportWithMultiClassRangeTest extends AbstractImporterTest {
public static final ResourceId NFI_DISTRIBUTION_FORM_CLASS = CuidAdapter.activityFormClass(33);
public static final ResourceId SCHOOL_FORM_CLASS = CuidAdapter.locationFormClass(2);
public static final ResourceId ADMIN_FIELD = LocationClassAdapter.getAdminFieldId(SCHOOL_FORM_CLASS);
// admin levels
public static final int PROVINCE_LEVEL = 1;
public static final int DISTRICT_LEVEL = 2;
public static final int TERRITOIRE_LEVEL = 3;
public static final int SECTEUR_LEVEL = 4;
public static final int GROUPEMENT_LEVEL = 5;
public static final int ZONE_DE_SANTE = 7;
public static final int AIRE_DE_SANTE = 8;
// indicators
public static final int NUMBER_MENAGES = 118;
// attributes
public static final int ECHO = 400;
public static final int DEPLACEMENT = 63;
public static final ResourceId PROVINCE_KATANGA = CuidAdapter.entity(141804);
public static final ResourceId DISTRICT_TANGANIKA = CuidAdapter.entity(141845);
public static final ResourceId TERRITOIRE_KALEMIE = CuidAdapter.entity(141979);
public static final ResourceId SECTEUR_TUMBWE = CuidAdapter.entity(142803);
public static final ResourceId GROUPEMENT_LAMBO_KATENGA = CuidAdapter.entity(148235);
public static final ResourceId ZONE_SANTE_NYEMBA = CuidAdapter.entity(212931);
private List<FormInstance> instances;
@Test
public void testSimple() throws IOException {
setUser(3);
FormTree formTree = assertResolves(formTreeBuilder.apply(NFI_DISTRIBUTION_FORM_CLASS));
FormTreePrettyPrinter.print(formTree);
Hierarchy hierarchy = new Hierarchy(formTree.getNodeByPath(new FieldPath(CuidAdapter.locationField(33))));
HierarchyPrettyPrinter.prettyPrint(hierarchy);
importModel = new ImportModel(formTree);
importer = new Importer(resourceLocator, formTree, FieldImportStrategies.get(JvmConverterFactory.get()));
// Step 1: User pastes in data to import
PastedTable source = new PastedTable(
Resources.toString(getResource("org/activityinfo/core/shared/importing/nfi.csv"), Charsets.UTF_8));
source.parseAllRows();
importModel.setSource(source);
dumpList("COLUMNS", source.getColumns());
importModel.setColumnAction(columnIndex("Date1"), target("Start Date"));
importModel.setColumnAction(columnIndex("Date2"), target("End Date"));
importModel.setColumnAction(columnIndex("Partner"), target("Partner Name"));
importModel.setColumnAction(columnIndex("Localité"), target("Localité Name"));
importModel.setColumnAction(columnIndex("Province"), target("Province Name"));
importModel.setColumnAction(columnIndex("District"), target("District Name"));
importModel.setColumnAction(columnIndex("Territoire"), target("Territoire Name"));
importModel.setColumnAction(columnIndex("Secteur"), target("Secteur Name"));
importModel.setColumnAction(columnIndex("Groupement"), target("Groupement Name"));
importModel.setColumnAction(columnIndex("Zone de Santé"), target("Zone de Santé Name"));
importModel.setColumnAction(columnIndex("Nombre de ménages ayant reçu une assistance en NFI"),
target("Nombre de ménages ayant reçu une assistance en NFI"));
ValidatedRowTable validatedResult = assertResolves(importer.validateRows(importModel));
showValidationGrid(validatedResult);
assertResolves(importer.persist(importModel));
GetSites query = new GetSites(Filter.filter().onActivity(33));
query.setSortInfo(new SortInfo("date2", Style.SortDir.DESC));
SiteResult result = execute(query);
// assertThat(result.getTotalLength(), equalTo(651));
assertThat(result.getTotalLength(), equalTo(313));
SiteDTO lastSite = result.getData().get(0);
assertThat(lastSite.getDate2(), equalTo(new LocalDate(2013,4,26)));
assertThat(lastSite.getLocationName(), equalTo("Bukombo(Camp)"));
assertThat(lastSite.getAdminEntity(PROVINCE_LEVEL).getName(), equalTo("Nord Kivu"));
assertThat(lastSite.getAdminEntity(DISTRICT_LEVEL).getName(), equalTo("Nord Kivu"));
assertThat(lastSite.getAdminEntity(TERRITOIRE_LEVEL).getName(), equalTo("Masisi"));
assertThat(lastSite.getAdminEntity(SECTEUR_LEVEL).getName(), equalTo("Osso Banyungu"));
assertThat((Double) lastSite.getIndicatorValue(NUMBER_MENAGES), equalTo(94.0));
assertThat(lastSite.getAttributeValue(ECHO), equalTo(false));
}
@Test
public void testMulti() throws IOException {
setUser(3);
FormTree formTree = assertResolves(formTreeBuilder.apply(SCHOOL_FORM_CLASS));
FormTreePrettyPrinter.print(formTree);
importModel = new ImportModel(formTree);
importer = new Importer(resourceLocator, formTree, FieldImportStrategies.get(JvmConverterFactory.get()));
// Step 1: User pastes in data to import
PastedTable source = new PastedTable(
Resources.toString(getResource("org/activityinfo/core/shared/importing/school-import.csv"), Charsets.UTF_8));
importModel.setSource(source);
dumpList("COLUMNS", source.getColumns());
importModel.setColumnAction(columnIndex("School"), target("Name"));
// Province is at the root of both hierarchies
importModel.setColumnAction(columnIndex("Province"), target("Province Name"));
// Admin hierarchy
importModel.setColumnAction(columnIndex("District"), target("District Name"));
importModel.setColumnAction(columnIndex("Territoire"), target("Territoire Name"));
importModel.setColumnAction(columnIndex("Secteur"), target("Secteur Name"));
importModel.setColumnAction(columnIndex("Groupement"), target("Groupement Name"));
// health ministry hierarchy
importModel.setColumnAction(columnIndex("Zone de Santé"), target("Zone de Santé Name"));
ValidatedRowTable validatedResult = assertResolves(importer.validateRows(importModel));
showValidationGrid(validatedResult);
assertResolves(importer.persist(importModel));
instances = assertResolves(resourceLocator.queryInstances(new ClassCriteria(SCHOOL_FORM_CLASS)));
assertThat(instances.size(), equalTo(8)); // we have 8 rows in school-import.csv
assertThat(school("P"), equalTo(set(PROVINCE_KATANGA)));
assertThat(school("D"), equalTo(set(DISTRICT_TANGANIKA)));
assertThat(school("T"), equalTo(set(TERRITOIRE_KALEMIE)));
assertThat(school("S"), equalTo(set(SECTEUR_TUMBWE)));
assertThat(school("G"), equalTo(set(GROUPEMENT_LAMBO_KATENGA)));
assertThat(school("GZ"), equalTo(set(GROUPEMENT_LAMBO_KATENGA, ZONE_SANTE_NYEMBA)));
assertThat(school("TZ"), equalTo(set(TERRITOIRE_KALEMIE, ZONE_SANTE_NYEMBA)));
}
private Set<ResourceId> school(String name) {
for(FormInstance instance : instances) {
if(name.equals(instance.getString(LocationClassAdapter.getNameFieldId(SCHOOL_FORM_CLASS)))) {
Set<ResourceId> references = instance.getReferences(ADMIN_FIELD);
System.out.println(name +", references: " + references);
return references;
}
}
throw new AssertionError("No instance with name " + name);
}
public static Set<ResourceId> set(ResourceId... resourceIds) {
return Sets.newHashSet(resourceIds);
}
}