From 72b9f0b2c9f58b109ace5b7e190458f88500ef6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89douard=20Gomez-Va=C3=ABz?= Date: Fri, 31 Oct 2025 19:30:16 +0100 Subject: [PATCH 1/8] First playwright BDD scenario --- .vscode/settings.json | 7 ++- public/mobile-app/package.json | 2 +- .../tests/features/france-connexion.feature | 1 + .../step_definitions/default-steps.cjs | 47 ++++++++++++++----- 4 files changed, 43 insertions(+), 14 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 686dc0a42..9e3c7213a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,6 +4,9 @@ ], "cucumberautocomplete.syncfeatures": "public/mobile-app/tests/features/*.feature", "cucumberautocomplete.smartSnippets": true, - "cucumber.features": ["public/mobile-app/tests/features*.feature"], - "cucumber.glue": ["public/mobile-app/tests/features/step_definitions/*.js"] + "cucumber.features": ["public/mobile-app/tests/features/*.feature"], + "cucumber.glue": ["public/mobile-app/tests/features/step_definitions/*.cjs"], + "config.webserver": { + "reuseExistingServer" :true + } } diff --git a/public/mobile-app/package.json b/public/mobile-app/package.json index 6563ccc2e..b5d5cd4e9 100644 --- a/public/mobile-app/package.json +++ b/public/mobile-app/package.json @@ -15,7 +15,7 @@ "test:unit": "vitest", "test": "npm run test:unit -- --run && npm run test:e2e", "test:e2e": "playwright test", - "test:cucumber": "cucumber-js tests/features" + "test:cucumber": "cucumber-js tests/features --tags @ok" }, "dependencies": { "@eslint/compat": "^1.2.5", diff --git a/public/mobile-app/tests/features/france-connexion.feature b/public/mobile-app/tests/features/france-connexion.feature index a4bd95841..2e929ea6e 100644 --- a/public/mobile-app/tests/features/france-connexion.feature +++ b/public/mobile-app/tests/features/france-connexion.feature @@ -16,6 +16,7 @@ Fonctionnalité: France Connect et Initialisation des données usager Quand l'usager clique sur le lien allant vers la démo Alors l'usager va vers la démo + @ok Scénario: enregistrement d'un usager au service de notification d'AMI via France Connect Etant donné que l'usager est sur la home page non connectée de l'application AMI Quand l'usager se connecte sur AMI via France Connect en tant que "Camille" et suit le process de france connexion diff --git a/public/mobile-app/tests/features/step_definitions/default-steps.cjs b/public/mobile-app/tests/features/step_definitions/default-steps.cjs index 20738f37d..1f27c6e6e 100644 --- a/public/mobile-app/tests/features/step_definitions/default-steps.cjs +++ b/public/mobile-app/tests/features/step_definitions/default-steps.cjs @@ -1,23 +1,48 @@ -const { Given, - Then, -// When -} = require('@cucumber/cucumber'); +const { Given, When, Then, Before, After, setDefaultTimeout, context } = require("@cucumber/cucumber"); + +const { chromium, expect, defineConfig } = require("@playwright/test"); + +const { Page } = require("playwright"); + +setDefaultTimeout(60 * 1000); + +let page, browserContext, browser; + +Before(async function () { + browser = await chromium.launch({ headless: false}); + // browserContext = await browser.newContext({baseURL: "https://localhost:4173/", ignoreHTTPSErrors: true}); + browserContext = await browser.newContext({baseURL: "https://ami-back-staging.osc-fr1.scalingo.io/"}); + page = await browserContext.newPage(); +}); + +After(async function () { + await browserContext.close(); + await browser.close(); +}) Given( "l'usager se connecte sur AMI via France Connect en tant que {string} et suit le process de france connexion", - function (s) { - // Write code here that turns the phrase above into concrete actions + async (s) => { + await page.locator('#fr-connect-button').click() + await page.getByTestId('idp-e1e90d50-cca0-4a85-9db3-0bcc190ee6f7').click() + await page.getByLabel('Mot de passe').fill('123') + await page.getByRole('button', {name: 'Valider'}).click() + await page.getByRole('button', {name: 'Continuer sur AMI'}).click() } ); -Given("l'usager est sur la home page non connectée de l'application AMI", function () { - // Write code here that turns the phrase above into concrete actions +Given("l'usager est sur la home page non connectée de l'application AMI", async () => { + await page.goto("/") +}); + +Then("l'usager devrait arriver sur la home page connectée de l'application AMI", async () => { + await expect(page.locator('.user-profile')).toBeVisible() }); -Then("l'usager devrait arriver sur la home page connectée de l'application AMI", function () { - // Write code here that turns the phrase above into concrete actions +Then("les données de l'usager {string} récupérées depuis l'API Particulier devraient être affichées", function (s) { + //console.log(s); }); Then("l'usager {string} devrait être enregistré(e)", function (s) { - console.log(s); + //console.log(s); }); \ No newline at end of file From dbbc79dd257927337e23a51a4f1a17762156073b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89douard=20Gomez-Va=C3=ABz?= Date: Sat, 1 Nov 2025 14:52:29 +0100 Subject: [PATCH 2/8] Better configs alternative --- .../tests/features/step_definitions/default-steps.cjs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/public/mobile-app/tests/features/step_definitions/default-steps.cjs b/public/mobile-app/tests/features/step_definitions/default-steps.cjs index 1f27c6e6e..09e67c69a 100644 --- a/public/mobile-app/tests/features/step_definitions/default-steps.cjs +++ b/public/mobile-app/tests/features/step_definitions/default-steps.cjs @@ -9,9 +9,14 @@ setDefaultTimeout(60 * 1000); let page, browserContext, browser; Before(async function () { - browser = await chromium.launch({ headless: false}); - // browserContext = await browser.newContext({baseURL: "https://localhost:4173/", ignoreHTTPSErrors: true}); - browserContext = await browser.newContext({baseURL: "https://ami-back-staging.osc-fr1.scalingo.io/"}); + browser = await chromium.launch( + //uncomment this line to see the tests in live + //{ headless: false, slowMo: 1500} + ); + browserContext = await browser.newContext( + //{baseURL: "https://localhost:4173/", ignoreHTTPSErrors: true} + {baseURL: "https://ami-back-staging.osc-fr1.scalingo.io/"} + ); page = await browserContext.newPage(); }); From 998de2144a2cf2f1aa1b8559409ef1070d882d32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89douard=20Gomez-Va=C3=ABz?= Date: Sat, 1 Nov 2025 14:56:51 +0100 Subject: [PATCH 3/8] document test:cucumber filtering @OK scenarios --- CONTRIBUTING-BEHAVIOR.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING-BEHAVIOR.md b/CONTRIBUTING-BEHAVIOR.md index c8ce26b69..4bd7812f6 100644 --- a/CONTRIBUTING-BEHAVIOR.md +++ b/CONTRIBUTING-BEHAVIOR.md @@ -49,4 +49,4 @@ after having launched `npm install` if needed. Currently, there is no automated test execution integrated into the CI/CD pipeline. However, you can manually run acceptance tests - using **PyCharm** with the Cucumber.js and Gherkin plugins installed : After having launched `npm install` if needed, simply open your feature files in PyCharm and use the provided tools to execute and debug your scenarios. Don't use a ~~Behave~~ configuration but a **Cucumber.js** configuration. -- in a **terminal** : go to directory `/public/mobile-app directory` and launch `npx cucumber-js tests/features` or `npm run test:cucumber`. +- in a **terminal** : go to directory `/public/mobile-app directory` and launch `npx cucumber-js tests/features` or `npm run test:cucumber` (the latest script is currently configured to launch only scenarios tagged as @OK). From 9de345663097d3a17ebc02844dbc4c9fee23d4a8 Mon Sep 17 00:00:00 2001 From: Edouard Gomez-Vaez Date: Mon, 10 Nov 2025 17:51:20 +0100 Subject: [PATCH 4/8] playwright & cucumber installation details --- CONTRIBUTING-BEHAVIOR.md | 11 ++++++++--- public/mobile-app/package-lock.json | 13 ++++++++++++- public/mobile-app/package.json | 3 ++- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING-BEHAVIOR.md b/CONTRIBUTING-BEHAVIOR.md index 4bd7812f6..0fcfc770d 100644 --- a/CONTRIBUTING-BEHAVIOR.md +++ b/CONTRIBUTING-BEHAVIOR.md @@ -42,11 +42,16 @@ The following plugins have been tested Don't forget to tag the language in the first line of the feature file if a language other than English is used. -To launch a Cucumber scenario from PyCharm, don't use a ~~Behave~~ configuration but a **Cucumber.js** configuration, -after having launched `npm install` if needed. - ## 5. Launching Acceptance Tests Currently, there is no automated test execution integrated into the CI/CD pipeline. However, you can manually run acceptance tests + +### Install playwright browser + +**Warning**: this installs the different browsers needed for playwright e2e tests, and requires 500 MiB. + +Launch `npx playwright install` after having launched `npm install` in `/public/mobile-app` directory if needed. + +### Launching a test - using **PyCharm** with the Cucumber.js and Gherkin plugins installed : After having launched `npm install` if needed, simply open your feature files in PyCharm and use the provided tools to execute and debug your scenarios. Don't use a ~~Behave~~ configuration but a **Cucumber.js** configuration. - in a **terminal** : go to directory `/public/mobile-app directory` and launch `npx cucumber-js tests/features` or `npm run test:cucumber` (the latest script is currently configured to launch only scenarios tagged as @OK). diff --git a/public/mobile-app/package-lock.json b/public/mobile-app/package-lock.json index 5614607e0..29d85604f 100644 --- a/public/mobile-app/package-lock.json +++ b/public/mobile-app/package-lock.json @@ -35,7 +35,8 @@ "devDependencies": { "@cucumber/cucumber": "^12.1.0", "@vitejs/plugin-basic-ssl": "^2.1.0", - "vitest-websocket-mock": "^0.5.0" + "vitest-websocket-mock": "^0.5.0", + "cucumber-js": "^1.0.0" } }, "node_modules/@adobe/css-tools": { @@ -2491,6 +2492,16 @@ "node": ">=18" } }, + "node_modules/cucumber-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cucumber-js/-/cucumber-js-1.0.0.tgz", + "integrity": "sha512-nvFslqg9jKbd3Lmbq6nI+euseoAz6CB0XQboOgUf9oUrbN1ZKNCwSHqkgHXN8w4zQ8MRoVg/zT5CVVS+l9zNkQ==", + "dev": true, + "license": "ISC", + "bin": { + "cucumber-js": "cli.js" + } + }, "node_modules/data-urls": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", diff --git a/public/mobile-app/package.json b/public/mobile-app/package.json index b5d5cd4e9..99050e57e 100644 --- a/public/mobile-app/package.json +++ b/public/mobile-app/package.json @@ -45,6 +45,7 @@ "devDependencies": { "@cucumber/cucumber": "^12.1.0", "@vitejs/plugin-basic-ssl": "^2.1.0", - "vitest-websocket-mock": "^0.5.0" + "vitest-websocket-mock": "^0.5.0", + "cucumber-js": "^1.0.0" } } From ce95173a829c88688bc4de4c897c805986ed9213 Mon Sep 17 00:00:00 2001 From: Mathieu Agopian Date: Mon, 17 Nov 2025 10:11:10 +0100 Subject: [PATCH 5/8] Lint and format --- .vscode/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 9e3c7213a..05a7265d0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,6 +7,6 @@ "cucumber.features": ["public/mobile-app/tests/features/*.feature"], "cucumber.glue": ["public/mobile-app/tests/features/step_definitions/*.cjs"], "config.webserver": { - "reuseExistingServer" :true + "reuseExistingServer": true } } From 52a487668ce6551886722b69b4bb773b530c8ec3 Mon Sep 17 00:00:00 2001 From: Edouard Gomez-Vaez Date: Thu, 4 Dec 2025 16:43:51 +0100 Subject: [PATCH 6/8] Scenario template for multiple loggin. --- .../tests/features/france-connexion.feature | 48 +++++++++++++++++-- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/public/mobile-app/tests/features/france-connexion.feature b/public/mobile-app/tests/features/france-connexion.feature index 2e929ea6e..8e0c9adf4 100644 --- a/public/mobile-app/tests/features/france-connexion.feature +++ b/public/mobile-app/tests/features/france-connexion.feature @@ -17,13 +17,53 @@ Fonctionnalité: France Connect et Initialisation des données usager Alors l'usager va vers la démo @ok - Scénario: enregistrement d'un usager au service de notification d'AMI via France Connect + Plan du scénario: enregistrement d'un usager au service de notification d'AMI via France Connect Etant donné que l'usager est sur la home page non connectée de l'application AMI - Quand l'usager se connecte sur AMI via France Connect en tant que "Camille" et suit le process de france connexion + Quand l'usager se connecte sur AMI via France Connect en tant que "" et suit le process de france connexion Alors l'usager devrait arriver sur la home page connectée de l'application AMI # Quand on aura une donnée précise (adresse particulière ?) on le précisera dans le step ci-dessous - Et les données de l'usager "Camille" récupérées depuis l'API Particulier devraient être affichées - Et l'usager "Camille" devrait être enregistrée + Et les données de l'usager "" récupérées depuis l'API Particulier devraient être affichées + Et l'usager "" devrait être enregistrée + + Exemples: + | login | + | test | + | avec_nom_dusage | + | nom_composé | + | nom_50+_caractères | + | carac_speciaux | + | plusieurs_prénoms_2 | + | plusieurs_prénoms_3 | + | prénom_composé | + | prénom_composé_avec_espace | + | caractères_spéciaux | + | nom_prénom_long | + | moins_16_ans | + | moins_18_ans | + | moins_25_ans | + | genre_indéfini | + | sans_prenom | + | sans_nom_naissance | + | sans_nom_dusage | + | sans_mail | + | sans_telephone | + | sans_mail_sans_tel | + | sans_genre | + | sans_birthplace | + | test_CORSE_2A | + | test_CORSE_2B | + | naissance_Algérie | + | naissance_Maroc | + | naissance_Portugal | + | naissance_Belgique | + | naissance_Espagne | + | naissance_Italie | + | naissance_polynesie_française | + | naissance_wallis_futuna | + | naissance_etranger_birthplace_cog | + | naissance_etranger_birthplace_texte | + | étranger_présumé_né_jour | + | étranger_présumé_né_jour_et_mois | # Remarque : une première itération peut ignorer tout le process FC pour juste renvoyer des données en dur / aléatoire. From 1943d5e98caff483aa0468065c8f352441c83292 Mon Sep 17 00:00:00 2001 From: Edouard Gomez-Vaez Date: Wed, 11 Feb 2026 18:55:43 +0100 Subject: [PATCH 7/8] Suppression de la page d'information FC --- .../tests/features/step_definitions/default-steps.cjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/mobile-app/tests/features/step_definitions/default-steps.cjs b/public/mobile-app/tests/features/step_definitions/default-steps.cjs index 09e67c69a..dbf45f0ef 100644 --- a/public/mobile-app/tests/features/step_definitions/default-steps.cjs +++ b/public/mobile-app/tests/features/step_definitions/default-steps.cjs @@ -30,9 +30,10 @@ Given( async (s) => { await page.locator('#fr-connect-button').click() await page.getByTestId('idp-e1e90d50-cca0-4a85-9db3-0bcc190ee6f7').click() + await page.getByLabel('Identifiant').fill(s) await page.getByLabel('Mot de passe').fill('123') await page.getByRole('button', {name: 'Valider'}).click() - await page.getByRole('button', {name: 'Continuer sur AMI'}).click() +// await page.getByRole('button', {name: 'Continuer sur AMI'}).click() } ); From c7186a4c14fc1f3b4b31b488cbd0a63bbe0313d6 Mon Sep 17 00:00:00 2001 From: Edouard Gomez-Vaez Date: Wed, 11 Feb 2026 18:57:16 +0100 Subject: [PATCH 8/8] On ne test plus tous les comptes de test FC. --- .../tests/features/france-connexion.feature | 70 +++++++++---------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/public/mobile-app/tests/features/france-connexion.feature b/public/mobile-app/tests/features/france-connexion.feature index 8e0c9adf4..fdb0bdf9a 100644 --- a/public/mobile-app/tests/features/france-connexion.feature +++ b/public/mobile-app/tests/features/france-connexion.feature @@ -29,41 +29,41 @@ Fonctionnalité: France Connect et Initialisation des données usager | login | | test | | avec_nom_dusage | - | nom_composé | - | nom_50+_caractères | - | carac_speciaux | - | plusieurs_prénoms_2 | - | plusieurs_prénoms_3 | - | prénom_composé | - | prénom_composé_avec_espace | - | caractères_spéciaux | - | nom_prénom_long | - | moins_16_ans | - | moins_18_ans | - | moins_25_ans | - | genre_indéfini | - | sans_prenom | - | sans_nom_naissance | - | sans_nom_dusage | - | sans_mail | - | sans_telephone | - | sans_mail_sans_tel | - | sans_genre | - | sans_birthplace | - | test_CORSE_2A | - | test_CORSE_2B | - | naissance_Algérie | - | naissance_Maroc | - | naissance_Portugal | - | naissance_Belgique | - | naissance_Espagne | - | naissance_Italie | - | naissance_polynesie_française | - | naissance_wallis_futuna | - | naissance_etranger_birthplace_cog | - | naissance_etranger_birthplace_texte | - | étranger_présumé_né_jour | - | étranger_présumé_né_jour_et_mois | + # | nom_composé | + # | nom_50+_caractères | + # | carac_speciaux | + # | plusieurs_prénoms_2 | + # | plusieurs_prénoms_3 | + # | prénom_composé | + # | prénom_composé_avec_espace | + # | caractères_spéciaux | + # | nom_prénom_long | + # | moins_16_ans | + # | moins_18_ans | + # | moins_25_ans | + # | genre_indéfini | + # | sans_prenom | + # | sans_nom_naissance | + # | sans_nom_dusage | + # | sans_mail | + # | sans_telephone | + # | sans_mail_sans_tel | + # | sans_genre | + # | sans_birthplace | + # | test_CORSE_2A | + # | test_CORSE_2B | + # | naissance_Algérie | + # | naissance_Maroc | + # | naissance_Portugal | + # | naissance_Belgique | + # | naissance_Espagne | + # | naissance_Italie | + # | naissance_polynesie_française | + # | naissance_wallis_futuna | + # | naissance_etranger_birthplace_cog | + # | naissance_etranger_birthplace_texte | + # | étranger_présumé_né_jour | + # | étranger_présumé_né_jour_et_mois | # Remarque : une première itération peut ignorer tout le process FC pour juste renvoyer des données en dur / aléatoire.