From e0c2978f523c67eba5a98f9ba9f245e36fb49268 Mon Sep 17 00:00:00 2001 From: Thomas Camlong Date: Fri, 1 May 2026 10:12:14 +0200 Subject: [PATCH] fix: resolve CI failures from integrations onboarding step - Fix TypeScript error: InitIntegrations returning null by transitioning to done phase instead - Fix TypeScript error: Object.fromEntries cast in integration grids by typing the array elements - Update E2E onboarding tests to process the new integrations step (skip for now) and increase finish assertion timeout for async mutation --- .../[locale]/init/_steps/integrations/init-integrations.tsx | 3 ++- .../components/integration/integration-multi-select-grid.tsx | 4 ++-- .../src/components/integration/integration-select-grid.tsx | 4 ++-- e2e/onboarding.spec.ts | 2 ++ e2e/shared/actions/onboarding-actions.ts | 5 +++++ e2e/shared/assertions/onboarding-assertions.ts | 2 +- 6 files changed, 14 insertions(+), 6 deletions(-) diff --git a/apps/nextjs/src/app/[locale]/init/_steps/integrations/init-integrations.tsx b/apps/nextjs/src/app/[locale]/init/_steps/integrations/init-integrations.tsx index a8f939b7b..2a188ef5d 100644 --- a/apps/nextjs/src/app/[locale]/init/_steps/integrations/init-integrations.tsx +++ b/apps/nextjs/src/app/[locale]/init/_steps/integrations/init-integrations.tsx @@ -57,7 +57,8 @@ export const InitIntegrations = () => { if (phase === "configure") { const currentKind = selectedKinds[currentIndex]; if (currentKind === undefined) { - return null; + setPhase("done"); + return <>; } return ( diff --git a/apps/nextjs/src/components/integration/integration-multi-select-grid.tsx b/apps/nextjs/src/components/integration/integration-multi-select-grid.tsx index e253f8468..3e5c542ae 100644 --- a/apps/nextjs/src/components/integration/integration-multi-select-grid.tsx +++ b/apps/nextjs/src/components/integration/integration-multi-select-grid.tsx @@ -16,8 +16,8 @@ interface IntegrationMultiSelectGridProps { } const getWidgetsByIntegration = () => { - const map: Record = Object.fromEntries( - integrationKinds.map((kind) => [kind, []]), + const map = Object.fromEntries( + integrationKinds.map((kind) => [kind, [] as WidgetKind[]]), ) as Record; for (const [widgetKind, widget] of Object.entries(widgetImports) as [ diff --git a/apps/nextjs/src/components/integration/integration-select-grid.tsx b/apps/nextjs/src/components/integration/integration-select-grid.tsx index 321473d77..e846b54e5 100644 --- a/apps/nextjs/src/components/integration/integration-select-grid.tsx +++ b/apps/nextjs/src/components/integration/integration-select-grid.tsx @@ -16,8 +16,8 @@ interface IntegrationSelectGridProps { } const getWidgetsByIntegration = () => { - const map: Record = Object.fromEntries( - integrationKinds.map((kind) => [kind, []]), + const map = Object.fromEntries( + integrationKinds.map((kind) => [kind, [] as WidgetKind[]]), ) as Record; for (const [widgetKind, widget] of Object.entries(widgetImports) as [ diff --git a/e2e/onboarding.spec.ts b/e2e/onboarding.spec.ts index d2731853a..0f09bb52e 100644 --- a/e2e/onboarding.spec.ts +++ b/e2e/onboarding.spec.ts @@ -31,6 +31,7 @@ describe("Onboarding", () => { confirmPassword: "Comp(exP4sswOrd", }); await actions.processSettingsStepAsync(); + await actions.processIntegrationsStepAsync(); // Assert await assertions.assertFinishStepVisibleAsync(); @@ -72,6 +73,7 @@ describe("Onboarding", () => { name: externalGroupName, }); await actions.processSettingsStepAsync(); + await actions.processIntegrationsStepAsync(); // Assert await assertions.assertFinishStepVisibleAsync(); diff --git a/e2e/shared/actions/onboarding-actions.ts b/e2e/shared/actions/onboarding-actions.ts index 182203fcf..4db61692b 100644 --- a/e2e/shared/actions/onboarding-actions.ts +++ b/e2e/shared/actions/onboarding-actions.ts @@ -51,4 +51,9 @@ export class OnboardingActions { await this.page.waitForSelector("text=Analytics"); await this.page.locator("css=button[type='submit']").click(); } + + public async processIntegrationsStepAsync() { + await this.page.waitForSelector("text=integrations you'd like to connect"); + await this.page.locator("button", { hasText: "Skip for now" }).click(); + } } diff --git a/e2e/shared/assertions/onboarding-assertions.ts b/e2e/shared/assertions/onboarding-assertions.ts index a2f9ccb2f..612b71e13 100644 --- a/e2e/shared/assertions/onboarding-assertions.ts +++ b/e2e/shared/assertions/onboarding-assertions.ts @@ -57,6 +57,6 @@ export class OnboardingAssertions { } public async assertFinishStepVisibleAsync() { - await this.page.waitForSelector("text=completed the setup", { timeout: 5000 }); + await this.page.waitForSelector("text=completed the setup", { timeout: 15000 }); } }