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==