Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add unit tests in the scope of move to pdfkit package #1442

Merged
merged 20 commits into from
Nov 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
7dd4f82
refactor(pdf-service): move attachment logic to shared domains folder
rbrtrfl Nov 18, 2024
a9fede9
refactor(pdf-service): rename /sections folder with /pdfForm in /doma…
rbrtrfl Nov 18, 2024
941165f
refactor(pdf-service): move related files into /domains/prozesskoste…
rbrtrfl Nov 18, 2024
06a5b5c
refactor(pdf-service): move index from /services/pdf/attachment to /d…
rbrtrfl Nov 18, 2024
14c7d10
refactor(pdf-service): move /domains/shared/pdf to /domains/shared/se…
rbrtrfl Nov 18, 2024
d3b114d
refactor(pdf-service): move /app/services/pdf/util to /app/domains/pr…
rbrtrfl Nov 18, 2024
afb7090
refactor(pdf-service): move /app/domains/share/services/pdf/attachmen…
rbrtrfl Nov 18, 2024
08a5f8a
refactor(pdf-service): move /app/domains/share/services/pdf/pdfStyles…
rbrtrfl Nov 18, 2024
167ddb4
refactor(pdf-service): remove circular dependencies
rbrtrfl Nov 18, 2024
9f54933
Merge remote-tracking branch 'origin/main' into move-to-pdfkit
rbrtrfl Nov 18, 2024
2bf7ec6
refactor(pdf-service): move removeDecimalsFromCurrencyString to /app/…
rbrtrfl Nov 18, 2024
42feeee
text(pdf-service): add test for createChecklistSteps
rbrtrfl Nov 18, 2024
695a6ad
text(pdf-service): add test for createChecklistPage
rbrtrfl Nov 18, 2024
90688be
text(pdf-service): add test for createHeader
rbrtrfl Nov 18, 2024
da8a84a
text(pdf-service): add test for createHeading
rbrtrfl Nov 18, 2024
1e9cc3c
text(pdf-service): add test for appendPagesToPdf
rbrtrfl Nov 18, 2024
8b0a96d
text(pdf-service): add test for createAttachmentPages
rbrtrfl Nov 18, 2024
e1e8299
text(pdf-service): add test for createAttachmentEntries
rbrtrfl Nov 18, 2024
85dd0bb
Merge remote-tracking branch 'origin/main' into move-to-pdfkit
rbrtrfl Nov 18, 2024
748578f
Merge branch 'main' into move-to-pdfkit
rbrtrfl Nov 19, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import {
mockPdfKitDocument,
mockPdfKitDocumentStructure,
} from "tests/factories/mockPdfKit";
import type { BeratungshilfeFormularContext } from "~/domains/beratungshilfe/formular";
import { abgabeContext } from "~/domains/shared/formular/abgabe/context";
import { createChecklistPage } from "../createChecklistPage";

