From 28aad9261720e86f1271891673a5641b9ac7f550 Mon Sep 17 00:00:00 2001 From: Carine Dengler Date: Tue, 16 Jan 2024 16:18:05 +0100 Subject: [PATCH 01/11] fix: make sure the pages are properly loaded --- web/frontend/tests/shared.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/web/frontend/tests/shared.ts b/web/frontend/tests/shared.ts index a17581897..6aee95529 100644 --- a/web/frontend/tests/shared.ts +++ b/web/frontend/tests/shared.ts @@ -23,8 +23,9 @@ export async function setUp(page: page, url: string) { await mockProxy(page); await mockGetDevLogin(page); await mockLogout(page); - await page.goto(url); - await expect(page).toHaveURL(url); // make sure that page is loaded + // make sure that page is loaded + await page.goto(url, { waitUntil: 'networkidle' }); + await expect(page).toHaveURL(url); } export async function logIn(page: page, sciper: string) { From ea18d146a46369865675c49aa83c5210f32dfd12 Mon Sep 17 00:00:00 2001 From: Carine Dengler Date: Tue, 16 Jan 2024 16:19:29 +0100 Subject: [PATCH 02/11] test: add new test data --- .../tests/json/api/proxies/dela-worker-0.json | 4 + .../tests/json/api/proxies/dela-worker-1.json | 4 + .../tests/json/api/proxies/dela-worker-2.json | 4 + .../tests/json/api/proxies/dela-worker-3.json | 4 + .../json/evoting/dkgActors/certified.json | 9 ++ .../json/evoting/dkgActors/initialized.json | 9 ++ .../tests/json/evoting/dkgActors/setup.json | 9 ++ .../json/evoting/dkgActors/uninitialized.json | 10 ++ .../tests/json/evoting/forms/closed.json | 64 ++++++++++ .../tests/json/evoting/forms/combined.json | 113 ++++++++++++++++++ .../tests/json/evoting/forms/created.json | 60 ++++++++++ .../tests/json/evoting/forms/decrypted.json | 64 ++++++++++ .../tests/json/evoting/forms/open.json | 64 ++++++++++ .../tests/json/evoting/forms/openNoVotes.json | 60 ++++++++++ .../tests/json/evoting/forms/shuffled.json | 64 ++++++++++ .../tests/json/personal_info/123456.json | 3 +- .../tests/json/personal_info/789012.json | 3 +- 17 files changed, 546 insertions(+), 2 deletions(-) create mode 100644 web/frontend/tests/json/api/proxies/dela-worker-0.json create mode 100644 web/frontend/tests/json/api/proxies/dela-worker-1.json create mode 100644 web/frontend/tests/json/api/proxies/dela-worker-2.json create mode 100644 web/frontend/tests/json/api/proxies/dela-worker-3.json create mode 100644 web/frontend/tests/json/evoting/dkgActors/certified.json create mode 100644 web/frontend/tests/json/evoting/dkgActors/initialized.json create mode 100644 web/frontend/tests/json/evoting/dkgActors/setup.json create mode 100644 web/frontend/tests/json/evoting/dkgActors/uninitialized.json create mode 100644 web/frontend/tests/json/evoting/forms/closed.json create mode 100644 web/frontend/tests/json/evoting/forms/combined.json create mode 100644 web/frontend/tests/json/evoting/forms/created.json create mode 100644 web/frontend/tests/json/evoting/forms/decrypted.json create mode 100644 web/frontend/tests/json/evoting/forms/open.json create mode 100644 web/frontend/tests/json/evoting/forms/openNoVotes.json create mode 100644 web/frontend/tests/json/evoting/forms/shuffled.json diff --git a/web/frontend/tests/json/api/proxies/dela-worker-0.json b/web/frontend/tests/json/api/proxies/dela-worker-0.json new file mode 100644 index 000000000..443a40641 --- /dev/null +++ b/web/frontend/tests/json/api/proxies/dela-worker-0.json @@ -0,0 +1,4 @@ +{ + "NodeAddr": "grpc://dela-worker-0:2000", + "Proxy": "http://172.19.44.254:8080" +} diff --git a/web/frontend/tests/json/api/proxies/dela-worker-1.json b/web/frontend/tests/json/api/proxies/dela-worker-1.json new file mode 100644 index 000000000..00f2076a6 --- /dev/null +++ b/web/frontend/tests/json/api/proxies/dela-worker-1.json @@ -0,0 +1,4 @@ +{ + "NodeAddr": "grpc://dela-worker-1:2000", + "Proxy": "http://172.19.44.253:8080" +} diff --git a/web/frontend/tests/json/api/proxies/dela-worker-2.json b/web/frontend/tests/json/api/proxies/dela-worker-2.json new file mode 100644 index 000000000..96773ff91 --- /dev/null +++ b/web/frontend/tests/json/api/proxies/dela-worker-2.json @@ -0,0 +1,4 @@ +{ + "NodeAddr": "grpc://dela-worker-2:2000", + "Proxy": "http://172.19.44.252:8080" +} diff --git a/web/frontend/tests/json/api/proxies/dela-worker-3.json b/web/frontend/tests/json/api/proxies/dela-worker-3.json new file mode 100644 index 000000000..827759dde --- /dev/null +++ b/web/frontend/tests/json/api/proxies/dela-worker-3.json @@ -0,0 +1,4 @@ +{ + "NodeAddr": "grpc://dela-worker-3:2000", + "Proxy": "http://172.19.44.251:8080" +} diff --git a/web/frontend/tests/json/evoting/dkgActors/certified.json b/web/frontend/tests/json/evoting/dkgActors/certified.json new file mode 100644 index 000000000..771f8d130 --- /dev/null +++ b/web/frontend/tests/json/evoting/dkgActors/certified.json @@ -0,0 +1,9 @@ +{ + "Status": 6, + "Error": { + "Title": "", + "Code": 0, + "Message": "", + "Args": null + } +} diff --git a/web/frontend/tests/json/evoting/dkgActors/initialized.json b/web/frontend/tests/json/evoting/dkgActors/initialized.json new file mode 100644 index 000000000..57116eb93 --- /dev/null +++ b/web/frontend/tests/json/evoting/dkgActors/initialized.json @@ -0,0 +1,9 @@ +{ + "Status": 0, + "Error": { + "Title": "", + "Code": 0, + "Message": "", + "Args": null + } +} diff --git a/web/frontend/tests/json/evoting/dkgActors/setup.json b/web/frontend/tests/json/evoting/dkgActors/setup.json new file mode 100644 index 000000000..7dc8c8a04 --- /dev/null +++ b/web/frontend/tests/json/evoting/dkgActors/setup.json @@ -0,0 +1,9 @@ +{ + "Status": 1, + "Error": { + "Title": "", + "Code": 0, + "Message": "", + "Args": null + } +} diff --git a/web/frontend/tests/json/evoting/dkgActors/uninitialized.json b/web/frontend/tests/json/evoting/dkgActors/uninitialized.json new file mode 100644 index 000000000..1279f9f3c --- /dev/null +++ b/web/frontend/tests/json/evoting/dkgActors/uninitialized.json @@ -0,0 +1,10 @@ +{ + "Title": "not found", + "Code": 404, + "Message": "A problem occurred on the proxy", + "Args": { + "error": "actor not found", + "method": "GET", + "url": "/evoting/services/dkg/actors/d3319c58a3bea17dafe61168610757b9a7bb0d922c1f2aa30b8ad537646b1c07" + } +} diff --git a/web/frontend/tests/json/evoting/forms/closed.json b/web/frontend/tests/json/evoting/forms/closed.json new file mode 100644 index 000000000..908e8885c --- /dev/null +++ b/web/frontend/tests/json/evoting/forms/closed.json @@ -0,0 +1,64 @@ +{ + "FormID": "b63bcb854121051f2d8cff04bf0ac9b524b534b704509a16a423448bde3321b4", + "Configuration": { + "Title": { + "En": "Colours", + "Fr": "", + "De": "" + }, + "Scaffold": [ + { + "ID": "yOakwFnR", + "Title": { + "En": "Colours", + "Fr": "Couleurs", + "De": "Farben" + }, + "Order": [ + "CLgNiLbC" + ], + "Subjects": [], + "Selects": [ + { + "ID": "CLgNiLbC", + "Title": { + "En": "RGB", + "Fr": "RGB", + "De": "RGB" + }, + "MaxN": 2, + "MinN": 1, + "Choices": [ + "{\"en\":\"Red\",\"fr\":\"Rouge\",\"de\":\"Rot\"}", + "{\"en\":\"Green\",\"fr\":\"Vert\",\"de\":\"Grün\"}", + "{\"en\":\"Blue\",\"fr\":\"Bleu\",\"de\":\"Blau\"}" + ], + "Hint": { + "En": "", + "Fr": "", + "De": "" + } + } + ], + "Ranks": [], + "Texts": [] + } + ] + }, + "Status": 2, + "Pubkey": "612fdc867be1a5faccf16e5aed946880005840ee04aaa382fe181a2b46dc9a24", + "Result": [], + "Roster": [ + "grpc://dela-worker-0:2000", + "grpc://dela-worker-1:2000", + "grpc://dela-worker-2:2000", + "grpc://dela-worker-3:2000" + ], + "ChunksPerBallot": 1, + "BallotSize": 23, + "Voters": [ + "oUItDdhhEE", + "WZyqP1gssL", + "K7ZNvumBVc" + ] +} diff --git a/web/frontend/tests/json/evoting/forms/combined.json b/web/frontend/tests/json/evoting/forms/combined.json new file mode 100644 index 000000000..e02139e73 --- /dev/null +++ b/web/frontend/tests/json/evoting/forms/combined.json @@ -0,0 +1,113 @@ +{ + "FormID": "b63bcb854121051f2d8cff04bf0ac9b524b534b704509a16a423448bde3321b4", + "Configuration": { + "Title": { + "En": "Colours", + "Fr": "", + "De": "" + }, + "Scaffold": [ + { + "ID": "yOakwFnR", + "Title": { + "En": "Colours", + "Fr": "Couleurs", + "De": "Farben" + }, + "Order": [ + "CLgNiLbC" + ], + "Subjects": [], + "Selects": [ + { + "ID": "CLgNiLbC", + "Title": { + "En": "RGB", + "Fr": "RGB", + "De": "RGB" + }, + "MaxN": 2, + "MinN": 1, + "Choices": [ + "{\"en\":\"Red\",\"fr\":\"Rouge\",\"de\":\"Rot\"}", + "{\"en\":\"Green\",\"fr\":\"Vert\",\"de\":\"Grün\"}", + "{\"en\":\"Blue\",\"fr\":\"Bleu\",\"de\":\"Blau\"}" + ], + "Hint": { + "En": "", + "Fr": "", + "De": "" + } + } + ], + "Ranks": [], + "Texts": [] + } + ] + }, + "Status": 5, + "Pubkey": "612fdc867be1a5faccf16e5aed946880005840ee04aaa382fe181a2b46dc9a24", + "Result": [ + { + "SelectResultIDs": [ + "CLgNiLbC" + ], + "SelectResult": [ + [ + true, + false, + false + ] + ], + "RankResultIDs": [], + "RankResult": [], + "TextResultIDs": [], + "TextResult": [] + }, + { + "SelectResultIDs": [ + "CLgNiLbC" + ], + "SelectResult": [ + [ + false, + false, + true + ] + ], + "RankResultIDs": [], + "RankResult": [], + "TextResultIDs": [], + "TextResult": [] + }, + { + "SelectResultIDs": [ + "CLgNiLbC" + ], + "SelectResult": [ + [ + false, + true, + false + ] + ], + "RankResultIDs": [], + "RankResult": [], + "TextResultIDs": [], + "TextResult": [] + } + ], + "Roster": [ + "grpc://dela-worker-0:2000", + "grpc://dela-worker-1:2000", + "grpc://dela-worker-2:2000", + "grpc://dela-worker-3:2000" + ], + "ChunksPerBallot": 1, + "BallotSize": 23, + "Voters": [ + "oUItDdhhEE", + "WZyqP1gssL", + "K7ZNvumBVc" + ] +} diff --git a/web/frontend/tests/json/evoting/forms/created.json b/web/frontend/tests/json/evoting/forms/created.json new file mode 100644 index 000000000..37b9366a5 --- /dev/null +++ b/web/frontend/tests/json/evoting/forms/created.json @@ -0,0 +1,60 @@ +{ + "FormID": "b63bcb854121051f2d8cff04bf0ac9b524b534b704509a16a423448bde3321b4", + "Configuration": { + "Title": { + "En": "Colours", + "Fr": "", + "De": "" + }, + "Scaffold": [ + { + "ID": "yOakwFnR", + "Title": { + "En": "Colours", + "Fr": "Couleurs", + "De": "Farben" + }, + "Order": [ + "CLgNiLbC" + ], + "Subjects": [], + "Selects": [ + { + "ID": "CLgNiLbC", + "Title": { + "En": "RGB", + "Fr": "RGB", + "De": "RGB" + }, + "MaxN": 2, + "MinN": 1, + "Choices": [ + "{\"en\":\"Red\",\"fr\":\"Rouge\",\"de\":\"Rot\"}", + "{\"en\":\"Green\",\"fr\":\"Vert\",\"de\":\"Grün\"}", + "{\"en\":\"Blue\",\"fr\":\"Bleu\",\"de\":\"Blau\"}" + ], + "Hint": { + "En": "", + "Fr": "", + "De": "" + } + } + ], + "Ranks": [], + "Texts": [] + } + ] + }, + "Status": 0, + "Pubkey": "", + "Result": [], + "Roster": [ + "grpc://dela-worker-0:2000", + "grpc://dela-worker-1:2000", + "grpc://dela-worker-2:2000", + "grpc://dela-worker-3:2000" + ], + "ChunksPerBallot": 1, + "BallotSize": 23, + "Voters": null +} diff --git a/web/frontend/tests/json/evoting/forms/decrypted.json b/web/frontend/tests/json/evoting/forms/decrypted.json new file mode 100644 index 000000000..35ab94a45 --- /dev/null +++ b/web/frontend/tests/json/evoting/forms/decrypted.json @@ -0,0 +1,64 @@ +{ + "FormID": "b63bcb854121051f2d8cff04bf0ac9b524b534b704509a16a423448bde3321b4", + "Configuration": { + "Title": { + "En": "Colours", + "Fr": "", + "De": "" + }, + "Scaffold": [ + { + "ID": "yOakwFnR", + "Title": { + "En": "Colours", + "Fr": "Couleurs", + "De": "Farben" + }, + "Order": [ + "CLgNiLbC" + ], + "Subjects": [], + "Selects": [ + { + "ID": "CLgNiLbC", + "Title": { + "En": "RGB", + "Fr": "RGB", + "De": "RGB" + }, + "MaxN": 2, + "MinN": 1, + "Choices": [ + "{\"en\":\"Red\",\"fr\":\"Rouge\",\"de\":\"Rot\"}", + "{\"en\":\"Green\",\"fr\":\"Vert\",\"de\":\"Grün\"}", + "{\"en\":\"Blue\",\"fr\":\"Bleu\",\"de\":\"Blau\"}" + ], + "Hint": { + "En": "", + "Fr": "", + "De": "" + } + } + ], + "Ranks": [], + "Texts": [] + } + ] + }, + "Status": 4, + "Pubkey": "612fdc867be1a5faccf16e5aed946880005840ee04aaa382fe181a2b46dc9a24", + "Result": [], + "Roster": [ + "grpc://dela-worker-0:2000", + "grpc://dela-worker-1:2000", + "grpc://dela-worker-2:2000", + "grpc://dela-worker-3:2000" + ], + "ChunksPerBallot": 1, + "BallotSize": 23, + "Voters": [ + "oUItDdhhEE", + "WZyqP1gssL", + "K7ZNvumBVc" + ] +} diff --git a/web/frontend/tests/json/evoting/forms/open.json b/web/frontend/tests/json/evoting/forms/open.json new file mode 100644 index 000000000..5dc33b69d --- /dev/null +++ b/web/frontend/tests/json/evoting/forms/open.json @@ -0,0 +1,64 @@ +{ + "FormID": "b63bcb854121051f2d8cff04bf0ac9b524b534b704509a16a423448bde3321b4", + "Configuration": { + "Title": { + "En": "Colours", + "Fr": "", + "De": "" + }, + "Scaffold": [ + { + "ID": "yOakwFnR", + "Title": { + "En": "Colours", + "Fr": "Couleurs", + "De": "Farben" + }, + "Order": [ + "CLgNiLbC" + ], + "Subjects": [], + "Selects": [ + { + "ID": "CLgNiLbC", + "Title": { + "En": "RGB", + "Fr": "RGB", + "De": "RGB" + }, + "MaxN": 2, + "MinN": 1, + "Choices": [ + "{\"en\":\"Red\",\"fr\":\"Rouge\",\"de\":\"Rot\"}", + "{\"en\":\"Green\",\"fr\":\"Vert\",\"de\":\"Grün\"}", + "{\"en\":\"Blue\",\"fr\":\"Bleu\",\"de\":\"Blau\"}" + ], + "Hint": { + "En": "", + "Fr": "", + "De": "" + } + } + ], + "Ranks": [], + "Texts": [] + } + ] + }, + "Status": 1, + "Pubkey": "612fdc867be1a5faccf16e5aed946880005840ee04aaa382fe181a2b46dc9a24", + "Result": [], + "Roster": [ + "grpc://dela-worker-0:2000", + "grpc://dela-worker-1:2000", + "grpc://dela-worker-2:2000", + "grpc://dela-worker-3:2000" + ], + "ChunksPerBallot": 1, + "BallotSize": 23, + "Voters": [ + "oUItDdhhEE", + "WZyqP1gssL", + "K7ZNvumBVc" + ] +} diff --git a/web/frontend/tests/json/evoting/forms/openNoVotes.json b/web/frontend/tests/json/evoting/forms/openNoVotes.json new file mode 100644 index 000000000..52b8427e2 --- /dev/null +++ b/web/frontend/tests/json/evoting/forms/openNoVotes.json @@ -0,0 +1,60 @@ +{ + "FormID": "b63bcb854121051f2d8cff04bf0ac9b524b534b704509a16a423448bde3321b4", + "Configuration": { + "Title": { + "En": "Colours", + "Fr": "", + "De": "" + }, + "Scaffold": [ + { + "ID": "yOakwFnR", + "Title": { + "En": "Colours", + "Fr": "Couleurs", + "De": "Farben" + }, + "Order": [ + "CLgNiLbC" + ], + "Subjects": [], + "Selects": [ + { + "ID": "CLgNiLbC", + "Title": { + "En": "RGB", + "Fr": "RGB", + "De": "RGB" + }, + "MaxN": 2, + "MinN": 1, + "Choices": [ + "{\"en\":\"Red\",\"fr\":\"Rouge\",\"de\":\"Rot\"}", + "{\"en\":\"Green\",\"fr\":\"Vert\",\"de\":\"Grün\"}", + "{\"en\":\"Blue\",\"fr\":\"Bleu\",\"de\":\"Blau\"}" + ], + "Hint": { + "En": "", + "Fr": "", + "De": "" + } + } + ], + "Ranks": [], + "Texts": [] + } + ] + }, + "Status": 1, + "Pubkey": "612fdc867be1a5faccf16e5aed946880005840ee04aaa382fe181a2b46dc9a24", + "Result": [], + "Roster": [ + "grpc://dela-worker-0:2000", + "grpc://dela-worker-1:2000", + "grpc://dela-worker-2:2000", + "grpc://dela-worker-3:2000" + ], + "ChunksPerBallot": 1, + "BallotSize": 23, + "Voters": null +} diff --git a/web/frontend/tests/json/evoting/forms/shuffled.json b/web/frontend/tests/json/evoting/forms/shuffled.json new file mode 100644 index 000000000..68cf96c69 --- /dev/null +++ b/web/frontend/tests/json/evoting/forms/shuffled.json @@ -0,0 +1,64 @@ +{ + "FormID": "b63bcb854121051f2d8cff04bf0ac9b524b534b704509a16a423448bde3321b4", + "Configuration": { + "Title": { + "En": "Colours", + "Fr": "", + "De": "" + }, + "Scaffold": [ + { + "ID": "yOakwFnR", + "Title": { + "En": "Colours", + "Fr": "Couleurs", + "De": "Farben" + }, + "Order": [ + "CLgNiLbC" + ], + "Subjects": [], + "Selects": [ + { + "ID": "CLgNiLbC", + "Title": { + "En": "RGB", + "Fr": "RGB", + "De": "RGB" + }, + "MaxN": 2, + "MinN": 1, + "Choices": [ + "{\"en\":\"Red\",\"fr\":\"Rouge\",\"de\":\"Rot\"}", + "{\"en\":\"Green\",\"fr\":\"Vert\",\"de\":\"Grün\"}", + "{\"en\":\"Blue\",\"fr\":\"Bleu\",\"de\":\"Blau\"}" + ], + "Hint": { + "En": "", + "Fr": "", + "De": "" + } + } + ], + "Ranks": [], + "Texts": [] + } + ] + }, + "Status": 3, + "Pubkey": "612fdc867be1a5faccf16e5aed946880005840ee04aaa382fe181a2b46dc9a24", + "Result": [], + "Roster": [ + "grpc://dela-worker-0:2000", + "grpc://dela-worker-1:2000", + "grpc://dela-worker-2:2000", + "grpc://dela-worker-3:2000" + ], + "ChunksPerBallot": 1, + "BallotSize": 23, + "Voters": [ + "oUItDdhhEE", + "WZyqP1gssL", + "K7ZNvumBVc" + ] +} diff --git a/web/frontend/tests/json/personal_info/123456.json b/web/frontend/tests/json/personal_info/123456.json index 2f6de9a7b..5e82fef62 100644 --- a/web/frontend/tests/json/personal_info/123456.json +++ b/web/frontend/tests/json/personal_info/123456.json @@ -19,6 +19,7 @@ ], "fdf8bfb702e8883e330a2b303b24212b6fc16df5a53a097998b77ba74632dc72": ["own"], "ed26713245824d44ee46ec90507ef521962f2313706934cdfe76ff1823738109": ["vote"], - "9f50ad723805a6419ba1a9f83dd0aa582f3e13b94f14727cd0c8c01744e0dba2": ["vote", "own"] + "9f50ad723805a6419ba1a9f83dd0aa582f3e13b94f14727cd0c8c01744e0dba2": ["vote", "own"], + "b63bcb854121051f2d8cff04bf0ac9b524b534b704509a16a423448bde3321b4": ["own"] } } diff --git a/web/frontend/tests/json/personal_info/789012.json b/web/frontend/tests/json/personal_info/789012.json index dd341520e..065f71f27 100644 --- a/web/frontend/tests/json/personal_info/789012.json +++ b/web/frontend/tests/json/personal_info/789012.json @@ -5,6 +5,7 @@ "isLoggedIn": true, "authorization": { "fdf8bfb702e8883e330a2b303b24212b6fc16df5a53a097998b77ba74632dc72": ["vote"], - "ed26713245824d44ee46ec90507ef521962f2313706934cdfe76ff1823738109": ["vote"] + "ed26713245824d44ee46ec90507ef521962f2313706934cdfe76ff1823738109": ["vote"], + "b63bcb854121051f2d8cff04bf0ac9b524b534b704509a16a423448bde3321b4": ["vote"] } } From 97315e34d36c0b2a5065f114a9b274d749bcc2c7 Mon Sep 17 00:00:00 2001 From: Carine Dengler Date: Tue, 16 Jan 2024 16:20:27 +0100 Subject: [PATCH 03/11] test: add initial tests for form editing --- web/frontend/tests/forms.spec.ts | 29 ++++++++++++++ web/frontend/tests/mocks/api.ts | 18 +++++++++ web/frontend/tests/mocks/evoting.ts | 62 +++++++++++++++++++++++++++++ 3 files changed, 109 insertions(+) create mode 100644 web/frontend/tests/forms.spec.ts create mode 100644 web/frontend/tests/mocks/api.ts create mode 100644 web/frontend/tests/mocks/evoting.ts diff --git a/web/frontend/tests/forms.spec.ts b/web/frontend/tests/forms.spec.ts new file mode 100644 index 000000000..1905acc27 --- /dev/null +++ b/web/frontend/tests/forms.spec.ts @@ -0,0 +1,29 @@ +import { expect, test } from '@playwright/test'; +import { default as i18n } from 'i18next'; +import { assertHasFooter, assertHasNavBar, initI18n, logIn, setUp, translate } from './shared'; +import { SCIPER_ADMIN, SCIPER_USER, mockPersonalInfo } from './mocks'; +import { FORMID, mockFormsFormID, mockDKGActors } from './mocks/evoting'; +import { mockProxies } from './mocks/api'; + +initI18n(); + +// main elements + +test.beforeEach(async ({ page }) => { + // mock empty list per default + await mockFormsFormID(page, 0); + for (const i of [0, 1, 2, 3]) { + await mockProxies(page, i); + } + await mockDKGActors(page, 0, true); + await mockPersonalInfo(page); + await setUp(page, `/forms/${FORMID}`); +}); + +test('Assert navigation bar is present', async ({ page }) => { + await assertHasNavBar(page); +}); + +test('Assert footer is present', async ({ page }) => { + await assertHasFooter(page); +}); diff --git a/web/frontend/tests/mocks/api.ts b/web/frontend/tests/mocks/api.ts new file mode 100644 index 000000000..da41f10c6 --- /dev/null +++ b/web/frontend/tests/mocks/api.ts @@ -0,0 +1,18 @@ +export async function mockProxies(page: page, workerNumber: number) { + await page.route(`/api/proxies/grpc%3A%2F%2Fdela-worker-${workerNumber}%3A2000`, async (route) => { + if (route.request().method() === 'OPTIONS') { + await route.fulfill({ + status: 200, + headers: { + 'Access-Control-Allow-Headers': '*', + 'Access-Control-Allow-Origin': '*', + }, + }); + } else { + await route.fulfill({ + path: `./tests/json/api/proxies/dela-worker-${workerNumber}.json`, + }); + } + }); +} + diff --git a/web/frontend/tests/mocks/evoting.ts b/web/frontend/tests/mocks/evoting.ts new file mode 100644 index 000000000..71e93bd8c --- /dev/null +++ b/web/frontend/tests/mocks/evoting.ts @@ -0,0 +1,62 @@ +import Worker0 from './../json/api/proxies/dela-worker-0.json' +import Worker1 from './../json/api/proxies/dela-worker-1.json' +import Worker2 from './../json/api/proxies/dela-worker-2.json' +import Worker3 from './../json/api/proxies/dela-worker-3.json' + +export const FORMID = 'b63bcb854121051f2d8cff04bf0ac9b524b534b704509a16a423448bde3321b4'; + +export async function mockFormsFormID(page: page, formStatus: number) { + // clear current mock + await page.unroute(`${process.env.DELA_PROXY_URL}/evoting/forms/${FORMID}`); + await page.route(`${process.env.DELA_PROXY_URL}/evoting/forms/${FORMID}`, async (route) => { + let formFile = ''; + switch (formStatus) { + case 0: + formFile = 'created.json'; + break; + case 1: + formFile = 'open.json'; + break; + case 2: + formFile = 'closed.json'; + break; + case 3: + formFile = 'shuffled.json'; + break; + case 4: + formFile = 'decrypted.json'; + break; + case 5: + formFile = 'combined.json'; + break; + } + await route.fulfill({ + path: `./tests/json/evoting/forms/${formFile}`, + }); + }); +} + +export async function mockDKGActors(page: page, formStatus: number, initialized?: boolean) { + // the nodes must have been initialized if the form changed state + initialized = (initialized || formStatus > 0); + for (const worker of [Worker0, Worker1, Worker2, Worker3]) { + await page.route(`${worker.Proxy}/evoting/services/dkg/actors/${FORMID}`, async (route) => { + let dkgActorsFile = ''; + switch (formStatus) { + case 0: + dkgActorsFile = initialized ? 'initialized.json' : 'uninitialized.json'; + break; + case 1: + dkgActorsFile = 'setup.json'; + break; + case 6: + dkgActorsFile = 'certified.json'; + break; + } + await route.fulfill({ + status: initialized ? 200 : 400, + path: `./tests/json/evoting/dkgActors/${dkgActorsFile}`, + }); + }); + } +} From 345927bc5e71d6ea02c786da9edd65460c9e0246 Mon Sep 17 00:00:00 2001 From: Carine Dengler Date: Tue, 16 Jan 2024 17:32:37 +0100 Subject: [PATCH 04/11] test: move api mocks to separate folders --- web/frontend/tests/footer.spec.ts | 2 +- web/frontend/tests/formIndex.spec.ts | 7 +-- web/frontend/tests/forms.spec.ts | 2 +- .../json/{ => api}/personal_info/123456.json | 0 .../json/{ => api}/personal_info/789012.json | 0 web/frontend/tests/mocks.ts | 53 ------------------- web/frontend/tests/mocks/api.ts | 52 ++++++++++++++++++ web/frontend/tests/navbar.spec.ts | 2 +- web/frontend/tests/shared.ts | 2 +- 9 files changed, 60 insertions(+), 60 deletions(-) rename web/frontend/tests/json/{ => api}/personal_info/123456.json (100%) rename web/frontend/tests/json/{ => api}/personal_info/789012.json (100%) diff --git a/web/frontend/tests/footer.spec.ts b/web/frontend/tests/footer.spec.ts index b1f0fec80..39b8bc6a0 100644 --- a/web/frontend/tests/footer.spec.ts +++ b/web/frontend/tests/footer.spec.ts @@ -1,7 +1,7 @@ import { expect, test } from '@playwright/test'; import { default as i18n } from 'i18next'; import { initI18n, setUp } from './shared'; -import { mockPersonalInfo } from './mocks'; +import { mockPersonalInfo } from './mocks/api'; initI18n(); diff --git a/web/frontend/tests/formIndex.spec.ts b/web/frontend/tests/formIndex.spec.ts index 56f83d3d4..5bff4c946 100644 --- a/web/frontend/tests/formIndex.spec.ts +++ b/web/frontend/tests/formIndex.spec.ts @@ -1,10 +1,11 @@ import { expect, test } from '@playwright/test'; import { default as i18n } from 'i18next'; import { assertHasFooter, assertHasNavBar, initI18n, logIn, setUp, translate } from './shared'; -import { SCIPER_ADMIN, SCIPER_USER, mockEvoting, mockPersonalInfo } from './mocks'; +import { SCIPER_ADMIN, SCIPER_USER, mockPersonalInfo } from './mocks/api'; +import { mockEvoting } from './mocks'; import Forms from './json/formList.json'; -import User from './json/personal_info/789012.json'; -import Admin from './json/personal_info/123456.json'; +import User from './json/api/personal_info/789012.json'; +import Admin from './json/api/personal_info/123456.json'; initI18n(); diff --git a/web/frontend/tests/forms.spec.ts b/web/frontend/tests/forms.spec.ts index 1905acc27..b9350dd10 100644 --- a/web/frontend/tests/forms.spec.ts +++ b/web/frontend/tests/forms.spec.ts @@ -1,7 +1,7 @@ import { expect, test } from '@playwright/test'; import { default as i18n } from 'i18next'; import { assertHasFooter, assertHasNavBar, initI18n, logIn, setUp, translate } from './shared'; -import { SCIPER_ADMIN, SCIPER_USER, mockPersonalInfo } from './mocks'; +import { SCIPER_ADMIN, SCIPER_USER, mockPersonalInfo } from './mocks/api'; import { FORMID, mockFormsFormID, mockDKGActors } from './mocks/evoting'; import { mockProxies } from './mocks/api'; diff --git a/web/frontend/tests/json/personal_info/123456.json b/web/frontend/tests/json/api/personal_info/123456.json similarity index 100% rename from web/frontend/tests/json/personal_info/123456.json rename to web/frontend/tests/json/api/personal_info/123456.json diff --git a/web/frontend/tests/json/personal_info/789012.json b/web/frontend/tests/json/api/personal_info/789012.json similarity index 100% rename from web/frontend/tests/json/personal_info/789012.json rename to web/frontend/tests/json/api/personal_info/789012.json diff --git a/web/frontend/tests/mocks.ts b/web/frontend/tests/mocks.ts index 70d98ace2..8f2693abc 100644 --- a/web/frontend/tests/mocks.ts +++ b/web/frontend/tests/mocks.ts @@ -1,56 +1,3 @@ -export const SCIPER_ADMIN = '123456'; -export const SCIPER_USER = '789012'; - -export async function mockPersonalInfo(page: page, sciper?: string) { - // clear current mock - await page.unroute('/api/personal_info'); - await page.route('/api/personal_info', async (route) => { - if (sciper) { - route.fulfill({ path: `./tests/json/personal_info/${sciper}.json` }); - } else { - route.fulfill({ status: 401, contentType: 'text/html', body: 'Unauthenticated' }); - } - }); -} - -export async function mockGetDevLogin(page: page) { - await page.route(`/api/get_dev_login/${SCIPER_ADMIN}`, async (route) => { - await route.fulfill({}); - }); - await page.route(`/api/get_dev_login/${SCIPER_USER}`, async (route) => { - await route.fulfill({}); - }); - if ( - process.env.REACT_APP_SCIPER_ADMIN !== undefined && - process.env.REACT_APP_SCIPER_ADMIN !== SCIPER_ADMIN - ) { - // dummy route for "Login" button depending on local configuration - await page.route(`/api/get_dev_login/${process.env.REACT_APP_SCIPER_ADMIN}`, async (route) => { - await route.fulfill({}); - }); - } -} - -export async function mockLogout(page: page) { - await page.route('/api/logout', async (route) => { - await route.fulfill({}); - }); -} - -export async function mockProxy(page: page) { - await page.route('/api/config/proxy', async (route) => { - await route.fulfill({ - status: 200, - contentType: 'text/html', - body: `${process.env.DELA_PROXY_URL}`, - headers: { - 'set-cookie': - 'connect.sid=s%3A5srES5h7hQ2fN5T71W59qh3cUSQL3Mix.fPoO3rOxui8yfTG7tFd7RPyasaU5VTkhxgdzVRWJyNk', - }, - }); - }); -} - export async function mockEvoting(page: page, empty: boolean = true) { // clear current mock await page.unroute(`${process.env.DELA_PROXY_URL}/evoting/forms`); diff --git a/web/frontend/tests/mocks/api.ts b/web/frontend/tests/mocks/api.ts index da41f10c6..5fbac22fc 100644 --- a/web/frontend/tests/mocks/api.ts +++ b/web/frontend/tests/mocks/api.ts @@ -1,3 +1,20 @@ +export const SCIPER_ADMIN = '123456'; +export const SCIPER_USER = '789012'; + +export async function mockProxy(page: page) { + await page.route('/api/config/proxy', async (route) => { + await route.fulfill({ + status: 200, + contentType: 'text/html', + body: `${process.env.DELA_PROXY_URL}`, + headers: { + 'set-cookie': + 'connect.sid=s%3A5srES5h7hQ2fN5T71W59qh3cUSQL3Mix.fPoO3rOxui8yfTG7tFd7RPyasaU5VTkhxgdzVRWJyNk', + }, + }); + }); +} + export async function mockProxies(page: page, workerNumber: number) { await page.route(`/api/proxies/grpc%3A%2F%2Fdela-worker-${workerNumber}%3A2000`, async (route) => { if (route.request().method() === 'OPTIONS') { @@ -16,3 +33,38 @@ export async function mockProxies(page: page, workerNumber: number) { }); } +export async function mockPersonalInfo(page: page, sciper?: string) { + // clear current mock + await page.unroute('/api/personal_info'); + await page.route('/api/personal_info', async (route) => { + if (sciper) { + route.fulfill({ path: `./tests/json/api/personal_info/${sciper}.json` }); + } else { + route.fulfill({ status: 401, contentType: 'text/html', body: 'Unauthenticated' }); + } + }); +} + +export async function mockGetDevLogin(page: page) { + await page.route(`/api/get_dev_login/${SCIPER_ADMIN}`, async (route) => { + await route.fulfill({}); + }); + await page.route(`/api/get_dev_login/${SCIPER_USER}`, async (route) => { + await route.fulfill({}); + }); + if ( + process.env.REACT_APP_SCIPER_ADMIN !== undefined && + process.env.REACT_APP_SCIPER_ADMIN !== SCIPER_ADMIN + ) { + // dummy route for "Login" button depending on local configuration + await page.route(`/api/get_dev_login/${process.env.REACT_APP_SCIPER_ADMIN}`, async (route) => { + await route.fulfill({}); + }); + } +} + +export async function mockLogout(page: page) { + await page.route('/api/logout', async (route) => { + await route.fulfill({}); + }); +} diff --git a/web/frontend/tests/navbar.spec.ts b/web/frontend/tests/navbar.spec.ts index 5ea38700d..b340efcc8 100644 --- a/web/frontend/tests/navbar.spec.ts +++ b/web/frontend/tests/navbar.spec.ts @@ -7,7 +7,7 @@ import { logIn, setUp, } from './shared'; -import { SCIPER_USER, mockLogout, mockPersonalInfo } from './mocks'; +import { SCIPER_USER, mockLogout, mockPersonalInfo } from './mocks/api'; initI18n(); diff --git a/web/frontend/tests/shared.ts b/web/frontend/tests/shared.ts index 6aee95529..0ce9ce5d2 100644 --- a/web/frontend/tests/shared.ts +++ b/web/frontend/tests/shared.ts @@ -10,7 +10,7 @@ import { mockLogout, mockPersonalInfo, mockProxy, -} from './mocks'; +} from './mocks/api'; export function initI18n() { i18n.init({ From 56425a23b2836a3a36cca87371034beaf8993873 Mon Sep 17 00:00:00 2001 From: Carine Dengler Date: Tue, 16 Jan 2024 17:41:16 +0100 Subject: [PATCH 05/11] test: move evoting mocks --- web/frontend/tests/formIndex.spec.ts | 10 ++++---- web/frontend/tests/forms.spec.ts | 8 +++---- web/frontend/tests/mocks.ts | 25 ------------------- web/frontend/tests/mocks/api.ts | 31 +++++++++++++----------- web/frontend/tests/mocks/evoting.ts | 36 ++++++++++++++++++++++++---- 5 files changed, 56 insertions(+), 54 deletions(-) delete mode 100644 web/frontend/tests/mocks.ts diff --git a/web/frontend/tests/formIndex.spec.ts b/web/frontend/tests/formIndex.spec.ts index 5bff4c946..f92692705 100644 --- a/web/frontend/tests/formIndex.spec.ts +++ b/web/frontend/tests/formIndex.spec.ts @@ -2,7 +2,7 @@ import { expect, test } from '@playwright/test'; import { default as i18n } from 'i18next'; import { assertHasFooter, assertHasNavBar, initI18n, logIn, setUp, translate } from './shared'; import { SCIPER_ADMIN, SCIPER_USER, mockPersonalInfo } from './mocks/api'; -import { mockEvoting } from './mocks'; +import { mockForms } from './mocks/evoting'; import Forms from './json/formList.json'; import User from './json/api/personal_info/789012.json'; import Admin from './json/api/personal_info/123456.json'; @@ -15,7 +15,7 @@ async function goForward(page: page) { test.beforeEach(async ({ page }) => { // mock empty list per default - await mockEvoting(page); + await mockForms(page); await mockPersonalInfo(page); await setUp(page, '/form/index'); }); @@ -49,7 +49,7 @@ test('Assert pagination works correctly for empty list', async ({ page }) => { test('Assert pagination works correctly for non-empty list', async ({ page }) => { // mock non-empty list w/ 11 elements i.e. 2 pages - await mockEvoting(page, false); + await mockForms(page, false); await page.reload(); const next = await page.getByRole('button', { name: i18n.t('next') }); const previous = await page.getByRole('button', { name: i18n.t('previous') }); @@ -120,7 +120,7 @@ async function assertQuickAction(row: locator, form: object, sciper?: string) { } test('Assert forms are displayed correctly for unauthenticated user', async ({ page }) => { - await mockEvoting(page, false); + await mockForms(page, false); await page.reload(); const table = await page.getByRole('table'); for (let form of Forms.Forms.slice(0, -1)) { @@ -142,7 +142,7 @@ test('Assert forms are displayed correctly for unauthenticated user', async ({ p test('Assert quick actions are displayed correctly for authenticated users', async ({ page }) => { for (let sciper of [SCIPER_USER, SCIPER_ADMIN]) { await logIn(page, sciper); - await mockEvoting(page, false); + await mockForms(page, false); await page.reload(); const table = await page.getByRole('table'); for (let form of Forms.Forms.slice(0, -1)) { diff --git a/web/frontend/tests/forms.spec.ts b/web/frontend/tests/forms.spec.ts index b9350dd10..c6d18925f 100644 --- a/web/frontend/tests/forms.spec.ts +++ b/web/frontend/tests/forms.spec.ts @@ -1,9 +1,7 @@ import { expect, test } from '@playwright/test'; -import { default as i18n } from 'i18next'; -import { assertHasFooter, assertHasNavBar, initI18n, logIn, setUp, translate } from './shared'; -import { SCIPER_ADMIN, SCIPER_USER, mockPersonalInfo } from './mocks/api'; -import { FORMID, mockFormsFormID, mockDKGActors } from './mocks/evoting'; -import { mockProxies } from './mocks/api'; +import { assertHasFooter, assertHasNavBar, initI18n, setUp } from './shared'; +import { mockPersonalInfo, mockProxies } from './mocks/api'; +import { FORMID, mockDKGActors, mockFormsFormID } from './mocks/evoting'; initI18n(); diff --git a/web/frontend/tests/mocks.ts b/web/frontend/tests/mocks.ts deleted file mode 100644 index 8f2693abc..000000000 --- a/web/frontend/tests/mocks.ts +++ /dev/null @@ -1,25 +0,0 @@ -export async function mockEvoting(page: page, empty: boolean = true) { - // clear current mock - await page.unroute(`${process.env.DELA_PROXY_URL}/evoting/forms`); - await page.route(`${process.env.DELA_PROXY_URL}/evoting/forms`, async (route) => { - if (route.request().method() === 'OPTIONS') { - await route.fulfill({ - status: 200, - headers: { - 'Access-Control-Allow-Headers': '*', - 'Access-Control-Allow-Origin': '*', - }, - }); - } else if (empty) { - await route.fulfill({ - status: 200, - contentType: 'application/json', - body: '{"Forms": []}', - }); - } else { - await route.fulfill({ - path: './tests/json/formList.json', - }); - } - }); -} diff --git a/web/frontend/tests/mocks/api.ts b/web/frontend/tests/mocks/api.ts index 5fbac22fc..5d83f6e90 100644 --- a/web/frontend/tests/mocks/api.ts +++ b/web/frontend/tests/mocks/api.ts @@ -16,21 +16,24 @@ export async function mockProxy(page: page) { } export async function mockProxies(page: page, workerNumber: number) { - await page.route(`/api/proxies/grpc%3A%2F%2Fdela-worker-${workerNumber}%3A2000`, async (route) => { - if (route.request().method() === 'OPTIONS') { - await route.fulfill({ - status: 200, - headers: { - 'Access-Control-Allow-Headers': '*', - 'Access-Control-Allow-Origin': '*', - }, - }); - } else { - await route.fulfill({ - path: `./tests/json/api/proxies/dela-worker-${workerNumber}.json`, - }); + await page.route( + `/api/proxies/grpc%3A%2F%2Fdela-worker-${workerNumber}%3A2000`, + async (route) => { + if (route.request().method() === 'OPTIONS') { + await route.fulfill({ + status: 200, + headers: { + 'Access-Control-Allow-Headers': '*', + 'Access-Control-Allow-Origin': '*', + }, + }); + } else { + await route.fulfill({ + path: `./tests/json/api/proxies/dela-worker-${workerNumber}.json`, + }); + } } - }); + ); } export async function mockPersonalInfo(page: page, sciper?: string) { diff --git a/web/frontend/tests/mocks/evoting.ts b/web/frontend/tests/mocks/evoting.ts index 71e93bd8c..b373cb8b7 100644 --- a/web/frontend/tests/mocks/evoting.ts +++ b/web/frontend/tests/mocks/evoting.ts @@ -1,10 +1,36 @@ -import Worker0 from './../json/api/proxies/dela-worker-0.json' -import Worker1 from './../json/api/proxies/dela-worker-1.json' -import Worker2 from './../json/api/proxies/dela-worker-2.json' -import Worker3 from './../json/api/proxies/dela-worker-3.json' +import Worker0 from './../json/api/proxies/dela-worker-0.json'; +import Worker1 from './../json/api/proxies/dela-worker-1.json'; +import Worker2 from './../json/api/proxies/dela-worker-2.json'; +import Worker3 from './../json/api/proxies/dela-worker-3.json'; export const FORMID = 'b63bcb854121051f2d8cff04bf0ac9b524b534b704509a16a423448bde3321b4'; +export async function mockForms(page: page, empty: boolean = true) { + // clear current mock + await page.unroute(`${process.env.DELA_PROXY_URL}/evoting/forms`); + await page.route(`${process.env.DELA_PROXY_URL}/evoting/forms`, async (route) => { + if (route.request().method() === 'OPTIONS') { + await route.fulfill({ + status: 200, + headers: { + 'Access-Control-Allow-Headers': '*', + 'Access-Control-Allow-Origin': '*', + }, + }); + } else if (empty) { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: '{"Forms": []}', + }); + } else { + await route.fulfill({ + path: './tests/json/formList.json', + }); + } + }); +} + export async function mockFormsFormID(page: page, formStatus: number) { // clear current mock await page.unroute(`${process.env.DELA_PROXY_URL}/evoting/forms/${FORMID}`); @@ -38,7 +64,7 @@ export async function mockFormsFormID(page: page, formStatus: number) { export async function mockDKGActors(page: page, formStatus: number, initialized?: boolean) { // the nodes must have been initialized if the form changed state - initialized = (initialized || formStatus > 0); + initialized = initialized || formStatus > 0; for (const worker of [Worker0, Worker1, Worker2, Worker3]) { await page.route(`${worker.Proxy}/evoting/services/dkg/actors/${FORMID}`, async (route) => { let dkgActorsFile = ''; From 981b74f7a97e5789e94c17b9b6a268b341072954 Mon Sep 17 00:00:00 2001 From: Carine Dengler Date: Thu, 18 Jan 2024 17:42:46 +0100 Subject: [PATCH 06/11] test: added 2nd admin user for ownership tests --- scripts/run_docker.sh | 1 + .../tests/json/api/personal_info/987654.json | 25 +++++++++++++++++++ web/frontend/tests/mocks/api.ts | 1 + 3 files changed, 27 insertions(+) create mode 100644 web/frontend/tests/json/api/personal_info/987654.json diff --git a/scripts/run_docker.sh b/scripts/run_docker.sh index 7904fbb18..cc66dde86 100755 --- a/scripts/run_docker.sh +++ b/scripts/run_docker.sh @@ -67,6 +67,7 @@ function init_dela() { function local_admin() { echo "adding local user $REACT_APP_SCIPER_ADMIN to admins"; docker compose exec backend npx cli addAdmin --sciper "$REACT_APP_SCIPER_ADMIN"; + docker compose exec backend npx cli addAdmin --sciper 987654; docker compose restart backend; } diff --git a/web/frontend/tests/json/api/personal_info/987654.json b/web/frontend/tests/json/api/personal_info/987654.json new file mode 100644 index 000000000..e24cb3e6a --- /dev/null +++ b/web/frontend/tests/json/api/personal_info/987654.json @@ -0,0 +1,25 @@ +{ + "sciper": 987654, + "lastName": "987654", + "firstName": "sciper-#", + "isLoggedIn": true, + "authorization": { + "roles": [ + "add", + "list", + "remove" + ], + "proxies": [ + "post", + "put", + "delete" + ], + "election": [ + "create" + ], + "fdf8bfb702e8883e330a2b303b24212b6fc16df5a53a097998b77ba74632dc72": ["own"], + "ed26713245824d44ee46ec90507ef521962f2313706934cdfe76ff1823738109": ["vote", "own"], + "9f50ad723805a6419ba1a9f83dd0aa582f3e13b94f14727cd0c8c01744e0dba2": ["vote"], + "b63bcb854121051f2d8cff04bf0ac9b524b534b704509a16a423448bde3321b4": ["own"] + } +} diff --git a/web/frontend/tests/mocks/api.ts b/web/frontend/tests/mocks/api.ts index 5d83f6e90..4d5ec042f 100644 --- a/web/frontend/tests/mocks/api.ts +++ b/web/frontend/tests/mocks/api.ts @@ -1,4 +1,5 @@ export const SCIPER_ADMIN = '123456'; +export const SCIPER_OTHER_ADMIN = '987654'; export const SCIPER_USER = '789012'; export async function mockProxy(page: page) { From 6498f8b031540d87b28360683ae6834d812606a3 Mon Sep 17 00:00:00 2001 From: Carine Dengler Date: Mon, 22 Jan 2024 20:58:47 +0100 Subject: [PATCH 07/11] test: wait until there's no more network traffic on reload --- web/frontend/tests/shared.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/web/frontend/tests/shared.ts b/web/frontend/tests/shared.ts index 0ce9ce5d2..e99e8d7a4 100644 --- a/web/frontend/tests/shared.ts +++ b/web/frontend/tests/shared.ts @@ -30,8 +30,7 @@ export async function setUp(page: page, url: string) { export async function logIn(page: page, sciper: string) { await mockPersonalInfo(page, sciper); - await page.reload(); - await expect(page).toHaveURL(page.url()); // make sure that page is loaded + await page.reload({ waitUntil: 'networkidle' }); } export async function assertOnlyVisibleToAuthenticated(page: page, locator: locator) { From e4746f03bf72fe9c9794af2c077f95dcd414cc32 Mon Sep 17 00:00:00 2001 From: Carine Dengler Date: Thu, 25 Jan 2024 10:31:07 +0100 Subject: [PATCH 08/11] fix: do not show 'Add voters' button to non-owner --- .../ActionButtons/AddVotersButton.tsx | 14 ++--- .../form/components/ActionButtons/utils.tsx | 11 ++++ .../form/components/utils/useChangeAction.tsx | 4 +- web/frontend/tests/forms.spec.ts | 61 +++++++++++++++++-- .../tests/json/api/personal_info/123456.json | 2 +- web/frontend/tests/mocks/evoting.ts | 44 +++++++------ 6 files changed, 101 insertions(+), 35 deletions(-) create mode 100644 web/frontend/src/pages/form/components/ActionButtons/utils.tsx diff --git a/web/frontend/src/pages/form/components/ActionButtons/AddVotersButton.tsx b/web/frontend/src/pages/form/components/ActionButtons/AddVotersButton.tsx index 61a241ae6..e4a1e78b0 100644 --- a/web/frontend/src/pages/form/components/ActionButtons/AddVotersButton.tsx +++ b/web/frontend/src/pages/form/components/ActionButtons/AddVotersButton.tsx @@ -1,18 +1,16 @@ import { DocumentAddIcon } from '@heroicons/react/outline'; +import { useTranslation } from 'react-i18next'; +import { isManager } from './utils'; import { AuthContext } from 'index'; import { useContext } from 'react'; -import { useTranslation } from 'react-i18next'; - -const SUBJECT_ELECTION = 'election'; -const ACTION_CREATE = 'create'; -const AddVotersButton = ({ handleAddVoters }) => { - const authCtx = useContext(AuthContext); +const AddVotersButton = ({ handleAddVoters, formID }) => { const { t } = useTranslation(); + const { authorization, isLogged } = useContext(AuthContext); return ( - authCtx.isAllowed(SUBJECT_ELECTION, ACTION_CREATE) && ( -