Skip to content

Commit fa8e7f4

Browse files
authored
Migrate Light browser tests off lab state global (#1276)
* Migrate Light browser tests off lab state global * Wait for app view in Light environment tests
1 parent e38b134 commit fa8e7f4

7 files changed

Lines changed: 57 additions & 26 deletions

scripts/quality-baseline.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"viewRuntimeBridgeConsumers": 0,
77
"viewRuntimeBridgeLookups": 0,
88
"labStateAppFiles": 1,
9-
"labStateTestFiles": 18,
9+
"labStateTestFiles": 14,
1010
"largeJsFilesOver800Lines": 23,
1111
"maxJsFileLines": 1168
1212
}

tests/playwright/light-ai-analysis-coverage-batch.spec.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ test('sun and device session AI analysis covers contexts fingerprints and render
88
await page.goto('/app', { waitUntil: 'load' });
99

1010
const results = await page.evaluate(async ({ sunUrl, deviceUrl, apiUrl }) => {
11-
const [sun, device, api, aiVerdictRuntime] = await Promise.all([
11+
const [{ state }, sun, device, api, aiVerdictRuntime] = await Promise.all([
12+
import('/js/state.js'),
1213
import(sunUrl),
1314
import(deviceUrl),
1415
import(apiUrl),
1516
import('/js/ai-verdict-engine-runtime.js'),
1617
]);
17-
const state = window._labState;
1818
const outcomes = {};
1919
const saved = {
2020
importedData: JSON.parse(JSON.stringify(state.importedData || {})),
@@ -354,14 +354,14 @@ test('light environment AI analysis covers audit room screen and onboarding verd
354354
await page.goto('/app', { waitUntil: 'load' });
355355

356356
const results = await page.evaluate(async ({ auditUrl, roomUrl, screenUrl, onboardingUrl }) => {
357-
const [audit, roomAI, screenAI, onboarding, aiVerdictRuntime] = await Promise.all([
357+
const [{ state }, audit, roomAI, screenAI, onboarding, aiVerdictRuntime] = await Promise.all([
358+
import('/js/state.js'),
358359
import(auditUrl),
359360
import(roomUrl),
360361
import(screenUrl),
361362
import(onboardingUrl),
362363
import('/js/ai-verdict-engine-runtime.js'),
363364
]);
364-
const state = window._labState;
365365
const outcomes = {};
366366
const saved = {
367367
importedData: JSON.parse(JSON.stringify(state.importedData || {})),
@@ -633,13 +633,13 @@ test('light aggregate AI analysis covers channel burden and daily verdicts', asy
633633
await page.goto('/app', { waitUntil: 'load' });
634634

635635
const results = await page.evaluate(async ({ channelUrl, burdenUrl, todayUrl }) => {
636-
const [channelAI, burdenAI, todayAI, aiVerdictRuntime] = await Promise.all([
636+
const [{ state }, channelAI, burdenAI, todayAI, aiVerdictRuntime] = await Promise.all([
637+
import('/js/state.js'),
637638
import(channelUrl),
638639
import(burdenUrl),
639640
import(todayUrl),
640641
import('/js/ai-verdict-engine-runtime.js'),
641642
]);
642-
const state = window._labState;
643643
const outcomes = {};
644644
const saved = {
645645
importedData: JSON.parse(JSON.stringify(state.importedData || {})),

tests/playwright/light-coverage-batch-2.spec.js

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ test('light device setup covers preset pick custom form validation unit conversi
88
await page.goto('/app', { waitUntil: 'load' });
99

1010
const results = await page.evaluate(async ({ setupUrl }) => {
11-
const setup = await import(setupUrl);
12-
const state = window._labState;
11+
const [{ state }, setup] = await Promise.all([
12+
import('/js/state.js'),
13+
import(setupUrl),
14+
]);
1315
const outcomes = {};
1416
const calls = [];
1517
const saved = {
@@ -257,8 +259,10 @@ test('light channel view covers pills detail panels suggestions and light-page r
257259
await page.goto('/app', { waitUntil: 'load' });
258260

259261
const results = await page.evaluate(async ({ channelUrl }) => {
260-
const channel = await import(channelUrl);
261-
const state = window._labState;
262+
const [{ state }, channel] = await Promise.all([
263+
import('/js/state.js'),
264+
import(channelUrl),
265+
]);
262266
const outcomes = {};
263267
const calls = [];
264268
const host = document.createElement('section');
@@ -413,8 +417,10 @@ test('light tools AI analysis covers per-tool contexts fingerprints and inline s
413417
await page.goto('/app', { waitUntil: 'load' });
414418

415419
const results = await page.evaluate(async ({ analysisUrl }) => {
416-
const analysis = await import(analysisUrl);
417-
const state = window._labState;
420+
const [{ state }, analysis] = await Promise.all([
421+
import('/js/state.js'),
422+
import(analysisUrl),
423+
]);
418424
const outcomes = {};
419425
const saved = {
420426
importedData: JSON.parse(JSON.stringify(state.importedData || {})),

tests/playwright/light-env-browser-coverage.spec.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,17 @@ function expectAll(outcomes) {
1313
expect(failed).toEqual([]);
1414
}
1515

16+
async function waitForInitialView(page) {
17+
await page.waitForFunction(async () => {
18+
const { state } = await import('/js/state.js');
19+
return typeof state.currentView === 'string' && state.currentView.length > 0;
20+
});
21+
}
22+
1623
test('light environment browser coverage handles summary modal prompt and source helpers', async ({ page }) => {
1724
await page.addInitScript(seedCompletedTour);
1825
await page.goto('/app', { waitUntil: 'load' });
26+
await waitForInitialView(page);
1927

2028
const outcomes = await page.evaluate(async () => {
2129
const [{ state }, data, lightEnv] = await Promise.all([
@@ -203,6 +211,7 @@ test('light environment browser coverage handles summary modal prompt and source
203211
test('light environment browser coverage handles screens tools and confirm deletes', async ({ page }) => {
204212
await page.addInitScript(seedCompletedTour);
205213
await page.goto('/app', { waitUntil: 'load' });
214+
await waitForInitialView(page);
206215

207216
const outcomes = await page.evaluate(async () => {
208217
const [{ state }, data, lightEnv] = await Promise.all([

tests/playwright/light-page-view.spec.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ function moduleUrl(path) {
66

77
test('Light page view delegates session, link, channel, and prompt actions', async ({ page }) => {
88
await page.goto('/app', { waitUntil: 'load' });
9-
await page.waitForFunction(() => !!window._labState);
9+
await page.waitForFunction(async () => {
10+
const { state } = await import('/js/state.js');
11+
return !!state;
12+
});
1013

1114
const results = await page.evaluate(async () => {
1215
const { configureLightPageView, renderDashboardLightChannelPills, renderLightSessionLogActions } = await import('/js/light-page-view.js');

tests/playwright/light-sun-coverage-batch.spec.js

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ test('sun session UI covers list detail edit delete and past-session save paths'
88
await page.goto('/app', { waitUntil: 'load' });
99

1010
const results = await page.evaluate(async ({ sunSessionUiUrl }) => {
11-
const sunUI = await import(sunSessionUiUrl);
12-
const state = window._labState;
11+
const [{ state }, sunUI] = await Promise.all([
12+
import('/js/state.js'),
13+
import(sunSessionUiUrl),
14+
]);
1315
const outcomes = {};
1416
const originalView = state.currentView;
1517
let sessions = [
@@ -252,9 +254,11 @@ test('sun active session covers start dialog stop summary and live dose helpers'
252254
await page.goto('/app', { waitUntil: 'load' });
253255

254256
const results = await page.evaluate(async ({ activeUrl, sessionUiUrl }) => {
255-
const active = await import(activeUrl);
256-
const sunUI = await import(sessionUiUrl);
257-
const state = window._labState;
257+
const [{ state }, active, sunUI] = await Promise.all([
258+
import('/js/state.js'),
259+
import(activeUrl),
260+
import(sessionUiUrl),
261+
]);
258262
const outcomes = {};
259263
const originalImported = JSON.parse(JSON.stringify(state.importedData || {}));
260264
let sessions = [{
@@ -789,12 +793,21 @@ test('light devices cover session detail edit log active card and rendered list
789793
await page.goto('/app', { waitUntil: 'load' });
790794

791795
const results = await page.evaluate(async ({ devicesUrl }) => {
792-
const lightDevices = await import(devicesUrl);
793-
const lightDevicesRuntime = await import('/js/light-devices-runtime.js');
794-
const recommendationRuntime = await import('/js/recommendations-runtime.js');
795-
const { profileStorageKey } = await import('/js/profile.js');
796-
const blobStorage = await import('/js/blob-storage.js');
797-
const state = window._labState;
796+
const [
797+
{ state },
798+
lightDevices,
799+
lightDevicesRuntime,
800+
recommendationRuntime,
801+
{ profileStorageKey },
802+
blobStorage,
803+
] = await Promise.all([
804+
import('/js/state.js'),
805+
import(devicesUrl),
806+
import('/js/light-devices-runtime.js'),
807+
import('/js/recommendations-runtime.js'),
808+
import('/js/profile.js'),
809+
import('/js/blob-storage.js'),
810+
]);
798811
const outcomes = {};
799812
const originalImported = JSON.parse(JSON.stringify(state.importedData || {}));
800813
const importedStorageKey = profileStorageKey(state.currentProfile || 'default', 'imported');

tests/test-quality-guardrails.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ assert('quality guardrail ratchets _labState retirement by file',
6161
guardrailSrc.includes('labStateAppFiles') &&
6262
guardrailSrc.includes('labStateTestFiles') &&
6363
baseline.labStateAppFiles === 1 &&
64-
baseline.labStateTestFiles === 18);
64+
baseline.labStateTestFiles === 14);
6565
const forbiddenAppEventWindowGlobals = [
6666
'closeModal',
6767
'toggleChatPanel',

0 commit comments

Comments
 (0)