22
22
23
23
import {
24
24
createDomainObjectWithDefaults ,
25
- setTimeConductorBounds ,
26
- setTimeConductorMode
25
+ navigateToObjectWithRealTime ,
26
+ setTimeConductorBounds
27
27
} from '../../../../appActions.js' ;
28
28
import { expect , test } from '../../../../pluginFixtures.js' ;
29
29
@@ -39,12 +39,52 @@ test.describe('Telemetry Table', () => {
39
39
type : 'Sine Wave Generator' ,
40
40
parent : table . uuid
41
41
} ) ;
42
- await page . goto ( table . url ) ;
43
- await setTimeConductorMode ( page , false ) ;
42
+ await navigateToObjectWithRealTime ( page , table . url ) ;
44
43
const rows = page . getByLabel ( 'table content' ) . getByLabel ( 'Table Row' ) ;
45
44
await expect ( rows ) . toHaveCount ( 50 ) ;
46
45
} ) ;
47
46
47
+ test ( 'on load, auto scrolls to top for descending, and to bottom for ascending' , async ( {
48
+ page
49
+ } ) => {
50
+ const sineWaveGenerator = await createDomainObjectWithDefaults ( page , {
51
+ type : 'Sine Wave Generator' ,
52
+ parent : table . uuid
53
+ } ) ;
54
+
55
+ // verify in telemetry table object view
56
+ await navigateToObjectWithRealTime ( page , table . url ) ;
57
+
58
+ expect ( await getScrollPosition ( page ) ) . toBe ( 0 ) ;
59
+
60
+ // verify in telemetry table view
61
+ await page . goto ( sineWaveGenerator . url ) ;
62
+ await page . getByLabel ( 'Open the View Switcher Menu' ) . click ( ) ;
63
+ await page . getByText ( 'Telemetry Table' , { exact : true } ) . click ( ) ;
64
+
65
+ expect ( await getScrollPosition ( page ) ) . toBe ( 0 ) ;
66
+
67
+ // navigate back to table
68
+ await page . goto ( table . url ) ;
69
+
70
+ // go into edit mode
71
+ await page . getByLabel ( 'Edit Object' ) . click ( ) ;
72
+
73
+ // change sort direction
74
+ await page . locator ( 'thead div' ) . filter ( { hasText : 'Time' } ) . click ( ) ;
75
+
76
+ // save view
77
+ await page . getByRole ( 'button' , { name : 'Save' } ) . click ( ) ;
78
+ await page . getByRole ( 'listitem' , { name : 'Save and Finish Editing' } ) . click ( ) ;
79
+
80
+ // navigate away and back
81
+ await page . goto ( sineWaveGenerator . url ) ;
82
+ await page . goto ( table . url ) ;
83
+
84
+ // verify scroll position
85
+ expect ( await getScrollPosition ( page , false ) ) . toBeLessThan ( 1 ) ;
86
+ } ) ;
87
+
48
88
test ( 'unpauses and filters data when paused by button and user changes bounds' , async ( {
49
89
page
50
90
} ) => {
@@ -183,3 +223,42 @@ test.describe('Telemetry Table', () => {
183
223
await page . click ( 'button[title="Pause"]' ) ;
184
224
} ) ;
185
225
} ) ;
226
+
227
+ async function getScrollPosition ( page , top = true ) {
228
+ const tableBody = page . locator ( '.c-table__body-w' ) ;
229
+
230
+ // Wait for the scrollbar to appear
231
+ await tableBody . evaluate ( ( node ) => {
232
+ return new Promise ( ( resolve ) => {
233
+ function checkScroll ( ) {
234
+ if ( node . scrollHeight > node . clientHeight ) {
235
+ resolve ( ) ;
236
+ } else {
237
+ setTimeout ( checkScroll , 100 ) ;
238
+ }
239
+ }
240
+ checkScroll ( ) ;
241
+ } ) ;
242
+ } ) ;
243
+
244
+ // make sure there are rows
245
+ const rows = page . getByLabel ( 'table content' ) . getByLabel ( 'Table Row' ) ;
246
+ await rows . first ( ) . waitFor ( ) ;
247
+
248
+ // Using this to allow for rows to come and go, so we can truly test the scroll position
249
+ // eslint-disable-next-line playwright/no-wait-for-timeout
250
+ await page . waitForTimeout ( 1000 ) ;
251
+
252
+ const { scrollTop, clientHeight, scrollHeight } = await tableBody . evaluate ( ( node ) => ( {
253
+ scrollTop : node . scrollTop ,
254
+ clientHeight : node . clientHeight ,
255
+ scrollHeight : node . scrollHeight
256
+ } ) ) ;
257
+
258
+ // eslint-disable-next-line playwright/no-conditional-in-test
259
+ if ( top ) {
260
+ return scrollTop ;
261
+ } else {
262
+ return Math . abs ( scrollHeight - ( scrollTop + clientHeight ) ) ;
263
+ }
264
+ }
0 commit comments