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;