@@ -27,7 +27,7 @@ test.describe("Visual Regression", () => {
2727    await  page . filebrowser . openDirectory ( tmpPath ) ; 
2828  } ) ; 
2929
30-   test ( "Run notebook and  capture cell outputs" ,  async  ( { 
30+   test ( "Run notebook,  capture cell outputs, and test widgets " ,  async  ( { 
3131    page, 
3232    tmpPath, 
3333  } )  =>  { 
@@ -60,5 +60,80 @@ test.describe("Visual Regression", () => {
6060        continue ; 
6161      } 
6262    } 
63+ 
64+     const  widgetCellIndex  =  3 ; 
65+ 
66+     await  waitForWidget ( page ,  widgetCellIndex ,  'input[type="checkbox"]' ) ; 
67+     await  waitForWidget ( page ,  widgetCellIndex ,  'button:has-text("Cluster Down")' ) ; 
68+     await  waitForWidget ( page ,  widgetCellIndex ,  'button:has-text("Cluster Up")' ) ; 
69+ 
70+     await  interactWithWidget ( page ,  widgetCellIndex ,  'input[type="checkbox"]' ,  async  ( checkbox )  =>  { 
71+       await  checkbox . click ( ) ; 
72+       const  isChecked  =  await  checkbox . isChecked ( ) ; 
73+       expect ( isChecked ) . toBe ( true ) ; 
74+     } ) ; 
75+ 
76+     await  interactWithWidget ( page ,  widgetCellIndex ,  'button:has-text("Cluster Down")' ,  async  ( button )  =>  { 
77+       await  button . click ( ) ; 
78+       const  clusterDownMessage  =  await  page . waitForSelector ( 'text=No instances found, nothing to be done.' ,  {  timeout : 5000  } ) ; 
79+       expect ( clusterDownMessage ) . not . toBeNull ( ) ; 
80+     } ) ; 
81+ 
82+     await  interactWithWidget ( page ,  widgetCellIndex ,  'button:has-text("Cluster Up")' ,  async  ( button )  =>  { 
83+       await  button . click ( ) ; 
84+ 
85+       const  successMessage  =  await  page . waitForSelector ( 'text=Ray Cluster: \'raytest\' has successfully been created' ,  {  timeout : 10000  } ) ; 
86+       expect ( successMessage ) . not . toBeNull ( ) ; 
87+ 
88+       const  resourcesMessage  =  await  page . waitForSelector ( 'text=Waiting for requested resources to be set up...' ) ; 
89+       expect ( resourcesMessage ) . not . toBeNull ( ) ; 
90+ 
91+       const  upAndRunningMessage  =  await  page . waitForSelector ( 'text=Requested cluster is up and running!' ) ; 
92+       expect ( upAndRunningMessage ) . not . toBeNull ( ) ; 
93+ 
94+       const  dashboardReadyMessage  =  await  page . waitForSelector ( 'text=Dashboard is ready!' ) ; 
95+       expect ( dashboardReadyMessage ) . not . toBeNull ( ) ; 
96+     } ) ; 
97+ 
98+     await  runLastCell ( page ,  cellCount ,  '(<CodeFlareClusterStatus.READY: 1>, True)' ) ; 
99+ 
100+     await  interactWithWidget ( page ,  widgetCellIndex ,  'button:has-text("Cluster Down")' ,  async  ( button )  =>  { 
101+       await  button . click ( ) ; 
102+       const  clusterDownMessage  =  await  page . waitForSelector ( 'text=Ray Cluster: \'raytest\' has successfully been deleted' ,  {  timeout : 5000  } ) ; 
103+       expect ( clusterDownMessage ) . not . toBeNull ( ) ; 
104+     } ) ; 
105+ 
106+     await  runLastCell ( page ,  cellCount ,  '(<CodeFlareClusterStatus.UNKNOWN: 6>, False)' ) ; 
63107  } ) ; 
64108} ) ; 
109+ 
110+ async  function  waitForWidget ( page ,  cellIndex : number ,  widgetSelector : string ,  timeout  =  5000 )  { 
111+   const  widgetCell  =  await  page . notebook . getCellOutput ( cellIndex ) ; 
112+ 
113+   if  ( widgetCell )  { 
114+     await  widgetCell . waitForSelector ( widgetSelector ,  {  timeout } ) ; 
115+   } 
116+ } 
117+ 
118+ async  function  interactWithWidget ( page ,  cellIndex : number ,  widgetSelector : string ,  action : ( widget )  =>  Promise < void > )  { 
119+   const  widgetCell  =  await  page . notebook . getCellOutput ( cellIndex ) ; 
120+ 
121+   if  ( widgetCell )  { 
122+     const  widget  =  await  widgetCell . $ ( widgetSelector ) ; 
123+     if  ( widget )  { 
124+       await  action ( widget ) ; 
125+     } 
126+   } 
127+ } 
128+ 
129+ async  function  runLastCell ( page ,  cellCount ,  expectedMessage )  { 
130+   const  runSuccess  =  await  page . notebook . runCell ( cellCount  -  1 ) ;  expect ( runSuccess ) . toBe ( true ) ; 
131+   const  lastCellOutput  =  await  page . notebook . getCellOutput ( cellCount  -  1 ) ; 
132+   const  newOutput  =  await  lastCellOutput . evaluate ( ( output )  =>  output . textContent ) ; 
133+ 
134+   if  ( expectedMessage )  { 
135+     expect ( newOutput ) . toContain ( expectedMessage ) ; 
136+   } 
137+ 
138+   return  lastCellOutput ; 
139+ } 
0 commit comments