11import { faker } from '@faker-js/faker'
2- import { type CDPSession } from '@playwright/test'
32import { expect , test } from '#tests/playwright-utils.ts'
43
54async function setupWebAuthn ( page : any ) {
@@ -19,42 +18,6 @@ async function setupWebAuthn(page: any) {
1918 return { client, authenticatorId : result . authenticatorId }
2019}
2120
22- async function waitOnce (
23- client : CDPSession ,
24- event : Parameters < CDPSession [ 'once' ] > [ 0 ] ,
25- ) {
26- let resolve : ( ) => void
27- client . once ( event , ( ) => resolve ( ) )
28- return new Promise < void > ( ( r ) => {
29- resolve = r
30- } )
31- }
32-
33- async function simulateSuccessfulPasskeyInput (
34- client : CDPSession ,
35- operationTrigger : ( ) => Promise < void > ,
36- ) {
37- // initialize event listeners to wait for a successful passkey input event
38- let resolve : ( ) => void
39- const credentialAddedHandler = ( ) => resolve ( )
40- const credentialAssertedHandler = ( ) => resolve ( )
41- const operationCompleted = new Promise < void > ( ( r ) => {
42- resolve = r
43- client . on ( 'WebAuthn.credentialAdded' , credentialAddedHandler )
44- client . on ( 'WebAuthn.credentialAsserted' , credentialAssertedHandler )
45- } )
46-
47- // perform a user action that triggers passkey prompt
48- await operationTrigger ( )
49-
50- // wait to receive the event that the passkey was successfully registered or verified
51- await operationCompleted
52-
53- // clean up event listeners
54- client . off ( 'WebAuthn.credentialAdded' , credentialAddedHandler )
55- client . off ( 'WebAuthn.credentialAsserted' , credentialAssertedHandler )
56- }
57-
5821test ( 'Users can register and use passkeys' , async ( { page, login } ) => {
5922 const user = await login ( )
6023
@@ -70,7 +33,9 @@ test('Users can register and use passkeys', async ({ page, login }) => {
7033
7134 await page . goto ( '/settings/profile/passkeys' )
7235
73- const passkeyRegisteredPromise = waitOnce ( client , 'WebAuthn.credentialAdded' )
36+ const passkeyRegisteredPromise = new Promise < void > ( ( resolve ) => {
37+ client . once ( 'WebAuthn.credentialAdded' , ( ) => resolve ( ) )
38+ } )
7439 await page . getByRole ( 'button' , { name : / r e g i s t e r n e w p a s s k e y / i } ) . click ( )
7540 await passkeyRegisteredPromise
7641
@@ -96,7 +61,9 @@ test('Users can register and use passkeys', async ({ page, login }) => {
9661 await page . goto ( '/login' )
9762 const signCount1 = afterRegistrationCredentials . credentials [ 0 ] . signCount
9863
99- const passkeyAssertedPromise = waitOnce ( client , 'WebAuthn.credentialAsserted' )
64+ const passkeyAssertedPromise = new Promise < void > ( ( resolve ) => {
65+ client . once ( 'WebAuthn.credentialAsserted' , ( ) => resolve ( ) )
66+ } )
10067
10168 await page . getByRole ( 'button' , { name : / l o g i n w i t h a p a s s k e y / i } ) . click ( )
10269
@@ -143,10 +110,14 @@ test('Users can register and use passkeys', async ({ page, login }) => {
143110
144111 // Try logging in with the deleted passkey
145112 await page . goto ( '/login' )
146- await simulateSuccessfulPasskeyInput ( client , async ( ) => {
147- await page . getByRole ( 'button ', { name : / l o g i n w i t h a p a s s k e y / i } ) . click ( )
113+ const deletedPasskeyAssertedPromise = new Promise < void > ( ( resolve ) => {
114+ client . once ( 'WebAuthn.credentialAsserted ', ( ) => resolve ( ) )
148115 } )
149116
117+ await page . getByRole ( 'button' , { name : / l o g i n w i t h a p a s s k e y / i } ) . click ( )
118+
119+ await deletedPasskeyAssertedPromise
120+
150121 // Verify error message appears
151122 await expect ( page . getByText ( / p a s s k e y n o t f o u n d / i) ) . toBeVisible ( )
152123
@@ -157,11 +128,7 @@ test('Users can register and use passkeys', async ({ page, login }) => {
157128test ( 'Failed passkey verification shows error' , async ( { page, login } ) => {
158129 const password = faker . internet . password ( )
159130 await login ( { password } )
160-
161- // Set up WebAuthn
162131 const { client, authenticatorId } = await setupWebAuthn ( page )
163-
164- // Navigate to passkeys page
165132 await page . goto ( '/settings/profile/passkeys' )
166133
167134 // Try to register with failed verification
0 commit comments