package net.thucydides.core.csv; import net.thucydides.core.util.ExtendedTemporaryFolder; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.List; import java.util.Map; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; public class WhenLoadingTestDataFromACSVFile { @Rule public ExtendedTemporaryFolder temporaryFolder = new ExtendedTemporaryFolder(); File temporaryDirectory; @Before public void setupTemporaryDirectory() throws IOException { temporaryDirectory = temporaryFolder.newFolder("testdata"); } protected File useTestDataIn(String filename, String... data) throws IOException { File testDataFile = new File(temporaryDirectory, filename); testDataFile.setExecutable(true); testDataFile.setReadable(true); testDataFile.setWritable(true); BufferedWriter out = new BufferedWriter(new FileWriter(testDataFile)); for (String row : data) { out.write(row); out.newLine(); } out.close(); return testDataFile; } @Test public void should_be_able_to_load_test_data_from_a_specified_CSV_file() throws IOException { // Given File testDataFile = useTestDataIn("testdata.csv", "name, address, phone", "Bill, 10 main street, 123456789"); TestDataSource testdata = new CSVTestDataSource(testDataFile.getAbsolutePath()); // When List<Map<String,String>> loadedData = testdata.getData(); // Then assertThat(loadedData, is(notNullValue())); assertThat(loadedData.size(), is(1)); } @Test public void should_be_able_to_load_test_data_from_the_classpath() throws IOException { TestDataSource testdata = new CSVTestDataSource("testdata/test.csv"); List<Map<String,String>> loadedData = testdata.getData(); assertThat(loadedData, is(notNullValue())); assertThat(loadedData.size(), is(3)); } @Test public void should_use_column_headings_to_identify_fields_in_the_test_data() throws IOException { File testDataFile = useTestDataIn("testdata.csv", "name, address, phone", "Bill, 10 main street, 123456789"); TestDataSource testdata = new CSVTestDataSource(testDataFile.getAbsolutePath()); List<Map<String,String>> loadedData = testdata.getData(); Map<String,String> row = loadedData.get(0); assertThat(row.get("name"), is("Bill")); assertThat(row.get("address"), is("10 main street")); assertThat(row.get("phone"), is("123456789")); } @Test public void should_ignore_unknown_headings() throws IOException { File testDataFile = useTestDataIn("testdata.csv", "name, address, phone, unused", "Bill, 10 main street, 123456789, extra data here"); TestDataSource testdata = new CSVTestDataSource(testDataFile.getAbsolutePath()); List<Map<String,String>> loadedData = testdata.getData(); Map<String,String> row = loadedData.get(0); assertThat(row.get("name"), is("Bill")); assertThat(row.get("address"), is("10 main street")); assertThat(row.get("phone"), is("123456789")); } @Test public void should_allow_non_comma_separators_to_be_used() throws IOException { File testDataFile = useTestDataIn("testdata.csv", "name; address; phone", "Bill; 10 main street, BillVille; 123456789"); TestDataSource testdata = new CSVTestDataSource(testDataFile.getAbsolutePath(),';'); List<Map<String,String>> loadedData = testdata.getData(); Map<String,String> row = loadedData.get(0); assertThat(row.get("name"), is("Bill")); assertThat(row.get("address"), is("10 main street, BillVille")); assertThat(row.get("phone"), is("123456789")); } @Test public void should_ignore_unknown_headings_with_no_matching_columns() throws IOException { File testDataFile = useTestDataIn("testdata.csv", "name, address, phone, unused", "Bill, 10 main street, 123456789"); TestDataSource testdata = new CSVTestDataSource(testDataFile.getAbsolutePath()); List<Map<String,String>> loadedData = testdata.getData(); Map<String,String> row = loadedData.get(0); assertThat(row.get("name"), is("Bill")); assertThat(row.get("address"), is("10 main street")); assertThat(row.get("phone"), is("123456789")); } @Test public void should_ignore_extra_columns_in_data_rows() throws IOException { File testDataFile = useTestDataIn("testdata.csv", "name, address, phone", "Bill, 10 main street, 123456789, extra data here"); TestDataSource testdata = new CSVTestDataSource(testDataFile.getAbsolutePath()); List<Map<String,String>> loadedData = testdata.getData(); Map<String,String> row = loadedData.get(0); assertThat(row.get("name"), is("Bill")); assertThat(row.get("address"), is("10 main street")); assertThat(row.get("phone"), is("123456789")); } @Test public void should_read_multple_rows_of_data() throws IOException { File testDataFile = useTestDataIn("testdata.csv", "name, address, phone", "Bill, 10 main street, 123456789", "Tim, 12 main street, 123456700"); TestDataSource testdata = new CSVTestDataSource(testDataFile.getAbsolutePath()); List<Map<String,String>> loadedData = testdata.getData(); assertThat(loadedData.size(), is(2)); Map<String,String> row1 = loadedData.get(0); assertThat(row1.get("name"), is("Bill")); assertThat(row1.get("address"), is("10 main street")); assertThat(row1.get("phone"), is("123456789")); Map<String,String> row2 = loadedData.get(1); assertThat(row2.get("name"), is("Tim")); assertThat(row2.get("address"), is("12 main street")); assertThat(row2.get("phone"), is("123456700")); } @Test public void should_load_nothing_if_no_data_is_present() throws IOException { File testDataFile = useTestDataIn("testdata.csv", ""); TestDataSource testdata = new CSVTestDataSource(testDataFile.getAbsolutePath()); List<Map<String,String>> loadedData = testdata.getData(); assertThat(loadedData.size(), is(0)); } @Test public void should_load_nothing_if_only_the_titles_are_present() throws IOException { File testDataFile = useTestDataIn("testdata.csv", "name, address, phone"); TestDataSource testdata = new CSVTestDataSource(testDataFile.getAbsolutePath()); List<Map<String,String>> loadedData = testdata.getData(); assertThat(loadedData.size(), is(0)); } @Test public void should_load_data_as_objects() throws IOException { File testDataFile = useTestDataIn("testdata.csv", "name, address, phone", "Bill, 10 main street, 123456789"); TestDataSource testdata = new CSVTestDataSource(testDataFile.getAbsolutePath()); List<Person> loadedData = testdata.getDataAsInstancesOf(Person.class); assertThat(loadedData.size(), is(1)); } @Test public void should_load_multiple_rows_of_data_as_objects() throws IOException { File testDataFile = useTestDataIn("testdata.csv", "name, address, phone", "Bill, 10 main street, 123456789", "Tim, 12 main street, 123456700"); TestDataSource testdata = new CSVTestDataSource(testDataFile.getAbsolutePath()); List<Person> loadedData = testdata.getDataAsInstancesOf(Person.class); assertThat(loadedData.size(), is(2)); } @Test public void should_assign_fields_in_loaded_objects() throws IOException { File testDataFile = useTestDataIn("testdata.csv", "name, address, phone", "Bill, 10 main street, 123456789"); TestDataSource testdata = new CSVTestDataSource(testDataFile.getAbsolutePath()); List<Person> loadedData = testdata.getDataAsInstancesOf(Person.class); Person person = loadedData.get(0); assertThat(person, allOf(hasProperty("name", is("Bill")), hasProperty("address", is("10 main street")), hasProperty("phone", is("123456789")))); } @Test public void empty_fields_should_be_set_to_empty_strings() throws IOException { File testDataFile = useTestDataIn("testdata.csv", "name, address, phone", "Bill, , 123456789"); TestDataSource testdata = new CSVTestDataSource(testDataFile.getAbsolutePath()); List<Person> loadedData = testdata.getDataAsInstancesOf(Person.class); Person person = loadedData.get(0); assertThat(person.getAddress(), is("")); } @Test public void unknown_fields_should_be_ignored() throws IOException { File testDataFile = useTestDataIn("testdata.csv", "name, address, phone, unknown", "Bill, 10 main street, 123456789, whatever"); TestDataSource testdata = new CSVTestDataSource(testDataFile.getAbsolutePath()); List<Person> loadedData = testdata.getDataAsInstancesOf(Person.class); Person person = loadedData.get(0); assertThat(person.getName(), is("Bill")); assertThat(person.getAddress(), is("10 main street")); assertThat(person.getPhone(), is("123456789")); } @Test public void should_work_with_upper_case_column_headings() throws IOException { File testDataFile = useTestDataIn("testdata.csv", "NAME, ADDRESS, PHONE", "Bill, 10 main street, 123456789"); TestDataSource testdata = new CSVTestDataSource(testDataFile.getAbsolutePath()); List<Person> loadedData = testdata.getDataAsInstancesOf(Person.class); Person person = loadedData.get(0); assertThat(person.getName(), is("Bill")); assertThat(person.getAddress(), is("10 main street")); assertThat(person.getPhone(), is("123456789")); } @Test public void should_camel_case_upper_cased_column_headings_with_spaces() throws IOException { File testDataFile = useTestDataIn("testdata.csv", "NAME, ADDRESS, PHONE, DATE OF BIRTH", "Bill, 10 main street, 123456789, 10/10/1980"); TestDataSource testdata = new CSVTestDataSource(testDataFile.getAbsolutePath()); List<Person> loadedData = testdata.getDataAsInstancesOf(Person.class); Person person = loadedData.get(0); assertThat(person.getDateOfBirth(), is("10/10/1980")); } }