From f74e015f3e299185de25580b96022fa04bcc27e3 Mon Sep 17 00:00:00 2001 From: Andreas Hufler Date: Mon, 30 Sep 2024 12:33:33 +0200 Subject: [PATCH] add assertion helpers --- pom.xml | 19 ++++ .../assertion/document/DocxAssert.java | 68 +++++++++++++ .../testing/assertion/document/PdfAssert.java | 83 ++++++++++++++++ .../assertion/document/XlsxAssert.java | 99 +++++++++++++++++++ .../persistance/PersistenceAssert.java | 2 +- 5 files changed, 270 insertions(+), 1 deletion(-) create mode 100644 src/main/java/it/aboutbits/springboot/testing/assertion/document/DocxAssert.java create mode 100644 src/main/java/it/aboutbits/springboot/testing/assertion/document/PdfAssert.java create mode 100644 src/main/java/it/aboutbits/springboot/testing/assertion/document/XlsxAssert.java rename src/main/java/it/aboutbits/springboot/testing/{ => assertion}/persistance/PersistenceAssert.java (98%) diff --git a/pom.xml b/pom.xml index 5f6877d..ca34daf 100644 --- a/pom.xml +++ b/pom.xml @@ -43,6 +43,25 @@ org.springframework.boot spring-boot-starter-test + + + + org.apache.pdfbox + pdfbox + 3.0.3 + + + org.xhtmlrenderer + flying-saucer-pdf + 9.9.4 + + + + + org.apache.poi + poi-ooxml + 5.3.0 + diff --git a/src/main/java/it/aboutbits/springboot/testing/assertion/document/DocxAssert.java b/src/main/java/it/aboutbits/springboot/testing/assertion/document/DocxAssert.java new file mode 100644 index 0000000..46518b1 --- /dev/null +++ b/src/main/java/it/aboutbits/springboot/testing/assertion/document/DocxAssert.java @@ -0,0 +1,68 @@ +package it.aboutbits.springboot.testing.assertion.document; + +import lombok.SneakyThrows; +import org.apache.poi.xwpf.usermodel.XWPFDocument; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import static org.assertj.core.api.Assertions.assertThat; + +public final class DocxAssert { + private final XWPFDocument document; + + private DocxAssert(XWPFDocument document) { + this.document = document; + } + + @SneakyThrows(IOException.class) + public static DocxAssert assertThatDocx(InputStream inputStream) { + assertThat(inputStream).isNotNull(); + + var document = new XWPFDocument(inputStream); + + return new DocxAssert(document); + } + + public static DocxAssert assertThatDocx(ByteArrayOutputStream outputStream) { + assertThat(outputStream).isNotNull(); + + return assertThatDocx(new ByteArrayInputStream(outputStream.toByteArray())); + } + + public static DocxAssert assertThatDocx(byte[] bytea) { + assertThat(bytea).isNotNull(); + + return assertThatDocx(new ByteArrayInputStream(bytea)); + } + + public DocxAssert hasContent() { + assertThat(getTextContent()).isNotBlank(); + + return this; + } + + public DocxAssert containsText(String text) { + assertThat(text).isNotNull(); + + assertThat(getTextContent()).contains(text); + + return this; + } + + private String getTextContent() { + var sb = new StringBuilder(); + var paragraphs = document.getParagraphs(); + + for (var paragraph : paragraphs) { + var runs = paragraph.getRuns(); + for (var run : runs) { + sb.append(run.getText(0)).append(" "); + } + } + + return sb.toString().trim(); // Remove leading/trailing whitespaces + } +} diff --git a/src/main/java/it/aboutbits/springboot/testing/assertion/document/PdfAssert.java b/src/main/java/it/aboutbits/springboot/testing/assertion/document/PdfAssert.java new file mode 100644 index 0000000..9cbc895 --- /dev/null +++ b/src/main/java/it/aboutbits/springboot/testing/assertion/document/PdfAssert.java @@ -0,0 +1,83 @@ +package it.aboutbits.springboot.testing.assertion.document; + +import lombok.SneakyThrows; +import org.apache.pdfbox.Loader; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.text.PDFTextStripper; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import static org.assertj.core.api.Assertions.assertThat; + +public final class PdfAssert { + private final PDDocument pdDocument; + + private String textContent = null; + + private PdfAssert(PDDocument pdDocument) { + this.pdDocument = pdDocument; + } + + @SneakyThrows(IOException.class) + public static PdfAssert assertThatPdf(InputStream inputStream) { + assertThat(inputStream).isNotNull(); + + var document = Loader.loadPDF(inputStream.readAllBytes()); + + return new PdfAssert(document); + } + + public static PdfAssert assertThatPdf(ByteArrayOutputStream outputStream) { + assertThat(outputStream).isNotNull(); + + return assertThatPdf(new ByteArrayInputStream(outputStream.toByteArray())); + } + + public static PdfAssert assertThatPdf(byte[] bytea) { + assertThat(bytea).isNotNull(); + + return assertThatPdf(new ByteArrayInputStream(bytea)); + } + + public PdfAssert hasNumberOfPages(int expectedNumberOfPages) { + assertThat(pdDocument.getNumberOfPages()).isEqualTo(expectedNumberOfPages); + + return this; + } + + public PdfAssert hasContent() { + assertThat(getTextContent()).isNotBlank(); + assertThat(pdDocument.getNumberOfPages()).isNotZero(); + + return this; + } + + public PdfAssert containsText(String text) { + assertThat(text).isNotNull(); + + assertThat(getTextContent()).contains(cleanTextForComparison(text)); + + return this; + } + + @SneakyThrows(IOException.class) + private String getTextContent() { + if (textContent == null) { + var textStripper = new PDFTextStripper(); + textStripper.setStartPage(0); + textStripper.setEndPage(pdDocument.getNumberOfPages()); + + textContent = textStripper.getText(pdDocument); + } + + return cleanTextForComparison(textContent); + } + + // ignore line breaks, and replace multiple following spaces with a single space character + private String cleanTextForComparison(String text) { + return text.replace("\\R", "").replaceAll("\\s", "").trim(); + } +} diff --git a/src/main/java/it/aboutbits/springboot/testing/assertion/document/XlsxAssert.java b/src/main/java/it/aboutbits/springboot/testing/assertion/document/XlsxAssert.java new file mode 100644 index 0000000..09d7553 --- /dev/null +++ b/src/main/java/it/aboutbits/springboot/testing/assertion/document/XlsxAssert.java @@ -0,0 +1,99 @@ +package it.aboutbits.springboot.testing.assertion.document; + +import lombok.SneakyThrows; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import static org.assertj.core.api.Assertions.assertThat; + +public final class XlsxAssert { + private final XSSFWorkbook workbook; + + private String textContent = null; + + private XlsxAssert(XSSFWorkbook workbook) { + this.workbook = workbook; + } + + @SneakyThrows(IOException.class) + public static XlsxAssert assertThatXlsx(InputStream inputStream) { + assertThat(inputStream).isNotNull(); + + var workbook = new XSSFWorkbook(inputStream); + + return new XlsxAssert(workbook); + } + + public static XlsxAssert assertThatXlsx(ByteArrayOutputStream outputStream) { + assertThat(outputStream).isNotNull(); + + return assertThatXlsx(new ByteArrayInputStream(outputStream.toByteArray())); + } + + public static XlsxAssert assertThatXlsx(byte[] bytea) { + assertThat(bytea).isNotNull(); + + return assertThatXlsx(new ByteArrayInputStream(bytea)); + } + + public XlsxAssert hasNumberOfSheets(int expectedNumberOfPages) { + assertThat(workbook.getNumberOfSheets()).isEqualTo(expectedNumberOfPages); + + return this; + } + + public XlsxAssert hasContent() { + assertThat(getTextContent()).isNotBlank(); + assertThat(workbook.getNumberOfSheets()).isNotZero(); + + return this; + } + + public XlsxAssert containsText(String text) { + assertThat(text).isNotNull(); + + assertThat(getTextContent()).contains(text); + + return this; + } + + private String getTextContent() { + if (textContent == null) { + var allContent = new StringBuilder(); + + for (int i = 0; i < workbook.getNumberOfSheets(); i++) { + var sheet = workbook.getSheetAt(i); + + for (var row : sheet) { + for (var cell : row) { + switch (cell.getCellType()) { + case STRING: + allContent.append(cell.getStringCellValue()).append("\t"); + break; + case NUMERIC: + allContent.append(cell.getNumericCellValue()).append("\t"); + break; + case BOOLEAN: + allContent.append(cell.getBooleanCellValue()).append("\t"); + break; + case FORMULA: + allContent.append(cell.getCellFormula()).append("\t"); + break; + default: + allContent.append("\t"); + } + } + allContent.append("\n"); + } + } + + textContent = allContent.toString(); + } + + return textContent; + } +} diff --git a/src/main/java/it/aboutbits/springboot/testing/persistance/PersistenceAssert.java b/src/main/java/it/aboutbits/springboot/testing/assertion/persistance/PersistenceAssert.java similarity index 98% rename from src/main/java/it/aboutbits/springboot/testing/persistance/PersistenceAssert.java rename to src/main/java/it/aboutbits/springboot/testing/assertion/persistance/PersistenceAssert.java index c08a6c6..e9e1dec 100644 --- a/src/main/java/it/aboutbits/springboot/testing/persistance/PersistenceAssert.java +++ b/src/main/java/it/aboutbits/springboot/testing/assertion/persistance/PersistenceAssert.java @@ -1,4 +1,4 @@ -package it.aboutbits.springboot.testing.persistance; +package it.aboutbits.springboot.testing.assertion.persistance; import it.aboutbits.springboot.testing.spring.BeanAccessor; import it.aboutbits.springboot.toolbox.persistence.ChangeAware;