From d235639fc6d49087fef94c28d245710e4a31a474 Mon Sep 17 00:00:00 2001 From: aehnh Date: Tue, 3 Jun 2025 10:19:35 +0200 Subject: [PATCH 01/11] change tests to handle auto append --- .../tests-e2e/src/connect/models/BaseModel.ts | 15 ++++++++------ .../tests-e2e/src/connect/models/MFAModel.ts | 20 ++++++++++++++++++- .../src/connect/models/SignupModel.ts | 20 ++++++++++++++++++- .../src/connect/scenarios/append.spec.ts | 18 ++++++++++++----- .../tests-e2e/src/connect/scenarios/hooks.ts | 6 +++--- .../src/connect/scenarios/login.spec.ts | 5 +++-- .../src/connect/scenarios/misc.spec.ts | 7 ++++--- 7 files changed, 70 insertions(+), 21 deletions(-) diff --git a/packages/tests-e2e/src/connect/models/BaseModel.ts b/packages/tests-e2e/src/connect/models/BaseModel.ts index 4d891e6a9..3ac5d633a 100644 --- a/packages/tests-e2e/src/connect/models/BaseModel.ts +++ b/packages/tests-e2e/src/connect/models/BaseModel.ts @@ -32,14 +32,14 @@ export class BaseModel { this.page = page; this.authenticator = authenticator; this.blocker = blocker; - this.signup = new SignupModel(page); + this.signup = new SignupModel(page, authenticator); this.login = new LoginModel(page, authenticator); this.append = new AppendModel(page, authenticator); this.home = new HomeModel(page); this.passkeyList = new PasskeyListModel(page, authenticator); this.webhook = new WebhookModel(page); this.storage = new StorageModel(page); - this.mfa = new MFAModel(page); + this.mfa = new MFAModel(page, authenticator); } loadSignup() { @@ -64,17 +64,20 @@ export class BaseModel { async createUser(invited: boolean, append: boolean) { this.email = await this.signup.autofillCredentials(); - await this.signup.submit(); - this.mfa.registerTokenUsed(); if (invited) { - await this.expectScreen(ScreenNames.PasskeyAppend); if (append) { - await this.append.appendPasskey(true); + await this.signup.autoAppendPasskey(true); await this.expectScreen(ScreenNames.PasskeyAppended); await this.append.confirmAppended(); } else { + // todo: figure out how to wait until continue button no longer has loading sign + await this.signup.autoAppendPasskey(false); + await this.expectScreen(ScreenNames.PasskeyAppend); await this.append.skipAppend(); } + } else { + await this.signup.submit(); } + this.mfa.registerTokenUsed(); } } diff --git a/packages/tests-e2e/src/connect/models/MFAModel.ts b/packages/tests-e2e/src/connect/models/MFAModel.ts index d5131c723..4313877ce 100644 --- a/packages/tests-e2e/src/connect/models/MFAModel.ts +++ b/packages/tests-e2e/src/connect/models/MFAModel.ts @@ -1,12 +1,18 @@ import type { Page } from '@playwright/test'; import { expect } from '@playwright/test'; +import { ScreenNames } from '../utils/Constants'; +import { expectScreen } from '../utils/ExpectScreen'; +import type { VirtualAuthenticator } from '../utils/VirtualAuthenticator'; + export class MFAModel { page: Page; + authenticator: VirtualAuthenticator; timestamp: number; - constructor(page: Page) { + constructor(page: Page, authenticator: VirtualAuthenticator) { this.page = page; + this.authenticator = authenticator; this.timestamp = Date.now(); } @@ -24,4 +30,16 @@ export class MFAModel { submit() { return this.page.getByRole('button', { name: 'Submit' }).click(); } + + autoAppendPasskey(complete: boolean) { + const operationTrigger = () => this.page.getByRole('button', { name: 'Submit' }).click(); + if (complete) { + return this.authenticator.startAndCompletePasskeyOperation(operationTrigger); + } else { + return this.authenticator.startAndCancelPasskeyOperation(operationTrigger, async () => { + await expectScreen(this.page, ScreenNames.PasskeyAppend); + await this.page.waitForSelector('.button-loading-container', { state: 'detached' }); + }); + } + } } diff --git a/packages/tests-e2e/src/connect/models/SignupModel.ts b/packages/tests-e2e/src/connect/models/SignupModel.ts index 13e46f26d..e8796b953 100644 --- a/packages/tests-e2e/src/connect/models/SignupModel.ts +++ b/packages/tests-e2e/src/connect/models/SignupModel.ts @@ -1,10 +1,16 @@ import type { Page } from '@playwright/test'; +import type { VirtualAuthenticator } from '../utils/VirtualAuthenticator'; +import { ScreenNames } from '../utils/Constants'; +import { expectScreen } from '../utils/ExpectScreen'; + export class SignupModel { page: Page; + authenticator: VirtualAuthenticator; - constructor(page: Page) { + constructor(page: Page, authenticator: VirtualAuthenticator) { this.page = page; + this.authenticator = authenticator; } async autofillCredentials(): Promise { @@ -15,4 +21,16 @@ export class SignupModel { submit() { return this.page.getByRole('button', { name: 'Sign up' }).click(); } + + autoAppendPasskey(complete: boolean) { + const operationTrigger = () => this.page.getByRole('button', { name: 'Sign up' }).click(); + if (complete) { + return this.authenticator.startAndCompletePasskeyOperation(operationTrigger); + } else { + return this.authenticator.startAndCancelPasskeyOperation(operationTrigger, async () => { + await expectScreen(this.page, ScreenNames.PasskeyAppend); + await this.page.waitForSelector('.button-loading-container', { state: 'detached' }); + }); + } + } } diff --git a/packages/tests-e2e/src/connect/scenarios/append.spec.ts b/packages/tests-e2e/src/connect/scenarios/append.spec.ts index 3add83f22..fc0f65bfd 100644 --- a/packages/tests-e2e/src/connect/scenarios/append.spec.ts +++ b/packages/tests-e2e/src/connect/scenarios/append.spec.ts @@ -2,16 +2,22 @@ import { expect } from '@playwright/test'; import { test } from '../fixtures/BaseTest'; import { password, ScreenNames } from '../utils/Constants'; -import { loadPasskeyAppend, setupNetworkBlocker, setupUser, setupVirtualAuthenticator } from './hooks'; +import { + loadBeforePasskeyAppend, + setupNetworkBlocker, + setupUser, + setupVirtualAuthenticator, +} from './hooks'; test.describe('append component', () => { setupVirtualAuthenticator(test); setupNetworkBlocker(test); setupUser(test, true, false); - loadPasskeyAppend(test); + loadBeforePasskeyAppend(test); test('successful passkey append on login', async ({ model }) => { - await model.append.appendPasskey(true); + // await model.append.appendPasskey(true); + await model.mfa.autoAppendPasskey(true); await model.expectScreen(ScreenNames.PasskeyAppended); await model.append.confirmAppended(); @@ -19,13 +25,15 @@ test.describe('append component', () => { }); test('failed passkey append on login', async ({ model }) => { - await model.append.appendPasskey(false); + // await model.append.appendPasskey(false); + await model.mfa.autoAppendPasskey(false); }); test('Corbado FAPI unavailable after authentication', async ({ model }) => { await model.blocker.blockCorbadoFAPIFinishEndpoint(); - await model.append.appendPasskey(true); + // await model.append.appendPasskey(true); + await model.mfa.autoAppendPasskey(true); await model.expectScreen(ScreenNames.Home); }); }); diff --git a/packages/tests-e2e/src/connect/scenarios/hooks.ts b/packages/tests-e2e/src/connect/scenarios/hooks.ts index 90efe88d0..4f05a47e2 100644 --- a/packages/tests-e2e/src/connect/scenarios/hooks.ts +++ b/packages/tests-e2e/src/connect/scenarios/hooks.ts @@ -83,7 +83,7 @@ export function setupUser( } // assumes that setupUser(test, true, false) has been called right before -export function loadPasskeyAppend( +export function loadBeforePasskeyAppend( test: TestType< PlaywrightTestArgs & PlaywrightTestOptions & { model: BaseModel }, PlaywrightWorkerArgs & PlaywrightWorkerOptions @@ -100,8 +100,8 @@ export function loadPasskeyAppend( await model.expectScreen(ScreenNames.MFA); await model.mfa.autofillTOTP(); - await model.mfa.submit(); - await model.expectScreen(ScreenNames.PasskeyAppend); + // await model.mfa.submit(); + // await model.expectScreen(ScreenNames.PasskeyAppend); }); } diff --git a/packages/tests-e2e/src/connect/scenarios/login.spec.ts b/packages/tests-e2e/src/connect/scenarios/login.spec.ts index 6d647c4a0..ae4c2c69e 100644 --- a/packages/tests-e2e/src/connect/scenarios/login.spec.ts +++ b/packages/tests-e2e/src/connect/scenarios/login.spec.ts @@ -35,8 +35,9 @@ test.describe('login component (with invitation token, without passkeys)', () => await model.expectScreen(ScreenNames.MFA); await model.mfa.autofillTOTP(); - await model.mfa.submit(); - await model.expectScreen(ScreenNames.PasskeyAppend); + // await model.mfa.submit(); + // await model.expectScreen(ScreenNames.PasskeyAppend); + await model.mfa.autoAppendPasskey(false); await model.append.skipAppend(); await model.expectScreen(ScreenNames.Home); diff --git a/packages/tests-e2e/src/connect/scenarios/misc.spec.ts b/packages/tests-e2e/src/connect/scenarios/misc.spec.ts index 36156d7da..c63c01465 100644 --- a/packages/tests-e2e/src/connect/scenarios/misc.spec.ts +++ b/packages/tests-e2e/src/connect/scenarios/misc.spec.ts @@ -1,7 +1,7 @@ import { test } from '../fixtures/BaseTest'; import { ScreenNames, WebhookTypes } from '../utils/Constants'; import { - loadPasskeyAppend, + loadBeforePasskeyAppend, loadPasskeyList, setupNetworkBlocker, setupUser, @@ -34,11 +34,12 @@ test.describe.serial('webhook tests', () => { setupVirtualAuthenticator(test); setupNetworkBlocker(test); setupUser(test, true, false); - loadPasskeyAppend(test); + loadBeforePasskeyAppend(test); setupWebhooks(test, [WebhookTypes.Create]); test('successful passkey append on login (+ webhook)', async ({ model }) => { - await model.append.appendPasskey(true); + // await model.append.appendPasskey(true); + await model.mfa.autoAppendPasskey(true); await model.expectScreen(ScreenNames.PasskeyAppended); await model.append.confirmAppended(); From 7fc1bef1aecc740edc50d25221734c7ab69b0e3e Mon Sep 17 00:00:00 2001 From: aehnh Date: Tue, 3 Jun 2025 10:24:09 +0200 Subject: [PATCH 02/11] prettier --- packages/tests-e2e/src/connect/scenarios/append.spec.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/tests-e2e/src/connect/scenarios/append.spec.ts b/packages/tests-e2e/src/connect/scenarios/append.spec.ts index fc0f65bfd..619a8000a 100644 --- a/packages/tests-e2e/src/connect/scenarios/append.spec.ts +++ b/packages/tests-e2e/src/connect/scenarios/append.spec.ts @@ -2,12 +2,7 @@ import { expect } from '@playwright/test'; import { test } from '../fixtures/BaseTest'; import { password, ScreenNames } from '../utils/Constants'; -import { - loadBeforePasskeyAppend, - setupNetworkBlocker, - setupUser, - setupVirtualAuthenticator, -} from './hooks'; +import { loadBeforePasskeyAppend, setupNetworkBlocker, setupUser, setupVirtualAuthenticator } from './hooks'; test.describe('append component', () => { setupVirtualAuthenticator(test); From b87a988aa61f71a189ae6f3b6d155969c9e5faae Mon Sep 17 00:00:00 2001 From: aehnh Date: Tue, 3 Jun 2025 10:25:15 +0200 Subject: [PATCH 03/11] remove comment --- packages/tests-e2e/src/connect/models/BaseModel.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/tests-e2e/src/connect/models/BaseModel.ts b/packages/tests-e2e/src/connect/models/BaseModel.ts index 3ac5d633a..f668f2bba 100644 --- a/packages/tests-e2e/src/connect/models/BaseModel.ts +++ b/packages/tests-e2e/src/connect/models/BaseModel.ts @@ -70,7 +70,6 @@ export class BaseModel { await this.expectScreen(ScreenNames.PasskeyAppended); await this.append.confirmAppended(); } else { - // todo: figure out how to wait until continue button no longer has loading sign await this.signup.autoAppendPasskey(false); await this.expectScreen(ScreenNames.PasskeyAppend); await this.append.skipAppend(); From aea0eb1963379cf894cc6f0e2c397e99c517dbaa Mon Sep 17 00:00:00 2001 From: aehnh Date: Tue, 3 Jun 2025 13:25:58 +0200 Subject: [PATCH 04/11] change test env to macos for autoappend support --- .github/workflows/deploy-playground-and-test.yml | 4 ++-- .github/workflows/test-all.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy-playground-and-test.yml b/.github/workflows/deploy-playground-and-test.yml index f93b75da1..3e90ccb0b 100644 --- a/.github/workflows/deploy-playground-and-test.yml +++ b/.github/workflows/deploy-playground-and-test.yml @@ -12,7 +12,7 @@ on: jobs: deploy: - runs-on: ubuntu-24.04 + runs-on: macos-15 steps: - name: Checkout code @@ -103,7 +103,7 @@ jobs: test: needs: deploy timeout-minutes: 60 - runs-on: ubuntu-latest + runs-on: macos-latest steps: - name: Checkout code diff --git a/.github/workflows/test-all.yml b/.github/workflows/test-all.yml index eb4ea9ea0..ce9276e04 100644 --- a/.github/workflows/test-all.yml +++ b/.github/workflows/test-all.yml @@ -12,7 +12,7 @@ on: jobs: test: timeout-minutes: 60 - runs-on: ubuntu-24.04 + runs-on: macos-15 steps: - name: Checkout code uses: actions/checkout@v4 From dde38049d6d80a1e897149356db1667c14a17bbb Mon Sep 17 00:00:00 2001 From: aehnh Date: Tue, 3 Jun 2025 13:27:14 +0200 Subject: [PATCH 05/11] run only tests on macos github runners --- .github/workflows/deploy-playground-and-test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-playground-and-test.yml b/.github/workflows/deploy-playground-and-test.yml index 3e90ccb0b..76a8268c5 100644 --- a/.github/workflows/deploy-playground-and-test.yml +++ b/.github/workflows/deploy-playground-and-test.yml @@ -12,7 +12,7 @@ on: jobs: deploy: - runs-on: macos-15 + runs-on: ubuntu-24.04 steps: - name: Checkout code @@ -103,7 +103,7 @@ jobs: test: needs: deploy timeout-minutes: 60 - runs-on: macos-latest + runs-on: macos-15 steps: - name: Checkout code From 7e61a006a738c53ce1974f1630ebc79576d6b531 Mon Sep 17 00:00:00 2001 From: aehnh Date: Tue, 3 Jun 2025 13:37:13 +0200 Subject: [PATCH 06/11] remove unnecessary xmllint installation (apparently builtin on macos) --- .github/workflows/deploy-playground-and-test.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-playground-and-test.yml b/.github/workflows/deploy-playground-and-test.yml index 76a8268c5..933d6fcc8 100644 --- a/.github/workflows/deploy-playground-and-test.yml +++ b/.github/workflows/deploy-playground-and-test.yml @@ -141,8 +141,10 @@ jobs: run: | cd packages/tests-e2e npm install - sudo apt-get update - sudo apt-get install -y libxml2-utils +# brew update +# brew install libxml2 +# sudo apt-get update +# sudo apt-get install -y libxml2-utils - uses: actions/cache@v3 id: playwright-cache From c9d0eac5977dcf57b86581367d13a0d38a5fb483 Mon Sep 17 00:00:00 2001 From: aehnh Date: Tue, 3 Jun 2025 13:51:17 +0200 Subject: [PATCH 07/11] remove useless package installation --- .github/workflows/test-all.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-all.yml b/.github/workflows/test-all.yml index ce9276e04..e8297548b 100644 --- a/.github/workflows/test-all.yml +++ b/.github/workflows/test-all.yml @@ -49,8 +49,8 @@ jobs: run: | cd packages/tests-e2e npm install - sudo apt-get update - sudo apt-get install -y libxml2-utils +# sudo apt-get update +# sudo apt-get install -y libxml2-utils - uses: actions/cache@v3 id: playwright-cache From 15bddc3ed2f4bd632714dc061a6fab058fd58184 Mon Sep 17 00:00:00 2001 From: aehnh Date: Wed, 4 Jun 2025 10:53:58 +0200 Subject: [PATCH 08/11] fix UA to show the right version for javascript high entropy --- .github/workflows/deploy-playground-and-test.yml | 8 +++----- .github/workflows/test-all.yml | 6 +++--- packages/tests-e2e/playwright.config.connect.ts | 1 + 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/deploy-playground-and-test.yml b/.github/workflows/deploy-playground-and-test.yml index 933d6fcc8..b8335f17b 100644 --- a/.github/workflows/deploy-playground-and-test.yml +++ b/.github/workflows/deploy-playground-and-test.yml @@ -103,7 +103,7 @@ jobs: test: needs: deploy timeout-minutes: 60 - runs-on: macos-15 + runs-on: ubuntu-24.04 steps: - name: Checkout code @@ -141,10 +141,8 @@ jobs: run: | cd packages/tests-e2e npm install -# brew update -# brew install libxml2 -# sudo apt-get update -# sudo apt-get install -y libxml2-utils + sudo apt-get update + sudo apt-get install -y libxml2-utils - uses: actions/cache@v3 id: playwright-cache diff --git a/.github/workflows/test-all.yml b/.github/workflows/test-all.yml index e8297548b..eb4ea9ea0 100644 --- a/.github/workflows/test-all.yml +++ b/.github/workflows/test-all.yml @@ -12,7 +12,7 @@ on: jobs: test: timeout-minutes: 60 - runs-on: macos-15 + runs-on: ubuntu-24.04 steps: - name: Checkout code uses: actions/checkout@v4 @@ -49,8 +49,8 @@ jobs: run: | cd packages/tests-e2e npm install -# sudo apt-get update -# sudo apt-get install -y libxml2-utils + sudo apt-get update + sudo apt-get install -y libxml2-utils - uses: actions/cache@v3 id: playwright-cache diff --git a/packages/tests-e2e/playwright.config.connect.ts b/packages/tests-e2e/playwright.config.connect.ts index 568c353e5..0423921c4 100644 --- a/packages/tests-e2e/playwright.config.connect.ts +++ b/packages/tests-e2e/playwright.config.connect.ts @@ -44,6 +44,7 @@ export default defineConfig({ timeout: operationTimeout, // default: 5000ms }, use: { + userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 15.3.2) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/129.0.6668.29 Safari/537.36', actionTimeout: operationTimeout, // default: none navigationTimeout: operationTimeout, // default: none baseURL: process.env.PLAYWRIGHT_TEST_URL, From ff8116fbd2a6e4ff7a8037785c07e61b9517e4b3 Mon Sep 17 00:00:00 2001 From: aehnh Date: Wed, 4 Jun 2025 10:55:33 +0200 Subject: [PATCH 09/11] prettier --- packages/tests-e2e/playwright.config.connect.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/tests-e2e/playwright.config.connect.ts b/packages/tests-e2e/playwright.config.connect.ts index 0423921c4..526da0fb3 100644 --- a/packages/tests-e2e/playwright.config.connect.ts +++ b/packages/tests-e2e/playwright.config.connect.ts @@ -44,7 +44,8 @@ export default defineConfig({ timeout: operationTimeout, // default: 5000ms }, use: { - userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 15.3.2) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/129.0.6668.29 Safari/537.36', + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 15.3.2) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/129.0.6668.29 Safari/537.36', actionTimeout: operationTimeout, // default: none navigationTimeout: operationTimeout, // default: none baseURL: process.env.PLAYWRIGHT_TEST_URL, From cc5599c288862e597b699787268834737e655af2 Mon Sep 17 00:00:00 2001 From: aehnh Date: Wed, 4 Jun 2025 12:12:56 +0200 Subject: [PATCH 10/11] refactor append-related operations into append model --- .../src/connect/models/AppendModel.ts | 15 +++++++++-- .../tests-e2e/src/connect/models/BaseModel.ts | 11 +++----- .../tests-e2e/src/connect/models/MFAModel.ts | 27 +++++++------------ .../src/connect/models/SignupModel.ts | 27 +++++++------------ .../src/connect/scenarios/append.spec.ts | 13 ++++----- .../src/connect/scenarios/login.spec.ts | 6 ++--- .../src/connect/scenarios/misc.spec.ts | 3 +-- 7 files changed, 43 insertions(+), 59 deletions(-) diff --git a/packages/tests-e2e/src/connect/models/AppendModel.ts b/packages/tests-e2e/src/connect/models/AppendModel.ts index 20efe4530..63b6757b6 100644 --- a/packages/tests-e2e/src/connect/models/AppendModel.ts +++ b/packages/tests-e2e/src/connect/models/AppendModel.ts @@ -1,7 +1,7 @@ import type { Page } from '@playwright/test'; -import { ErrorTexts } from '../utils/Constants'; -import { expectError } from '../utils/ExpectScreen'; +import { ErrorTexts, ScreenNames } from '../utils/Constants'; +import { expectError, expectScreen } from '../utils/ExpectScreen'; import type { VirtualAuthenticator } from '../utils/VirtualAuthenticator'; export class AppendModel { @@ -24,6 +24,17 @@ export class AppendModel { } } + autoAppendPasskey(complete: boolean, operationTrigger: () => Promise) { + if (complete) { + return this.authenticator.startAndCompletePasskeyOperation(operationTrigger); + } else { + return this.authenticator.startAndCancelPasskeyOperation(operationTrigger, async () => { + await expectScreen(this.page, ScreenNames.PasskeyAppend); + await this.page.waitForSelector('.button-loading-container', { state: 'detached' }); + }); + } + } + confirmAppended() { return this.page.getByRole('button', { name: 'Continue' }).click(); } diff --git a/packages/tests-e2e/src/connect/models/BaseModel.ts b/packages/tests-e2e/src/connect/models/BaseModel.ts index f668f2bba..f3d87f0ad 100644 --- a/packages/tests-e2e/src/connect/models/BaseModel.ts +++ b/packages/tests-e2e/src/connect/models/BaseModel.ts @@ -32,14 +32,14 @@ export class BaseModel { this.page = page; this.authenticator = authenticator; this.blocker = blocker; - this.signup = new SignupModel(page, authenticator); this.login = new LoginModel(page, authenticator); this.append = new AppendModel(page, authenticator); + this.signup = new SignupModel(page, this.append); + this.mfa = new MFAModel(page, this.append); this.home = new HomeModel(page); this.passkeyList = new PasskeyListModel(page, authenticator); this.webhook = new WebhookModel(page); this.storage = new StorageModel(page); - this.mfa = new MFAModel(page, authenticator); } loadSignup() { @@ -64,19 +64,16 @@ export class BaseModel { async createUser(invited: boolean, append: boolean) { this.email = await this.signup.autofillCredentials(); + await this.signup.submit(invited, append); + this.mfa.registerTokenUsed(); if (invited) { if (append) { - await this.signup.autoAppendPasskey(true); await this.expectScreen(ScreenNames.PasskeyAppended); await this.append.confirmAppended(); } else { - await this.signup.autoAppendPasskey(false); await this.expectScreen(ScreenNames.PasskeyAppend); await this.append.skipAppend(); } - } else { - await this.signup.submit(); } - this.mfa.registerTokenUsed(); } } diff --git a/packages/tests-e2e/src/connect/models/MFAModel.ts b/packages/tests-e2e/src/connect/models/MFAModel.ts index 4313877ce..8e5adda1c 100644 --- a/packages/tests-e2e/src/connect/models/MFAModel.ts +++ b/packages/tests-e2e/src/connect/models/MFAModel.ts @@ -1,18 +1,16 @@ import type { Page } from '@playwright/test'; import { expect } from '@playwright/test'; -import { ScreenNames } from '../utils/Constants'; -import { expectScreen } from '../utils/ExpectScreen'; -import type { VirtualAuthenticator } from '../utils/VirtualAuthenticator'; +import type { AppendModel } from './AppendModel'; export class MFAModel { page: Page; - authenticator: VirtualAuthenticator; + append: AppendModel; timestamp: number; - constructor(page: Page, authenticator: VirtualAuthenticator) { + constructor(page: Page, append: AppendModel) { this.page = page; - this.authenticator = authenticator; + this.append = append; this.timestamp = Date.now(); } @@ -27,19 +25,12 @@ export class MFAModel { this.registerTokenUsed(); } - submit() { - return this.page.getByRole('button', { name: 'Submit' }).click(); - } - - autoAppendPasskey(complete: boolean) { - const operationTrigger = () => this.page.getByRole('button', { name: 'Submit' }).click(); - if (complete) { - return this.authenticator.startAndCompletePasskeyOperation(operationTrigger); + submit(invited: boolean, autoAppend: boolean) { + if (invited) { + const operationTrigger = () => this.page.getByRole('button', { name: 'Submit' }).click(); + return this.append.autoAppendPasskey(autoAppend, operationTrigger); } else { - return this.authenticator.startAndCancelPasskeyOperation(operationTrigger, async () => { - await expectScreen(this.page, ScreenNames.PasskeyAppend); - await this.page.waitForSelector('.button-loading-container', { state: 'detached' }); - }); + return this.page.getByRole('button', { name: 'Submit' }).click(); } } } diff --git a/packages/tests-e2e/src/connect/models/SignupModel.ts b/packages/tests-e2e/src/connect/models/SignupModel.ts index e8796b953..c1de3a931 100644 --- a/packages/tests-e2e/src/connect/models/SignupModel.ts +++ b/packages/tests-e2e/src/connect/models/SignupModel.ts @@ -1,16 +1,14 @@ import type { Page } from '@playwright/test'; -import type { VirtualAuthenticator } from '../utils/VirtualAuthenticator'; -import { ScreenNames } from '../utils/Constants'; -import { expectScreen } from '../utils/ExpectScreen'; +import type { AppendModel } from './AppendModel'; export class SignupModel { page: Page; - authenticator: VirtualAuthenticator; + append: AppendModel - constructor(page: Page, authenticator: VirtualAuthenticator) { + constructor(page: Page, append: AppendModel) { this.page = page; - this.authenticator = authenticator; + this.append = append; } async autofillCredentials(): Promise { @@ -18,19 +16,12 @@ export class SignupModel { return await this.page.getByPlaceholder('Email').inputValue(); } - submit() { - return this.page.getByRole('button', { name: 'Sign up' }).click(); - } - - autoAppendPasskey(complete: boolean) { - const operationTrigger = () => this.page.getByRole('button', { name: 'Sign up' }).click(); - if (complete) { - return this.authenticator.startAndCompletePasskeyOperation(operationTrigger); + submit(invited: boolean, autoAppend: boolean) { + if (invited) { + const operationTrigger = () => this.page.getByRole('button', { name: 'Sign up' }).click(); + return this.append.autoAppendPasskey(autoAppend, operationTrigger); } else { - return this.authenticator.startAndCancelPasskeyOperation(operationTrigger, async () => { - await expectScreen(this.page, ScreenNames.PasskeyAppend); - await this.page.waitForSelector('.button-loading-container', { state: 'detached' }); - }); + return this.page.getByRole('button', { name: 'Sign up' }).click(); } } } diff --git a/packages/tests-e2e/src/connect/scenarios/append.spec.ts b/packages/tests-e2e/src/connect/scenarios/append.spec.ts index 619a8000a..d50d4138e 100644 --- a/packages/tests-e2e/src/connect/scenarios/append.spec.ts +++ b/packages/tests-e2e/src/connect/scenarios/append.spec.ts @@ -11,8 +11,7 @@ test.describe('append component', () => { loadBeforePasskeyAppend(test); test('successful passkey append on login', async ({ model }) => { - // await model.append.appendPasskey(true); - await model.mfa.autoAppendPasskey(true); + await model.mfa.submit(true, true); await model.expectScreen(ScreenNames.PasskeyAppended); await model.append.confirmAppended(); @@ -20,15 +19,13 @@ test.describe('append component', () => { }); test('failed passkey append on login', async ({ model }) => { - // await model.append.appendPasskey(false); - await model.mfa.autoAppendPasskey(false); + await model.mfa.submit(true, false); }); test('Corbado FAPI unavailable after authentication', async ({ model }) => { await model.blocker.blockCorbadoFAPIFinishEndpoint(); - // await model.append.appendPasskey(true); - await model.mfa.autoAppendPasskey(true); + await model.mfa.submit(true, true); await model.expectScreen(ScreenNames.Home); }); }); @@ -51,7 +48,7 @@ test.describe('skip append component', () => { await model.expectScreen(ScreenNames.MFA); await model.mfa.autofillTOTP(); - await model.mfa.submit(); + await model.mfa.submit(false, false); await model.expectScreen(ScreenNames.Home); }); @@ -70,7 +67,7 @@ test.describe('skip append component', () => { await model.expectScreen(ScreenNames.MFA); await model.mfa.autofillTOTP(); - await model.mfa.submit(); + await model.mfa.submit(false, false); await model.expectScreen(ScreenNames.Home); }); }); diff --git a/packages/tests-e2e/src/connect/scenarios/login.spec.ts b/packages/tests-e2e/src/connect/scenarios/login.spec.ts index ae4c2c69e..104413850 100644 --- a/packages/tests-e2e/src/connect/scenarios/login.spec.ts +++ b/packages/tests-e2e/src/connect/scenarios/login.spec.ts @@ -15,7 +15,7 @@ test.describe('login component (without invitation token)', () => { await model.expectScreen(ScreenNames.MFA); await model.mfa.autofillTOTP(); - await model.mfa.submit(); + await model.mfa.submit(false, false); await model.expectScreen(ScreenNames.Home); }); }); @@ -35,9 +35,7 @@ test.describe('login component (with invitation token, without passkeys)', () => await model.expectScreen(ScreenNames.MFA); await model.mfa.autofillTOTP(); - // await model.mfa.submit(); - // await model.expectScreen(ScreenNames.PasskeyAppend); - await model.mfa.autoAppendPasskey(false); + await model.mfa.submit(true, false); await model.append.skipAppend(); await model.expectScreen(ScreenNames.Home); diff --git a/packages/tests-e2e/src/connect/scenarios/misc.spec.ts b/packages/tests-e2e/src/connect/scenarios/misc.spec.ts index c63c01465..001cff981 100644 --- a/packages/tests-e2e/src/connect/scenarios/misc.spec.ts +++ b/packages/tests-e2e/src/connect/scenarios/misc.spec.ts @@ -38,8 +38,7 @@ test.describe.serial('webhook tests', () => { setupWebhooks(test, [WebhookTypes.Create]); test('successful passkey append on login (+ webhook)', async ({ model }) => { - // await model.append.appendPasskey(true); - await model.mfa.autoAppendPasskey(true); + await model.mfa.submit(true, true); await model.expectScreen(ScreenNames.PasskeyAppended); await model.append.confirmAppended(); From c5346d2a75d2dcf17be499ec68b01a9d08ef7869 Mon Sep 17 00:00:00 2001 From: aehnh Date: Wed, 4 Jun 2025 12:13:32 +0200 Subject: [PATCH 11/11] prettier --- packages/tests-e2e/src/connect/models/SignupModel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tests-e2e/src/connect/models/SignupModel.ts b/packages/tests-e2e/src/connect/models/SignupModel.ts index c1de3a931..852d34993 100644 --- a/packages/tests-e2e/src/connect/models/SignupModel.ts +++ b/packages/tests-e2e/src/connect/models/SignupModel.ts @@ -4,7 +4,7 @@ import type { AppendModel } from './AppendModel'; export class SignupModel { page: Page; - append: AppendModel + append: AppendModel; constructor(page: Page, append: AppendModel) { this.page = page;