Skip to content

Commit

Permalink
test: add more unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
fr-ser committed Jul 1, 2024
1 parent b09d581 commit 311a905
Show file tree
Hide file tree
Showing 19 changed files with 4,279 additions and 46 deletions.
14 changes: 14 additions & 0 deletions .eslintrc.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/* eslint-env node */
module.exports = {
extends: [
"eslint:recommended",
"plugin:@typescript-eslint/recommended",
"plugin:prettier/recommended",
],
parser: "@typescript-eslint/parser",
plugins: ["@typescript-eslint"],
root: true,
rules: {
"prettier/prettier": "error",
},
};
14 changes: 14 additions & 0 deletions .github/workflows/all_commits.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,17 @@ jobs:
run: npm ci
- name: test
run: npm run test

test-global:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: 18.20.x
cache: npm
- name: Install dependencies
run: npm ci
- name: test
run: npm run test:lint && npm run test:unit
9 changes: 9 additions & 0 deletions .prettierrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"$schema": "https://json.schemastore.org/prettierrc",
"tabWidth": 2,
"printWidth": 100,
"plugins": ["@trivago/prettier-plugin-sort-imports"],
"importOrder": ["^[./]"],
"importOrderSeparation": true,
"importOrderSortSpecifiers": true
}
2 changes: 1 addition & 1 deletion backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"db_seed": "CONFIG_PATH=local.env npx ts-node -r tsconfig-paths/register scripts/seedLocalData.ts",
"lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --ignore-path .gitignore",
"format": "npm run lint -- --fix && prettier --write src/",
"test:unit": "vitest run",
"test:unit": "CONFIG_PATH=local.env vitest run",
"test": "npm run lint && npm run test:unit"
},
"nodemonConfig": {
Expand Down
2 changes: 1 addition & 1 deletion backend/src/global/types/dataEditTypes.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Article, Client, Invoice, Offer, Order } from "./entities";
import type { Article, Client, Invoice, Offer, Order } from "./entities";

export type ClientCreate = Omit<Client, "id">;
export type ClientUpdate = Partial<Omit<Client, "id">>;
Expand Down
6 changes: 3 additions & 3 deletions backend/src/global/types/entities.ts
Original file line number Diff line number Diff line change
Expand Up @@ -143,9 +143,9 @@ interface DocumentItem {
kind: ArticleKind;
title: string;
description: string;
unit: string;
price: number;
amount: number;
unit?: string;
price?: number;
amount?: number;
}

