From 0dc1be4cc7b6f51c76e4bcf9a71ef77436c7b8e4 Mon Sep 17 00:00:00 2001 From: Anthony LC Date: Wed, 10 Apr 2024 20:05:49 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=85(e2e)=20test=20the=20pdf=20export=20of?= =?UTF-8?q?=20the=20impress=20app?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a test to check the pdf export of the impress app. It intercept the download of the PDF and read its content. We can assert that the template is correctly rendered, and that the pad text is present as well. --- .github/workflows/impress-frontend.yml | 4 ++ Makefile | 3 +- .../__tests__/app-impress/pad-editor.spec.ts | 28 ++++++++++++++ src/frontend/apps/e2e/package.json | 5 +++ src/frontend/apps/e2e/tsconfig.json | 2 +- .../apps/e2e/type/convert-stream.d.ts | 5 +++ src/frontend/yarn.lock | 38 +++++++++++++++++-- 7 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 src/frontend/apps/e2e/type/convert-stream.d.ts diff --git a/.github/workflows/impress-frontend.yml b/.github/workflows/impress-frontend.yml index 6a4e18e8..b5ce1318 100644 --- a/.github/workflows/impress-frontend.yml +++ b/.github/workflows/impress-frontend.yml @@ -137,6 +137,10 @@ jobs: run: | make migrate + - name: Add dummy data + run: | + make demo FLUSH_ARGS='--no-input' + - name: Install Playwright Browsers run: cd src/frontend/apps/e2e && yarn install diff --git a/Makefile b/Makefile index 4d8bbe5b..f804a909 100644 --- a/Makefile +++ b/Makefile @@ -203,9 +203,10 @@ dbshell: ## connect to database shell docker compose exec app-dev python manage.py dbshell .PHONY: dbshell +resetdb: FLUSH_ARGS ?= resetdb: ## flush database and create a superuser "admin" @echo "$(BOLD)Flush database$(RESET)" - @$(MANAGE) flush + @$(MANAGE) flush $(FLUSH_ARGS) @${MAKE} superuser .PHONY: resetdb diff --git a/src/frontend/apps/e2e/__tests__/app-impress/pad-editor.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/pad-editor.spec.ts index da293602..a31c054a 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/pad-editor.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/pad-editor.spec.ts @@ -1,4 +1,6 @@ import { expect, test } from '@playwright/test'; +import cs from 'convert-stream'; +import pdf from 'pdf-parse'; import { keyCloakSignIn } from './common'; @@ -42,4 +44,30 @@ test.describe('Pad Editor', () => { const typeCases = ['publish', 'subscribe', 'unsubscribe', 'ping']; expect(typeCases.includes(payload.type)).toBeTruthy(); }); + + test('it converts the pad to pdf with a template integrated', async ({ + page, + }) => { + const downloadPromise = page.waitForEvent('download', (download) => { + return download.suggestedFilename().includes('impress-document.pdf'); + }); + + await page.getByText('My mocked pad').first().click(); + await expect(page.locator('h2').getByText('My mocked pad')).toBeVisible(); + + await page.locator('.ProseMirror.bn-editor').click(); + await page.locator('.ProseMirror.bn-editor').fill('Hello World'); + + await page.getByText('Print the pad').first().click(); + + const download = await downloadPromise; + expect(download.suggestedFilename()).toBe('impress-document.pdf'); + + const pdfBuffer = await cs.toBuffer(await download.createReadStream()); + const pdfText = (await pdf(pdfBuffer)).text; + + expect(pdfText).toContain('Monsieur le Premier Ministre'); // This is the template text + expect(pdfText).toContain('La directrice'); // This is the template text + expect(pdfText).toContain('Hello World'); // This is the pad text + }); }); diff --git a/src/frontend/apps/e2e/package.json b/src/frontend/apps/e2e/package.json index b36b599d..5c35d933 100644 --- a/src/frontend/apps/e2e/package.json +++ b/src/frontend/apps/e2e/package.json @@ -11,7 +11,12 @@ "devDependencies": { "@playwright/test": "1.42.1", "@types/node": "*", + "@types/pdf-parse": "1.1.4", "eslint-config-impress": "*", "typescript": "*" + }, + "dependencies": { + "convert-stream": "1.0.2", + "pdf-parse": "^1.1.1" } } diff --git a/src/frontend/apps/e2e/tsconfig.json b/src/frontend/apps/e2e/tsconfig.json index 19e42d22..a9aa4817 100644 --- a/src/frontend/apps/e2e/tsconfig.json +++ b/src/frontend/apps/e2e/tsconfig.json @@ -14,6 +14,6 @@ "jsx": "preserve", "incremental": true, }, - "include": ["**/*.ts"], + "include": ["**/*.ts", "**/*.d.ts"], "exclude": ["node_modules"] } diff --git a/src/frontend/apps/e2e/type/convert-stream.d.ts b/src/frontend/apps/e2e/type/convert-stream.d.ts new file mode 100644 index 00000000..d79cbccc --- /dev/null +++ b/src/frontend/apps/e2e/type/convert-stream.d.ts @@ -0,0 +1,5 @@ +declare module 'convert-stream' { + export function toBuffer( + readableStream: NodeJS.ReadableStream, + ): Promise; +} diff --git a/src/frontend/yarn.lock b/src/frontend/yarn.lock index 0347681d..292c72e1 100644 --- a/src/frontend/yarn.lock +++ b/src/frontend/yarn.lock @@ -3534,7 +3534,7 @@ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== -"@types/node@*", "@types/node@20.12.4": +"@types/node@*": version "20.12.4" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.4.tgz#af5921bd75ccdf3a3d8b3fa75bf3d3359268cd11" integrity sha512-E+Fa9z3wSQpzgYQdYmme5X3OTuejnnTx88A6p6vkkJosR3KBz+HpE3kqNm98VE6cfLFcISx7zW7MsJkH6KwbTw== @@ -3551,12 +3551,17 @@ resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== +"@types/pdf-parse@1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@types/pdf-parse/-/pdf-parse-1.1.4.tgz#21a539efd2f16009d08aeed3350133948b5d7ed1" + integrity sha512-+gbBHbNCVGGYw1S9lAIIvrHW47UYOhMIFUsJcMkMrzy1Jf0vulBN3XQIjPgnoOXveMuHnF3b57fXROnY/Or7eg== + "@types/prop-types@*": version "15.7.12" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== -"@types/react-dom@*", "@types/react-dom@18.2.24", "@types/react-dom@^18.0.0": +"@types/react-dom@*", "@types/react-dom@^18.0.0": version "18.2.24" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.24.tgz#8dda8f449ae436a7a6e91efed8035d4ab03ff759" integrity sha512-cN6upcKd8zkGy4HU9F1+/s98Hrp6D4MOcippK4PoE8OZRngohHZpbJn1GsaDLz87MqvHNoT13nHvNqM9ocRHZg== @@ -4227,6 +4232,11 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== +bluebird@^3.4.1: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" @@ -4615,6 +4625,13 @@ convert-source-map@^2.0.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== +convert-stream@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/convert-stream/-/convert-stream-1.0.2.tgz#152a7f10f4635e2bd000425b1fd025d1f114ff4d" + integrity sha512-kPDydAkRaSi3AfhRFRizZldlFucJTDw+zOtYVjQVePVGiGGhcNaBwisbUMRCozoJlZ4GOGgqVrjJsah9xC1wYQ== + dependencies: + bluebird "^3.4.1" + core-js-compat@^3.31.0, core-js-compat@^3.36.1: version "3.36.1" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.36.1.tgz#1818695d72c99c25d621dca94e6883e190cea3c8" @@ -4850,7 +4867,7 @@ debug@^2.2.0: dependencies: ms "2.0.0" -debug@^3.2.7: +debug@^3.1.0, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -8260,6 +8277,11 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" +node-ensure@^0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/node-ensure/-/node-ensure-0.0.0.tgz#ecae764150de99861ec5c810fd5d096b183932a7" + integrity sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw== + node-fetch@2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" @@ -8573,6 +8595,14 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pdf-parse@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pdf-parse/-/pdf-parse-1.1.1.tgz#745e07408679548b3995ff896fd38e96e19d14a7" + integrity sha512-v6ZJ/efsBpGrGGknjtq9J/oC8tZWq0KWL5vQrk2GlzLEQPUDB1ex+13Rmidl1neNN358Jn9EHZw5y07FFtaC7A== + dependencies: + debug "^3.1.0" + node-ensure "^0.0.0" + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -10356,7 +10386,7 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" -typescript@*, typescript@5.4.3, typescript@^5.0.4: +typescript@*, typescript@^5.0.4: version "5.4.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==