Skip to content

Commit 218548a

Browse files
committed
Rebalance conference suites across SET_7 SET_8 SET_9
1 parent d692b70 commit 218548a

10 files changed

Lines changed: 190 additions & 79 deletions

ai-docs/templates/playwright/00-master.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ From `playwright/test-data.ts`:
4444
- `SET_5` -> `advanced-task-controls-tests.spec.ts`
4545
- `SET_6` -> `dial-number-tests.spec.ts`
4646
- `SET_7` -> `conference-mpc-transfer-tests.spec.ts`
47-
- `SET_8` -> `conference-switch-tests.spec.ts`
47+
- `SET_8` -> `conference-transfer-tests.spec.ts`
48+
- `SET_9` -> `conference-switch-tests.spec.ts`
4849

4950
---
5051

playwright/ai-docs/AGENTS.md

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,14 @@ From `playwright/test-data.ts`:
5656
- `SET_5` -> `advanced-task-controls-tests.spec.ts`
5757
- `SET_6` -> `dial-number-tests.spec.ts`
5858
- `SET_7` -> `conference-mpc-transfer-tests.spec.ts`
59-
- `SET_8` -> `conference-switch-tests.spec.ts`
59+
- `SET_8` -> `conference-transfer-tests.spec.ts`
60+
- `SET_9` -> `conference-switch-tests.spec.ts`
61+
62+
Conference case routing is balanced in the shared conference factory to reduce total wall-clock time:
63+
64+
- `SET_7`: `CTS-MPC-01..06`, `CTS-TC-01`, `CTS-SW-01..02`
65+
- `SET_8`: `CTS-MPC-07..11`, `CTS-TC-02..03`, `CTS-SW-03..04`
66+
- `SET_9`: `CTS-MPC-12..16`, `CTS-TC-04..05`, `CTS-SW-05`
6067

6168
---
6269

@@ -174,15 +181,15 @@ Common env keys used by the framework:
174181
- `PW_SANDBOX`
175182
- `PW_SANDBOX_PASSWORD`
176183
- `PW_CHAT_URL`
177-
- `PW_ENTRY_POINT1..PW_ENTRY_POINT8` (and additional as needed)
184+
- `PW_ENTRY_POINT1..PW_ENTRY_POINT9` (and additional as needed)
178185
- `PW_DIAL_NUMBER_LOGIN_USERNAME` / `PW_DIAL_NUMBER_LOGIN_PASSWORD` (dial-number flows)
179186
- `DIAL_NUMBER_LOGIN_ACCESS_TOKEN` (dial-number access token)
180187

181188
`playwright/global.setup.ts` expands set-scoped env keys and writes access tokens into `.env`.
182189

183190
OAuth setup now runs as multiple setup tests inside the `OAuth: Get Access Token` project:
184191

185-
- `OAuth for SET_1` ... `OAuth for SET_8`
192+
- `OAuth for SET_1` ... `OAuth for SET_9`
186193
- `OAuth for DIAL_NUMBER_LOGIN` (when dial credentials are present)
187194

188195
This split reduces timeout risk versus one monolithic token-setup test.
@@ -206,4 +213,4 @@ When Playwright behavior changes:
206213

207214
---
208215

209-
_Last Updated: 2026-02-23_
216+
_Last Updated: 2026-02-24_

playwright/ai-docs/ARCHITECTURE.md

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ playwright/
88
│ ├── advanced-task-controls-tests.spec.ts
99
│ ├── basic-advanced-task-controls-tests.spec.ts
1010
│ ├── conference-mpc-transfer-tests.spec.ts
11+
│ ├── conference-transfer-tests.spec.ts
1112
│ ├── conference-switch-tests.spec.ts
1213
│ ├── dial-number-tests.spec.ts
1314
│ ├── digital-incoming-task-tests.spec.ts
@@ -135,7 +136,7 @@ Page types are defined in `PAGE_TYPES` constant (see Constants section).
135136
- `<SET>_<AGENT>_ACCESS_TOKEN`
136137
- `DIAL_NUMBER_LOGIN_ACCESS_TOKEN` (if dial-number credentials are provided)
137138

138-
OAuth token acquisition is split into per-set setup tests under the `OAuth: Get Access Token` project (`OAuth for SET_1` ... `OAuth for SET_8`, plus dial-number setup when configured). These setup tests run in serial mode to avoid concurrent `.env` write races while giving each set its own timeout budget.
139+
OAuth token acquisition is split into per-set setup tests under the `OAuth: Get Access Token` project (`OAuth for SET_1` ... `OAuth for SET_9`, plus dial-number setup when configured). These setup tests run in serial mode to avoid concurrent `.env` write races while giving each set its own timeout budget. Within each set, agent token fetches run in parallel and then `.env` writes are serialized.
139140

