Skip to content

Commit 29f32bc

Browse files
author
Anders
authored
change tests to handle auto append (#535)
* change tests to handle auto append * prettier * remove comment * change test env to macos for autoappend support * run only tests on macos github runners * remove unnecessary xmllint installation (apparently builtin on macos) * remove useless package installation * fix UA to show the right version for javascript high entropy * prettier * refactor append-related operations into append model * prettier
1 parent 63eec49 commit 29f32bc

File tree

10 files changed

+59
-30
lines changed

10 files changed

+59
-30
lines changed

.github/workflows/deploy-playground-and-test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ jobs:
103103
test:
104104
needs: deploy
105105
timeout-minutes: 60
106-
runs-on: ubuntu-latest
106+
runs-on: ubuntu-24.04
107107

108108
steps:
109109
- name: Checkout code

packages/tests-e2e/playwright.config.connect.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ export default defineConfig({
4444
timeout: operationTimeout, // default: 5000ms
4545
},
4646
use: {
47+
userAgent:
48+
'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',
4749
actionTimeout: operationTimeout, // default: none
4850
navigationTimeout: operationTimeout, // default: none
4951
baseURL: process.env.PLAYWRIGHT_TEST_URL,

packages/tests-e2e/src/connect/models/AppendModel.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { Page } from '@playwright/test';
22

3-
import { ErrorTexts } from '../utils/Constants';
4-
import { expectError } from '../utils/ExpectScreen';
3+
import { ErrorTexts, ScreenNames } from '../utils/Constants';
4+
import { expectError, expectScreen } from '../utils/ExpectScreen';
55
import type { VirtualAuthenticator } from '../utils/VirtualAuthenticator';
66

77
export class AppendModel {
@@ -24,6 +24,17 @@ export class AppendModel {
2424
}
2525
}
2626

27+
autoAppendPasskey(complete: boolean, operationTrigger: () => Promise<void>) {
28+
if (complete) {
29+
return this.authenticator.startAndCompletePasskeyOperation(operationTrigger);
30+
} else {
31+
return this.authenticator.startAndCancelPasskeyOperation(operationTrigger, async () => {
32+
await expectScreen(this.page, ScreenNames.PasskeyAppend);
33+
await this.page.waitForSelector('.button-loading-container', { state: 'detached' });
34+
});
35+
}
36+
}
37+
2738
confirmAppended() {
2839
return this.page.getByRole('button', { name: 'Continue' }).click();
2940
}

packages/tests-e2e/src/connect/models/BaseModel.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@ export class BaseModel {
3232
this.page = page;
3333
this.authenticator = authenticator;
3434
this.blocker = blocker;
35-
this.signup = new SignupModel(page);
3635
this.login = new LoginModel(page, authenticator);
3736
this.append = new AppendModel(page, authenticator);
37+
this.signup = new SignupModel(page, this.append);
38+
this.mfa = new MFAModel(page, this.append);
3839
this.home = new HomeModel(page);
3940
this.passkeyList = new PasskeyListModel(page, authenticator);
4041
this.webhook = new WebhookModel(page);
4142
this.storage = new StorageModel(page);
42-
this.mfa = new MFAModel(page);
4343
}
4444

4545
loadSignup() {
@@ -64,15 +64,14 @@ export class BaseModel {
6464

6565
async createUser(invited: boolean, append: boolean) {
6666
this.email = await this.signup.autofillCredentials();
67-
await this.signup.submit();
67+
await this.signup.submit(invited, append);
6868
this.mfa.registerTokenUsed();
6969
if (invited) {
70-
await this.expectScreen(ScreenNames.PasskeyAppend);
7170
if (append) {
72-
await this.append.appendPasskey(true);
7371
await this.expectScreen(ScreenNames.PasskeyAppended);
7472
await this.append.confirmAppended();
7573
} else {
74+
await this.expectScreen(ScreenNames.PasskeyAppend);
7675
await this.append.skipAppend();
7776
}
7877
}

packages/tests-e2e/src/connect/models/MFAModel.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
import type { Page } from '@playwright/test';
22
import { expect } from '@playwright/test';
33

4+
import type { AppendModel } from './AppendModel';
5+
46
export class MFAModel {
57
page: Page;
8+
append: AppendModel;
69
timestamp: number;
710

8-
constructor(page: Page) {
11+
constructor(page: Page, append: AppendModel) {
912
this.page = page;
13+
this.append = append;
1014
this.timestamp = Date.now();
1115
}
1216

@@ -21,7 +25,12 @@ export class MFAModel {
2125
this.registerTokenUsed();
2226
}
2327

24-
submit() {
25-
return this.page.getByRole('button', { name: 'Submit' }).click();
28+
submit(invited: boolean, autoAppend: boolean) {
29+
if (invited) {
30+
const operationTrigger = () => this.page.getByRole('button', { name: 'Submit' }).click();
31+
return this.append.autoAppendPasskey(autoAppend, operationTrigger);
32+
} else {
33+
return this.page.getByRole('button', { name: 'Submit' }).click();
34+
}
2635
}
2736
}
Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,27 @@
11
import type { Page } from '@playwright/test';
22

3+
import type { AppendModel } from './AppendModel';
4+
35
export class SignupModel {
46
page: Page;
7+
append: AppendModel;
58

6-
constructor(page: Page) {
9+
constructor(page: Page, append: AppendModel) {
710
this.page = page;
11+
this.append = append;
812
}
913

1014
async autofillCredentials(): Promise<string> {
1115
await this.page.getByRole('button', { name: 'auto' }).click();
1216
return await this.page.getByPlaceholder('Email').inputValue();
1317
}
1418

15-
submit() {
16-
return this.page.getByRole('button', { name: 'Sign up' }).click();
19+
submit(invited: boolean, autoAppend: boolean) {
20+
if (invited) {
21+
const operationTrigger = () => this.page.getByRole('button', { name: 'Sign up' }).click();
22+
return this.append.autoAppendPasskey(autoAppend, operationTrigger);
23+
} else {
24+
return this.page.getByRole('button', { name: 'Sign up' }).click();
25+
}
1726
}
1827
}

packages/tests-e2e/src/connect/scenarios/append.spec.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,30 @@ import { expect } from '@playwright/test';
22

33
import { test } from '../fixtures/BaseTest';
44
import { password, ScreenNames } from '../utils/Constants';
5-
import { loadPasskeyAppend, setupNetworkBlocker, setupUser, setupVirtualAuthenticator } from './hooks';
5+
import { loadBeforePasskeyAppend, setupNetworkBlocker, setupUser, setupVirtualAuthenticator } from './hooks';
66

77
test.describe('append component', () => {
88
setupVirtualAuthenticator(test);
99
setupNetworkBlocker(test);
1010
setupUser(test, true, false);
11-
loadPasskeyAppend(test);
11+
loadBeforePasskeyAppend(test);
1212

1313
test('successful passkey append on login', async ({ model }) => {
14-
await model.append.appendPasskey(true);
14+
await model.mfa.submit(true, true);
1515
await model.expectScreen(ScreenNames.PasskeyAppended);
1616

1717
await model.append.confirmAppended();
1818
await model.expectScreen(ScreenNames.Home);
1919
});
2020

2121
test('failed passkey append on login', async ({ model }) => {
22-
await model.append.appendPasskey(false);
22+
await model.mfa.submit(true, false);
2323
});
2424

2525
test('Corbado FAPI unavailable after authentication', async ({ model }) => {
2626
await model.blocker.blockCorbadoFAPIFinishEndpoint();
2727

28-
await model.append.appendPasskey(true);
28+
await model.mfa.submit(true, true);
2929
await model.expectScreen(ScreenNames.Home);
3030
});
3131
});
@@ -48,7 +48,7 @@ test.describe('skip append component', () => {
4848
await model.expectScreen(ScreenNames.MFA);
4949

5050
await model.mfa.autofillTOTP();
51-
await model.mfa.submit();
51+
await model.mfa.submit(false, false);
5252

5353
await model.expectScreen(ScreenNames.Home);
5454
});
@@ -67,7 +67,7 @@ test.describe('skip append component', () => {
6767
await model.expectScreen(ScreenNames.MFA);
6868

6969
await model.mfa.autofillTOTP();
70-
await model.mfa.submit();
70+
await model.mfa.submit(false, false);
7171
await model.expectScreen(ScreenNames.Home);
7272
});
7373
});

packages/tests-e2e/src/connect/scenarios/hooks.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ export function setupUser(
8383
}
8484

8585
// assumes that setupUser(test, true, false) has been called right before
86-
export function loadPasskeyAppend(
86+
export function loadBeforePasskeyAppend(
8787
test: TestType<
8888
PlaywrightTestArgs & PlaywrightTestOptions & { model: BaseModel },
8989
PlaywrightWorkerArgs & PlaywrightWorkerOptions
@@ -100,8 +100,8 @@ export function loadPasskeyAppend(
100100
await model.expectScreen(ScreenNames.MFA);
101101

102102
await model.mfa.autofillTOTP();
103-
await model.mfa.submit();
104-
await model.expectScreen(ScreenNames.PasskeyAppend);
103+
// await model.mfa.submit();
104+
// await model.expectScreen(ScreenNames.PasskeyAppend);
105105
});
106106
}
107107

packages/tests-e2e/src/connect/scenarios/login.spec.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ test.describe('login component (without invitation token)', () => {
1515
await model.expectScreen(ScreenNames.MFA);
1616

1717
await model.mfa.autofillTOTP();
18-
await model.mfa.submit();
18+
await model.mfa.submit(false, false);
1919
await model.expectScreen(ScreenNames.Home);
2020
});
2121
});
@@ -35,8 +35,7 @@ test.describe('login component (with invitation token, without passkeys)', () =>
3535
await model.expectScreen(ScreenNames.MFA);
3636

3737
await model.mfa.autofillTOTP();
38-
await model.mfa.submit();
39-
await model.expectScreen(ScreenNames.PasskeyAppend);
38+
await model.mfa.submit(true, false);
4039

4140
await model.append.skipAppend();
4241
await model.expectScreen(ScreenNames.Home);

packages/tests-e2e/src/connect/scenarios/misc.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { test } from '../fixtures/BaseTest';
22
import { ScreenNames, WebhookTypes } from '../utils/Constants';
33
import {
4-
loadPasskeyAppend,
4+
loadBeforePasskeyAppend,
55
loadPasskeyList,
66
setupNetworkBlocker,
77
setupUser,
@@ -34,11 +34,11 @@ test.describe.serial('webhook tests', () => {
3434
setupVirtualAuthenticator(test);
3535
setupNetworkBlocker(test);
3636
setupUser(test, true, false);
37-
loadPasskeyAppend(test);
37+
loadBeforePasskeyAppend(test);
3838
setupWebhooks(test, [WebhookTypes.Create]);
3939

4040
test('successful passkey append on login (+ webhook)', async ({ model }) => {
41-
await model.append.appendPasskey(true);
41+
await model.mfa.submit(true, true);
4242
await model.expectScreen(ScreenNames.PasskeyAppended);
4343

4444
await model.append.confirmAppended();

0 commit comments

Comments
 (0)