@@ -72,159 +72,75 @@ const {
7272const {
7373 createAccessibilityTestRun,
7474 setAccessibilityEventListeners,
75- checkAccessibilityPlatform,
7675 supportFileCleanup
7776} = require ( '../accessibility-automation/helper' ) ;
7877const { isTurboScaleSession, getTurboScaleGridDetails, patchCypressConfigFileContent, atsFileCleanup } = require ( '../helpers/atsHelper' ) ;
7978const { shouldProcessEventForTesthub, checkAndSetAccessibility, findAvailablePort } = require ( '../testhub/utils' ) ;
8079const 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