package com.socrata.datasync.job;
import com.socrata.datasync.PublishMethod;
import com.socrata.datasync.TestBase;
import com.socrata.datasync.config.CommandLineOptions;
import com.socrata.exceptions.LongRunningQueryException;
import com.socrata.exceptions.SodaError;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
import junit.framework.TestCase;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
public class IntegrationJobTest extends TestBase {
private IntegrationJob job;
CommandLineParser parser;
CommandLineOptions cmd = new CommandLineOptions();
public static final String PATH_TO_SAVED_JOB_FILE_V0dot1 = "src/test/resources/job_saved_v0.1.sij";
public static final String PATH_TO_SAVED_JOB_FILE_V0dot3 = "src/test/resources/job_saved_v0.3.sij";
public static final String PATH_TO_SAVED_JOB_FILE_V0dot4 = "src/test/resources/job_saved_v0.4.sij";
public static final String PATH_TO_SAVED_JOB_FILE_V0dot4_CONTROL_CONTENT =
"src/test/resources/job_saved_v0.4_control_content.sij";
@Before
public void initialize() {
job = new IntegrationJob();
parser = new PosixParser();
}
@Test
public void testValidationOfArgs() throws ParseException {
String[] goodArgs = {"-i", "some-four", "-f", " ~/././.", "-m", "replace", "-h", "true"};
String[] incompleteArgs1 = {"-f", " ~/././.", "-m", "replace", "-h", "true"};
String[] incompleteArgs2 = {"-i", "some-four", "-m", "replace", "-h", "true"};
String[] incompleteArgs3 = {"-i", "some-four", "-f", " ~/././.", "-h", "true"};
String[] incompleteArgs4 = {"-i", "some-four", "-f", " ~/././.", "-m", "replace"};
String[] invalidArgs1 = {"-i", "some-four", "-f", " ~/././.", "-m", "replace", "-h", "true", "-pf", "invalid"};
String[] invalidArgs2 = {"-i", "4x4", "-f", " ~/.", "-m", "replace", "-h", "true", "-pf", "false", "-sc", "/./."};
String[] invalidArgs3 = {"-i", "4x4", "-f", " ~/././.", "-m", "invalid", "-h", "true"};
TestCase.assertTrue(job.validateArgs(parser.parse(cmd.options, goodArgs)));
TestCase.assertFalse(job.validateArgs(parser.parse(cmd.options, incompleteArgs1)));
TestCase.assertFalse(job.validateArgs(parser.parse(cmd.options, incompleteArgs2)));
TestCase.assertFalse(job.validateArgs(parser.parse(cmd.options, incompleteArgs3)));
TestCase.assertFalse(job.validateArgs(parser.parse(cmd.options, incompleteArgs4)));
TestCase.assertFalse(job.validateArgs(parser.parse(cmd.options, invalidArgs1)));
TestCase.assertFalse(job.validateArgs(parser.parse(cmd.options, invalidArgs2)));
TestCase.assertFalse(job.validateArgs(parser.parse(cmd.options, invalidArgs3)));
}
@Test
public void testConfiguration() throws ParseException {
String[] args = {"-i", "some-four", "-f", " ~/././.", "-m", "replace", "-h", "true"};
job.configure(parser.parse(cmd.options, args));
TestCase.assertEquals(job.getDatasetID(), args[1]);
TestCase.assertEquals(job.getFileToPublish(), args[3]);
TestCase.assertEquals(job.getPublishMethod().toString(), args[5]);
TestCase.assertTrue(job.getFileToPublishHasHeaderRow());
}
@Test
public void testDataSyncV0dot1JobFileDeserialization() throws IOException, IntegrationJob.ControlDisagreementException {
IntegrationJob job = new IntegrationJob(PATH_TO_SAVED_JOB_FILE_V0dot1);
TestCase.assertEquals(
"/Users/adrian/Dropbox/Socrata_s/projects/data_integration/datasync/misc/honolulu_report2.csv",
job.getFileToPublish());
TestCase.assertEquals("n38h-y5wpx", job.getDatasetID());
TestCase.assertEquals(PublishMethod.upsert, job.getPublishMethod());
TestCase.assertEquals(
"src/test/resources/job_saved_v0.1.sij",
job.getPathToSavedFile());
TestCase.assertEquals(false, job.getPublishViaFTP());
}
@Test
public void testDataSyncJSONJobFileDeserialization() throws IOException, IntegrationJob.ControlDisagreementException {
IntegrationJob job = new IntegrationJob(PATH_TO_SAVED_JOB_FILE_V0dot3);
TestCase.assertEquals(
"/Users/adrian/Dropbox/Socrata_s/projects/data_integration/datasync/misc/honolulu_report2.csv",
job.getFileToPublish());
TestCase.assertEquals("n38h-y5wpx", job.getDatasetID());
TestCase.assertEquals(PublishMethod.upsert, job.getPublishMethod());
TestCase.assertEquals(
"src/test/resources/job_saved_v0.3.sij",
job.getPathToSavedFile());
TestCase.assertEquals(false, job.getPublishViaFTP());
}
@Test
public void testDataSyncJSONv0dot4JobFileDeserialization() throws IOException, IntegrationJob.ControlDisagreementException {
IntegrationJob job = new IntegrationJob(PATH_TO_SAVED_JOB_FILE_V0dot4);
TestCase.assertEquals("E:\\tm\\02.26.2014.17.59.22.0.0695675217148733.csv", job.getFileToPublish());
TestCase.assertEquals("kwgk-zc5k", job.getDatasetID());
TestCase.assertEquals(PublishMethod.replace, job.getPublishMethod());
TestCase.assertEquals("src/test/resources/job_saved_v0.4.sij", job.getPathToSavedFile());
TestCase.assertEquals(true, job.getFileToPublishHasHeaderRow());
TestCase.assertEquals(true, job.getPublishViaFTP());
TestCase.assertEquals("", job.getPathToControlFile());
TestCase.assertEquals("job_saved_v0.4.sij", job.getJobFilename());
}
@Test
public void testDataSyncJSONv0dot4ControlContentJobFileDeserialization() throws IOException, IntegrationJob.ControlDisagreementException {
IntegrationJob job = new IntegrationJob(PATH_TO_SAVED_JOB_FILE_V0dot4_CONTROL_CONTENT);
TestCase.assertEquals("/Users/file.csv", job.getFileToPublish());
TestCase.assertEquals("geue-g9cw", job.getDatasetID());
TestCase.assertEquals(PublishMethod.replace, job.getPublishMethod());
TestCase.assertEquals("src/test/resources/job_saved_v0.4_control_content.sij", job.getPathToSavedFile());
TestCase.assertEquals(false, job.getFileToPublishHasHeaderRow());
TestCase.assertEquals(true, job.getPublishViaFTP());
TestCase.assertEquals("", job.getPathToControlFile());
TestCase.assertEquals("{\n" +
" \"action\" : \"Replace\", \n" +
" \"csv\" :\n" +
" {\n" +
" \"columns\" : [\"id\",\"name\",\"another_name\",\"date\"],\n" +
" \"skip\" : 0,\n" +
" \"fixedTimestampFormat\" : \"ISO8601\",\n" +
" \"floatingTimestampFormat\" : \"ISO8601\",\n" +
" \"timezone\" : \"UTC\",\n" +
" \"separator\" : \",\",\n" +
" \"quote\" : \"\\\"\",\n" +
" \"encoding\" : \"utf-8\",\n" +
" \"emptyTextIsNull\" : true,\n" +
" \"trimWhitespace\" : true,\n" +
" \"trimServerWhitespace\" : false,\n" +
" \"overrides\" : {}\n" +
" }\n" +
"}", job.getControlFileContent());
TestCase.assertEquals("job_saved_v0.4_control_content.sij", job.getJobFilename());
}
@Test
public void testIntegrationJobReplaceViaHTTP() throws IOException, LongRunningQueryException, SodaError {
IntegrationJob jobToRun = getIntegrationJobWithUserPrefs();
jobToRun.setDatasetID(UNITTEST_DATASET_ID);
jobToRun.setFileToPublish("src/test/resources/datasync_unit_test_two_rows.csv");
jobToRun.setPublishMethod(PublishMethod.replace);
jobToRun.setFileToPublishHasHeaderRow(true);
jobToRun.setPublishViaFTP(false);
JobStatus status = jobToRun.run();
TestCase.assertEquals(false, jobToRun.getPublishViaFTP());
TestCase.assertEquals(JobStatus.SUCCESS, status);
TestCase.assertFalse(status.isError());
TestCase.assertEquals(2, getTotalRows(UNITTEST_DATASET_ID));
}
@Test
public void testIntegrationJobInvalidDatasetId() throws IOException, LongRunningQueryException, SodaError {
IntegrationJob jobToRun = getIntegrationJobWithUserPrefs();
jobToRun.setDatasetID("invalidid");
jobToRun.setFileToPublish("src/test/resources/datasync_unit_test_two_rows.csv");
jobToRun.setPublishMethod(PublishMethod.replace);
jobToRun.setFileToPublishHasHeaderRow(true);
JobStatus status = jobToRun.run();
TestCase.assertEquals(JobStatus.INVALID_DATASET_ID, status);
TestCase.assertTrue(status.isError());
}
@Test
public void testIntegrationJobPublishError() throws IOException, LongRunningQueryException, SodaError {
IntegrationJob jobToRun = getIntegrationJobWithUserPrefs();
jobToRun.setDatasetID(UNITTEST_DATASET_ID);
jobToRun.setFileToPublish("src/test/resources/datasync_unit_test_invalid_date.csv");
jobToRun.setPublishMethod(PublishMethod.upsert);
jobToRun.setFileToPublishHasHeaderRow(true);
jobToRun.setPublishViaFTP(false);
JobStatus status = jobToRun.run();
TestCase.assertEquals(JobStatus.PUBLISH_ERROR, status);
TestCase.assertTrue(status.isError());
TestCase.assertTrue(status.getMessage().endsWith(") to a calendar_date. Unknown date format 'invalid'. (line 3 of file) \n"));
// TestCase.assertEquals("FAILURE: Processing datasync_unit_test_invalid_date.csv failed: Value in column \"date\" uninterpretable as calendar_date in input at record 2: \"invalid\"\n", status.getMessage());
}
}