package org.mapfish.print.processor.jasper; import com.google.common.base.Predicate; import com.google.common.io.Resources; import jsr166y.ForkJoinPool; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.data.JRMapCollectionDataSource; import org.junit.Test; import org.mapfish.print.AbstractMapfishSpringTest; import org.mapfish.print.TestHttpClientFactory; import org.mapfish.print.config.Configuration; import org.mapfish.print.config.ConfigurationFactory; import org.mapfish.print.config.Template; import org.mapfish.print.output.AbstractJasperReportOutputFormat; import org.mapfish.print.output.OutputFormat; import org.mapfish.print.output.Values; import org.mapfish.print.parser.MapfishParser; import org.mapfish.print.test.util.ImageSimilarity; import org.mapfish.print.wrapper.json.PJsonObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.mock.http.client.MockClientHttpRequest; import org.springframework.mock.http.client.MockClientHttpResponse; import org.springframework.test.annotation.DirtiesContext; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.net.URI; import java.net.URL; import java.util.Map; import javax.annotation.Nullable; import static org.junit.Assert.assertEquals; @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) public class TableProcessorTest extends AbstractMapfishSpringTest { public static final String BASIC_BASE_DIR = "table/"; public static final String DYNAMIC_BASE_DIR = "table-dynamic/"; public static final String DEFAULT_DYNAMIC_BASE_DIR = "table-dynamic-defaults/"; public static final String IMAGE_CONVERTER_BASE_DIR = "table-image-column-resolver/"; public static final String TABLE_CONVERTERS = "table_converters/"; public static final String TABLE_CONVERTERS_DYNAMIC = "table_converters_dyn/"; @Autowired private ConfigurationFactory configurationFactory; @Autowired private MapfishParser parser; @Autowired private ForkJoinPool forkJoinPool; @Autowired private TestHttpClientFactory httpRequestFactory; @Autowired private Map<String, OutputFormat> outputFormat; @Test public void testDefaultDynamicTableProperties() throws Exception { final String baseDir = DEFAULT_DYNAMIC_BASE_DIR; final Configuration config = configurationFactory.getConfig(getFile(baseDir + "config.yaml")); PJsonObject requestData = loadJsonRequestData(baseDir); final AbstractJasperReportOutputFormat format = (AbstractJasperReportOutputFormat) this.outputFormat.get("pngOutputFormat"); final File file = getFile(TableProcessorTest.class, baseDir); JasperPrint print = format.getJasperPrint(requestData, config, file, getTaskDirectory()).print; BufferedImage reportImage = ImageSimilarity.exportReportToImage(print, 0); // ImageIO.write(reportImage, "png", new File("/tmp/testDefaultDynamicTableProperties.png")); // note that we are using a sample size of 50, because the image is quite big. // otherwise small differences are not detected! new ImageSimilarity(reportImage, 50).assertSimilarity(getFile(baseDir + "expectedImage.png"), 10); } @Test public void testBasicTableProperties() throws Exception { final String baseDir = BASIC_BASE_DIR; final Configuration config = configurationFactory.getConfig(getFile(baseDir + "config.yaml")); final Template template = config.getTemplate("main"); PJsonObject requestData = loadJsonRequestData(baseDir); Values values = new Values(requestData, template, parser, getTaskDirectory(), this.httpRequestFactory, new File(".")); forkJoinPool.invoke(template.getProcessorGraph().createTask(values)); final JRMapCollectionDataSource tableDataSource = values.getObject( "tableDataSource", JRMapCollectionDataSource.class); int count = 0; while (tableDataSource.next()) { count++; } assertEquals(2, count); } @Test public void testBasicTablePrint() throws Exception { final String baseDir = BASIC_BASE_DIR; final Configuration config = configurationFactory.getConfig(getFile(baseDir + "config.yaml")); PJsonObject requestData = loadJsonRequestData(baseDir); final AbstractJasperReportOutputFormat format = (AbstractJasperReportOutputFormat) this.outputFormat.get("pngOutputFormat"); final File file = getFile(TableProcessorTest.class, baseDir); JasperPrint print = format.getJasperPrint(requestData, config, file, getTaskDirectory()).print; BufferedImage reportImage = ImageSimilarity.exportReportToImage(print, 0); // note that we are using a sample size of 50, because the image is quite big. // otherwise small differences are not detected! new ImageSimilarity(reportImage, 50).assertSimilarity(getFile(baseDir + "expectedImage.png"), 10); } @Test public void testDynamicTablePrint() throws Exception { final String baseDir = DYNAMIC_BASE_DIR; final Configuration config = configurationFactory.getConfig(getFile(baseDir + "config.yaml")); PJsonObject requestData = loadJsonRequestData(baseDir); final AbstractJasperReportOutputFormat format = (AbstractJasperReportOutputFormat) this.outputFormat.get("pngOutputFormat"); final File file = getFile(TableProcessorTest.class, baseDir); JasperPrint print = format.getJasperPrint(requestData, config, file, getTaskDirectory()).print; BufferedImage reportImage = ImageSimilarity.exportReportToImage(print, 0); // ImageIO.write(reportImage, "png", new File("/tmp/expectedImage.png")); // note that we are using a sample size of 50, because the image is quite big. // otherwise small differences are not detected! new ImageSimilarity(reportImage, 50).assertSimilarity(getFile(baseDir + "expectedImage.png"), 10); } @Test public void testColumnImageConverter() throws Exception { httpRequestFactory.registerHandler(new Predicate<URI>() { @Override public boolean apply(@Nullable URI input) { return input.toString().contains("icons.com"); } }, new TestHttpClientFactory.Handler() { @Override public MockClientHttpRequest handleRequest(URI uri, HttpMethod httpMethod) throws Exception { final URL imageUrl = TableProcessorTest.class.getResource("/icons" + uri.getPath()); final byte[] imageBytes = Resources.toByteArray(imageUrl); MockClientHttpRequest request = new MockClientHttpRequest(); request.setResponse(new MockClientHttpResponse(imageBytes, HttpStatus.OK)); return request; } }); final String baseDir = IMAGE_CONVERTER_BASE_DIR; final Configuration config = configurationFactory.getConfig(getFile(baseDir + "config.yaml")); PJsonObject requestData = loadJsonRequestData(baseDir); final AbstractJasperReportOutputFormat format = (AbstractJasperReportOutputFormat) this.outputFormat.get("pngOutputFormat"); final File file = getFile(TableProcessorTest.class, baseDir); JasperPrint print = format.getJasperPrint(requestData, config, file, getTaskDirectory()).print; BufferedImage reportImage = ImageSimilarity.exportReportToImage(print, 0); // ImageIO.write(reportImage, "png", new File("/tmp/testColumnImageConverter.png")); // note that we are using a sample size of 50, because the image is quite big. // otherwise small differences are not detected! new ImageSimilarity(reportImage, 50).assertSimilarity(getFile(baseDir + "expectedImage.png"), 10); } @Test @DirtiesContext public void testTableConverters() throws Exception { httpRequestFactory.registerHandler(new Predicate<URI>() { @Override public boolean apply(@Nullable URI input) { return input.toString().contains("icons.com"); } }, new TestHttpClientFactory.Handler() { @Override public MockClientHttpRequest handleRequest(URI uri, HttpMethod httpMethod) throws Exception { final URL imageUrl = TableProcessorTest.class.getResource("/icons" + uri.getPath()); final byte[] imageBytes = Resources.toByteArray(imageUrl); MockClientHttpRequest request = new MockClientHttpRequest(); request.setResponse(new MockClientHttpResponse(imageBytes, HttpStatus.OK)); return request; } }); final String baseDir = TABLE_CONVERTERS; final Configuration config = configurationFactory.getConfig(getFile(baseDir + "config.yaml")); PJsonObject requestData = loadJsonRequestData(baseDir); final AbstractJasperReportOutputFormat format = (AbstractJasperReportOutputFormat) this.outputFormat.get("pngOutputFormat"); final File file = getFile(TableProcessorTest.class, baseDir); JasperPrint print = format.getJasperPrint(requestData, config, file, getTaskDirectory()).print; BufferedImage reportImage = ImageSimilarity.exportReportToImage(print, 0); // ImageIO.write(reportImage, "png", new File("/tmp/testColumnImageConverter.png")); // note that we are using a sample size of 50, because the image is quite big. // otherwise small differences are not detected! new ImageSimilarity(reportImage, 50).assertSimilarity(getFile(baseDir + "expectedImage.png"), 10); } @Test public void testTableConvertersDynamic() throws Exception { final String baseDir = TABLE_CONVERTERS_DYNAMIC; final Configuration config = configurationFactory.getConfig(getFile(baseDir + "config.yaml")); PJsonObject requestData = loadJsonRequestData(baseDir); final AbstractJasperReportOutputFormat format = (AbstractJasperReportOutputFormat) this.outputFormat.get("pngOutputFormat"); final File file = getFile(TableProcessorTest.class, baseDir); JasperPrint print = format.getJasperPrint(requestData, config, file, getTaskDirectory()).print; BufferedImage reportImage = ImageSimilarity.exportReportToImage(print, 0); // ImageIO.write(reportImage, "png", new File("/tmp/expectedImage.png")); // note that we are using a sample size of 50, because the image is quite big. // otherwise small differences are not detected! new ImageSimilarity(reportImage, 50).assertSimilarity(getFile(baseDir + "expectedImage.png"), 10); } private static PJsonObject loadJsonRequestData(String baseDir) throws IOException { return parseJSONObjectFromFile(TableProcessorTest.class, baseDir + "requestData.json"); } }