ultisuite-client/e2e/onboard-migration.spec.ts
R3D347HR4Y 6c7278a3aa
Some checks are pending
E2E / Playwright e2e (push) Waiting to run
feat(onboarding): implement claim and migration pages with OAuth support
- Added OnboardClaimPage and OnboardMigrationPage components for user onboarding.
- Integrated OAuth login flow for Google and Microsoft accounts.
- Implemented error handling and user feedback for claim and migration processes.
- Created MigrationStepList and MigrationOnboardingAlerts components for progress tracking.
- Added MailDomainsSection and MigrationProjectsPanel for admin settings.
- Introduced e2e tests for onboarding migration scenarios.
2026-06-13 12:47:03 +02:00

159 lines
5.8 KiB
TypeScript

import { test, expect } from "@playwright/test"
import {
E2E_INVITE_TOKEN,
E2E_MIGRATEE_EMAIL,
expectClaimAuthenticatedStep,
gotoClaimPage,
gotoMigrationPage,
installMigrationApiMocks,
mockAuthSession,
submitClaim,
} from "./helpers/migration-onboarding"
test.beforeEach(async ({ page }) => {
await page.addInitScript(() => {
window.localStorage.clear()
window.sessionStorage.clear()
})
})
test.describe("onboarding migration (mocked API)", () => {
test("claim page rejects invite link without token", async ({ page }) => {
await page.goto("/onboard/claim")
await expect(page.getByRole("heading", { name: "Lien d'invitation invalide" })).toBeVisible()
})
test("claim page prompts login when session is missing", async ({ page }) => {
await mockAuthSession(page, { authenticated: false })
await installMigrationApiMocks(page)
await gotoClaimPage(page)
await expect(page.getByRole("heading", { name: "Revendiquer votre compte" })).toBeVisible()
await expect(page.getByText(E2E_MIGRATEE_EMAIL)).toBeVisible()
await expect(page.getByRole("link", { name: "Se connecter pour continuer" })).toBeVisible()
await expect(page.getByRole("button", { name: "Revendiquer mon compte" })).toHaveCount(0)
})
test("claim then migration journey for oauth google project", async ({ page }) => {
await mockAuthSession(page)
await installMigrationApiMocks(page, {
projectStatus: "draft",
authMode: "oauth",
sourceProvider: "google",
})
await gotoClaimPage(page)
await expectClaimAuthenticatedStep(page)
await submitClaim(page)
await expect(page.getByRole("heading", { name: "Migration en cours" })).toBeVisible()
await expect(
page.getByText(/Votre administrateur doit activer le projet de migration/)
).toBeVisible()
await expect(page.getByRole("button", { name: "Autoriser Google" })).toHaveCount(0)
await expect(page.getByRole("button", { name: "Autoriser Microsoft" })).toHaveCount(0)
})
test("migration shows oauth when project is active", async ({ page }) => {
await mockAuthSession(page)
await installMigrationApiMocks(page, {
projectStatus: "active",
inviteStatus: "claimed",
authMode: "oauth",
sourceProvider: "google",
})
await gotoMigrationPage(page)
await expect(page.getByText(/Étape suivante : autorisez l'accès/)).toBeVisible()
await expect(page.getByRole("button", { name: "Autoriser Google" })).toBeVisible()
await expect(page.getByRole("button", { name: "Autoriser Microsoft" })).toHaveCount(0)
})
test("migration hides oauth for google domain-wide delegation", async ({ page }) => {
await mockAuthSession(page)
await installMigrationApiMocks(page, {
projectStatus: "active",
inviteStatus: "claimed",
authMode: "google_dwd",
sourceProvider: "google",
})
await gotoMigrationPage(page)
await expect(
page.getByText(/Aucune autorisation OAuth personnelle requise/)
).toBeVisible()
await expect(page.getByRole("button", { name: "Autoriser Google" })).toHaveCount(0)
await expect(page.getByRole("button", { name: "Autoriser Microsoft" })).toHaveCount(0)
})
test("migration shows microsoft admin consent warning", async ({ page }) => {
await mockAuthSession(page)
await installMigrationApiMocks(page, {
projectStatus: "active",
inviteStatus: "claimed",
sourceProvider: "microsoft",
})
await gotoMigrationPage(page)
await expect(page.getByText(/consentement admin/)).toBeVisible()
await expect(page.getByRole("button", { name: "Autoriser Microsoft" })).toBeVisible()
await expect(page.getByRole("button", { name: "Autoriser Google" })).toHaveCount(0)
})
test("migration hides oauth after credentials are stored", async ({ page }) => {
await mockAuthSession(page)
await installMigrationApiMocks(page, {
projectStatus: "active",
inviteStatus: "claimed",
hasMigrationCredentials: true,
jobs: [
{ service: "mail", status: "running", stats_json: { imported: 12, estimated_total: 100 } },
{ service: "contacts", status: "pending", stats_json: { imported: 0 } },
{ service: "calendar", status: "pending", stats_json: { imported: 0 } },
{ service: "drive", status: "pending", stats_json: { imported: 0 } },
],
})
await gotoMigrationPage(page)
await expect(page.getByText(/Autorisation enregistrée/)).toBeVisible()
await expect(page.getByRole("button", { name: "Autoriser Google" })).toHaveCount(0)
await expect(page.getByText("12 éléments importés")).toBeVisible()
})
test("migration shows oauth success banner from redirect", async ({ page }) => {
await mockAuthSession(page)
await installMigrationApiMocks(page, {
projectStatus: "active",
inviteStatus: "claimed",
hasMigrationCredentials: true,
})
await page.goto(
`/onboard/migration?token=${encodeURIComponent(E2E_INVITE_TOKEN)}&oauth=success`
)
await expect(page.getByText(/Autorisation enregistrée. L'import démarre/)).toBeVisible()
})
test("claimed invite redirects claim page to migration", async ({ page }) => {
await mockAuthSession(page)
await installMigrationApiMocks(page, {
projectStatus: "active",
inviteStatus: "claimed",
})
await gotoClaimPage(page)
await expect(page).toHaveURL(new RegExp(`/onboard/migration\\?token=${E2E_INVITE_TOKEN}`))
await expect(page.getByRole("heading", { name: "Migration en cours" })).toBeVisible()
})
test("unclaimed user on migration page returns to claim", async ({ page }) => {
await mockAuthSession(page)
await installMigrationApiMocks(page, {
projectStatus: "draft",
inviteStatus: "invited",
})
await gotoMigrationPage(page)
await expect(page).toHaveURL(new RegExp(`/onboard/claim\\?token=${E2E_INVITE_TOKEN}`))
})
})