de.ks.idnadrev.expimp.xls.XlsxExporterTest.java Source code

Java tutorial

Introduction

Here is the source code for de.ks.idnadrev.expimp.xls.XlsxExporterTest.java

Source

/*
 * Copyright [2014] [Christian Loehnert, krampenschiesser@gmail.com]
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package de.ks.idnadrev.expimp.xls;

import de.ks.LauncherRunner;
import de.ks.idnadrev.entity.Cleanup;
import de.ks.idnadrev.entity.Tag;
import de.ks.idnadrev.entity.Task;
import de.ks.idnadrev.entity.Thought;
import de.ks.idnadrev.expimp.EntityExportSource;
import de.ks.persistence.PersistentWork;
import de.ks.reflection.PropertyPath;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.*;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.inject.Inject;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Root;
import java.io.File;
import java.sql.Timestamp;
import java.util.*;

import static org.hamcrest.Matchers.greaterThanOrEqualTo;
import static org.junit.Assert.*;

@RunWith(LauncherRunner.class)
public class XlsxExporterTest {
    private static final Logger log = LoggerFactory.getLogger(XlsxExporterTest.class);
    public static final int COUNT = 142;
    @Inject
    protected Cleanup cleanup;

    @Before
    public void setUp() throws Exception {
        cleanup.cleanup();

        PersistentWork.run(em -> {
            for (int i = 0; i < COUNT; i++) {
                em.persist(new Thought(String.format("Thought%03d", i)));
            }
            Tag tag1 = new Tag("tag" + ToManyColumn.SEPARATOR + "1");
            Tag tag2 = new Tag("tag2");
            Task testTask = new Task("testTask");
            testTask.addTag(tag1);
            testTask.addTag(tag2);
            em.persist(testTask);
        });
    }

    protected List<Long> getAllIds() {
        return PersistentWork.read(em -> {
            CriteriaQuery<Long> criteriaQuery = em.getCriteriaBuilder().createQuery(Long.class);
            Root<Thought> root = criteriaQuery.from(Thought.class);
            Path<Long> id = root.<Long>get("id");
            criteriaQuery.select(id);
            return em.createQuery(criteriaQuery).getResultList();
        });
    }

    @Test
    public void testExportThoughts() throws Exception {
        File tempFile = File.createTempFile("thoughtExport", ".xlsx");
        EntityExportSource<Thought> source = new EntityExportSource<>(getAllIds(), Thought.class);
        XlsxExporter exporter = new XlsxExporter();
        exporter.export(tempFile, source);

        Workbook wb = WorkbookFactory.create(tempFile);
        Sheet sheet = wb.getSheetAt(0);
        assertEquals(Thought.class.getName(), sheet.getSheetName());
        int lastRowNum = sheet.getLastRowNum();
        assertEquals(COUNT, lastRowNum);
        Row firstRow = sheet.getRow(0);

        ArrayList<String> titles = new ArrayList<>();
        firstRow.cellIterator().forEachRemaining(col -> titles.add(col.getStringCellValue()));
        assertThat(titles.size(), greaterThanOrEqualTo(3));
        log.info("Found titles {}", titles);

        String creationTime = PropertyPath.property(Thought.class, t -> t.getCreationTime());
        String name = PropertyPath.property(Thought.class, t -> t.getName());
        String description = PropertyPath.property(Thought.class, t -> t.getDescription());

        assertTrue(titles.contains(creationTime));
        assertTrue(titles.contains(name));
        assertTrue(titles.contains(description));

        int nameColumn = titles.indexOf(name);
        ArrayList<String> names = new ArrayList<String>(COUNT);
        for (int i = 1; i <= COUNT; i++) {
            Row row = sheet.getRow(i);
            names.add(row.getCell(nameColumn).getStringCellValue());
        }
        Collections.sort(names);
        assertEquals("Thought000", names.get(0));
        assertEquals("Thought141", names.get(COUNT - 1));

        Date excelDate = sheet.getRow(1).getCell(titles.indexOf(creationTime)).getDateCellValue();

        Thought thought = PersistentWork.forName(Thought.class, "Thought000");

        Timestamp timestamp = java.sql.Timestamp.valueOf(thought.getCreationTime());
        Date creationDate = new Date(timestamp.getTime());
        assertEquals(creationDate, excelDate);
    }

    @Test
    public void testExportToManyRelation() throws Exception {
        File tempFile = File.createTempFile("taskExportTest", ".xlsx");
        EntityExportSource<Task> tasks = new EntityExportSource<>(PersistentWork.idsFrom(Task.class), Task.class);
        EntityExportSource<Tag> tags = new EntityExportSource<>(PersistentWork.idsFrom(Tag.class), Tag.class);
        XlsxExporter exporter = new XlsxExporter();
        exporter.export(tempFile, tasks, tags);

        Workbook wb = WorkbookFactory.create(tempFile);
        Sheet taskSheet = wb.getSheet(Task.class.getName());
        Sheet tagSheet = wb.getSheet(Tag.class.getName());
        assertNotNull(taskSheet);
        assertNotNull(tagSheet);

        Row firstRow = taskSheet.getRow(0);
        int pos = 0;
        Iterator<Cell> cellIterator = firstRow.cellIterator();

        String property = PropertyPath.property(Task.class, t -> t.getTags());
        while (cellIterator.hasNext()) {
            Cell cell = cellIterator.next();
            if (cell.getStringCellValue().equals(property)) {
                break;
            }
            pos++;
        }
        assertNotEquals(Task.class.getSimpleName() + "." + property + " not exported", firstRow.getLastCellNum(),
                pos);

        Cell cell = taskSheet.getRow(1).getCell(pos);
        String[] split = StringUtils.split(cell.getStringCellValue(), ToManyColumn.SEPARATOR);
        assertEquals(2, split.length);
        assertTrue(Arrays.asList(split).contains("tag" + ToManyColumn.SEPARATOR_REPLACEMENT + "1"));
        assertTrue(Arrays.asList(split).contains("tag2"));
    }
}