describe("createChecklistPage", () => {
it("should create checklist page for 'ausdrucken' abgabeArt", () => {
const mockDocumentStruct = mockPdfKitDocumentStructure();
const mockPDFDocument = mockPdfKitDocument(mockDocumentStruct);
const userData: BeratungshilfeFormularContext = {
vorname: "Luca",
nachname: "Mustermensch",
abgabeArt: abgabeContext.abgabeArt.Enum.ausdrucken,
};
createChecklistPage(mockPDFDocument, mockDocumentStruct, userData);

expect(mockPDFDocument.text).toHaveBeenNthCalledWith(
1,
"Merkblatt: Antrag auf Bewilligung von Beratungshilfe von Luca Mustermensch",
);
expect(mockPDFDocument.text).toHaveBeenNthCalledWith(2, "Anhang");
expect(mockPDFDocument.text).toHaveBeenNthCalledWith(
3,
"So schicken Sie den Antrag ins Amtsgericht",
);
});

it("should create checklist page for 'online' abgabeArt", () => {
const mockDocumentStruct = mockPdfKitDocumentStructure();
const mockPDFDocument = mockPdfKitDocument(mockDocumentStruct);
const userData: BeratungshilfeFormularContext = {
vorname: "Luca",
nachname: "Mustermensch",
abgabeArt: abgabeContext.abgabeArt.Enum.online,
};
createChecklistPage(mockPDFDocument, mockDocumentStruct, userData);

expect(mockPDFDocument.text).toHaveBeenNthCalledWith(
1,
"Merkblatt: Antrag auf Bewilligung von Beratungshilfe von Luca Mustermensch",
);
expect(mockPDFDocument.text).toHaveBeenNthCalledWith(2, "Anhang");
expect(mockPDFDocument.text).toHaveBeenNthCalledWith(
3,
"So stellen Sie den Antrag online",
);
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
import {
mockPdfKitDocument,
mockPdfKitDocumentStructure,
} from "tests/factories/mockPdfKit";
import type { BeratungshilfeFormularContext } from "~/domains/beratungshilfe/formular";
import { abgabeContext } from "~/domains/shared/formular/abgabe/context";
import { createChecklistSteps } from "../createChecklistSteps";

describe("createChecklistSteps", () => {
it("should create checklist steps for 'ausdrucken' abgabeArt", () => {
const mockDocumentStruct = mockPdfKitDocumentStructure();
const mockPDFDocument = mockPdfKitDocument(mockDocumentStruct);
const userData: BeratungshilfeFormularContext = {
abgabeArt: abgabeContext.abgabeArt.Enum.ausdrucken,
};
createChecklistSteps(mockPDFDocument, mockDocumentStruct, userData);

expect(mockPDFDocument.text).toHaveBeenNthCalledWith(
1,
"1. Antrag ausdrucken",
);
expect(mockPDFDocument.text).toHaveBeenNthCalledWith(
3,
"2. Antrag unterschreiben",
);
expect(mockPDFDocument.text).toHaveBeenNthCalledWith(
5,
"3. Benötigte Dokumente kopieren",
);
expect(mockPDFDocument.text).toHaveBeenNthCalledWith(
7,
"4. Antrag abgeben",
);
expect(mockPDFDocument.list).toHaveBeenCalledWith(
[
"Unterlagen zu Ihrem rechtlichen Problem",
"Kopie Ihres aktuellen Mietvertrags",
],
expect.any(Object),
);
});

it("should create checklist steps for 'online' abgabeArt", () => {
const mockDocumentStruct = mockPdfKitDocumentStructure();
const mockPDFDocument = mockPdfKitDocument(mockDocumentStruct);
const onlineUserData: BeratungshilfeFormularContext = {
abgabeArt: abgabeContext.abgabeArt.Enum.online,
};

createChecklistSteps(mockPDFDocument, mockDocumentStruct, onlineUserData);

expect(mockPDFDocument.text).toHaveBeenNthCalledWith(
1,
"1. Antrag prüfen und speichern",
);
expect(mockPDFDocument.text).toHaveBeenNthCalledWith(
3,
"2. Benötigte Dokumente scannen",
);
expect(mockPDFDocument.text).toHaveBeenNthCalledWith(
5,
"3. Antrag über das Portal Mein Justizpostfach versenden",
);
expect(mockPDFDocument.list).toHaveBeenCalledWith(
[
"Unterlagen zu Ihrem rechtlichen Problem",
"Kopie Ihres aktuellen Mietvertrags",
],
expect.any(Object),
);
});

it("should include relevant documents based on user data conditions", () => {
const mockDocumentStruct = mockPdfKitDocumentStructure();
const mockPDFDocument = mockPdfKitDocument(mockDocumentStruct);
const customUserData: BeratungshilfeFormularContext = {
abgabeArt: abgabeContext.abgabeArt.Enum.ausdrucken,
staatlicheLeistungen: "buergergeld",
hasGeldanlage: "yes",
geldanlagen: [
{
befristetArt: "lifeInsurance",
},
],
};

createChecklistSteps(mockPDFDocument, mockDocumentStruct, customUserData);

expect(mockPDFDocument.list).toHaveBeenCalledWith(
expect.arrayContaining([
"Unterlagen zu Ihrem rechtlichen Problem",
"Kopie Ihres aktuellen Mietvertrags",
"Ihren aktuellen Bürgergeld-Bescheid",
"Kontoauszüge der letzten 3 Monate",
"Kopie des letzten Jahreskontoauszugs für Ihre Lebensversicherung",
]),
expect.any(Object),
);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -105,13 +105,19 @@ export const createChecklistSteps = (
const firstPart = steps.slice(0, insertIndex);
const secondPart = steps.slice(insertIndex);
const combinedSteps = [...firstPart, null, ...secondPart];
const length = combinedSteps.length;

// The actual checklist should always sit between last and second last step
for (let index = 0; index < combinedSteps.length; index++) {
for (let index = 0; index < length; index++) {
const step = combinedSteps[index];

if (step) {
createHeading(doc, documentStruct, `${index + 1}. ${step.title}`, "H3");
createHeading(
doc,
documentStruct,
`${index === length - 1 ? length - 1 : index + 1}. ${step.title}`,
"H3",
);
documentStruct.add(
doc.struct("P", {}, () => {
doc
Expand Down
35 changes: 35 additions & 0 deletions app/services/pdf/__test__/appendPagesToPdf.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { PageSizes, PDFDocument } from "pdf-lib";
import { appendPagesToPdf } from "../appendPagesToPdf";

async function createPdfWithUniqueSize(
pageSize: (typeof PageSizes)[keyof typeof PageSizes],
): Promise<Uint8Array> {
const pdfDoc = await PDFDocument.create();
pdfDoc.addPage(pageSize);

return pdfDoc.save();
}

describe("appendPagesToPdf", () => {
it("should merge two PDFs and maintain all pages", async () => {
const primaryPdfBytes = await createPdfWithUniqueSize(PageSizes.A4);
const secondaryPdfBytes = await createPdfWithUniqueSize(PageSizes.A5);

const primaryPdf = await PDFDocument.load(primaryPdfBytes);
const secondaryPdf = await PDFDocument.load(secondaryPdfBytes);

const mergedPdfBytes = await appendPagesToPdf(primaryPdf, secondaryPdf);

const mergedPdf = await PDFDocument.load(mergedPdfBytes);

expect(mergedPdf.getPageCount()).toBe(2);

const page1 = mergedPdf.getPage(0);
expect(page1.getWidth()).toBe(595.28);
expect(page1.getHeight()).toBe(841.89);

const page2 = mergedPdf.getPage(1);
expect(page2.getWidth()).toBe(419.53);
expect(page2.getHeight()).toBe(595.28);
});
});
44 changes: 44 additions & 0 deletions app/services/pdf/__test__/createHeading.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import {
mockPdfKitDocument,
mockPdfKitDocumentStructure,
} from "tests/factories/mockPdfKit";
import { createHeading } from "../createHeading";
import { pdfStyles } from "../pdfStyles";

describe("createHeading", () => {
it("should create heading with the correct string and styling for level H1", () => {
const mockStruct = mockPdfKitDocumentStructure();
const mockDoc = mockPdfKitDocument(mockStruct);
const level = "H1";
const headingString = "The Heading";

createHeading(mockDoc, mockStruct, headingString, level);

expect(mockDoc.struct).toHaveBeenCalledWith(
level,
{},
expect.any(Function),
);
expect(mockDoc.fontSize).toHaveBeenCalledWith(pdfStyles.h1.fontSize);
expect(mockDoc.font).toHaveBeenCalledWith(pdfStyles.h1.font);
expect(mockDoc.text).toHaveBeenCalledWith(headingString);
});

it("should create heading with the correct string and styling for level H5", () => {
const mockStruct = mockPdfKitDocumentStructure();
const mockDoc = mockPdfKitDocument(mockStruct);
const level = "H5";
const headingString = "The Heading";

createHeading(mockDoc, mockStruct, headingString, level);

expect(mockDoc.struct).toHaveBeenCalledWith(
level,
{},
expect.any(Function),
);
expect(mockDoc.fontSize).toHaveBeenCalledWith(pdfStyles.h5.fontSize);
expect(mockDoc.font).toHaveBeenCalledWith(pdfStyles.h5.font);
expect(mockDoc.text).toHaveBeenCalledWith(headingString);
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import {
mockPdfKitDocument,
mockPdfKitDocumentStructure,
} from "tests/factories/mockPdfKit";
import type { AttachmentEntries } from "..";
import { createAttachmentEntries } from "../createAttachmentEntries";

describe("createAttachmentEntries", () => {
it("should create attachment entries for single object", () => {
const mockStruct = mockPdfKitDocumentStructure();
const mockDoc = mockPdfKitDocument(mockStruct);
const attachment: AttachmentEntries = [
{ title: "Test Title", text: "Test Text", level: "h2" },
];

createAttachmentEntries(mockDoc, mockStruct, attachment);

const structMock = mockDoc.struct;

expect(structMock).toHaveBeenCalledWith("H2", {}, expect.any(Function));
expect(mockDoc.text).toHaveBeenCalledWith("Test Title");
expect(structMock).toHaveBeenCalledWith("P", {}, expect.any(Function));
expect(mockDoc.text).toHaveBeenCalledWith("Test Text");
});

it("should create attachment entries for multiple objects", () => {
const mockStruct = mockPdfKitDocumentStructure();
const mockDoc = mockPdfKitDocument(mockStruct);
const attachment: AttachmentEntries = [
{ title: "Test Title 1", text: "Test Text 1", level: "h2" },
{ title: "Test Title 2", text: "Test Text 2", level: "h3" },
];

createAttachmentEntries(mockDoc, mockStruct, attachment);

const structMock = mockDoc.struct;

expect(structMock).toHaveBeenCalledWith("H2", {}, expect.any(Function));
expect(mockDoc.text).toHaveBeenCalledWith("Test Title 1");
expect(structMock).toHaveBeenCalledWith("P", {}, expect.any(Function));
expect(mockDoc.text).toHaveBeenCalledWith("Test Text 1");
expect(structMock).toHaveBeenCalledWith("H3", {}, expect.any(Function));
expect(mockDoc.text).toHaveBeenCalledWith("Test Title 2");
expect(structMock).toHaveBeenCalledWith("P", {}, expect.any(Function));
expect(mockDoc.text).toHaveBeenCalledWith("Test Text 2");
});
});
65 changes: 65 additions & 0 deletions app/services/pdf/attachment/__test__/createAttachmentPages.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import {
mockPdfKitDocument,
mockPdfKitDocumentStructure,
} from "tests/factories/mockPdfKit";
import type { ProzesskostenhilfeFormularContext } from "~/domains/prozesskostenhilfe/formular";
import * as createAttachmentEntriesModule from "~/services/pdf/attachment/createAttachmentEntries";
import * as createHeadingModule from "~/services/pdf/createHeading";
import * as createHeaderModule from "~/services/pdf/header/createHeader";
import type { AttachmentEntries } from "..";
import { createAttachmentPages } from "../createAttachmentPages";

describe("createAttachmentPages", () => {
beforeEach(() => {
vi.resetAllMocks();
});

it("should create attachment page", () => {
const createHeaderSpy = vi.spyOn(createHeaderModule, "createHeader");
const createHeadingSpy = vi.spyOn(createHeadingModule, "createHeading");
const createAttachmentEntriesSpy = vi.spyOn(
createAttachmentEntriesModule,
"createAttachmentEntries",
);

const userData: ProzesskostenhilfeFormularContext = {
vorname: "Alfred J.",
nachname: "Kwack",
};
const attachment: AttachmentEntries = [{ title: "Test Title" }];
const headerText = "Test Header";

const documentStruct = mockPdfKitDocumentStructure();
const doc = mockPdfKitDocument(documentStruct);
const attachmentPagesStruct = doc.struct("Sect");

createAttachmentPages({
doc,
documentStruct,
userData,
attachment,
headerText,
});

expect(createHeaderSpy).toBeCalledTimes(1);
expect(createHeaderSpy).toBeCalledWith(
doc,
documentStruct,
userData,
headerText,
);
expect(createHeadingSpy).toBeCalledTimes(1);
expect(createHeadingSpy).toBeCalledWith(
doc,
attachmentPagesStruct,
"Anhang",
"H1",
);
expect(createAttachmentEntriesSpy).toBeCalledTimes(1);
expect(createAttachmentEntriesSpy).toBeCalledWith(
doc,
attachmentPagesStruct,
attachment,
);
});
});
2 changes: 1 addition & 1 deletion app/services/pdf/attachment/createAttachmentEntries.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export function createAttachmentEntries(
if (attachment) {
attachment.forEach((entry) => {
documentStruct.add(
doc.struct(entry.level ?? "P", {}, () => {
doc.struct(entry.level?.toUpperCase() ?? "P", {}, () => {
doc
.fontSize(
entry.level
Expand Down
1 change: 0 additions & 1 deletion app/services/pdf/footer/__test__/createFooter.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import { createPageNumber } from "~/services/pdf/footer/createPageNumber";
import { createStamp } from "~/services/pdf/footer/createStamp";
import { createFooter } from "../createFooter";

vi.mock("../createBankInformation");
vi.mock("~/services/pdf/footer/createPageNumber", () => ({
createPageNumber: vi.fn(),
}));
Expand Down
Loading
Loading