package com.socrata.datasync.model; import com.socrata.datasync.TestBase; import com.socrata.datasync.config.controlfile.ControlFile; import com.socrata.datasync.config.controlfile.LocationColumn; import com.socrata.datasync.config.userpreferences.UserPreferences; import com.socrata.datasync.config.userpreferences.UserPreferencesFile; import com.socrata.exceptions.LongRunningQueryException; import org.apache.http.HttpException; import junit.framework.TestCase; import org.codehaus.jackson.map.DeserializationConfig; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.SerializationConfig; import org.junit.Test; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; /** * Series of tests to validate that the control file model produces a correct control file. * * Created by franklinwilliams */ public class ControlFileModelTest extends TestBase { ObjectMapper mapper = new ObjectMapper().enable(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY); @Test public void testColumnUpdates() throws IOException, LongRunningQueryException, InterruptedException, HttpException, URISyntaxException { ControlFile cf = getTestControlFile(); ControlFileModel model = getTestModel(cf); String fieldName = "test"; model.updateColumnAtPosition(fieldName,0); TestCase.assertEquals(model.getColumnAtPosition(0), fieldName); } //Can I get out the same control file that I put in? @Test public void testSerialization() throws IOException, LongRunningQueryException, InterruptedException, HttpException, URISyntaxException { ControlFile cf = getTestControlFile(); ObjectMapper mapper = new ObjectMapper().configure(SerializationConfig.Feature.INDENT_OUTPUT, true); String originalValue = mapper.writeValueAsString(cf); ControlFileModel model = getTestModel(cf); String newValue = model.getControlFileContents(); TestCase.assertEquals(originalValue,newValue); } @Test public void testIgnoredColumns() throws IOException, LongRunningQueryException, InterruptedException, HttpException, URISyntaxException { ControlFile cf = getTestControlFile(); ControlFileModel model = getTestModel(cf); int columnLengthBeforeUpdate = model.getColumnCount(); //Verify that the location column is part of the ignored list TestCase.assertTrue(model.isIgnored("foo")); //Now add it back to the columns list model.updateColumnAtPosition("foo",0); //Verify that the column that was there is no longer part of the ignored columns list. TestCase.assertFalse(model.isIgnored("id")); // Ignoring a column should not change how many columns there are. // Verify that we have the same number of columns in the control file as we did when we started TestCase.assertEquals(model.getColumnCount(), columnLengthBeforeUpdate); } @Test public void testHasHeaderRow() throws IOException, LongRunningQueryException, InterruptedException, HttpException, URISyntaxException { //Assert that we are skipping the first row when has header row == 1 ControlFile cf = getTestControlFile(); ControlFileModel model = getTestModel(cf); model.setRowsToSkip(0); model.setHasHeaderRow(true); TestCase.assertEquals(1, (int) model.getControlFile().getFileTypeControl().skip); //The headers should always be either the name of the field to which we're setting this column, or the dummy //placeholder. Verify that this actually the case. TestCase.assertEquals("id",model.getColumnAtPosition(0)); //Assert that we decrement by 1 when the header row is turned off model.setRowsToSkip(5); model.setHasHeaderRow(false); TestCase.assertEquals(4, (int) model.getControlFile().getFileTypeControl().skip); } @Test public void testSyntheticColumns() throws IOException, LongRunningQueryException, InterruptedException, HttpException, URISyntaxException { ControlFile cf = getTestControlFile(); ControlFileModel model = getTestModel(cf); String fieldName = "testLoc"; LocationColumn location = new LocationColumn(); location.address = "1234 fake street"; location.latitude = "90"; location.longitude = "90"; //Test that we can add to the synthetic location when none exist model.setSyntheticLocation(fieldName,location); TestCase.assertEquals(model.getSyntheticLocations().get(fieldName),location); //Test that we can add another one when one already exists String anotherColumn = "anotherColumn"; LocationColumn newLocation = new LocationColumn(); newLocation.address = "742 evergreen terrace"; model.setSyntheticLocation(anotherColumn,newLocation); TestCase.assertEquals(model.getSyntheticLocations().get(anotherColumn), newLocation); } private ControlFile getTestControlFile() throws IOException { File controlFile = new File("src/test/resources/datasync_unit_test_three_rows_control.json"); ControlFile cf = mapper.readValue(controlFile, ControlFile.class); cf.getFileTypeControl().filePath = "src/test/resources/datasync_unit_test_three_rows.csv"; return cf; } private ControlFileModel getTestModel(ControlFile cf) throws IOException, LongRunningQueryException, InterruptedException, HttpException, URISyntaxException { File configFile = new File(PATH_TO_CONFIG_FILE); ObjectMapper mapper = new ObjectMapper(); UserPreferences userPrefs = mapper.readValue(configFile, UserPreferencesFile.class); DatasetModel datasetModel = new DatasetModel(userPrefs,TestBase.UNITTEST_DATASET_ID); ControlFileModel model = new ControlFileModel(cf,datasetModel); return model; } }