Skip to content

Commit 036f495

Browse files
committed
feat(davinci-client): support prefilled phone field
1 parent 7176dd5 commit 036f495

File tree

9 files changed

+295
-126
lines changed

9 files changed

+295
-126
lines changed

.changeset/shiny-crabs-wish.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@forgerock/davinci-client': minor
3+
---
4+
5+
Added support for pre-filled phone number and country code

e2e/davinci-app/components/object-value.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,10 @@ export default function objectValueComponent(
8181
return;
8282
}
8383

84-
updater({ phoneNumber: selectedValue, countryCode: collector.input.value.countryCode });
84+
updater({
85+
phoneNumber: selectedValue,
86+
countryCode: collector.output.value?.countryCode || '',
87+
});
8588
});
8689

8790
formEl.appendChild(phoneLabel);

e2e/davinci-suites/src/form-fields.test.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@ import { expect, test } from '@playwright/test';
88

99
import { asyncEvents } from './utils/async-events.js';
1010

11-
// This test is failing due to a new phone number feature flag for pre-filling country codes.
12-
// A fix will be addressed in https://pingidentity.atlassian.net/browse/SDKS-4200
13-
test.skip('Should render form fields', async ({ page }) => {
11+
test('Should render form fields', async ({ page }) => {
1412
const { navigate } = asyncEvents(page);
1513
await navigate('/?clientId=60de77d5-dd2c-41ef-8c40-f8bb2381a359');
1614

@@ -33,6 +31,8 @@ test.skip('Should render form fields', async ({ page }) => {
3331
await page.locator('#combobox-field-key-3').check();
3432
await page.locator('#combobox-field-key-2').uncheck();
3533

34+
await page.locator('#phone-number-input').fill('1234567890');
35+
3636
await expect(page.getByRole('button', { name: 'Flow Button' })).toBeVisible();
3737
await expect(page.getByRole('button', { name: 'Flow Link' })).toBeVisible();
3838

@@ -52,6 +52,10 @@ test.skip('Should render form fields', async ({ page }) => {
5252
'dropdown-field-key': 'dropdown-option2-value',
5353
'radio-group-key': 'option2 value',
5454
'combobox-field-key': ['option1 value', 'option3 value'],
55+
'phone-field': {
56+
phoneNumber: '1234567890',
57+
countryCode: 'GB',
58+
},
5559
});
5660
});
5761

e2e/davinci-suites/src/phone-number-field.test.ts

Lines changed: 94 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -7,115 +7,106 @@
77
import { expect, test } from '@playwright/test';
88
import { password } from './utils/demo-user.js';
99

10-
test('Login - add email device - authenticate with email device', async ({ page }) => {
11-
/** Go to page */
12-
await page.goto('/?clientId=20dd0ed0-bb9b-4c8f-9a60-9ebeb4b348e0');
10+
test.describe('Device registration tests', () => {
11+
const username = '[email protected]';
1312

14-
expect(page.url()).toContain(
15-
'http://localhost:5829/?clientId=20dd0ed0-bb9b-4c8f-9a60-9ebeb4b348e',
16-
);
17-
/**
18-
* Register a new user
19-
*/
20-
await page.goto('http://localhost:5829/?clientId=20dd0ed0-bb9b-4c8f-9a60-9ebeb4b348e0');
21-
await expect(page.getByRole('button', { name: 'USER_REGISTRATION' })).toBeVisible();
22-
await page.getByRole('button', { name: 'USER_REGISTRATION' }).click();
23-
await page.getByRole('textbox', { name: 'Email' }).click();
24-
await page.getByRole('textbox', { name: 'Email' }).fill('[email protected]');
25-
await page.getByRole('textbox', { name: 'Password' }).fill('U.QPDWEN47ZMyJhCDmhGLK*nr');
26-
await page.getByRole('textbox', { name: 'Given Name' }).fill('demouser');
27-
await page.getByRole('textbox', { name: 'Family Name' }).fill('demouser');
28-
expect(await page.getByRole('button', { name: 'Continue' })).toBeVisible();
29-
await page.getByRole('button', { name: 'Continue' }).click();
30-
await expect(page.getByRole('heading', { name: 'Registration Complete' })).toBeVisible();
31-
await page.getByRole('button').click();
32-
await page.getByRole('button', { name: 'Logout' }).click();
33-
/***
34-
* Login with the new user
35-
**/
36-
await page.goto('http://localhost:5829/?clientId=20dd0ed0-bb9b-4c8f-9a60-9ebeb4b348e0');
37-
await page.getByRole('button', { name: 'USER_LOGIN' }).click();
38-
await page.getByText('SDK Automation - Sign On');
39-
await page.getByRole('textbox', { name: 'Username' }).fill('[email protected]');
40-
await page.getByRole('textbox', { name: 'Password' }).fill(password);
41-
await page.getByRole('button', { name: 'Sign On' }).click();
13+
test.afterEach(async ({ page }) => {
14+
await page.goto('/?clientId=20dd0ed0-bb9b-4c8f-9a60-9ebeb4b348e0');
4215

43-
/** Register a device */
44-
await page.getByText('Select Test Form');
45-
await page.getByRole('button', { name: 'DEVICE_REGISTRATION' }).click();
46-
await page.getByText('SDK Automation - Device Registration');
47-
await page.getByRole('button', { name: 'Email' }).click();
48-
await page.getByText('SDK Automation - Device Registration');
49-
await page.getByRole('textbox', { name: 'Email Address' }).fill('[email protected]');
50-
await page.getByRole('button', { name: 'Submit' }).click();
51-
await expect(page.getByText('EMAIL MFA Registered')).toBeVisible();
52-
await page.getByRole('button').click();
16+
await page.getByRole('button', { name: 'USER_LOGIN' }).click();
17+
await page.getByRole('textbox', { name: 'Username' }).fill(username);
18+
await page.getByRole('textbox', { name: 'Password' }).fill(password);
19+
await page.getByRole('button', { name: 'Sign On' }).click();
5320

54-
/** Authenticate with the Device */
55-
await page.getByRole('button', { name: 'DEVICE_AUTHENTICATION' }).click();
56-
await page.getByText('SDK Automation - Device Authentication');
57-
await page.getByRole('button', { name: 'Email' }).click();
58-
await page.getByRole('button', { name: 'USER_DELETE' }).click();
59-
await page.getByRole('heading', { name: 'Success' });
60-
await page.getByRole('button', { name: 'Start over' }).click();
61-
});
21+
await page.getByRole('button', { name: 'USER_DELETE' }).click();
22+
await expect(page.getByRole('heading', { name: 'Success' })).toBeVisible();
23+
});
24+
25+
test('Login - add email device - authenticate with email device', async ({ page }) => {
26+
/** Go to page */
27+
await page.goto('/?clientId=20dd0ed0-bb9b-4c8f-9a60-9ebeb4b348e0');
28+
29+
expect(page.url()).toContain(
30+
'http://localhost:5829/?clientId=20dd0ed0-bb9b-4c8f-9a60-9ebeb4b348e',
31+
);
32+
await expect(page.getByText('Select Test Form')).toBeVisible();
33+
34+
/**
35+
* Register a new user
36+
*/
37+
await page.getByRole('button', { name: 'USER_REGISTRATION' }).click();
38+
await page.getByRole('textbox', { name: 'Email' }).fill(username);
39+
await page.getByRole('textbox', { name: 'Password' }).fill(password);
40+
await page.getByRole('textbox', { name: 'Given Name' }).fill('demouser');
41+
await page.getByRole('textbox', { name: 'Family Name' }).fill('demouser');
42+
await page.getByRole('button', { name: 'Continue' }).click();
43+
await expect(page.getByRole('heading', { name: 'Registration Complete' })).toBeVisible();
44+
await page.getByRole('button', { name: 'Continue' }).click();
45+
await page.getByRole('button', { name: 'Logout' }).click();
46+
47+
/***
48+
* Login with the new user
49+
**/
50+
await page.goto('/?clientId=20dd0ed0-bb9b-4c8f-9a60-9ebeb4b348e0');
51+
await page.getByRole('button', { name: 'USER_LOGIN' }).click();
52+
await expect(page.getByText('SDK Automation - Sign On')).toBeVisible();
53+
await page.getByRole('textbox', { name: 'Username' }).fill(username);
54+
await page.getByRole('textbox', { name: 'Password' }).fill(password);
55+
await page.getByRole('button', { name: 'Sign On' }).click();
6256

63-
// This test is failing due to a new phone number feature flag for pre-filling country codes.
64-
// A fix will be addressed in https://pingidentity.atlassian.net/browse/SDKS-4200
65-
test.skip('Login - add phone device - authenticate with phone device', async ({ page }) => {
66-
await page.goto('/?clientId=20dd0ed0-bb9b-4c8f-9a60-9ebeb4b348e0');
67-
/***
68-
* Go to page
69-
***/
70-
expect(page.url()).toContain(
71-
'http://localhost:5829/?clientId=20dd0ed0-bb9b-4c8f-9a60-9ebeb4b348e0',
72-
);
57+
/** Register a device */
58+
await expect(page.getByText('Select Test Form')).toBeVisible();
59+
await page.getByRole('button', { name: 'DEVICE_REGISTRATION' }).click();
60+
await expect(page.getByText('SDK Automation - Device Registration')).toBeVisible();
61+
await page.getByRole('button', { name: 'Email' }).click();
62+
await page
63+
.getByRole('textbox', { name: 'Email Address' })
64+
65+
await page.getByRole('button', { name: 'Submit' }).click();
66+
await expect(page.getByText('EMAIL MFA Registered')).toBeVisible();
67+
await page.getByRole('button', { name: 'Continue' }).click();
68+
});
7369

74-
/**
75-
* Register a new user
76-
**/
77-
await page.goto('http://localhost:5829/?clientId=20dd0ed0-bb9b-4c8f-9a60-9ebeb4b348e0');
78-
await expect(page.getByRole('button', { name: 'USER_REGISTRATION' })).toBeVisible();
79-
await page.getByRole('button', { name: 'USER_REGISTRATION' }).click();
80-
await page.getByRole('textbox', { name: 'Email' }).click();
81-
await page.getByRole('textbox', { name: 'Email' }).fill('[email protected]');
82-
await page.getByRole('textbox', { name: 'Password' }).fill('U.QPDWEN47ZMyJhCDmhGLK*nr');
83-
await page.getByRole('textbox', { name: 'Given Name' }).fill('demouser');
84-
await page.getByRole('textbox', { name: 'Family Name' }).fill('demouser');
85-
expect(await page.getByRole('button', { name: 'Continue' })).toBeVisible();
86-
await page.getByRole('button', { name: 'Continue' }).click();
87-
await expect(page.getByRole('heading', { name: 'Registration Complete' })).toBeVisible();
88-
await page.getByRole('button').click();
89-
await page.getByRole('button', { name: 'Logout' }).click();
90-
await page.goto('http://localhost:5829/?clientId=20dd0ed0-bb9b-4c8f-9a60-9ebeb4b348e0');
70+
test('Login - add phone device - authenticate with phone device', async ({ page }) => {
71+
/** Go to page */
72+
await page.goto('/?clientId=20dd0ed0-bb9b-4c8f-9a60-9ebeb4b348e0');
73+
expect(page.url()).toContain(
74+
'http://localhost:5829/?clientId=20dd0ed0-bb9b-4c8f-9a60-9ebeb4b348e0',
75+
);
9176

92-
/**
93-
* Login with the new user
94-
**/
95-
await page.getByRole('button', { name: 'USER_LOGIN' }).click();
96-
await page.getByText('SDK Automation - Sign On');
97-
await page.getByRole('textbox', { name: 'Username' }).fill('[email protected]');
98-
await page.getByRole('textbox', { name: 'Password' }).fill(password);
99-
await page.getByRole('button', { name: 'Sign On' }).click();
77+
/**
78+
* Register a new user
79+
**/
80+
await expect(page.getByText('Select Test Form')).toBeVisible();
81+
await page.getByRole('button', { name: 'USER_REGISTRATION' }).click();
82+
await page.getByRole('textbox', { name: 'Email' }).fill(username);
83+
await page.getByRole('textbox', { name: 'Password' }).fill(password);
84+
await page.getByRole('textbox', { name: 'Given Name' }).fill('demouser');
85+
await page.getByRole('textbox', { name: 'Family Name' }).fill('demouser');
86+
await page.getByRole('button', { name: 'Continue' }).click();
87+
await expect(page.getByRole('heading', { name: 'Registration Complete' })).toBeVisible();
88+
await page.getByRole('button', { name: 'Continue' }).click();
89+
await page.getByRole('button', { name: 'Logout' }).click();
10090

101-
/** Register a Device */
102-
await page.getByText('Select Test Form');
103-
await page.getByRole('button', { name: 'DEVICE_REGISTRATION' }).click();
104-
await page.getByText('SDK Automation - Device Registration');
105-
await page.getByRole('button', { name: 'Text Message' }).click();
106-
await expect(page.getByText('SDK Automation - Enter Phone Number')).toBeVisible();
107-
await expect(page.locator('#countryCode')).toBeVisible();
108-
await page.locator('#countryCode').selectOption('1');
109-
await page.getByRole('textbox', { name: 'Enter Phone Number' }).fill('3035550100');
110-
await page.getByRole('button', { name: 'Submit' }).click();
111-
await expect(page.getByText('SMS/Voice MFA Registered')).toBeVisible();
112-
await page.getByRole('button').click();
91+
/**
92+
* Login with the new user
93+
**/
94+
await page.goto('/?clientId=20dd0ed0-bb9b-4c8f-9a60-9ebeb4b348e0');
95+
await page.getByRole('button', { name: 'USER_LOGIN' }).click();
96+
await expect(page.getByText('SDK Automation - Sign On')).toBeVisible();
97+
await page.getByRole('textbox', { name: 'Username' }).fill(username);
98+
await page.getByRole('textbox', { name: 'Password' }).fill(password);
99+
await page.getByRole('button', { name: 'Sign On' }).click();
113100

114-
/** Authenticate with the Device */
115-
await page.getByRole('button', { name: 'DEVICE_AUTHENTICATION' }).click();
116-
await page.getByText('SDK Automation - Device Authentication');
117-
await page.getByRole('button', { name: 'Text Message' }).click();
118-
await page.getByRole('button', { name: 'USER_DELETE' }).click();
119-
await page.getByRole('heading', { name: 'Success' });
120-
await page.getByRole('button', { name: 'Start over' }).click();
101+
/** Register a Device */
102+
await expect(page.getByText('Select Test Form')).toBeVisible();
103+
await page.getByRole('button', { name: 'DEVICE_REGISTRATION' }).click();
104+
await expect(page.getByText('SDK Automation - Device Registration')).toBeVisible();
105+
await page.getByRole('button', { name: 'Text Message' }).click();
106+
await expect(page.getByText('SDK Automation - Enter Phone Number')).toBeVisible();
107+
await page.getByRole('textbox', { name: 'Enter Phone Number' }).fill('3035550100');
108+
await page.getByRole('button', { name: 'Submit' }).click();
109+
await expect(page.getByText('SMS/Voice MFA Registered')).toBeVisible();
110+
await page.getByRole('button', { name: 'Continue' }).click();
111+
});
121112
});

packages/davinci-client/src/lib/collector.types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ export interface PhoneNumberInputValue {
290290
phoneNumber: string;
291291
}
292292

293-
interface PhoneNumberOutputValue {
293+
export interface PhoneNumberOutputValue {
294294
countryCode?: string;
295295
phoneNumber?: string;
296296
}

0 commit comments

Comments
 (0)