package services.export;
import helpers.JsonTest;
import models.Resource;
import models.ResourceList;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class CsvDetailedExporterTest implements JsonTest {
private final static AbstractCsvExporter mCsvExporter = new CsvDetailedExporter();
private Resource in1;
private Resource in2;
@Before
public void setup() throws IOException {
in1 = getResourceFromJsonFile("CsvDetailedExporterTest/testPlainExport.IN.1.json");
in2 = getResourceFromJsonFile("CsvDetailedExporterTest/testPlainExport.IN.2.json");
List<Resource> mockSearchResultItems = new ArrayList<>();
mockSearchResultItems.add(in1);
mockSearchResultItems.add(in2);
mCsvExporter.defineHeaderColumns(mockSearchResultItems);
}
@Test
public void testHeader() throws IOException {
assertEquals(
"@id;@type;authorOf>0>@id;authorOf>0>@type;authorOf>0>articleBody;authorOf>0>author>0>@id;authorOf>0>author>0>@type;authorOf>0>author>0>name;authorOf>0>author>1>@id;authorOf>0>author>1>@type;authorOf>0>author>1>name;authorOf>0>name;authorOf>1>@id;authorOf>1>@type;authorOf>1>author>0>@id;authorOf>1>author>0>@type;authorOf>1>author>0>name;authorOf>1>name;email;name;",
mCsvExporter.headerKeysToCsvString());
}
@Test
public void testPlainExport() throws IOException {
String csv1 = mCsvExporter.export(in1);
String csv2 = mCsvExporter.export(in2);
assertEquals(
"456;\"Person\";123;\"Article\";\"Super toll\";456;\"Person\";\"Hans Dampf\";;;;\"Ganz spannend!\";987;\"Article\";456;\"Person\";\"Hans Dampf\";\"Noch spannenderen!\";;\"Hans Dampf\"",
csv1);
assertEquals(
"345;\"Person\";123;\"Article\";\"Super toll\";456;\"Person\";\"Hans Dampf\";345;\"Person\";\"Hans Wurst\";\"Ganz spannend!\";;;;;;;\"foo@bar.com\";\"Hans Wurst\"",
csv2);
}
@Test
public void testEscapedStringExport() throws IOException {
AbstractCsvExporter csvExporter = new CsvDetailedExporter();
Resource resource = getResourceFromJsonFile("CsvDetailedExporterTest/testEscapedStringExport.IN.1.json");
List<Resource> asList = new ArrayList<>();
asList.add(resource);
csvExporter.defineHeaderColumns(asList);
String csv = csvExporter.export(resource);
assertEquals(
"456;\"Person\";\"Hans is a very sophisticated person, one you would need delimiters to tell his abilities; real delimiters| I mean: many of them. Plenty.\";\"Hans Dampf\"",
csv);
}
@Test
public void testExportResourceList() throws IOException {
ResourceList multipleEvents = new ResourceList(Arrays.asList(in1, in2),
0, null, 0, 0, null, null, null);
List<String> exported = splitLines(mCsvExporter.export(multipleEvents));
List<String> expected = splitLines(getStringFromFile("CsvDetailedExporterTest/testExportResourceList.OUT.1.csv", Charset.forName("UTF-8")));
assertFalse("Export is too short.", expected.size() > exported.size());
assertFalse("Export is too long.", expected.size() < exported.size());
compareLines(exported, expected);
}
private void compareLines(List<String> aExported, List<String> aExpected) {
for (String line : aExported){
assertTrue("The CSV export line was not expected: ".concat(line), aExpected.contains(line));
}
}
}