package org.molgenis.data.csv;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.molgenis.data.Entity;
import org.molgenis.data.meta.model.Attribute;
import org.molgenis.data.meta.model.AttributeFactory;
import org.molgenis.data.meta.model.EntityTypeFactory;
import org.molgenis.data.processor.CellProcessor;
import org.molgenis.test.data.AbstractMolgenisSpringTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.FileCopyUtils;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import static org.mockito.Mockito.*;
import static org.testng.Assert.*;
public class CsvRepositoryTest extends AbstractMolgenisSpringTest
{
@Autowired
private EntityTypeFactory entityTypeFactory;
@Autowired
private AttributeFactory attrMetaFactory;
private static File test;
private static File testdata;
private static File novalues;
private static File emptyvalues;
private static File testtsv;
private static File emptylines;
private static File emptylinessinglecol;
@BeforeClass
public static void beforeClass() throws IOException
{
InputStream in = CsvRepositoryTest.class.getResourceAsStream("/test.csv");
test = new File(FileUtils.getTempDirectory(), "test.csv");
FileCopyUtils.copy(in, new FileOutputStream(test));
in = CsvRepositoryTest.class.getResourceAsStream("/testdata.csv");
testdata = new File(FileUtils.getTempDirectory(), "testdata.csv");
FileCopyUtils.copy(in, new FileOutputStream(testdata));
in = CsvRepositoryTest.class.getResourceAsStream("/novalues.csv");
novalues = new File(FileUtils.getTempDirectory(), "novalues.csv");
FileCopyUtils.copy(in, new FileOutputStream(novalues));
in = CsvRepositoryTest.class.getResourceAsStream("/emptyvalues.csv");
emptyvalues = new File(FileUtils.getTempDirectory(), "emptyvalues.csv");
FileCopyUtils.copy(in, new FileOutputStream(emptyvalues));
in = CsvRepositoryTest.class.getResourceAsStream("/test.tsv");
testtsv = new File(FileUtils.getTempDirectory(), "test.tsv");
FileCopyUtils.copy(in, new FileOutputStream(testtsv));
in = CsvRepositoryTest.class.getResourceAsStream("/emptylines.csv");
emptylines = new File(FileUtils.getTempDirectory(), "emptylines.csv");
FileCopyUtils.copy(in, new FileOutputStream(emptylines));
in = CsvRepositoryTest.class.getResourceAsStream("/emptylinessinglecol.csv");
emptylinessinglecol = new File(FileUtils.getTempDirectory(), "emptylinessinglecol.csv");
FileCopyUtils.copy(in, new FileOutputStream(emptylinessinglecol));
}
@Test
public void addCellProcessor_header() throws IOException
{
CellProcessor processor = when(mock(CellProcessor.class).processHeader()).thenReturn(true).getMock();
when(processor.process("col1")).thenReturn("col1");
when(processor.process("col2")).thenReturn("col2");
CsvRepository csvRepository = new CsvRepository(test, entityTypeFactory, attrMetaFactory, null);
try
{
csvRepository.addCellProcessor(processor);
for (@SuppressWarnings("unused") Entity entity : csvRepository)
{
}
verify(processor).process("col1");
verify(processor).process("col2");
}
finally
{
csvRepository.close();
}
}
@Test
public void addCellProcessor_data() throws IOException
{
CellProcessor processor = when(mock(CellProcessor.class).processData()).thenReturn(true).getMock();
CsvRepository csvRepository = new CsvRepository(test, entityTypeFactory, attrMetaFactory, null);
try
{
csvRepository.addCellProcessor(processor);
for (@SuppressWarnings("unused") Entity entity : csvRepository)
{
}
verify(processor).process("val1");
verify(processor).process("val2");
}
finally
{
csvRepository.close();
}
}
@Test
public void metaData() throws IOException
{
CsvRepository csvRepository = null;
try
{
csvRepository = new CsvRepository(testdata, entityTypeFactory, attrMetaFactory, null);
assertEquals(csvRepository.getName(), "testdata");
Iterator<Attribute> it = csvRepository.getEntityType().getAttributes().iterator();
assertTrue(it.hasNext());
assertEquals(it.next().getName(), "col1");
assertTrue(it.hasNext());
assertEquals(it.next().getName(), "col2");
assertFalse(it.hasNext());
}
finally
{
IOUtils.closeQuietly(csvRepository);
}
}
/**
* Test based on au.com.bytecode.opencsv.CSVReaderTest
*
* @throws IOException
*/
@Test
public void iterator() throws IOException
{
CsvRepository csvRepository = null;
try
{
csvRepository = new CsvRepository(testdata, entityTypeFactory, attrMetaFactory, null);
Iterator<Entity> it = csvRepository.iterator();
assertTrue(it.hasNext());
Entity entity = it.next();
assertEquals(entity.get("col1"), "val1");
assertEquals(entity.get("col2"), "val2");
assertTrue(it.hasNext());
entity = it.next();
assertEquals(entity.get("col1"), "a,a");
assertEquals(entity.get("col2"), "b");
assertTrue(it.hasNext());
assertTrue(it.hasNext());
entity = it.next();
assertNull(entity.get("col1"));
assertEquals(entity.get("col2"), "a");
assertTrue(it.hasNext());
entity = it.next();
assertEquals(entity.get("col1"), "\"");
assertEquals(entity.get("col2"), "\"\"");
assertTrue(it.hasNext());
entity = it.next();
assertEquals(entity.get("col1"), ",");
assertEquals(entity.get("col2"), ",,");
assertFalse(it.hasNext());
}
finally
{
IOUtils.closeQuietly(csvRepository);
}
}
@Test
public void iterator_noValues() throws IOException
{
CsvRepository csvRepository = new CsvRepository(novalues, entityTypeFactory, attrMetaFactory, null);
try
{
Iterator<Entity> it = csvRepository.iterator();
assertFalse(it.hasNext());
}
finally
{
csvRepository.close();
}
}
@Test
public void iterator_emptyValues() throws IOException
{
CsvRepository csvRepository = new CsvRepository(emptyvalues, entityTypeFactory, attrMetaFactory, null);
try
{
Iterator<Entity> it = csvRepository.iterator();
assertTrue(it.hasNext());
assertNull(it.next().get("col1"));
}
finally
{
csvRepository.close();
}
}
@Test
public void iterator_tsv() throws IOException
{
CsvRepository tsvRepository = new CsvRepository(testtsv, entityTypeFactory, attrMetaFactory, null);
try
{
Iterator<Entity> it = tsvRepository.iterator();
Entity entity = it.next();
assertEquals(entity.get("col1"), "val1");
assertEquals(entity.get("col2"), "val2");
assertFalse(it.hasNext());
}
finally
{
tsvRepository.close();
}
}
@Test
public void iterator_emptylines() throws IOException
{
CsvRepository csvRepository = new CsvRepository(emptylines, entityTypeFactory, attrMetaFactory, null);
try
{
Iterator<Entity> it = csvRepository.iterator();
Entity entity = it.next();
assertEquals(entity.get("col1"), "val1");
assertEquals(entity.get("col2"), "val2");
assertFalse(it.hasNext());
}
finally
{
csvRepository.close();
}
}
@Test
public void iterator_emptylines_singlecol() throws IOException
{
CsvRepository csvRepository = new CsvRepository(emptylinessinglecol, entityTypeFactory, attrMetaFactory, null);
try
{
Iterator<Entity> it = csvRepository.iterator();
Entity entity = it.next();
assertEquals(entity.get("col1"), "val1");
assertTrue(it.hasNext());
entity = it.next();
assertNull(entity.get("col1"));
assertFalse(it.hasNext());
}
finally
{
csvRepository.close();
}
}
}