From 78798013f3f84b41bf872a11466ce3077a413726 Mon Sep 17 00:00:00 2001 From: Elio Bischof Date: Fri, 25 Jul 2025 13:35:10 +0200 Subject: [PATCH] timeouts --- .../login-integration-debug/devcontainer.json | 2 +- .../docker-compose.yml | 2 +- apps/login/.env.test | 2 +- apps/login/Dockerfile.dockerignore | 3 +- apps/login/cypress.config.ts | 5 ++ .../integration/integration/invite.cy.ts | 20 ++++---- .../login/integration/integration/login.cy.ts | 46 +++++++++---------- .../integration/integration/register.cy.ts | 6 +-- .../integration/integration/verify.cy.ts | 18 ++++---- apps/login/package.json | 2 +- apps/login/turbo.json | 6 ++- 11 files changed, 60 insertions(+), 52 deletions(-) diff --git a/.devcontainer/login-integration-debug/devcontainer.json b/.devcontainer/login-integration-debug/devcontainer.json index 9bed28b7a6..bb128d568e 100644 --- a/.devcontainer/login-integration-debug/devcontainer.json +++ b/.devcontainer/login-integration-debug/devcontainer.json @@ -14,5 +14,5 @@ 3001 ], "onCreateCommand": "pnpm install --filter . --filter @zitadel/login; cd apps/login; pnpm cypress install", - "postAttachCommand": "pnpm turbo daemon clean || true; pnpm turbo watch test:integration:login" + "postAttachCommand": "pnpm turbo daemon clean || true; pnpm turbo watch @zitadel/login#dev test:integration:login" } \ No newline at end of file diff --git a/.devcontainer/login-integration-debug/docker-compose.yml b/.devcontainer/login-integration-debug/docker-compose.yml index 7dce25157e..8985326149 100644 --- a/.devcontainer/login-integration-debug/docker-compose.yml +++ b/.devcontainer/login-integration-debug/docker-compose.yml @@ -4,4 +4,4 @@ services: extends: file: ../base/docker-compose.yml service: devcontainer - network_mode: !reset "" + network_mode: service:mock-zitadel diff --git a/apps/login/.env.test b/apps/login/.env.test index 134fdb5669..f401fcd76a 100644 --- a/apps/login/.env.test +++ b/apps/login/.env.test @@ -1,5 +1,5 @@ NEXT_PUBLIC_BASE_PATH="/ui/v2/login" -ZITADEL_API_URL=http://mock-zitadel:22222 +ZITADEL_API_URL=http://localhost:22222 ZITADEL_SERVICE_USER_TOKEN="yolo" EMAIL_VERIFICATION=true DEBUG=true diff --git a/apps/login/Dockerfile.dockerignore b/apps/login/Dockerfile.dockerignore index 4e64fd495f..d65fd69947 100644 --- a/apps/login/Dockerfile.dockerignore +++ b/apps/login/Dockerfile.dockerignore @@ -8,7 +8,8 @@ !next.config.mjs !next-env-vars.d.ts !next-env.d.ts -!tailwind.config.js +!tailwind.config.mjs +!postcss.config.cjs !tsconfig.json !package.json !pnpm-lock.yaml diff --git a/apps/login/cypress.config.ts b/apps/login/cypress.config.ts index 6d35d44c50..b9cca959ef 100644 --- a/apps/login/cypress.config.ts +++ b/apps/login/cypress.config.ts @@ -2,10 +2,15 @@ import { defineConfig } from "cypress"; export default defineConfig({ reporter: "list", + video: true, e2e: { baseUrl: process.env.LOGIN_BASE_URL || "http://localhost:3001/ui/v2/login", specPattern: "integration/integration/**/*.cy.{js,jsx,ts,tsx}", supportFile: "integration/support/e2e.{js,jsx,ts,tsx}", + responseTimeout: 5 * 60_000, // 5 minutes + pageLoadTimeout: 5 * 60_000, // 5 minutes + taskTimeout: 5 * 60_000, // 5 minutes + defaultCommandTimeout: 60_000, // 1 minute setupNodeEvents(on, config) { // implement node event listeners here }, diff --git a/apps/login/integration/integration/invite.cy.ts b/apps/login/integration/integration/invite.cy.ts index a68ff96c36..792ab31f28 100644 --- a/apps/login/integration/integration/invite.cy.ts +++ b/apps/login/integration/integration/invite.cy.ts @@ -22,22 +22,22 @@ describe("verify invite", () => { user: { userId: "221394658884845598", state: 1, - username: "john@zitadel.com", - loginNames: ["john@zitadel.com"], - preferredLoginName: "john@zitadel.com", + username: "john@example.com", + loginNames: ["john@example.com"], + preferredLoginName: "john@example.com", human: { userId: "221394658884845598", state: 1, - username: "john@zitadel.com", - loginNames: ["john@zitadel.com"], - preferredLoginName: "john@zitadel.com", + username: "john@example.com", + loginNames: ["john@example.com"], + preferredLoginName: "john@example.com", profile: { givenName: "John", familyName: "Doe", - avatarUrl: "https://zitadel.com/avatar.jpg", + avatarUrl: "https://example.com/avatar.jpg", }, email: { - email: "john@zitadel.com", + email: "john@example.com", isVerified: false, }, }, @@ -68,7 +68,7 @@ describe("verify invite", () => { factors: { user: { id: "221394658884845598", - loginName: "john@zitadel.com", + loginName: "john@example.com", }, password: undefined, webAuthN: undefined, @@ -93,7 +93,7 @@ describe("verify invite", () => { stub("zitadel.user.v2.UserService", "VerifyInviteCode"); cy.visit("/verify?userId=221394658884845598&code=abc&invite=true"); - cy.url({ timeout: 10_000 }).should("include", Cypress.config().baseUrl + "/authenticator/set"); + cy.url({ timeout: 5 * 60_000 }).should("include", Cypress.config().baseUrl + "/authenticator/set"); }); it("shows an error if invite code validation failed", () => { diff --git a/apps/login/integration/integration/login.cy.ts b/apps/login/integration/integration/login.cy.ts index 917d719cb1..05a084eac1 100644 --- a/apps/login/integration/integration/login.cy.ts +++ b/apps/login/integration/integration/login.cy.ts @@ -33,7 +33,7 @@ describe("login", () => { factors: { user: { id: "221394658884845598", - loginName: "john@zitadel.com", + loginName: "john@example.com", }, password: undefined, webAuthN: undefined, @@ -64,22 +64,22 @@ describe("login", () => { { userId: "221394658884845598", state: 1, - username: "john@zitadel.com", - loginNames: ["john@zitadel.com"], - preferredLoginName: "john@zitadel.com", + username: "john@example.com", + loginNames: ["john@example.com"], + preferredLoginName: "john@example.com", human: { userId: "221394658884845598", state: 1, - username: "john@zitadel.com", - loginNames: ["john@zitadel.com"], - preferredLoginName: "john@zitadel.com", + username: "john@example.com", + loginNames: ["john@example.com"], + preferredLoginName: "john@example.com", profile: { givenName: "John", familyName: "Doe", - avatarUrl: "https://zitadel.com/avatar.jpg", + avatarUrl: "https://example.com/avatar.jpg", }, email: { - email: "john@zitadel.com", + email: "john@example.com", isVerified: true, }, }, @@ -94,8 +94,8 @@ describe("login", () => { }); }); it("should redirect a user with password authentication to /password", () => { - cy.visit("/loginname?loginName=john%40zitadel.com&submit=true"); - cy.url({ timeout: 10_000 }).should("include", Cypress.config().baseUrl + "/password"); + cy.visit("/loginname?loginName=john%40example.com&submit=true"); + cy.url({ timeout: 5 * 60_000 }).should("include", Cypress.config().baseUrl + "/password"); }); describe("with passkey prompt", () => { beforeEach(() => { @@ -112,8 +112,8 @@ describe("login", () => { }); }); // it("should prompt a user to setup passwordless authentication if passkey is allowed in the login settings", () => { - // cy.visit("/loginname?loginName=john%40zitadel.com&submit=true"); - // cy.location("pathname", { timeout: 10_000 }).should("eq", "/password"); + // cy.visit("/loginname?loginName=john%40example.com&submit=true"); + // cy.location("pathname", { timeout: 5 * 60_000 }).should("eq", "/password"); // cy.get('input[type="password"]').focus().type("MyStrongPassword!1"); // cy.get('button[type="submit"]').click(); // cy.location("pathname", { timeout: 10_000 }).should( @@ -134,22 +134,22 @@ describe("login", () => { { userId: "221394658884845598", state: 1, - username: "john@zitadel.com", - loginNames: ["john@zitadel.com"], - preferredLoginName: "john@zitadel.com", + username: "john@example.com", + loginNames: ["john@example.com"], + preferredLoginName: "john@example.com", human: { userId: "221394658884845598", state: 1, - username: "john@zitadel.com", - loginNames: ["john@zitadel.com"], - preferredLoginName: "john@zitadel.com", + username: "john@example.com", + loginNames: ["john@example.com"], + preferredLoginName: "john@example.com", profile: { givenName: "John", familyName: "Doe", - avatarUrl: "https://zitadel.com/avatar.jpg", + avatarUrl: "https://example.com/avatar.jpg", }, email: { - email: "john@zitadel.com", + email: "john@example.com", isVerified: true, }, }, @@ -165,8 +165,8 @@ describe("login", () => { }); it("should redirect a user with passwordless authentication to /passkey", () => { - cy.visit("/loginname?loginName=john%40zitadel.com&submit=true"); - cy.url({ timeout: 10_000 }).should("include", Cypress.config().baseUrl + "/passkey"); + cy.visit("/loginname?loginName=john%40example.com&submit=true"); + cy.url({ timeout: 5 * 60_000 }).should("include", Cypress.config().baseUrl + "/passkey"); }); }); }); diff --git a/apps/login/integration/integration/register.cy.ts b/apps/login/integration/integration/register.cy.ts index 44c53647c1..9f525cc0c0 100644 --- a/apps/login/integration/integration/register.cy.ts +++ b/apps/login/integration/integration/register.cy.ts @@ -48,7 +48,7 @@ describe("register", () => { factors: { user: { id: "221394658884845598", - loginName: "john@zitadel.com", + loginName: "john@example.com", }, password: undefined, webAuthN: undefined, @@ -64,10 +64,10 @@ describe("register", () => { cy.visit("/register"); cy.get('input[data-testid="firstname-text-input"]').focus().type("John"); cy.get('input[data-testid="lastname-text-input"]').focus().type("Doe"); - cy.get('input[data-testid="email-text-input"]').focus().type("john@zitadel.com"); + cy.get('input[data-testid="email-text-input"]').focus().type("john@example.com"); cy.get('input[type="checkbox"][value="privacypolicy"]').check(); cy.get('input[type="checkbox"][value="tos"]').check(); cy.get('button[type="submit"]').click(); - cy.url({ timeout: 10_000 }).should("include", Cypress.config().baseUrl + "/passkey/set"); + cy.url({ timeout: 5 * 60_000 }).should("include", Cypress.config().baseUrl + "/passkey/set"); }); }); diff --git a/apps/login/integration/integration/verify.cy.ts b/apps/login/integration/integration/verify.cy.ts index db80cea720..e09d79662d 100644 --- a/apps/login/integration/integration/verify.cy.ts +++ b/apps/login/integration/integration/verify.cy.ts @@ -24,22 +24,22 @@ describe("verify email", () => { user: { userId: "221394658884845598", state: 1, - username: "john@zitadel.com", - loginNames: ["john@zitadel.com"], - preferredLoginName: "john@zitadel.com", + username: "john@example.com", + loginNames: ["john@example.com"], + preferredLoginName: "john@example.com", human: { userId: "221394658884845598", state: 1, - username: "john@zitadel.com", - loginNames: ["john@zitadel.com"], - preferredLoginName: "john@zitadel.com", + username: "john@example.com", + loginNames: ["john@example.com"], + preferredLoginName: "john@example.com", profile: { givenName: "John", familyName: "Doe", - avatarUrl: "https://zitadel.com/avatar.jpg", + avatarUrl: "https://example.com/avatar.jpg", }, email: { - email: "john@zitadel.com", + email: "john@example.com", isVerified: false, // email is not verified yet }, }, @@ -70,7 +70,7 @@ describe("verify email", () => { factors: { user: { id: "221394658884845598", - loginName: "john@zitadel.com", + loginName: "john@example.com", }, password: undefined, webAuthN: undefined, diff --git a/apps/login/package.json b/apps/login/package.json index 4681049a22..47c23278d8 100644 --- a/apps/login/package.json +++ b/apps/login/package.json @@ -15,7 +15,7 @@ "test:unit": "vitest --run", "lint-staged": "lint-staged", "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf .next", - "test:integration:login": "wait-on http://localhost:3001/ui/v2/login/verify && DISPLAY='' cypress run", + "test:integration:login": "wait-on --simultaneous 1 http://localhost:3001/ui/v2/login/verify?userId=221394658884845598&code=abc && DISPLAY='' cypress run", "test:acceptance": "dotenv -e ../login/.env.test.local playwright", "test:acceptance:setup": "cd ../.. && make login_test_acceptance_setup_env && NODE_ENV=test turbo run test:acceptance:setup:dev", "test:acceptance:setup:dev": "cd ../.. && make login_test_acceptance_setup_dev" diff --git a/apps/login/turbo.json b/apps/login/turbo.json index fc534b9576..dce47a5a3a 100644 --- a/apps/login/turbo.json +++ b/apps/login/turbo.json @@ -42,9 +42,11 @@ }, "test:integration:login": { "inputs": [ - ".next/trace", + ".next/**", + "!.next/cache/**", "integration/integration/**", - "integration/support/**" + "integration/support/**", + "cypress.config.ts" ], "outputs": [ "cypress/videos/**",