export interface OfferDocumentItem extends DocumentItem {
Expand Down
105 changes: 105 additions & 0 deletions backend/src/tests/factories.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
import { ArticleKind, OverdueNoticeLevel } from "@/global/types/appTypes";
import { InvoiceDocument, OfferDocument, OverdueNoticeDocument } from "@/global/types/entities";

export function getInvoiceDocument() {
return {
id: "document_id",
creation_date: "1992-12-12",
client_id: "client_id",
client_email: "[email protected]",
client_company_name: "client_company_name",
client_first_name: "client_first_name",
client_last_name: "client_last_name",
client_street_and_number: "client_street_and_number",
client_postal_code: "client_postal_code",
client_city: "client_city",
order_title: "order_title",
invoice_id: "invoice_id",
invoice: {} as any, // eslint-disable-line @typescript-eslint/no-explicit-any
items: [
{
id: "id1",
kind: ArticleKind.heading,
title: "title1",
description: "description1",
},
{
id: "id2",
kind: ArticleKind.item,
title: "title2",
description: "description2",
unit: "unit",
price: 10,
amount: 100,
},
],
service_dates: ["1993-12-12", "1994-12-13"],
payment_target: "1995-12-12",
can_have_cash_discount: false,
discount_duration: 0,
discount_percentage: 0,
} as InvoiceDocument;
}

export function getOfferDocument() {
return {
id: "document_id",
creation_date: "1992-12-12",
client_id: "client_id",
client_email: "[email protected]",
client_company_name: "client_company_name",
client_first_name: "client_first_name",
client_last_name: "client_last_name",
client_street_and_number: "client_street_and_number",
client_postal_code: "client_postal_code",
client_city: "client_city",
order_title: "order_title",
offer_id: "offer_id",
offer: {} as any, // eslint-disable-line @typescript-eslint/no-explicit-any
items: [
{
id: "id1",
kind: ArticleKind.heading,
title: "title1",
description: "description1",
},
{
id: "id2",
kind: ArticleKind.item,
title: "title2",
description: "description2",
unit: "unit",
price: 10,
amount: 100,
},
],
offered_at: "1993-12-12",
offer_valid_until: "1995-12-12",
} as OfferDocument;
}

export function getOverdueNoticeDocument() {
return {
id: "document_id",
creation_date: "1992-12-12",
client_id: "client_id",
client_email: "[email protected]",
client_company_name: "client_company_name",
client_first_name: "client_first_name",
client_last_name: "client_last_name",
client_street_and_number: "client_street_and_number",
client_postal_code: "client_postal_code",
client_city: "client_city",
order_title: "order_title",
overdue_notice_id: "overdue_notice_id",
overdue_notice: {} as any, // eslint-disable-line @typescript-eslint/no-explicit-any
items: [],
notice_level: OverdueNoticeLevel.first,
notice_date: "1993-12-12",
payments_until: "1994-12-12",
payment_target: "1995-12-12",
notice_costs: 55,
default_interest: 2.5,
invoice_documents: [getInvoiceDocument()],
} as OverdueNoticeDocument;
}
Binary file added backend/src/tests/pdf/invoice_snapshot.pdf
Binary file not shown.
Binary file added backend/src/tests/pdf/offer_snapshot.pdf
Binary file not shown.
Binary file added backend/src/tests/pdf/overdue_notice_snapshot.pdf
Binary file not shown.
62 changes: 62 additions & 0 deletions backend/src/tests/pdf/pdf.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import fs from "fs";
import { expect, test } from "vitest";

import { DocumentKind } from "@/global/types/appTypes";
import { renderMultiplePDF } from "@/pdf/renderPDF";
import { getInvoiceDocument, getOfferDocument, getOverdueNoticeDocument } from "@/tests/factories";

test("invoice PDF generation", async () => {
const resultPDF = await renderMultiplePDF([
{ kind: DocumentKind.invoice, document: getInvoiceDocument() },
]);
const pdfLines = String(resultPDF).split("\n");
const snapshotLines = String(fs.readFileSync("src/tests/pdf/invoice_snapshot.pdf")).split("\n");

for (let index = 0; index < pdfLines.length; index++) {
const pdfLine = pdfLines[index];
const snapshotLine = snapshotLines[index];

if (snapshotLine.startsWith("(D:20240701")) continue; // timestamps
if (snapshotLine.startsWith("/ID [<")) continue; // some ID, no idea what it is

expect(pdfLine).toBe(snapshotLine);
}
});

test("offer PDF generation", async () => {
const resultPDF = await renderMultiplePDF([
{ kind: DocumentKind.offer, document: getOfferDocument() },
]);
const pdfLines = String(resultPDF).split("\n");
const snapshotLines = String(fs.readFileSync("src/tests/pdf/offer_snapshot.pdf")).split("\n");

for (let index = 0; index < pdfLines.length; index++) {
const pdfLine = pdfLines[index];
const snapshotLine = snapshotLines[index];

if (snapshotLine.startsWith("(D:20240701")) continue; // timestamps
if (snapshotLine.startsWith("/ID [<")) continue; // some ID, no idea what it is

expect(pdfLine).toBe(snapshotLine);
}
});

test("overdue notice PDF generation", async () => {
const resultPDF = await renderMultiplePDF([
{ kind: DocumentKind.overdueNotice, document: getOverdueNoticeDocument() },
]);
const pdfLines = String(resultPDF).split("\n");
const snapshotLines = String(fs.readFileSync("src/tests/pdf/overdue_notice_snapshot.pdf")).split(
"\n",
);

for (let index = 0; index < pdfLines.length; index++) {
const pdfLine = pdfLines[index];
const snapshotLine = snapshotLines[index];

if (snapshotLine.startsWith("(D:20240701")) continue; // timestamps
if (snapshotLine.startsWith("/ID [<")) continue; // some ID, no idea what it is

expect(pdfLine).toBe(snapshotLine);
}
});
3 changes: 3 additions & 0 deletions frontend/src/global/types/backendTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ export enum ErrorCode {
FK_CONSTRAINT_SUB_ORDER = "FK_CONSTRAINT_SUB_ORDER",
FK_CONSTRAINT_OVERDUE_NOTICE = "FK_CONSTRAINT_OVERDUE_NOTICE",
FK_CONSTRAINT_OVERDUE_NOTICE_DOCUMENT = "FK_CONSTRAINT_OVERDUE_NOTICE_DOCUMENT",
PDF_NO_DOCUMENTS_SELECTED = "PDF_NO_DOCUMENTS_SELECTED",
PDF_NOT_ALL_DOCUMENTS_FOUND = "PDF_NOT_ALL_DOCUMENTS_FOUND",
PDF_TOO_MANY_DOCUMENTS_SELECTED = "PDF_TOO_MANY_DOCUMENTS_SELECTED",
INTERNAL = "INTERNAL",
}

Expand Down
6 changes: 3 additions & 3 deletions frontend/src/global/types/entities.ts
Original file line number Diff line number Diff line change
Expand Up @@ -143,9 +143,9 @@ interface DocumentItem {
kind: ArticleKind;
title: string;
description: string;
unit: string;
price: number;
amount: number;
unit?: string;
price?: number;
amount?: number;
}

export interface OfferDocumentItem extends DocumentItem {
Expand Down
Loading

0 comments on commit 311a905

Please sign in to comment.