package org.molgenis.data.excel; import org.apache.commons.io.IOUtils; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.molgenis.data.Entity; import org.molgenis.data.MolgenisDataException; import org.molgenis.data.meta.AttributeType; 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.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.io.IOException; import java.io.InputStream; import java.util.Iterator; import static org.mockito.Mockito.*; import static org.testng.Assert.*; public class ExcelRepositoryTest extends AbstractMolgenisSpringTest { @Autowired private EntityTypeFactory entityTypeFactory; @Autowired private AttributeFactory attrMetaFactory; private ExcelRepository excelSheetReader; private Workbook workbook; private InputStream is; @BeforeMethod public void beforeMethod() throws InvalidFormatException, IOException { is = getClass().getResourceAsStream("/test.xls"); workbook = WorkbookFactory.create(is); excelSheetReader = new ExcelRepository("test.xls", workbook.getSheet("test"), entityTypeFactory, attrMetaFactory); } @AfterMethod public void afterMethod() { IOUtils.closeQuietly(is); } @SuppressWarnings("resource") @Test(expectedExceptions = MolgenisDataException.class) public void ExcelRepository() { new ExcelRepository("test.xls", workbook.getSheet("test_mergedcells"), entityTypeFactory, attrMetaFactory); } @Test public void addCellProcessor_header() { CellProcessor processor = mock(CellProcessor.class); when(processor.processHeader()).thenReturn(true); when(processor.process("col1")).thenReturn("col1"); when(processor.process("col2")).thenReturn("col2"); excelSheetReader.addCellProcessor(processor); for (@SuppressWarnings("unused") Entity entity : excelSheetReader) { } verify(processor).process("col1"); verify(processor).process("col2"); } @Test public void addCellProcessor_data() { CellProcessor processor = when(mock(CellProcessor.class).processData()).thenReturn(true).getMock(); excelSheetReader.addCellProcessor(processor); for (Entity entity : excelSheetReader) entity.get("col2"); verify(processor).process("val2"); verify(processor).process("val4"); verify(processor).process("val6"); } @Test public void getAttribute() { Attribute attr = excelSheetReader.getEntityType().getAttribute("col1"); assertNotNull(attr); assertEquals(attr.getDataType(), AttributeType.STRING); assertEquals(attr.getName(), "col1"); } @Test public void getAttributes() { Iterator<Attribute> it = excelSheetReader.getEntityType().getAttributes().iterator(); assertTrue(it.hasNext()); assertEquals(it.next().getName(), "col1"); assertTrue(it.hasNext()); assertEquals(it.next().getName(), "col2"); assertFalse(it.hasNext()); } @Test public void getDescription() { assertNull(excelSheetReader.getEntityType().getDescription()); } @Test public void getIdAttribute() { assertNull(excelSheetReader.getEntityType().getIdAttribute()); } @Test public void getLabel() { assertEquals(excelSheetReader.getEntityType().getLabel(), "test"); } @Test public void getLabelAttribute() { assertNull(excelSheetReader.getEntityType().getLabelAttribute()); } @Test public void getName() { assertEquals(excelSheetReader.getName(), "test"); } @Test public void getNrRows() { assertEquals(excelSheetReader.getNrRows(), 5); } @Test public void iterator() { Iterator<Entity> it = excelSheetReader.iterator(); assertTrue(it.hasNext()); Entity row1 = it.next(); assertEquals(row1.get("col1"), "val1"); assertEquals(row1.get("col2"), "val2"); assertTrue(it.hasNext()); Entity row2 = it.next(); assertEquals(row2.get("col1"), "val3"); assertEquals(row2.get("col2"), "val4"); assertTrue(it.hasNext()); Entity row3 = it.next(); assertEquals(row3.get("col1"), "XXX"); assertEquals(row3.get("col2"), "val6"); assertTrue(it.hasNext()); // test number cell (col1) and formula cell (col2) Entity row4 = it.next(); assertEquals(row4.get("col1"), "1.2"); assertEquals(row4.get("col2"), "2.4"); assertFalse(it.hasNext()); } @Test public void attributesAndIterator() throws IOException { Iterator<Attribute> headerIt = excelSheetReader.getEntityType().getAttributes().iterator(); assertTrue(headerIt.hasNext()); assertEquals(headerIt.next().getName(), "col1"); assertTrue(headerIt.hasNext()); assertEquals(headerIt.next().getName(), "col2"); Iterator<Entity> it = excelSheetReader.iterator(); assertTrue(it.hasNext()); Entity row1 = it.next(); assertEquals(row1.get("col1"), "val1"); assertEquals(row1.get("col2"), "val2"); assertTrue(it.hasNext()); Entity row2 = it.next(); assertEquals(row2.get("col1"), "val3"); assertEquals(row2.get("col2"), "val4"); assertTrue(it.hasNext()); Entity row3 = it.next(); assertEquals(row3.get("col1"), "XXX"); assertEquals(row3.get("col2"), "val6"); assertTrue(it.hasNext()); // test number cell (col1) and formula cell (col2) Entity row4 = it.next(); assertEquals(row4.get("col1"), "1.2"); assertEquals(row4.get("col2"), "2.4"); assertFalse(it.hasNext()); } }