Skip to content

Commit

Permalink
avniproject/avni-webapp#1306 - more scenarios in BulkLocationCreatorI…
Browse files Browse the repository at this point in the history
…ntegrationTest
  • Loading branch information
petmongrels committed Aug 22, 2024
1 parent d934cf5 commit 5d07ce8
Show file tree
Hide file tree
Showing 4 changed files with 181 additions and 100 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ private boolean isNonEmptyQuestionGroup(FormElement formElement, Row row) {

private String getRowValue(FormElement formElement, Row row, Integer questionGroupIndex) {
Concept concept = formElement.getConcept();
if(formElement.getGroup() != null) {
if (formElement.getGroup() != null) {
Concept parentConcept = formElement.getGroup().getConcept();
String parentChildName = parentConcept.getName() + "|" + concept.getName();
String headerName = questionGroupIndex == null ? parentChildName : String.format("%s|%d", parentChildName, questionGroupIndex);
Expand All @@ -136,7 +136,7 @@ private ObservationCollection constructObservations(Row row, Headers headers, Li
for (Concept concept : getConceptHeaders(headers, row.getHeaders())) {
FormElement formElement = getFormElementForObservationConcept(concept, formType);
String rowValue = getRowValue(formElement, row, null);
if (!isNonEmptyQuestionGroup(formElement, row) && (rowValue == null || rowValue.trim().equals("")))
if (!isNonEmptyQuestionGroup(formElement, row) && (rowValue == null || rowValue.trim().isEmpty()))
continue;
ObservationRequest observationRequest = new ObservationRequest();
observationRequest.setConceptName(concept.getName());
Expand Down Expand Up @@ -166,7 +166,7 @@ private Object constructChildObservations(Row row, Headers headers, List<String>
List<ObservationCollection> repeatableObservationRequest = new ArrayList<>();
for (int i = 1; i <= maxIndex; i++) {
ObservationCollection questionGroupObservations = getQuestionGroupObservations(row, headers, errorMsgs, formType, oldObservations, allChildQuestions, i);
if(!questionGroupObservations.isEmpty()) {
if (!questionGroupObservations.isEmpty()) {
repeatableObservationRequest.add(questionGroupObservations);
}
}
Expand Down Expand Up @@ -205,7 +205,7 @@ private List<FormElement> createDecisionFormElement(Set<Concept> concepts) {
}).collect(Collectors.toList());
}

private FormElement getFormElementForObservationConcept(Concept concept, FormType formType) {
private FormElement getFormElementForObservationConcept(Concept concept, FormType formType) {
List<Form> applicableForms = formRepository.findByFormTypeAndIsVoidedFalse(formType);
if (applicableForms.isEmpty())
throw new RuntimeException(String.format("No forms of type %s found", formType));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,12 @@ public List<String> getLocationTypeNames() {
public void createLocation(Row row, List<String> allErrorMsgs, List<String> locationTypeNames) {
AddressLevel parent = null;
AddressLevel location = null;
for (String header : row.getHeaders()) {
if (isValidLocation(header, row, locationTypeNames)) {
location = createAddressLevel(row, parent, header, locationTypeNames);
for (String columnHeader : row.getHeaders()) {
if (isValidLocation(columnHeader, row, locationTypeNames)) {
location = createAddressLevel(row, parent, columnHeader, locationTypeNames);
parent = location;
} //This will get called only when location have extra properties
if (location != null && !locationTypeNames.contains(header)) {
if (location != null && !locationTypeNames.contains(columnHeader)) {
updateLocationProperties(row, allErrorMsgs, location);
}
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
package org.avni.server.importer.batch.csv.writer;

import org.avni.server.common.AbstractControllerIntegrationTest;
import org.avni.server.dao.LocationRepository;
import org.avni.server.domain.AddressLevel;
import org.avni.server.domain.AddressLevelType;
import org.avni.server.domain.ConceptDataType;
import org.avni.server.domain.factory.AddressLevelTypeBuilder;
import org.avni.server.importer.batch.model.Row;
import org.avni.server.service.LocationHierarchyService;
import org.avni.server.service.builder.TestConceptService;
import org.avni.server.service.builder.TestDataSetupService;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.jdbc.Sql;

import java.util.*;

import static org.avni.server.importer.batch.csv.writer.BulkLocationCreator.LocationTypesHeaderError;
import static org.avni.server.importer.batch.csv.writer.BulkLocationCreator.UnknownHeadersErrorMessage;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

@Sql(value = {"/tear-down.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD)
@Sql(value = {"/tear-down.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)
public class BulkLocationCreatorIntegrationTest extends AbstractControllerIntegrationTest {
@Autowired
private TestDataSetupService testDataSetupService;
@Autowired
private BulkLocationCreator bulkLocationCreator;
@Autowired
private LocationHierarchyService locationHierarchyService;
@Autowired
private LocationRepository addressLevelRepository;
@Autowired
private TestConceptService testConceptService;
@Autowired
private LocationRepository locationRepository;
private String hierarchy;

@Override
public void setUp() throws Exception {
TestDataSetupService.TestOrganisationData organisationData = testDataSetupService.setupOrganisation();
AddressLevelType block = new AddressLevelTypeBuilder().name("Block").level(2d).withUuid(UUID.randomUUID()).build();
AddressLevelType district = new AddressLevelTypeBuilder().name("District").level(3d).withUuid(UUID.randomUUID()).build();
AddressLevelType state = new AddressLevelTypeBuilder().name("State").level(4d).withUuid(UUID.randomUUID()).build();
testDataSetupService.saveLocationTypes(Arrays.asList(block, district, state));
testConceptService.createCodedConcept("Coded Concept", "Answer 1", "Answer 2");
testConceptService.createConcept("Text Concept", ConceptDataType.Text);

setUser(organisationData.getUser().getUsername());
Map<String, String> hierarchies = locationHierarchyService.determineAddressHierarchiesForAllAddressLevelTypesInOrg();
hierarchy = String.join(".", hierarchies.keySet());
}

private static int newLocationsCreated(int count) {
return count;
}

private static String[] header(String ... cells) {
return cells;
}

private static String[] dataRow(String ... cells) {
return cells;
}

private void treatAsDescriptor(String[] headers, String ... additionalHeaders) {
long before = addressLevelRepository.count();
bulkLocationCreator.write(Collections.singletonList(new Row(headers, additionalHeaders)), hierarchy);
long after = addressLevelRepository.count();
assertEquals(before, after);
}

private void success(String[] headers, String[] cells, int numberOfNewLocations) {
long before = addressLevelRepository.count();
bulkLocationCreator.write(Collections.singletonList(new Row(headers, cells)), hierarchy);
long after = addressLevelRepository.count();
assertEquals(before + newLocationsCreated(numberOfNewLocations), after);
}

private void failure(String[] headers, String[] cells, String errorMessage) {
long before = addressLevelRepository.count();
try {
bulkLocationCreator.write(Collections.singletonList(new Row(headers, cells)), hierarchy);
} catch (Exception e) {
assertEquals(errorMessage, e.getMessage());
}
long after = addressLevelRepository.count();
assertEquals(before, after);
}

private String[] lineage(String ... lineage) {
return lineage;
}

private void lineageExists(String ... lineage) {
AddressLevel address = this.locationRepository.findByTitleLineageIgnoreCase(String.join(".", lineage)).get();
assertNotNull(address);
}

private void locationHasAttribute(String[] lineage, String concept) {
AddressLevel address = this.locationRepository.findByTitleLineageIgnoreCase(String.join(".", lineage)).get();
assertNotNull(address.getLocationProperties().get(concept));
}

@Test
@Ignore
public void shouldCreate() {
success(header("State", "District", "Block", "GPS coordinates"),
dataRow("Bihar", "Vaishali", "Mahua", "23.45,43.85"),
newLocationsCreated(3));
success(header("State", "District", "Block", "GPS coordinates"),
dataRow(" Bihar", " Vaishali ", " Jamui ", "23.20,43.85"),
newLocationsCreated(1));
success(header("State", "District", "Block", "GPS coordinates"),
dataRow(" Bihar", " Darbhanga "),
newLocationsCreated(1));
success(header("State", "District", "Block", "GPS coordinates"),
dataRow(" Bihar", " Aara ", " ", "24.20,43.85"),
newLocationsCreated(1));
success(header(" State ", "District", " Block", " GPS coordinates"),
dataRow(" Bihar", " Chapra ", " ", "24.20,43.85"),
newLocationsCreated(1));
success(header("State", "District", "Block", "GPS coordinates"),
dataRow(" bihar", " VAISHALI ", " Tarora ", "23.20,43.85"),
newLocationsCreated(1));

failure(header("State1", "District", "Block", "GPS coordinates"),
dataRow("Bihar", "Vaishali", "Nijma", "23.45,43.85"),
LocationTypesHeaderError);
failure(header("State", "District2", "Block", "GPS coordinates"),
dataRow("Bihar", "Vaishali", "Nijma", "23.45,43.85"),
LocationTypesHeaderError);
failure(header("State", "District", "Block", "GPS"),
dataRow("Bihar", "Vaishali", "Nijma", "23.45,43.85"),
UnknownHeadersErrorMessage);

treatAsDescriptor(header("State", "District", "Block", "GPS coordinates"),
dataRow("Ex: state 1", "Ex: distr 1", "Ex: blo 1", "Ex. 23.45,43.85"));
treatAsDescriptor(header("State", "District", "Block", "GPS coordinates"),
dataRow(" Ex: state 1", "Ex: distr 1 ", "Ex: blo 1", " Ex. 23.45,43.85 "));


//attributes
success(header("State", "District", "Block", "GPS coordinates", "Coded Concept"),
dataRow("Bihar", "Vaishali", "Block 1", "23.45,43.86", "Answer 1"),
newLocationsCreated(1));
locationHasAttribute(lineage("Bihar", "Vaishali", "Block 1"), "Coded Concept");

success(header("State", "District", "Block", "GPS coordinates", " Coded Concept"),
dataRow("Bihar", "Vaishali", "Block 2", "23.45,43.86", " Answer 1"),
newLocationsCreated(1));
locationHasAttribute(lineage("Bihar", "Vaishali", "Block 2"), "Coded Concept");

success(header("State", "District", "Block", "GPS coordinates", "Text Concept"),
dataRow("Bihar", "Vaishali", "Block 3", "23.45,43.86", "any text"),
newLocationsCreated(1));
locationHasAttribute(lineage("Bihar", "Vaishali", "Block 3"), "Text Concept");

failure(header("State", "District", "Block", "GPS coordinates", "Coded Concept "),
dataRow("Bihar", "Vaishali", "Block 4", "23.45,43.86", "not an answer to this concept"),
"");

// in random steps
success(header("State", "District", "Block", "GPS coordinates"),
dataRow(" ", " ", "Block11", "23.45,43.85"), newLocationsCreated(1));
success(header("State", "District", "Block", "GPS coordinates"),
dataRow("Bihar", "District1", "Block11"), newLocationsCreated(1));
lineageExists("Bihar", "District1", "Block11");
}
}

0 comments on commit 5d07ce8

Please sign in to comment.