@@ -125,9 +125,14 @@ test.describe('Automerge Collaborative Editing Sync', () => {
125125 const nodeInA = await getDocNode ( pageA , nodeId ) ;
126126 expect ( nodeInA ) . not . toBeNull ( ) ;
127127
128- await pageB . waitForTimeout ( SYNC_WAIT ) ;
128+ // Poll for sync with retries instead of fixed wait
129+ let nodeInB = null ;
130+ for ( let attempt = 0 ; attempt < 10 ; attempt ++ ) {
131+ await pageB . waitForTimeout ( 1000 ) ;
132+ nodeInB = await getDocNode ( pageB , nodeId ) ;
133+ if ( nodeInB ) break ;
134+ }
129135
130- const nodeInB = await getDocNode ( pageB , nodeId ) ;
131136 expect ( nodeInB ) . not . toBeNull ( ) ;
132137 expect ( nodeInB . name ) . toBe ( 'test-sync-node' ) ;
133138 expect ( nodeInB . type ) . toBe ( 'inject' ) ;
@@ -327,45 +332,35 @@ test.describe('Automerge Collaborative Editing Sync', () => {
327332 } ) ;
328333
329334 test ( 'workspace order sync between tabs' , async ( ) => {
330- // Add two workspaces in tab A
331- const [ ws1 , ws2 ] = await pageA . evaluate ( ( ) => {
335+ // Add two workspaces in tab A and immediately set order
336+ const result = await pageA . evaluate ( ( ) => {
332337 const id1 = RED . nodes . id ( ) ;
333338 const id2 = RED . nodes . id ( ) ;
334339 RED . automerge . addNode ( { type : 'tab' , id : id1 , label : 'Order Test 1' , disabled : false } ) ;
335340 RED . automerge . addNode ( { type : 'tab' , id : id2 , label : 'Order Test 2' , disabled : false } ) ;
336- return [ id1 , id2 ] ;
337- } ) ;
338-
339- await pageB . waitForTimeout ( SYNC_WAIT ) ;
340-
341- // Verify both workspaces exist in B
342- const stateB = await getDocState ( pageB ) ;
343- expect ( stateB . workspaces ) . toContain ( ws1 ) ;
344- expect ( stateB . workspaces ) . toContain ( ws2 ) ;
345341
346- // Get current order and rearrange so ws2 comes before ws1
347- const currentOrder = await pageA . evaluate ( ( ) => {
342+ // Get existing workspaceOrder, append ws2 before ws1
348343 const doc = RED . automerge . getDocument ( ) ;
349- return JSON . parse ( JSON . stringify ( doc . workspaceOrder || [ ] ) ) ;
350- } ) ;
344+ const current = JSON . parse ( JSON . stringify ( doc . workspaceOrder || [ ] ) ) ;
345+ // Filter out ws1/ws2 if already present, then append ws2 before ws1
346+ const base = current . filter ( id => id !== id1 && id !== id2 ) ;
347+ RED . automerge . setWorkspaceOrder ( [ ...base , id2 , id1 ] ) ;
351348
352- // Build new order: keep existing order, then append ws2, ws1
353- // (the setWorkspaceOrder filters to only IDs in doc.workspaces)
354- await pageA . evaluate ( ( args ) => {
355- const { ws1, ws2, currentOrder } = args ;
356- // Remove ws1/ws2 from current order if present, then add in desired order
357- const base = currentOrder . filter ( id => id !== ws1 && id !== ws2 ) ;
358- const newOrder = [ ...base , ws2 , ws1 ] ;
359- RED . automerge . setWorkspaceOrder ( newOrder ) ;
360- } , { ws1, ws2, currentOrder } ) ;
349+ return { ws1 : id1 , ws2 : id2 } ;
350+ } ) ;
361351
362- await pageB . waitForTimeout ( SYNC_WAIT ) ;
352+ const { ws1 , ws2 } = result ;
363353
364- // Verify order in B
365- const orderB = await pageB . evaluate ( ( ) => {
366- const doc = RED . automerge . getDocument ( ) ;
367- return JSON . parse ( JSON . stringify ( doc . workspaceOrder || [ ] ) ) ;
368- } ) ;
354+ // Poll for sync
355+ let orderB = [ ] ;
356+ for ( let attempt = 0 ; attempt < 10 ; attempt ++ ) {
357+ await pageB . waitForTimeout ( 1000 ) ;
358+ orderB = await pageB . evaluate ( ( ) => {
359+ const doc = RED . automerge . getDocument ( ) ;
360+ return JSON . parse ( JSON . stringify ( doc . workspaceOrder || [ ] ) ) ;
361+ } ) ;
362+ if ( orderB . includes ( ws1 ) && orderB . includes ( ws2 ) ) break ;
363+ }
369364
370365 const idx1 = orderB . indexOf ( ws1 ) ;
371366 const idx2 = orderB . indexOf ( ws2 ) ;
0 commit comments