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

chore: add basic E2E tests #2628

Merged
merged 1 commit into from
Feb 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
35 changes: 34 additions & 1 deletion .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ jobs:
run: yarn --cwd packages/renderer run size

test:
name: Run tests (Node.js ${{ matrix.node_version }}; React ${{ matrix.react_version }})
name: Run unit tests (Node.js ${{ matrix.node_version }}; React ${{ matrix.react_version }})
runs-on: ubuntu-latest
strategy:
matrix:
Expand Down Expand Up @@ -106,3 +106,36 @@ jobs:

- name: Run tests
run: REACT_VERSION=${{ matrix.react_version }} yarn test

e2e-node:
name: Run E2E tests (Node.js ${{ matrix.node_version }}; ${{ matrix.cjs_or_esm.toUpperCase() }})
runs-on: ubuntu-latest
strategy:
matrix:
cjs_or_esm: [cjs, esm]
node_version: [18, 20, 21]

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Cache Yarn cache
uses: actions/cache@v4
env:
cache-name: yarn-cache
with:
path: ~/.cache/yarn
key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-${{ env.cache-name }}-

- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node_version }}

- name: Install dependencies and build
run: yarn --frozen-lockfile

- name: Run E2E tests
run: yarn --cwd e2e/node-${{ matrix.cjs_or_esm }} run start
45 changes: 45 additions & 0 deletions e2e/node-cjs/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
const fs = require('node:fs/promises');
const assert = require('node:assert');
const { test } = require('node:test');
const { jsx } = require('react/jsx-runtime');
const { Document, Page, Text, renderToBuffer } = require('@react-pdf/renderer');

const MyDocument = () =>
jsx(Document, {
children: jsx(Page, {
size: 'A4',
children: jsx(Text, {
children: 'Hello world',
}),
}),
});

function removeMovingParts(buffer) {
return Buffer.from(
buffer
.toString('ascii')
.replace(/\(D:[0-9]{14}Z\)/g, '(D:20240101000000Z)')
.replace(
/\/ID \[.*\]/,
'/ID [<00000000000000000000000000000000> <00000000000000000000000000000000>]',
),
);
}

test('rendering a PDF', async () => {
const bufferPromise = renderToBuffer(jsx(MyDocument, {}));
const referenceBufferPromise = fs.readFile('../reference.pdf');

const [buffer, referenceBuffer] = await Promise.all([
bufferPromise,
referenceBufferPromise,
]);

const bufferAsciiWithIDsRemoved = removeMovingParts(buffer);
const referenceBufferAsciiWithIDsRemoved = removeMovingParts(referenceBuffer);

assert.deepStrictEqual(
bufferAsciiWithIDsRemoved,
referenceBufferAsciiWithIDsRemoved,
);
});
18 changes: 18 additions & 0 deletions e2e/node-cjs/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"name": "@react-pdf/e2e-node-cjs",
"version": "2.0.0",
"license": "MIT",
"private": true,
"type": "commonjs",
"author": "Diego Muracciole <[email protected]>",
"homepage": "https://github.com/diegomura/react-pdf#readme",
"repository": "[email protected]:diegomura/react-pdf.git",
"scripts": {
"dev": "node --watch ./index.js",
"start": "node ./index.js"
},
"dependencies": {
"@react-pdf/renderer": "^3.3.7",
"react": "^18.2.0"
}
}
45 changes: 45 additions & 0 deletions e2e/node-esm/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import fs from 'node:fs/promises';
import assert from 'node:assert';
import { test } from 'node:test';
import { jsx } from 'react/jsx-runtime';
import { Document, Page, Text, renderToBuffer } from '@react-pdf/renderer';

const MyDocument = () =>
jsx(Document, {
children: jsx(Page, {
size: 'A4',
children: jsx(Text, {
children: 'Hello world',
}),
}),
});

function removeMovingParts(buffer) {
return Buffer.from(
buffer
.toString('ascii')
.replace(/\(D:[0-9]{14}Z\)/g, '(D:20240101000000Z)')
.replace(
/\/ID \[.*\]/,
'/ID [<00000000000000000000000000000000> <00000000000000000000000000000000>]',
),
);
}

test('rendering a PDF', async () => {
const bufferPromise = renderToBuffer(jsx(MyDocument, {}));
const referenceBufferPromise = fs.readFile('../reference.pdf');

const [buffer, referenceBuffer] = await Promise.all([
bufferPromise,
referenceBufferPromise,
]);

const bufferAsciiWithIDsRemoved = removeMovingParts(buffer);
const referenceBufferAsciiWithIDsRemoved = removeMovingParts(referenceBuffer);

assert.deepStrictEqual(
bufferAsciiWithIDsRemoved,
referenceBufferAsciiWithIDsRemoved,
);
});
18 changes: 18 additions & 0 deletions e2e/node-esm/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"name": "@react-pdf/e2e-node-esm",
"version": "2.0.0",
"license": "MIT",
"private": true,
"type": "module",
"author": "Diego Muracciole <[email protected]>",
"homepage": "https://github.com/diegomura/react-pdf#readme",
"repository": "[email protected]:diegomura/react-pdf.git",
"scripts": {
"dev": "node --watch ./index.js",
"start": "node ./index.js"
},
"dependencies": {
"@react-pdf/renderer": "^3.3.7",
"react": "^18.2.0"
}
}
Binary file added e2e/reference.pdf
Binary file not shown.
2 changes: 1 addition & 1 deletion lerna.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"version": "independent",
"packages": ["packages/*"],
"packages": ["packages/*", "e2e/*"],
"npmClient": "yarn"
}
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
"type": "module",
"repository": "[email protected]:diegomura/react-pdf.git",
"workspaces": [
"packages/*"
"packages/*",
"e2e/*"
],
"scripts": {
"prepare": "husky",
Expand Down