140141
---
141142

@@ -194,9 +195,18 @@ Common anti-flake patterns in the current framework:
194195
Conference automation is implemented through:
195196

196197
- `playwright/suites/conference-mpc-transfer-tests.spec.ts` (SET_7)
197-
- `playwright/suites/conference-switch-tests.spec.ts` (SET_8)
198+
- `playwright/suites/conference-transfer-tests.spec.ts` (SET_8)
199+
- `playwright/suites/conference-switch-tests.spec.ts` (SET_9)
198200
- `playwright/tests/conference-transfer-switch-test.spec.ts`
199201

202+
Conference setup uses parallel desktop setup for Agent1-4 in `setupForConferenceDesktop` to reduce `beforeAll` startup time.
203+
204+
Conference scenarios are balanced across the three sets by case ID to keep suite durations closer:
205+
206+
- `SET_7`: `CTS-MPC-01..06`, `CTS-TC-01`, `CTS-SW-01..02`
207+
- `SET_8`: `CTS-MPC-07..11`, `CTS-TC-02..03`, `CTS-SW-03..04`
208+
- `SET_9`: `CTS-MPC-12..16`, `CTS-TC-04..05`, `CTS-SW-05`
209+
200210
Current documented scope includes:
201211

202212
- desktop-only conference flows
@@ -248,4 +258,4 @@ Tests should consume these helpers rather than re-implementing similar logic in
248258

249259
---
250260

251-
_Last Updated: 2026-02-23_
261+
_Last Updated: 2026-02-24_

