From d266401ed85953cfe060e2f8ea3f957d7cc21333 Mon Sep 17 00:00:00 2001 From: Marcus <56945030+maspio@users.noreply.github.com> Date: Fri, 10 Feb 2023 16:26:26 +0100 Subject: [PATCH] test(Read PDF Node): Unit tests (no-changelog) (#5453) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ✅ add ReadPDF node test Co-authored-by: Michael Kret --- .../nodes/ReadPdf/test/ReadPDF.test.ts | 60 ++++++++++++++++ .../nodes/ReadPdf/test/ReadPDF.workflow.json | 64 ++++++++++++++++++ .../nodes-base/nodes/ReadPdf/test/sample.pdf | Bin 0 -> 17814 bytes 3 files changed, 124 insertions(+) create mode 100644 packages/nodes-base/nodes/ReadPdf/test/ReadPDF.test.ts create mode 100644 packages/nodes-base/nodes/ReadPdf/test/ReadPDF.workflow.json create mode 100644 packages/nodes-base/nodes/ReadPdf/test/sample.pdf diff --git a/packages/nodes-base/nodes/ReadPdf/test/ReadPDF.test.ts b/packages/nodes-base/nodes/ReadPdf/test/ReadPDF.test.ts new file mode 100644 index 0000000000..b814a3eee5 --- /dev/null +++ b/packages/nodes-base/nodes/ReadPdf/test/ReadPDF.test.ts @@ -0,0 +1,60 @@ +/* eslint-disable @typescript-eslint/no-loop-func */ +import * as Helpers from '../../../test/nodes/Helpers'; +import type { WorkflowTestData } from '../../../test/nodes/types'; +import { executeWorkflow } from '../../../test/nodes/ExecuteWorkflow'; +import path from 'path'; + +describe('Test Read PDF Node', () => { + beforeEach(async () => { + await Helpers.initBinaryDataManager(); + }); + + const workflow = Helpers.readJsonFileSync('nodes/ReadPdf/test/ReadPDF.workflow.json'); + const node = workflow.nodes.find((n: any) => n.name === 'Read Binary File'); + node.parameters.filePath = path.join(__dirname, 'sample.pdf'); + + const testData: WorkflowTestData = { + description: 'nodes/ReadPdf/test/ReadPDF.workflow.json', + input: { + workflowData: workflow, + }, + output: { + nodeData: { + 'Read PDF': [ + [ + { + json: { + numpages: 1, + numrender: 1, + info: { + PDFFormatVersion: '1.4', + IsAcroFormPresent: false, + IsXFAPresent: false, + Title: 'sample', + Producer: 'iLovePDF', + ModDate: 'D:20230210122750Z', + }, + metadata: null, + text: '\n\nN8N\nSample PDF\nLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor\ninvidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et\njusto duo dolores et ea rebum.', + version: '1.10.100', + }, + }, + ], + ], + }, + }, + }; + + const nodeTypes = Helpers.setup(testData); + + test(testData.description, async () => { + const { result } = await executeWorkflow(testData, nodeTypes); + const resultNodeData = Helpers.getResultNodeData(result, testData); + + // delete binary data because we test against json only + delete resultNodeData[0].resultData[0]![0].binary; + expect(resultNodeData[0].resultData).toEqual(testData.output.nodeData['Read PDF']); + + expect(result.finished).toEqual(true); + }); +}); diff --git a/packages/nodes-base/nodes/ReadPdf/test/ReadPDF.workflow.json b/packages/nodes-base/nodes/ReadPdf/test/ReadPDF.workflow.json new file mode 100644 index 0000000000..9d6aaf0c1f --- /dev/null +++ b/packages/nodes-base/nodes/ReadPdf/test/ReadPDF.workflow.json @@ -0,0 +1,64 @@ +{ + "name": "Read PDF node unit test", + "nodes": [ + { + "parameters": {}, + "id": "0c9db33c-dd15-4088-9d12-b9f3b8f1fa96", + "name": "When clicking \"Execute Workflow\"", + "type": "n8n-nodes-base.manualTrigger", + "typeVersion": 1, + "position": [960, 540] + }, + { + "parameters": {}, + "id": "86abdc3b-206d-4b67-a37f-6b67b6bd3bbc", + "name": "Read PDF", + "type": "n8n-nodes-base.readPDF", + "typeVersion": 1, + "position": [1400, 540] + }, + { + "parameters": { + "filePath": "C:\\Test\\sample.pdf" + }, + "id": "2f6d241e-44a4-4213-b49a-166201946a89", + "name": "Read Binary File", + "type": "n8n-nodes-base.readBinaryFile", + "typeVersion": 1, + "position": [1180, 540] + } + ], + "pinData": {}, + "connections": { + "When clicking \"Execute Workflow\"": { + "main": [ + [ + { + "node": "Read Binary File", + "type": "main", + "index": 0 + } + ] + ] + }, + "Read Binary File": { + "main": [ + [ + { + "node": "Read PDF", + "type": "main", + "index": 0 + } + ] + ] + } + }, + "active": false, + "settings": {}, + "versionId": "9802b48d-727a-40ef-ad87-d544a9a648a7", + "id": "188", + "meta": { + "instanceId": "104a4d08d8897b8bdeb38aaca515021075e0bd8544c983c2bb8c86e6a8e6081c" + }, + "tags": [] +} diff --git a/packages/nodes-base/nodes/ReadPdf/test/sample.pdf b/packages/nodes-base/nodes/ReadPdf/test/sample.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5e539c06132761199bbfeba1ed0baf55944fd77f GIT binary patch literal 17814 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˘nQwo(R% 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 literal 0 HcmV?d00001