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 6a4e18e8b..b5ce1318c 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 4d8bbe5b8..f804a9099 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 da2936029..a31c054a4 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 b36b599d5..5c35d9331 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 19e42d221..a9aa4817c 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 000000000..d79cbccc9 --- /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 0347681d2..292c72e1e 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==