playwright/global.setup.ts

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -83,21 +83,28 @@ export const UpdateENVWithUserSets = () => {
8383

8484
const setupAccessTokenForSet = async (browser: Browser, setKey: string) => {
8585
const userSet = USER_SETS[setKey];
86-
87-
for (const agentKey of Object.keys(userSet.AGENTS)) {
88-
const page = await browser.newPage();
89-
90-
// Construct the OAuth agent ID directly
91-
const oauthAgentId = `${userSet.AGENTS[agentKey].username}@${process.env.PW_SANDBOX}`;
92-
93-
await oauthLogin(page, oauthAgentId);
94-
95-
await page.getByRole('textbox').click();
96-
const accessToken = await page.getByRole('textbox').inputValue();
86+
const tokenResults = await Promise.all(
87+
Object.keys(userSet.AGENTS).map(async (agentKey) => {
88+
const page = await browser.newPage();
89+
try {
90+
// Construct the OAuth agent ID directly
91+
const oauthAgentId = `${userSet.AGENTS[agentKey].username}@${process.env.PW_SANDBOX}`;
92+
93+
await oauthLogin(page, oauthAgentId);
94+
await page.getByRole('textbox').click();
95+
const accessToken = await page.getByRole('textbox').inputValue();
96+
97+
return {agentKey, accessToken};
98+
} finally {
99+
await page.close();
100+
}
101+
})
102+
);
103+
104+
// Serialize .env writes to avoid race conditions.
105+
tokenResults.forEach(({agentKey, accessToken}) => {
97106
upsertEnvKey(`${setKey}_${agentKey}_ACCESS_TOKEN`, accessToken);
98-
99-
await page.close();
100-
}
107+
});
101108
};
102109

103110
setup.describe('OAuth', () => {
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {test} from '@playwright/test';
22
import createConferenceTransferSwitchTests from '../tests/conference-transfer-switch-test.spec';
33

4-
const createConferenceMpcTests = () => createConferenceTransferSwitchTests('mpc');
4+
const createConferenceBalancedSet7Tests = () => createConferenceTransferSwitchTests('balanced-set7');
55

6-
test.describe('Conference MPC Tests', createConferenceMpcTests);
6+
test.describe('Conference Balanced SET_7 Tests', createConferenceBalancedSet7Tests);
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {test} from '@playwright/test';
22
import createConferenceTransferSwitchTests from '../tests/conference-transfer-switch-test.spec';
33

4-
const createConferenceTransferAndSwitchTests = () => createConferenceTransferSwitchTests('transfer-switch');
4+
const createConferenceBalancedSet9Tests = () => createConferenceTransferSwitchTests('balanced-set9');
55

6-
test.describe('Conference Transfer and Switch Tests', createConferenceTransferAndSwitchTests);
6+
test.describe('Conference Balanced SET_9 Tests', createConferenceBalancedSet9Tests);
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import {test} from '@playwright/test';
2+
import createConferenceTransferSwitchTests from '../tests/conference-transfer-switch-test.spec';
3+
4+
const createConferenceBalancedSet8Tests = () => createConferenceTransferSwitchTests('balanced-set8');
5+
6+
test.describe('Conference Balanced SET_8 Tests', createConferenceBalancedSet8Tests);

playwright/test-data.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,19 @@ export const USER_SETS = {
9393
CHAT_URL: `${env.PW_CHAT_URL}-e2e-8.html`,
9494
EMAIL_ENTRY_POINT: `${env.PW_SANDBOX}.e2e8@gmail.com`,
9595
ENTRY_POINT: env.PW_ENTRY_POINT8,
96+
TEST_SUITE: 'conference-transfer-tests.spec.ts',
97+
},
98+
SET_9: {
99+
AGENTS: {
100+
AGENT1: {username: 'user33', extension: '1033', agentName: 'User33 Agent33'},
101+
AGENT2: {username: 'user34', extension: '1034', agentName: 'User34 Agent34'},
102+
AGENT3: {username: 'user35', extension: '1035', agentName: 'User35 Agent35'},
103+
AGENT4: {username: 'user36', extension: '1036', agentName: 'User36 Agent36'},
104+
},
105+
QUEUE_NAME: 'Queue e2e 9',
106+
CHAT_URL: `${env.PW_CHAT_URL}-e2e-9.html`,
107+
EMAIL_ENTRY_POINT: `${env.PW_SANDBOX}.e2e9@gmail.com`,
108+
ENTRY_POINT: env.PW_ENTRY_POINT9,
96109
TEST_SUITE: 'conference-switch-tests.spec.ts',
97110
},
98111
};

playwright/test-manager.ts

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -475,24 +475,25 @@ export class TestManager {
475475
this.setupPageConsoleLogging(this.agent3Page, true);
476476
this.setupPageConsoleLogging(this.agent4Page, true);
477477

478-
// Conference setup is sensitive to parallel telephony login contention.
479-
// Run agent setups sequentially with retries so one flaky login does not fail the whole beforeAll.
480-
await this.retryOperation(
481-
() => pageSetup(this.agent1Page, LOGIN_MODE.DESKTOP, tokens.agent1AccessToken),
482-
`${this.projectName} conference agent1 setup`
483-
);
484-
await this.retryOperation(
485-
() => pageSetup(this.agent2Page, LOGIN_MODE.DESKTOP, tokens.agent2AccessToken),
486-
`${this.projectName} conference agent2 setup`
487-
);
488-
await this.retryOperation(
489-
() => pageSetup(this.agent3Page, LOGIN_MODE.DESKTOP, tokens.agent3AccessToken),
490-
`${this.projectName} conference agent3 setup`
491-
);
492-
await this.retryOperation(
493-
() => pageSetup(this.agent4Page, LOGIN_MODE.DESKTOP, tokens.agent4AccessToken),
494-
`${this.projectName} conference agent4 setup`
495-
);
478+
// Run conference desktop agent setups in parallel to reduce startup time per suite.
479+
await Promise.all([
480+
this.retryOperation(
481+
() => pageSetup(this.agent1Page, LOGIN_MODE.DESKTOP, tokens.agent1AccessToken),
482+
`${this.projectName} conference agent1 setup`
483+
),
484+
this.retryOperation(
485+
() => pageSetup(this.agent2Page, LOGIN_MODE.DESKTOP, tokens.agent2AccessToken),
486+
`${this.projectName} conference agent2 setup`
487+
),
488+
this.retryOperation(
489+
() => pageSetup(this.agent3Page, LOGIN_MODE.DESKTOP, tokens.agent3AccessToken),
490+
`${this.projectName} conference agent3 setup`
491+
),
492+
this.retryOperation(
493+
() => pageSetup(this.agent4Page, LOGIN_MODE.DESKTOP, tokens.agent4AccessToken),
494+
`${this.projectName} conference agent4 setup`
495+
),
496+
]);
496497
await this.retryOperation(
497498
() => loginExtension(this.callerPage, tokens.agent4AccessToken),
498499
`${this.projectName} conference caller extension login`

0 commit comments

Comments
 (0)