From 13eadeb0afd80cda98477ffbac9726fc084c3997 Mon Sep 17 00:00:00 2001 From: Alex Christoffer Rasmussen Date: Mon, 6 Jan 2025 20:26:06 +0100 Subject: [PATCH] fix download (#1434) * fix download * update test db * create download test --- .gitignore | 1 + apps/client/src/common/api/db.ts | 2 +- e2e/tests/000-upload-showfile.spec.ts | 32 ++ e2e/tests/fixtures/test-db.json | 686 +++++++++++++++----------- 4 files changed, 425 insertions(+), 296 deletions(-) diff --git a/.gitignore b/.gitignore index a73158227..4a5888eb0 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,7 @@ test-results playwright-report /playwright/.cache/ automated-screenshots +e2e/tests/fixtures/tmp/* # production build/ diff --git a/apps/client/src/common/api/db.ts b/apps/client/src/common/api/db.ts index e9a29b3da..b382498ac 100644 --- a/apps/client/src/common/api/db.ts +++ b/apps/client/src/common/api/db.ts @@ -12,7 +12,7 @@ const dbPath = `${apiEntryUrl}/db`; * HTTP request to the current DB */ export function getDb(filename: string): Promise> { - return axios.post(`${dbPath}/download/`, { filename }); + return axios.post(`${dbPath}/download`, { filename }); } /** diff --git a/e2e/tests/000-upload-showfile.spec.ts b/e2e/tests/000-upload-showfile.spec.ts index f1245ac82..88c7e7312 100644 --- a/e2e/tests/000-upload-showfile.spec.ts +++ b/e2e/tests/000-upload-showfile.spec.ts @@ -1,6 +1,9 @@ import { test, expect } from '@playwright/test'; +import { readFile } from 'fs/promises'; + const fileToUpload = 'e2e/tests/fixtures/test-db.json'; +const fileToDownload = 'e2e/tests/fixtures/tmp/test-db.json'; test('project file upload', async ({ page }) => { await page.goto('http://localhost:4001/editor'); @@ -34,3 +37,32 @@ test('project file upload', async ({ page }) => { const thirdTitle = page.getByTestId('entry-3').getByTestId('block__title'); await expect(thirdTitle).toHaveValue('Lithuania'); }); + +test('project file download', async ({ page }) => { + await page.goto('http://localhost:4001/editor'); + + // close the welcome modal if it is open + await page.keyboard.down('Escape'); + + await page.getByRole('button', { name: 'toggle settings' }).click(); + await page.getByRole('button', { name: 'Project', exact: true }).click(); + + // workaround to download + // https://playwright.dev/docs/api/class-download + const downloadPromise = page.waitForEvent('download'); + + await page + .getByRole('row', { name: RegExp('^test-db') }) + .getByLabel('Options') + .click(); + await page.getByRole('menuitem', { name: 'Download' }).click(); + + const download = await downloadPromise; + + // Wait for the download process to complete and save the downloaded file somewhere. + await download.saveAs(fileToDownload); + await expect(download.failure()).toMatchObject({}); + const original = JSON.parse(await readFile(fileToUpload, { encoding: 'utf-8' })); + const fromServer = JSON.parse(await readFile(fileToDownload, { encoding: 'utf-8' })); + await expect(original).toEqual(fromServer); +}); diff --git a/e2e/tests/fixtures/test-db.json b/e2e/tests/fixtures/test-db.json index ddf9e09be..c84df4205 100644 --- a/e2e/tests/fixtures/test-db.json +++ b/e2e/tests/fixtures/test-db.json @@ -1,307 +1,392 @@ { "rundown": [ - { - "title": "Albania", - "note": "SF1.01", - "endAction": "none", - "timerType": "count-down", - "timeStart": 36000000, - "timeEnd": 37200000, - "duration": 1200000, - "isPublic": true, - "skip": false, - "colour": "", - "type": "event", - "revision": 0, - "id": "32d31", - "cue": "SF1.01", - "custom": { - "song": "Sekret", - "artist": "Ronela Hajati" - } - }, - { - "title": "Latvia", - "note": "SF1.02", - "endAction": "none", - "timerType": "count-down", - "timeStart": 37500000, - "timeEnd": 38700000, - "duration": 1200000, - "isPublic": true, - "skip": false, - "colour": "", - "type": "event", - "revision": 0, - "id": "21cd2", - "cue": "SF1.02", - "custom": { - "song": "Eat Your Salad", - "artist": "Citi Zeni" - } - }, - { - "title": "Lithuania", - "note": "SF1.03", - "endAction": "none", - "timerType": "count-down", - "timeStart": 39000000, - "timeEnd": 40200000, - "duration": 1200000, - "isPublic": true, - "skip": false, - "colour": "", - "type": "event", - "revision": 0, - "id": "0b371", - "cue": "SF1.03", - "custom": { - "song": "Sentimentai", - "artist": "Monika Liu" - } - }, - { - "title": "Switzerland", - "note": "SF1.04", - "endAction": "none", - "timerType": "count-down", - "timeStart": 40500000, - "timeEnd": 41700000, - "duration": 1200000, - "isPublic": true, - "skip": false, - "colour": "", - "type": "event", - "revision": 0, - "id": "3cd28", - "cue": "SF1.04", - "custom": { - "song": "Boys Do Cry", - "artist": "Marius Bear" - } - }, - { - "title": "Slovenia", - "note": "SF1.05", - "endAction": "none", - "timerType": "count-down", - "timeStart": 42000000, - "timeEnd": 43200000, - "duration": 1200000, - "isPublic": true, - "skip": false, - "colour": "", - "type": "event", - "revision": 0, - "id": "e457f", - "cue": "SF1.05", - "custom": { - "song": "Disko", - "artist": "LPS" - } - }, - { - "title": "Lunch break", - "type": "block", - "id": "01e85" - }, - { - "title": "Ukraine", - "note": "SF1.06", - "endAction": "none", - "timerType": "count-down", - "timeStart": 47100000, - "timeEnd": 48300000, - "duration": 1200000, - "isPublic": true, - "skip": false, - "colour": "", - "type": "event", - "revision": 0, - "id": "1c420", - "cue": "SF1.06", - "custom": { - "song": "Stefania", - "artist": "Kalush Orchestra" - } - }, - { - "title": "Bulgaria", - "note": "SF1.07", - "endAction": "none", - "timerType": "count-down", - "timeStart": 48600000, - "timeEnd": 49800000, - "duration": 1200000, - "isPublic": true, - "skip": false, - "colour": "", - "type": "event", - "revision": 0, - "id": "b7737", - "cue": "SF1.07", - "custom": { - "song": "Intention", - "artist": "Intelligent Music Project" - } - }, - { - "title": "Netherlands", - "note": "SF1.08", - "endAction": "none", - "timerType": "count-down", - "timeStart": 50100000, - "timeEnd": 51300000, - "duration": 1200000, - "isPublic": true, - "skip": false, - "colour": "", - "type": "event", - "revision": 0, - "id": "d3a80", - "cue": "SF1.08", - "custom": { - "song": "De Diepte", - "artist": "S10" - } - }, - { - "title": "Moldova", - "note": "SF1.09", - "endAction": "none", - "timerType": "count-down", - "timeStart": 51600000, - "timeEnd": 52800000, - "duration": 1200000, - "isPublic": true, - "skip": false, - "colour": "", - "type": "event", - "revision": 0, - "id": "8276c", - "cue": "SF1.09", - "custom": { - "song": "Trenuletul", - "artist": "Zdob si Zdub" - } - }, - { - "title": "Portugal", - "note": "SF1.10", - "endAction": "none", - "timerType": "count-down", - "timeStart": 53100000, - "timeEnd": 54300000, - "duration": 1200000, - "isPublic": true, - "skip": false, - "colour": "", - "type": "event", - "revision": 0, - "id": "2340b", - "cue": "SF1.10", - "custom": { - "song": "Saudade Saudade", - "artist": "Maro" - } - }, - { - "title": "Afternoon break", - "type": "block", - "id": "cb90b" - }, - { - "title": "Croatia", - "note": "SF1.11", - "endAction": "none", - "timerType": "count-down", - "timeStart": 56100000, - "timeEnd": 57300000, - "duration": 1200000, - "isPublic": true, - "skip": false, - "colour": "", - "type": "event", - "revision": 0, - "id": "503c4", - "cue": "SF1.11", - "custom": { - "song": "Guilty Pleasure", - "artist": "Mia Dimsic" - } - }, - { - "title": "Denmark", - "note": "SF1.12", - "endAction": "none", - "timerType": "count-down", - "timeStart": 57600000, - "timeEnd": 58800000, - "duration": 1200000, - "isPublic": true, - "skip": false, - "colour": "", - "type": "event", - "revision": 0, - "id": "5e965", - "cue": "SF1.12", - "custom": { - "song": "The Show", - "artist": "Reddi" - } - }, - { - "title": "Austria", - "note": "SF1.13", - "endAction": "none", - "timerType": "count-down", - "timeStart": 59100000, - "timeEnd": 60300000, - "duration": 1200000, - "isPublic": true, - "skip": false, - "colour": "", - "type": "event", - "revision": 0, - "id": "bab4a", - "cue": "SF1.13", - "custom": { - "song": "Halo", - "artist": "LUM!X & Pia Maria" - } - }, - { - "title": "Greece", - "note": "SF1.14", - "endAction": "none", - "timerType": "count-down", - "timeStart": 60600000, - "timeEnd": 61800000, - "duration": 1200000, - "isPublic": true, - "skip": false, - "colour": "", - "type": "event", - "revision": 0, - "id": "d3eb1", - "cue": "SF1.14", - "custom": { - "song": "Die Together", - "artist": "Amanda Tenfjord" - } + { + "id": "32d31", + "type": "event", + "title": "Albania", + "timeStart": 36000000, + "timeEnd": 37200000, + "duration": 1200000, + "timeStrategy": "lock-duration", + "linkStart": null, + "endAction": "none", + "timerType": "count-down", + "countToEnd": false, + "isPublic": true, + "skip": false, + "note": "SF1.01", + "colour": "", + "delay": 0, + "cue": "SF1.01", + "revision": 0, + "timeWarning": 120000, + "timeDanger": 60000, + "custom": { + "song": "Sekret", + "artist": "Ronela Hajati" } - ], + }, + { + "id": "21cd2", + "type": "event", + "title": "Latvia", + "timeStart": 37500000, + "timeEnd": 38700000, + "duration": 1200000, + "timeStrategy": "lock-duration", + "linkStart": null, + "endAction": "none", + "timerType": "count-down", + "countToEnd": false, + "isPublic": true, + "skip": false, + "note": "SF1.02", + "colour": "", + "delay": 0, + "cue": "SF1.02", + "revision": 0, + "timeWarning": 120000, + "timeDanger": 60000, + "custom": { + "song": "Eat Your Salad", + "artist": "Citi Zeni" + } + }, + { + "id": "0b371", + "type": "event", + "title": "Lithuania", + "timeStart": 39000000, + "timeEnd": 40200000, + "duration": 1200000, + "timeStrategy": "lock-duration", + "linkStart": null, + "endAction": "none", + "timerType": "count-down", + "countToEnd": false, + "isPublic": true, + "skip": false, + "note": "SF1.03", + "colour": "", + "delay": 0, + "cue": "SF1.03", + "revision": 0, + "timeWarning": 120000, + "timeDanger": 60000, + "custom": { + "song": "Sentimentai", + "artist": "Monika Liu" + } + }, + { + "id": "3cd28", + "type": "event", + "title": "Switzerland", + "timeStart": 40500000, + "timeEnd": 41700000, + "duration": 1200000, + "timeStrategy": "lock-duration", + "linkStart": null, + "endAction": "none", + "timerType": "count-down", + "countToEnd": false, + "isPublic": true, + "skip": false, + "note": "SF1.04", + "colour": "", + "delay": 0, + "cue": "SF1.04", + "revision": 0, + "timeWarning": 120000, + "timeDanger": 60000, + "custom": { + "song": "Boys Do Cry", + "artist": "Marius Bear" + } + }, + { + "id": "e457f", + "type": "event", + "title": "Slovenia", + "timeStart": 42000000, + "timeEnd": 43200000, + "duration": 1200000, + "timeStrategy": "lock-duration", + "linkStart": null, + "endAction": "none", + "timerType": "count-down", + "countToEnd": false, + "isPublic": true, + "skip": false, + "note": "SF1.05", + "colour": "", + "delay": 0, + "cue": "SF1.05", + "revision": 0, + "timeWarning": 120000, + "timeDanger": 60000, + "custom": { + "song": "Disko", + "artist": "LPS" + } + }, + { + "title": "Lunch break", + "type": "block", + "id": "01e85" + }, + { + "id": "1c420", + "type": "event", + "title": "Ukraine", + "timeStart": 47100000, + "timeEnd": 48300000, + "duration": 1200000, + "timeStrategy": "lock-duration", + "linkStart": null, + "endAction": "none", + "timerType": "count-down", + "countToEnd": false, + "isPublic": true, + "skip": false, + "note": "SF1.06", + "colour": "", + "delay": 0, + "cue": "SF1.06", + "revision": 0, + "timeWarning": 120000, + "timeDanger": 60000, + "custom": { + "song": "Stefania", + "artist": "Kalush Orchestra" + } + }, + { + "id": "b7737", + "type": "event", + "title": "Bulgaria", + "timeStart": 48600000, + "timeEnd": 49800000, + "duration": 1200000, + "timeStrategy": "lock-duration", + "linkStart": null, + "endAction": "none", + "timerType": "count-down", + "countToEnd": false, + "isPublic": true, + "skip": false, + "note": "SF1.07", + "colour": "", + "delay": 0, + "cue": "SF1.07", + "revision": 0, + "timeWarning": 120000, + "timeDanger": 60000, + "custom": { + "song": "Intention", + "artist": "Intelligent Music Project" + } + }, + { + "id": "d3a80", + "type": "event", + "title": "Netherlands", + "timeStart": 50100000, + "timeEnd": 51300000, + "duration": 1200000, + "timeStrategy": "lock-duration", + "linkStart": null, + "endAction": "none", + "timerType": "count-down", + "countToEnd": false, + "isPublic": true, + "skip": false, + "note": "SF1.08", + "colour": "", + "delay": 0, + "cue": "SF1.08", + "revision": 0, + "timeWarning": 120000, + "timeDanger": 60000, + "custom": { + "song": "De Diepte", + "artist": "S10" + } + }, + { + "id": "8276c", + "type": "event", + "title": "Moldova", + "timeStart": 51600000, + "timeEnd": 52800000, + "duration": 1200000, + "timeStrategy": "lock-duration", + "linkStart": null, + "endAction": "none", + "timerType": "count-down", + "countToEnd": false, + "isPublic": true, + "skip": false, + "note": "SF1.09", + "colour": "", + "delay": 0, + "cue": "SF1.09", + "revision": 0, + "timeWarning": 120000, + "timeDanger": 60000, + "custom": { + "song": "Trenuletul", + "artist": "Zdob si Zdub" + } + }, + { + "id": "2340b", + "type": "event", + "title": "Portugal", + "timeStart": 53100000, + "timeEnd": 54300000, + "duration": 1200000, + "timeStrategy": "lock-duration", + "linkStart": null, + "endAction": "none", + "timerType": "count-down", + "countToEnd": false, + "isPublic": true, + "skip": false, + "note": "SF1.10", + "colour": "", + "delay": 0, + "cue": "SF1.10", + "revision": 0, + "timeWarning": 120000, + "timeDanger": 60000, + "custom": { + "song": "Saudade Saudade", + "artist": "Maro" + } + }, + { + "title": "Afternoon break", + "type": "block", + "id": "cb90b" + }, + { + "id": "503c4", + "type": "event", + "title": "Croatia", + "timeStart": 56100000, + "timeEnd": 57300000, + "duration": 1200000, + "timeStrategy": "lock-duration", + "linkStart": null, + "endAction": "none", + "timerType": "count-down", + "countToEnd": false, + "isPublic": true, + "skip": false, + "note": "SF1.11", + "colour": "", + "delay": 0, + "cue": "SF1.11", + "revision": 0, + "timeWarning": 120000, + "timeDanger": 60000, + "custom": { + "song": "Guilty Pleasure", + "artist": "Mia Dimsic" + } + }, + { + "id": "5e965", + "type": "event", + "title": "Denmark", + "timeStart": 57600000, + "timeEnd": 58800000, + "duration": 1200000, + "timeStrategy": "lock-duration", + "linkStart": null, + "endAction": "none", + "timerType": "count-down", + "countToEnd": false, + "isPublic": true, + "skip": false, + "note": "SF1.12", + "colour": "", + "delay": 0, + "cue": "SF1.12", + "revision": 0, + "timeWarning": 120000, + "timeDanger": 60000, + "custom": { + "song": "The Show", + "artist": "Reddi" + } + }, + { + "id": "bab4a", + "type": "event", + "title": "Austria", + "timeStart": 59100000, + "timeEnd": 60300000, + "duration": 1200000, + "timeStrategy": "lock-duration", + "linkStart": null, + "endAction": "none", + "timerType": "count-down", + "countToEnd": false, + "isPublic": true, + "skip": false, + "note": "SF1.13", + "colour": "", + "delay": 0, + "cue": "SF1.13", + "revision": 0, + "timeWarning": 120000, + "timeDanger": 60000, + "custom": { + "song": "Halo", + "artist": "LUM!X & Pia Maria" + } + }, + { + "id": "d3eb1", + "type": "event", + "title": "Greece", + "timeStart": 60600000, + "timeEnd": 61800000, + "duration": 1200000, + "timeStrategy": "lock-duration", + "linkStart": null, + "endAction": "none", + "timerType": "count-down", + "countToEnd": false, + "isPublic": true, + "skip": false, + "note": "SF1.14", + "colour": "", + "delay": 0, + "cue": "SF1.14", + "revision": 0, + "timeWarning": 120000, + "timeDanger": 60000, + "custom": { + "song": "Die Together", + "artist": "Amanda Tenfjord" + } + } +], "project": { "title": "Eurovision Song Contest", "description": "Turin 2022", "publicUrl": "www.getontime.no", "publicInfo": "Rehearsal Schedule - Turin 2022", "backstageUrl": "www.github.com/cpvalente/ontime", - "backstageInfo": "Rehearsal Schedule - Turin 2022\nAll performers to wear full costumes for 1st rehearsal" + "backstageInfo": "Rehearsal Schedule - Turin 2022\nAll performers to wear full costumes for 1st rehearsal", + "projectLogo": null }, "settings": { "app": "ontime", - "version": "2.0.0", + "version": "3.10.2", "serverPort": 4001, "editorKey": null, "operatorKey": null, @@ -312,10 +397,9 @@ "overrideStyles": false, "normalColor": "#ffffffcc", "warningColor": "#FFAB33", - "warningThreshold": 120000, "dangerColor": "#ED3333", - "dangerThreshold": 60000, - "endMessage": "" + "endMessage": "", + "freezeEnd": false }, "urlPresets": [ { @@ -335,5 +419,17 @@ "http": { "enabledOut": true, "subscriptions": [] + }, + "customFields": { + "song": { + "type": "string", + "colour": "", + "label": "song" + }, + "artist": { + "type": "string", + "colour": "", + "label": "artist" + } } } \ No newline at end of file