From c56521557f31939869ff0b2993cf61bf8d6c67f5 Mon Sep 17 00:00:00 2001 From: Benjamin Bohec Date: Tue, 28 Jan 2025 15:31:52 +0100 Subject: [PATCH 1/3] seed ProConnect mode enabled --- back/src/scripts/seed.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/back/src/scripts/seed.ts b/back/src/scripts/seed.ts index 7376f9f9a9..cc3199b244 100644 --- a/back/src/scripts/seed.ts +++ b/back/src/scripts/seed.ts @@ -176,7 +176,7 @@ const featureFlagsSeed = async (uow: UnitOfWork) => { severity: "warning", }), enableSearchByScore: makeBooleanFeatureFlag(true), - enableProConnect: makeBooleanFeatureFlag(false), + enableProConnect: makeBooleanFeatureFlag(true), enableBroadcastOfConseilDepartementalToFT: makeBooleanFeatureFlag(false), enableBroadcastOfCapEmploiToFT: makeBooleanFeatureFlag(false), enableBroadcastOfMissionLocaleToFT: makeBooleanFeatureFlag(false), From 68e295586d7053cae1742954e0a5529389a7b46a Mon Sep 17 00:00:00 2001 From: Benjamin Bohec Date: Tue, 28 Jan 2025 15:34:14 +0100 Subject: [PATCH 2/3] valid proconnect auth workflow --- playwright/custom.config.ts | 10 +++ playwright/tests/auth.setup.ts | 108 +++++++++++++++++++++------------ 2 files changed, 80 insertions(+), 38 deletions(-) diff --git a/playwright/custom.config.ts b/playwright/custom.config.ts index 4f4e89428c..eb9361cabf 100644 --- a/playwright/custom.config.ts +++ b/playwright/custom.config.ts @@ -1,6 +1,16 @@ +import { makeThrowIfNotDefinedOrDefault } from "shared"; + +const throwIfNotDefinedOrDefault = makeThrowIfNotDefinedOrDefault(process.env); export const testConfig = { timeForDebounce: 600, // debounce time value * 2 for safety timeForEventCrawler: 2000, // event crawler time interval + 1s for safety + proConnect: { + baseUrl: "https://fca.integ01.dev-agentconnect.fr/api/v2", + username: throwIfNotDefinedOrDefault("PC_USERNAME"), + password: throwIfNotDefinedOrDefault("PC_PASSWORD"), + adminUsername: "admin+playwright@immersion-facile.beta.gouv.fr", + adminPassword: throwIfNotDefinedOrDefault("PC_ADMIN_PASSWORD"), + }, inclusionConnect: { baseUrl: "https://recette.connect.inclusion.beta.gouv.fr", username: process.env.IC_USERNAME ?? "", diff --git a/playwright/tests/auth.setup.ts b/playwright/tests/auth.setup.ts index a4da15e348..6bf673911a 100644 --- a/playwright/tests/auth.setup.ts +++ b/playwright/tests/auth.setup.ts @@ -7,22 +7,22 @@ const { adminAuthFile, establishmentAuthFile, agencyAuthFile } = testConfig; setup("authenticate as admin", async ({ page }) => { await page.goto("/"); const adminButton = await page.locator("#fr-header-main-navigation-button-4"); - await loginWithInclusionConnect(page, "admin"); + await loginWithIdentityProvider(page, "admin", "ProConnect"); await expect(adminButton).toBeVisible(); await page.context().storageState({ path: adminAuthFile }); }); setup("authenticate as IC user establishment", async ({ page }) => { await page.goto("/"); - await loginWithInclusionConnect(page, "establishmentDashboard"); + await loginWithIdentityProvider(page, "establishmentDashboard", "ProConnect"); await expect(page.locator(".fr-tabs__list")).toBeVisible(); await page.context().storageState({ path: establishmentAuthFile }); }); setup("authenticate as IC user agency", async ({ page }) => { await page.goto("/"); - await loginWithInclusionConnect(page, "agencyDashboard"); + await loginWithIdentityProvider(page, "agencyDashboard", "ProConnect"); await expect( page.locator(`#${domElementIds.agencyDashboard.registerAgencies.search}`), ).toBeVisible(); @@ -30,12 +30,15 @@ setup("authenticate as IC user agency", async ({ page }) => { await page.context().storageState({ path: agencyAuthFile }); }); -const loginWithInclusionConnect = async ( +type ProviderMode = "ProConnect" | "InclusionConnect"; + +const loginWithIdentityProvider = async ( page: Page, routeName: "agencyDashboard" | "establishmentDashboard" | "admin", + identityProviderMode: ProviderMode, ) => { const { loginButtonId, navLink, username, password, headerNavLink } = - buttonByRouteName[routeName]; + buttonByRouteName(identityProviderMode)[routeName]; if (routeName === "admin") { await page.goto("/admin"); @@ -47,21 +50,36 @@ const loginWithInclusionConnect = async ( await expect(page.url()).toContain(frontRoutes[routeName]); } - const inclusionConnectButton = await page.locator(`#${loginButtonId}`); - await expect(inclusionConnectButton).toBeVisible(); + const authButton = await page.locator(`#${loginButtonId}`); + await expect(authButton).toBeVisible(); - await inclusionConnectButton.click(); - await page.waitForURL(`${testConfig.inclusionConnect.baseUrl}/**`); + await authButton.click(); + await page.waitForURL( + `${getAuthEnvVarByIdentityProviderMode(identityProviderMode).baseUrl}/**`, + ); await page.waitForLoadState("domcontentloaded"); await page.waitForSelector("input[name=email]"); await page.fill("input[name=email]", username); + + if (identityProviderMode === "ProConnect") + await page + .locator("button[type='submit']") + .getByText("Continuer", { + exact: false, + }) + .click(); + await page.fill("input[name=password]", password); - await page - .locator("button[type='submit']") - .getByText("Connexion", { - exact: false, - }) - .click(); + + identityProviderMode === "ProConnect" + ? await page.getByRole("button", { name: /identifier/ }).click() + : await page + .locator("button[type='submit']") + .getByText("Connexion", { + exact: false, + }) + .click(); + await page.waitForURL(`${frontRoutes[routeName]}**`); expect(page.url()).toContain(frontRoutes[routeName]); }; @@ -71,7 +89,9 @@ type InclusionConnectRoute = | "establishmentDashboard" | "admin"; -const buttonByRouteName: Record< +const buttonByRouteName = ( + identityProviderMode: ProviderMode, +): Record< InclusionConnectRoute, { loginButtonId: string; @@ -80,26 +100,38 @@ const buttonByRouteName: Record< password: string; headerNavLink?: string; } -> = { - agencyDashboard: { - loginButtonId: domElementIds.agencyDashboard.login.inclusionConnectButton, - navLink: domElementIds.header.navLinks.agency.dashboard, - username: testConfig.inclusionConnect.username, - password: testConfig.inclusionConnect.password, - headerNavLink: "fr-header-main-navigation-button-3", - }, - establishmentDashboard: { - loginButtonId: - domElementIds.establishmentDashboard.login.inclusionConnectButton, - navLink: domElementIds.header.navLinks.establishment.dashboard, - username: testConfig.inclusionConnect.username, - password: testConfig.inclusionConnect.password, - headerNavLink: "fr-header-main-navigation-button-2", - }, - admin: { - loginButtonId: domElementIds.admin.login.inclusionConnectButton, - navLink: domElementIds.header.navLinks.admin.backOffice, - username: testConfig.inclusionConnect.adminUsername, - password: testConfig.inclusionConnect.adminPassword, - }, +> => { + const { username, password, adminUsername, adminPassword } = + getAuthEnvVarByIdentityProviderMode(identityProviderMode); + + return { + agencyDashboard: { + loginButtonId: domElementIds.agencyDashboard.login.inclusionConnectButton, + navLink: domElementIds.header.navLinks.agency.dashboard, + username, + password, + headerNavLink: "fr-header-main-navigation-button-3", + }, + establishmentDashboard: { + loginButtonId: + domElementIds.establishmentDashboard.login.inclusionConnectButton, + navLink: domElementIds.header.navLinks.establishment.dashboard, + username, + password, + headerNavLink: "fr-header-main-navigation-button-2", + }, + admin: { + loginButtonId: domElementIds.admin.login.inclusionConnectButton, + navLink: domElementIds.header.navLinks.admin.backOffice, + username: adminUsername, + password: adminPassword, + }, + }; }; + +const getAuthEnvVarByIdentityProviderMode = (identityProviderMode: string) => + testConfig[ + identityProviderMode === "InclusionConnect" + ? "inclusionConnect" + : "proConnect" + ]; From 461b99ef98b74b9c10a4f424072b2894023fa38c Mon Sep 17 00:00:00 2001 From: Benjamin Bohec Date: Wed, 29 Jan 2025 13:35:07 +0100 Subject: [PATCH 3/3] include new secrets and envVars in fullcheck --- .github/workflows/fullcheck.yml | 15 +++++++++++++++ .github/workflows/validation-pr.yml | 4 ++++ 2 files changed, 19 insertions(+) diff --git a/.github/workflows/fullcheck.yml b/.github/workflows/fullcheck.yml index 820cf04db1..57f6e70631 100644 --- a/.github/workflows/fullcheck.yml +++ b/.github/workflows/fullcheck.yml @@ -13,6 +13,12 @@ on: required: true IC_USERNAME: required: true + PC_ADMIN_PASSWORD: + required: true + PC_PASSWORD: + required: true + PC_USERNAME: + required: true SIRENE_INSEE_CLIENT_ID: required: true SIRENE_INSEE_CLIENT_SECRET: @@ -23,6 +29,8 @@ on: required: true INCLUSION_CONNECT_CLIENT_SECRET: required: true + PRO_CONNECT_CLIENT_SECRET: + required: true jobs: validation: @@ -107,10 +115,17 @@ jobs: IC_USERNAME: ${{ secrets.IC_USERNAME }} IC_PASSWORD: ${{ secrets.IC_PASSWORD }} IC_ADMIN_PASSWORD: ${{ secrets.IC_ADMIN_PASSWORD }} + PC_USERNAME: ${{ secrets.PC_USERNAME }} + PC_PASSWORD: ${{ secrets.PC_PASSWORD }} + PC_ADMIN_PASSWORD: ${{ secrets.PC_ADMIN_PASSWORD }} INCLUSION_CONNECT_GATEWAY: "HTTPS" INCLUSION_CONNECT_CLIENT_ID: local_inclusion_connect INCLUSION_CONNECT_CLIENT_SECRET: ${{ secrets.INCLUSION_CONNECT_CLIENT_SECRET }} INCLUSION_CONNECT_BASE_URI: "https://recette.connect.inclusion.beta.gouv.fr/auth" + PRO_CONNECT_GATEWAY: "HTTPS" + PRO_CONNECT_CLIENT_ID: 449e24c6-b5aa-4435-bb8c-728d4a3c1c94 + PRO_CONNECT_CLIENT_SECRET: ${{ secrets.PRO_CONNECT_CLIENT_SECRET }} + PRO_CONNECT_BASE_URI: "https://fca.integ01.dev-agentconnect.fr/api/v2" API_KEY_OPEN_CAGE_DATA_GEOCODING: ${{ secrets.API_KEY_OPEN_CAGE_DATA_GEOCODING }} API_KEY_OPEN_CAGE_DATA_GEOSEARCH: ${{ secrets.API_KEY_OPEN_CAGE_DATA_GEOSEARCH }} POLE_EMPLOI_GATEWAY: IN_MEMORY diff --git a/.github/workflows/validation-pr.yml b/.github/workflows/validation-pr.yml index 0f20b93500..cff5267ba1 100644 --- a/.github/workflows/validation-pr.yml +++ b/.github/workflows/validation-pr.yml @@ -20,11 +20,15 @@ jobs: IC_ADMIN_PASSWORD: ${{ secrets.IC_ADMIN_PASSWORD }} IC_PASSWORD: ${{ secrets.IC_PASSWORD }} IC_USERNAME: ${{ secrets.IC_USERNAME }} + PC_USERNAME: ${{ secrets.PC_USERNAME }} + PC_PASSWORD: ${{ secrets.PC_PASSWORD }} + PC_ADMIN_PASSWORD: ${{ secrets.PC_ADMIN_PASSWORD }} SIRENE_INSEE_CLIENT_ID: ${{ secrets.SIRENE_INSEE_CLIENT_ID }} SIRENE_INSEE_CLIENT_SECRET: ${{ secrets.SIRENE_INSEE_CLIENT_SECRET }} SIRENE_INSEE_USERNAME: ${{ secrets.SIRENE_INSEE_USERNAME }} SIRENE_INSEE_PASSWORD: ${{ secrets.SIRENE_INSEE_PASSWORD }} INCLUSION_CONNECT_CLIENT_SECRET: ${{ secrets.INCLUSION_CONNECT_CLIENT_SECRET }} + PRO_CONNECT_CLIENT_SECRET: ${{ secrets.PRO_CONNECT_CLIENT_SECRET}} verify-migration-order: name: "Verify migration order"