Skip to content

Commit 81df849

Browse files
fixes is core logic
1 parent 4bae0c7 commit 81df849

File tree

1 file changed

+104
-178
lines changed

1 file changed

+104
-178
lines changed

bin/commands/runs.js

Lines changed: 104 additions & 178 deletions
Original file line numberDiff line numberDiff line change
@@ -72,159 +72,75 @@ const {
7272
const {
7373
createAccessibilityTestRun,
7474
setAccessibilityEventListeners,
75-
checkAccessibilityPlatform,
7675
supportFileCleanup
7776
} = require('../accessibility-automation/helper');
7877
const { isTurboScaleSession, getTurboScaleGridDetails, patchCypressConfigFileContent, atsFileCleanup } = require('../helpers/atsHelper');
7978
const { shouldProcessEventForTesthub, checkAndSetAccessibility, findAvailablePort } = require('../testhub/utils');
8079
const TestHubHandler = require('../testhub/testhubHandler');
81-
const testObservabilityConstants = require('../testObservability/helper/constants');
8280

83-
// Helper function to check accessibility via existing Test Observability session
84-
const checkAccessibilityViaTestHub = async (bsConfig, buildId) => {
85-
try {
86-
// Only proceed if Test Observability is enabled and we have proper authentication
87-
if (!process.env.BS_TESTOPS_JWT || !process.env.BS_TESTOPS_BUILD_HASHED_ID) {
88-
logToServer(`Aakash CBT checkAccessibilityViaTestHub - No Test Observability JWT available, skipping accessibility check`);
89-
return null;
90-
}
91-
92-
logToServer(`Aakash CBT checkAccessibilityViaTestHub - Starting API call with JWT for build: ${process.env.BS_TESTOPS_BUILD_HASHED_ID}`);
93-
94-
const axios = require('axios');
95-
// Use Test Observability build details endpoint
96-
const url = `${testObservabilityConstants.API_URL}/api/v2/builds/${process.env.BS_TESTOPS_BUILD_HASHED_ID}`;
97-
98-
const requestOptions = {
99-
url: url,
100-
method: 'GET',
101-
headers: {
102-
'Authorization': `Bearer ${process.env.BS_TESTOPS_JWT}`,
103-
'Content-Type': 'application/json',
104-
'X-BSTACK-TESTOPS': 'true',
105-
'User-Agent': `${config.userAgentPrefix}/${pkg.version}`
106-
},
107-
timeout: 10000
108-
};
109-
110-
logToServer(`Aakash CBT checkAccessibilityViaTestHub - Making request to Test Observability API with JWT: ${url}`);
111-
112-
const response = await axios(requestOptions);
113-
114-
logToServer(`Aakash CBT checkAccessibilityViaTestHub - Response status: ${response.status}, data: ${JSON.stringify(response.data, null, 2)}`);
115-
116-
if (response.status === 200 && response.data) {
117-
return response.data;
118-
}
119-
120-
logToServer(`Aakash CBT checkAccessibilityViaTestHub - Invalid response status: ${response.status}`);
121-
return null;
122-
123-
} catch (error) {
124-
// Don't fail the build if accessibility status check fails
125-
logToServer(`Aakash CBT checkAccessibilityViaTestHub - Error: ${error.message}, status: ${error.response?.status}, data: ${JSON.stringify(error.response?.data)}`);
126-
logger.debug(`Test Observability accessibility check failed: ${error.message}`);
127-
return null;
81+
// Helper function to determine final accessibility setting matching C# SDK logic
82+
const shouldAutoEnableAccessibility = (userSetting, buildResponse) => {
83+
// If user has explicit setting (true/false), respect it
84+
if (userSetting !== null && userSetting !== undefined) {
85+
logToServer(`[Accessibility] Using explicit user setting: ${userSetting}`);
86+
return userSetting;
12887
}
129-
};
130-
131-
// Helper function to process accessibility status response
132-
const processAccessibilityStatusResponse = (bsConfig, statusResponse) => {
133-
try {
134-
logToServer(`Aakash CBT processAccessibilityStatusResponse - Processing status response: ${JSON.stringify(statusResponse, null, 2)}`);
135-
136-
// Check multiple possible response formats from Test Observability API
137-
// Format 1: Direct accessibility object
138-
if (statusResponse && statusResponse.accessibility) {
139-
if (statusResponse.accessibility.auto_enable === true ||
140-
statusResponse.accessibility.enabled === true ||
141-
statusResponse.accessibility.success === true) {
142-
143-
logToServer(`Aakash CBT processAccessibilityStatusResponse - Auto-enabling accessibility based on status API (accessibility object)`);
144-
145-
bsConfig.run_settings.accessibility = true;
146-
process.env.BROWSERSTACK_TEST_ACCESSIBILITY = 'true';
147-
148-
if (!bsConfig.run_settings.system_env_vars) {
149-
bsConfig.run_settings.system_env_vars = [];
150-
}
151-
152-
// Remove existing accessibility env var if present
153-
bsConfig.run_settings.system_env_vars = bsConfig.run_settings.system_env_vars.filter(
154-
envVar => !envVar.startsWith('BROWSERSTACK_TEST_ACCESSIBILITY=')
155-
);
156-
157-
// Add the accessibility setting
158-
bsConfig.run_settings.system_env_vars.push(`BROWSERSTACK_TEST_ACCESSIBILITY=true`);
159-
160-
logToServer(`Aakash CBT processAccessibilityStatusResponse - Successfully auto-enabled accessibility via status API`);
161-
return true;
162-
}
163-
}
164-
165-
// Format 2: Check if response contains accessibility enablement flag at root level
166-
if (statusResponse &&
167-
(statusResponse.auto_enable_accessibility === true ||
168-
statusResponse.accessibility_enabled === true)) {
169-
170-
logToServer(`Aakash CBT processAccessibilityStatusResponse - Auto-enabling accessibility based on status API (root level flags)`);
171-
172-
bsConfig.run_settings.accessibility = true;
173-
process.env.BROWSERSTACK_TEST_ACCESSIBILITY = 'true';
174-
175-
if (!bsConfig.run_settings.system_env_vars) {
176-
bsConfig.run_settings.system_env_vars = [];
177-
}
178-
179-
// Remove existing accessibility env var if present
180-
bsConfig.run_settings.system_env_vars = bsConfig.run_settings.system_env_vars.filter(
181-
envVar => !envVar.startsWith('BROWSERSTACK_TEST_ACCESSIBILITY=')
182-
);
183-
184-
// Add the accessibility setting
185-
bsConfig.run_settings.system_env_vars.push(`BROWSERSTACK_TEST_ACCESSIBILITY=true`);
186-
187-
logToServer(`Aakash CBT processAccessibilityStatusResponse - Successfully auto-enabled accessibility via status API`);
188-
return true;
189-
}
190-
191-
logToServer(`Aakash CBT processAccessibilityStatusResponse - No auto-enable from status API: no matching flags found`);
192-
return false;
193-
194-
} catch (error) {
195-
logToServer(`Aakash CBT processAccessibilityStatusResponse - Error processing status response: ${error.message}`);
196-
logger.debug(`Error processing accessibility status response: ${error.message}`);
197-
return false;
88+
89+
// User setting is null - check server response for auto-enable decision
90+
if (buildResponse && buildResponse.accessibility && buildResponse.accessibility.success === true) {
91+
logToServer(`[Accessibility] Server decided to auto-enable accessibility`);
92+
return true;
19893
}
94+
95+
// Fallback if no server auto-enable decision
96+
logToServer('[Accessibility] No server auto-enable decision, defaulting to false');
97+
return false;
19998
};
20099

201100
// Helper function to process accessibility response from server - matches C# SDK pattern
202-
const processAccessibilityResponse = (bsConfig, buildResponse) => {
203-
logToServer(`Aakash CBT processAccessibilityResponse - Processing build response: ${JSON.stringify(buildResponse?.accessibility || 'No accessibility in response', null, 2)}`);
101+
const processAccessibilityResponse = (bsConfig, buildResponse, userAccessibilitySetting) => {
102+
logToServer(`[Accessibility] Processing build response: ${JSON.stringify(buildResponse?.accessibility || 'No accessibility in response', null, 2)}`);
204103

205-
// Check if server response indicates accessibility should be enabled
206-
if (buildResponse && buildResponse.accessibility && buildResponse.accessibility.success === true) {
207-
logger.debug("Server response indicates accessibility should be auto-enabled");
208-
209-
logToServer(`Aakash CBT processAccessibilityResponse - Server auto-enabling accessibility: buildResponse.accessibility.success=true`);
104+
// Use C# SDK logic to determine final accessibility setting
105+
const finalAccessibility = shouldAutoEnableAccessibility(userAccessibilitySetting, buildResponse);
106+
107+
logToServer(`[Accessibility] Final decision: userSetting=${userAccessibilitySetting}, serverResponse=${buildResponse?.accessibility?.success}, finalAccessibility=${finalAccessibility}`);
108+
109+
// If final decision is to enable accessibility, update configuration
110+
if (finalAccessibility === true) {
111+
logger.debug("Accessibility enabled (user explicit or server auto-enable)");
210112

113+
// Update configuration
211114
bsConfig.run_settings.accessibility = true;
212115
process.env.BROWSERSTACK_TEST_ACCESSIBILITY = 'true';
213116

117+
// Ensure system_env_vars array exists
214118
if (!bsConfig.run_settings.system_env_vars) {
215119
bsConfig.run_settings.system_env_vars = [];
216120
}
217-
if (!bsConfig.run_settings.system_env_vars.includes("BROWSERSTACK_TEST_ACCESSIBILITY")) {
218-
bsConfig.run_settings.system_env_vars.push(`BROWSERSTACK_TEST_ACCESSIBILITY=true`);
219-
}
220121

221-
logToServer(`Aakash CBT processAccessibilityResponse - Successfully auto-enabled accessibility via server response`);
122+
// Remove existing accessibility env var if present to avoid duplicates
123+
bsConfig.run_settings.system_env_vars = bsConfig.run_settings.system_env_vars.filter(
124+
envVar => !envVar.startsWith('BROWSERSTACK_TEST_ACCESSIBILITY=')
125+
);
126+
127+
// Add the accessibility setting
128+
bsConfig.run_settings.system_env_vars.push(`BROWSERSTACK_TEST_ACCESSIBILITY=true`);
129+
130+
logToServer(`[Accessibility] Successfully enabled accessibility`);
222131

223132
return true;
133+
} else if (finalAccessibility === false) {
134+
// Explicitly set to false
135+
bsConfig.run_settings.accessibility = false;
136+
process.env.BROWSERSTACK_TEST_ACCESSIBILITY = 'false';
137+
138+
logToServer(`[Accessibility] Accessibility set to false`);
139+
return false;
224140
}
225141

226-
logToServer(`Aakash CBT processAccessibilityResponse - No server auto-enable: accessibility.success != true`);
227-
142+
// Should not reach here with proper logic
143+
logToServer(`[Accessibility] Unexpected state: finalAccessibility=${finalAccessibility}`);
228144
return false;
229145
};
230146

@@ -260,50 +176,74 @@ module.exports = function run(args, rawArgs) {
260176
// Log initial accessibility state
261177
logToServer(`Aakash CBT Initial Config - Before accessibility processing: bsConfig.run_settings.accessibility=${bsConfig.run_settings.accessibility}, system_env_vars=${JSON.stringify(bsConfig.run_settings.system_env_vars || [])}`);
262178

263-
// Auto-enable A11y logic - similar to C# SDK implementation
264-
const determineAccessibilitySession = (bsConfig) => {
265-
const userAccessibilitySetting = bsConfig.run_settings.accessibility;
266-
const platformSupportsAccessibility = checkAccessibilityPlatform(bsConfig);
179+
// Helper functions to match C# SDK logic for accessibility auto-enable
180+
const getUserAccessibilitySetting = (bsConfig) => {
181+
logToServer(`[Accessibility] Getting user setting from config:`, {
182+
runSettings: bsConfig.run_settings.accessibility,
183+
environment: process.env.BROWSERSTACK_TEST_ACCESSIBILITY
184+
});
185+
186+
// Priority order: run_settings.accessibility > environment variable > null (let server decide)
267187

268-
// Log initial state
269-
logToServer(`Aakash CBT determineAccessibilitySession - Initial state: userSetting=${userAccessibilitySetting}, platformSupports=${platformSupportsAccessibility}, browsers=${JSON.stringify(bsConfig.browsers || [], null, 2)}`);
188+
// Check run_settings.accessibility first
189+
if (bsConfig.run_settings.accessibility !== undefined && bsConfig.run_settings.accessibility !== null) {
190+
logToServer(`[Accessibility] Using run_settings setting: ${bsConfig.run_settings.accessibility}`);
191+
return bsConfig.run_settings.accessibility;
192+
}
270193

271-
// If user explicitly set accessibility to true, enable it
272-
if (userAccessibilitySetting === true) {
273-
logToServer(`Aakash CBT determineAccessibilitySession - User explicitly enabled accessibility: returning TRUE`);
194+
// Check environment variable
195+
if (process.env.BROWSERSTACK_TEST_ACCESSIBILITY === 'true') {
196+
logToServer('[Accessibility] Using environment variable setting: true');
274197
return true;
275198
}
276199

277-
// If user explicitly set accessibility to false, disable it
278-
if (userAccessibilitySetting === false) {
279-
logToServer(`Aakash CBT determineAccessibilitySession - User explicitly disabled accessibility: returning FALSE`);
200+
if (process.env.BROWSERSTACK_TEST_ACCESSIBILITY === 'false') {
201+
logToServer('[Accessibility] Using environment variable setting: false');
280202
return false;
281203
}
282204

283-
// If user didn't specify (null/undefined), auto-enable based on platform support
284-
// This matches the C# SDK logic where server can auto-enable based on platform
285-
if (userAccessibilitySetting === null || userAccessibilitySetting === undefined) {
286-
logToServer(`Aakash CBT determineAccessibilitySession - User not specified, auto-enabling based on platform: platformSupports=${platformSupportsAccessibility}, returning ${platformSupportsAccessibility}`);
287-
return platformSupportsAccessibility; // Auto-enable if platform supports it
205+
// Return null to let server decide (matches C# SDK behavior)
206+
logToServer('[Accessibility] No explicit setting found, returning null for server decision');
207+
return null;
208+
};
209+
210+
const shouldAutoEnableAccessibility = (userSetting, buildResponse) => {
211+
// If user has explicit setting (true/false), respect it
212+
if (userSetting !== null && userSetting !== undefined) {
213+
logToServer(`[Accessibility] Using explicit user setting: ${userSetting}`);
214+
return userSetting;
215+
}
216+
217+
// User setting is null - check server response for auto-enable decision
218+
if (buildResponse && buildResponse.accessibility && buildResponse.accessibility.success === true) {
219+
logToServer(`[Accessibility] Server decided to auto-enable accessibility`);
220+
return true;
288221
}
289222

290-
logToServer(`Aakash CBT determineAccessibilitySession - Fallback case: returning FALSE`);
223+
// Fallback if no server decision available
224+
logToServer('[Accessibility] No server auto-enable decision, defaulting to false');
291225
return false;
292226
};
293227

294-
const isAccessibilitySession = determineAccessibilitySession(bsConfig);
228+
// Get user's explicit accessibility setting (null means let server decide)
229+
const userAccessibilitySetting = getUserAccessibilitySetting(bsConfig);
295230

296-
// Log the accessibility decision for debugging
297-
logToServer(`Aakash CBT Accessibility Decision - Final decision: isAccessibilitySession=${isAccessibilitySession}, current bsConfig.run_settings.accessibility=${bsConfig.run_settings.accessibility}`);
231+
// Set initial accessibility value based on user setting (null if not explicitly set)
232+
if (userAccessibilitySetting !== null) {
233+
bsConfig.run_settings.accessibility = userAccessibilitySetting;
234+
logToServer(`[Accessibility] Set initial accessibility to user setting: ${userAccessibilitySetting}`);
235+
} else {
236+
// Keep accessibility as null to let server decide
237+
bsConfig.run_settings.accessibility = null;
238+
logToServer(`[Accessibility] Keeping accessibility as null for server decision`);
239+
}
298240

299241
if (bsConfig.run_settings.accessibility === true) {
300242
logger.debug("Accessibility explicitly enabled by user");
301243
} else if (bsConfig.run_settings.accessibility === false) {
302244
logger.debug("Accessibility explicitly disabled by user");
303-
} else if (isAccessibilitySession) {
304-
logger.debug("Accessibility auto-enabled based on platform support");
305245
} else {
306-
logger.debug("Accessibility not enabled - platform may not support it");
246+
logger.debug("Accessibility setting is null - will be decided by server response");
307247
}
308248

309249
const turboScaleSession = isTurboScaleSession(bsConfig);
@@ -349,7 +289,13 @@ module.exports = function run(args, rawArgs) {
349289
// set build tag caps
350290
utils.setBuildTags(bsConfig, args);
351291

352-
checkAndSetAccessibility(bsConfig, isAccessibilitySession);
292+
// Only call checkAndSetAccessibility if user has explicit setting
293+
if (userAccessibilitySetting !== null) {
294+
checkAndSetAccessibility(bsConfig, userAccessibilitySetting);
295+
logToServer(`[Accessibility] Called checkAndSetAccessibility with explicit user setting: ${userAccessibilitySetting}`);
296+
} else {
297+
logToServer(`[Accessibility] Skipping checkAndSetAccessibility - accessibility is null for server decision`);
298+
}
353299

354300
// Log accessibility state after checkAndSetAccessibility
355301
logToServer(`Aakash CBT After checkAndSetAccessibility - Final accessibility state: bsConfig.run_settings.accessibility=${bsConfig.run_settings.accessibility}, BROWSERSTACK_TEST_ACCESSIBILITY=${process.env.BROWSERSTACK_TEST_ACCESSIBILITY}, system_env_vars=${JSON.stringify(bsConfig.run_settings.system_env_vars || [])}`);
@@ -556,41 +502,21 @@ module.exports = function run(args, rawArgs) {
556502
markBlockEnd('localSetup');
557503
logger.debug("Started build creation");
558504
markBlockStart('createBuild');
559-
return build.createBuild(bsConfig, zip).then(async function (data) {
505+
return build.createBuild(bsConfig, zip).then(function (data) {
560506
markBlockEnd('preBuild');
561507
markBlockStart('buildProcessing');
562508
logger.debug("Completed build creation");
563509
markBlockEnd('createBuild');
564510
markBlockEnd('total');
565511

566512
// Process accessibility response from server - matches C# SDK logic
567-
const accessibilityAutoEnabled = processAccessibilityResponse(bsConfig, data);
513+
const accessibilityAutoEnabled = processAccessibilityResponse(bsConfig, data, userAccessibilitySetting);
568514
if (accessibilityAutoEnabled) {
569515
logger.info("Accessibility has been auto-enabled based on server response");
570516
}
571517

572-
// Additional API call to check accessibility auto-enable status (like C# SDK)
573-
let statusAutoEnabled = false;
574-
if (!accessibilityAutoEnabled && data.build_id) {
575-
logToServer(`Aakash CBT Build Creation - Making Test Observability accessibility check for build: ${data.build_id}`);
576-
577-
try {
578-
// Use JWT-based Test Observability API call instead of Basic Auth
579-
const statusResponse = await checkAccessibilityViaTestHub(bsConfig, data.build_id);
580-
if (statusResponse) {
581-
statusAutoEnabled = processAccessibilityStatusResponse(bsConfig, statusResponse);
582-
if (statusAutoEnabled) {
583-
logger.info("Accessibility has been auto-enabled based on Test Observability API call");
584-
}
585-
}
586-
} catch (error) {
587-
logToServer(`Aakash CBT Build Creation - Error in Test Observability accessibility check: ${error.message}`);
588-
logger.debug(`Test Observability accessibility check failed: ${error.message}`);
589-
}
590-
}
591-
592-
// Log final accessibility state after all server response processing
593-
logToServer(`Aakash CBT Final Build State - After all server processing: bsConfig.run_settings.accessibility=${bsConfig.run_settings.accessibility}, BROWSERSTACK_TEST_ACCESSIBILITY=${process.env.BROWSERSTACK_TEST_ACCESSIBILITY}, buildResponseAutoEnabled=${accessibilityAutoEnabled}, statusApiAutoEnabled=${statusAutoEnabled}`);
518+
// Log final accessibility state after server response processing
519+
logToServer(`Aakash CBT Final Build State - After server response processing: bsConfig.run_settings.accessibility=${bsConfig.run_settings.accessibility}, BROWSERSTACK_TEST_ACCESSIBILITY=${process.env.BROWSERSTACK_TEST_ACCESSIBILITY}, accessibilityAutoEnabled=${accessibilityAutoEnabled}`);
594520

595521
utils.setProcessHooks(data.build_id, bsConfig, bs_local, args, buildReportData);
596522
if(isTestObservabilitySession) {

0 commit comments

Comments
 (0)