@@ -1278,6 +1278,18 @@ export class BrowserPage extends BasePage {
1278
1278
await expect ( this . keysSummary ) . not . toBeVisible ( )
1279
1279
}
1280
1280
1281
+ async verifyKeyExists ( keyName : string ) : Promise < void > {
1282
+ await this . searchByKeyName ( keyName )
1283
+ const keyExists = await this . isKeyIsDisplayedInTheList ( keyName )
1284
+ expect ( keyExists ) . toBe ( true )
1285
+ }
1286
+
1287
+ async verifyKeyDoesNotExist ( keyName : string ) : Promise < void > {
1288
+ await this . searchByKeyName ( keyName )
1289
+ const keyStillExists = await this . isKeyIsDisplayedInTheList ( keyName )
1290
+ expect ( keyStillExists ) . toBe ( false )
1291
+ }
1292
+
1281
1293
async clearFilter ( ) : Promise < void > {
1282
1294
await this . clearFilterButton . click ( )
1283
1295
}
@@ -1386,6 +1398,9 @@ export class BrowserPage extends BasePage {
1386
1398
}
1387
1399
1388
1400
async getAllListElements ( ) : Promise < string [ ] > {
1401
+ // Wait for list details to be visible first
1402
+ await expect ( this . page . getByTestId ( 'list-details' ) ) . toBeVisible ( )
1403
+
1389
1404
// Get all list elements' text content
1390
1405
const elements = await this . listElementsList . all ( )
1391
1406
const values : string [ ] = [ ]
@@ -1401,21 +1416,41 @@ export class BrowserPage extends BasePage {
1401
1416
}
1402
1417
1403
1418
async getAllSetMembers ( ) : Promise < string [ ] > {
1404
- // Get all set members' text content
1405
- const elements = await this . setMembersList . all ( )
1406
- const values : string [ ] = [ ]
1419
+ // Wait for set details to be visible and loaded
1420
+ await this . waitForSetDetailsToBeVisible ( )
1407
1421
1408
- for ( let i = 0 ; i < elements . length ; i += 1 ) {
1409
- const text = await elements [ i ] . textContent ( )
1410
- if ( text && text . trim ( ) ) {
1411
- values . push ( text . trim ( ) )
1412
- }
1422
+ // Wait for at least one element to be visible (or confirm none exist)
1423
+ try {
1424
+ await expect ( this . setMembersList . first ( ) ) . toBeVisible ( )
1425
+ } catch {
1426
+ // No members exist - return empty array
1427
+ return [ ]
1413
1428
}
1414
1429
1415
- return values
1430
+ // Get all set members' text content
1431
+ const elements = await this . setMembersList . all ( )
1432
+ const textContents = await Promise . all (
1433
+ elements . map ( async ( element ) => {
1434
+ const text = await element . textContent ( )
1435
+ return text ?. trim ( ) || ''
1436
+ } ) ,
1437
+ )
1438
+
1439
+ return textContents . filter ( ( text ) => text . length > 0 )
1416
1440
}
1417
1441
1418
1442
async getAllZsetMembers ( ) : Promise < Array < { name : string ; score : string } > > {
1443
+ // Wait for zset details to be visible and loaded
1444
+ await this . waitForZsetDetailsToBeVisible ( )
1445
+
1446
+ // Wait for at least one element to be visible (or confirm none exist)
1447
+ try {
1448
+ await expect ( this . zsetMembersList . first ( ) ) . toBeVisible ( )
1449
+ } catch {
1450
+ // No members exist - return empty array
1451
+ return [ ]
1452
+ }
1453
+
1419
1454
// Get all zset members' names and scores
1420
1455
const memberElements = await this . zsetMembersList . all ( )
1421
1456
const scoreElements = await this . zsetScoresList . all ( )
@@ -1783,4 +1818,309 @@ export class BrowserPage extends BasePage {
1783
1818
}
1784
1819
}
1785
1820
}
1821
+
1822
+ async addMemberToZsetKey ( member : string , score : number ) : Promise < void > {
1823
+ if ( await this . toast . isCloseButtonVisible ( ) ) {
1824
+ await this . toast . closeToast ( )
1825
+ }
1826
+ await this . addKeyValueItemsButton . click ( )
1827
+ await this . setMemberInput . fill ( member )
1828
+ await this . zsetMemberScoreInput . fill ( score . toString ( ) )
1829
+ await this . saveMemberButton . click ( )
1830
+ }
1831
+
1832
+ async editZsetMemberScore ( member : string , newScore : number ) : Promise < void > {
1833
+ // First ensure we're on the right page and elements are loaded
1834
+ await this . waitForZsetDetailsToBeVisible ( )
1835
+
1836
+ // Find the member element first and ensure it exists
1837
+ const memberElement = this . page . locator (
1838
+ `[data-testid="zset-member-value-${ member } "]` ,
1839
+ )
1840
+ await expect ( memberElement ) . toBeVisible ( )
1841
+
1842
+ // We need to hover over the score element, not the member element
1843
+ // Wait for score elements to be ready
1844
+ await expect (
1845
+ this . page . locator ( '[data-testid^="zset_content-value-"]' ) . first ( ) ,
1846
+ ) . toBeVisible ( )
1847
+
1848
+ // Get all zset content value elements and try each one until we find the right row
1849
+ const allScoreElements = await this . page
1850
+ . locator ( '[data-testid^="zset_content-value-"]' )
1851
+ . all ( )
1852
+
1853
+ let editButton
1854
+ let foundVisible = false
1855
+
1856
+ for ( let i = 0 ; i < allScoreElements . length && ! foundVisible ; i += 1 ) {
1857
+ const scoreElement = allScoreElements [ i ]
1858
+ // Hover over this score element
1859
+ await scoreElement . hover ( )
1860
+
1861
+ // Check if an edit button becomes visible
1862
+ editButton = this . page
1863
+ . locator ( '[data-testid^="zset_edit-btn-"]' )
1864
+ . first ( )
1865
+ foundVisible = await editButton . isVisible ( )
1866
+ }
1867
+
1868
+ // Click the edit button if we found one
1869
+ if ( editButton && foundVisible ) {
1870
+ await editButton . click ( )
1871
+ } else {
1872
+ throw new Error ( `Could not find edit button for member: ${ member } ` )
1873
+ }
1874
+
1875
+ // Use the correct editor element from the unit tests
1876
+ const editorLocator = this . page . locator (
1877
+ '[data-testid="inline-item-editor"]' ,
1878
+ )
1879
+ await expect ( editorLocator ) . toBeVisible ( )
1880
+ await editorLocator . clear ( )
1881
+ await editorLocator . fill ( newScore . toString ( ) )
1882
+ await this . applyButton . click ( )
1883
+ }
1884
+
1885
+ async cancelZsetMemberScoreEdit (
1886
+ member : string ,
1887
+ newScore : number ,
1888
+ ) : Promise < void > {
1889
+ // We need to hover over the score element to make the edit button appear
1890
+ // Wait for score elements to be ready
1891
+ await expect (
1892
+ this . page . locator ( '[data-testid^="zset_content-value-"]' ) . first ( ) ,
1893
+ ) . toBeVisible ( )
1894
+
1895
+ // Get all zset content value elements and try each one until we find the right row
1896
+ const allScoreElements = await this . page
1897
+ . locator ( '[data-testid^="zset_content-value-"]' )
1898
+ . all ( )
1899
+
1900
+ let editButton
1901
+ let foundVisible = false
1902
+
1903
+ for ( let i = 0 ; i < allScoreElements . length && ! foundVisible ; i += 1 ) {
1904
+ const scoreElement = allScoreElements [ i ]
1905
+ // Hover over this score element
1906
+ await scoreElement . hover ( )
1907
+
1908
+ // Check if an edit button becomes visible
1909
+ editButton = this . page
1910
+ . locator ( '[data-testid^="zset_edit-btn-"]' )
1911
+ . first ( )
1912
+ foundVisible = await editButton . isVisible ( )
1913
+ }
1914
+
1915
+ // Click the edit button if we found one
1916
+ if ( editButton && foundVisible ) {
1917
+ await editButton . click ( )
1918
+ } else {
1919
+ throw new Error ( `Could not find edit button for member: ${ member } ` )
1920
+ }
1921
+
1922
+ // Use the correct editor element from the unit tests
1923
+ const editorLocator = this . page . locator (
1924
+ '[data-testid="inline-item-editor"]' ,
1925
+ )
1926
+ await expect ( editorLocator ) . toBeVisible ( )
1927
+ await editorLocator . clear ( )
1928
+ await editorLocator . fill ( newScore . toString ( ) )
1929
+
1930
+ // Cancel using Escape key
1931
+ await this . page . keyboard . press ( 'Escape' )
1932
+ await expect ( editorLocator ) . not . toBeVisible ( )
1933
+ }
1934
+
1935
+ async removeMemberFromZset ( member : string ) : Promise < void > {
1936
+ const memberElement = this . page . locator (
1937
+ `[data-testid="zset-member-value-${ member } "]` ,
1938
+ )
1939
+ await memberElement . hover ( )
1940
+ await this . page
1941
+ . locator ( `[data-testid="zset-remove-button-${ member } -icon"]` )
1942
+ . click ( )
1943
+ await this . page
1944
+ . locator ( `[data-testid^="zset-remove-button-${ member } "]` )
1945
+ . getByText ( 'Remove' )
1946
+ . click ( )
1947
+ }
1948
+
1949
+ async removeMultipleMembersFromZset ( memberNames : string [ ] ) : Promise < void > {
1950
+ for ( let i = 0 ; i < memberNames . length ; i += 1 ) {
1951
+ await this . removeMemberFromZset ( memberNames [ i ] )
1952
+ }
1953
+ }
1954
+
1955
+ async removeAllZsetMembers (
1956
+ members : Array < { name : string ; score : number } > ,
1957
+ ) : Promise < void > {
1958
+ for ( let i = 0 ; i < members . length ; i += 1 ) {
1959
+ await this . removeMemberFromZset ( members [ i ] . name )
1960
+ }
1961
+ }
1962
+
1963
+ async waitForZsetLengthToUpdate ( expectedLength : number ) : Promise < void > {
1964
+ await expect
1965
+ . poll ( async ( ) => {
1966
+ const keyLength = await this . getKeyLength ( )
1967
+ return parseInt ( keyLength , 10 )
1968
+ } )
1969
+ . toBe ( expectedLength )
1970
+ }
1971
+
1972
+ async verifyZsetContainsMembers (
1973
+ expectedMembers : Array < { name : string ; score : number } > ,
1974
+ ) : Promise < void > {
1975
+ const displayedMembers = await this . getAllZsetMembers ( )
1976
+
1977
+ expect ( displayedMembers ) . toHaveLength ( expectedMembers . length )
1978
+ expectedMembers . forEach ( ( expectedMember ) => {
1979
+ const foundMember = displayedMembers . find (
1980
+ ( member ) => member . name === expectedMember . name ,
1981
+ )
1982
+ expect ( foundMember ) . toBeDefined ( )
1983
+ expect ( foundMember ?. score ) . toBe ( expectedMember . score . toString ( ) )
1984
+ } )
1985
+ }
1986
+
1987
+ async verifyZsetDoesNotContainMembers (
1988
+ unwantedMembers : string [ ] ,
1989
+ ) : Promise < void > {
1990
+ const displayedMembers = await this . getAllZsetMembers ( )
1991
+ unwantedMembers . forEach ( ( unwantedMember ) => {
1992
+ const foundMember = displayedMembers . find (
1993
+ ( member ) => member . name === unwantedMember ,
1994
+ )
1995
+ expect ( foundMember ) . toBeUndefined ( )
1996
+ } )
1997
+ }
1998
+
1999
+ async verifyZsetMemberExists ( member : string ) : Promise < void > {
2000
+ const memberElement = this . page . locator (
2001
+ `[data-testid="zset-member-value-${ member } "]` ,
2002
+ )
2003
+ await expect ( memberElement ) . toBeVisible ( )
2004
+ }
2005
+
2006
+ async verifyZsetMemberNotExists ( member : string ) : Promise < void > {
2007
+ const memberElement = this . page . locator (
2008
+ `[data-testid="zset-member-value-${ member } "]` ,
2009
+ )
2010
+ await expect ( memberElement ) . not . toBeVisible ( )
2011
+ }
2012
+
2013
+ async verifyZsetMemberScore (
2014
+ member : string ,
2015
+ expectedScore : number ,
2016
+ ) : Promise < void > {
2017
+ // Since we can't reliably match member to score element by DOM traversal,
2018
+ // let's verify that ANY score element contains our expected score
2019
+ // This is sufficient for our test since we're editing a specific score
2020
+
2021
+ const allScoreElements = await this . page
2022
+ . locator ( '[data-testid^="zset_content-value-"]' )
2023
+ . all ( )
2024
+
2025
+ let found = false
2026
+ for ( const scoreElement of allScoreElements ) {
2027
+ const scoreText = await scoreElement . textContent ( )
2028
+ if ( scoreText && scoreText . includes ( expectedScore . toString ( ) ) ) {
2029
+ found = true
2030
+ break
2031
+ }
2032
+ }
2033
+
2034
+ if ( ! found ) {
2035
+ throw new Error (
2036
+ `Expected score ${ expectedScore } not found in any zset score elements` ,
2037
+ )
2038
+ }
2039
+ }
2040
+
2041
+ async waitForZsetScoreToUpdate ( expectedScore : number ) : Promise < void > {
2042
+ await expect
2043
+ . poll ( async ( ) => {
2044
+ const allScoreElements = await this . page
2045
+ . locator ( '[data-testid^="zset_content-value-"]' )
2046
+ . all ( )
2047
+
2048
+ const textContents = await Promise . all (
2049
+ allScoreElements . map ( ( element ) => element . textContent ( ) ) ,
2050
+ )
2051
+
2052
+ return textContents . some (
2053
+ ( text ) => text && text . includes ( expectedScore . toString ( ) ) ,
2054
+ )
2055
+ } )
2056
+ . toBe ( true )
2057
+ }
2058
+
2059
+ async searchInZsetMembers ( searchTerm : string ) : Promise < void > {
2060
+ // Wait for zset details to be visible first
2061
+ await this . waitForZsetDetailsToBeVisible ( )
2062
+
2063
+ // Try clicking the search button first to make search input visible
2064
+ await this . searchButtonInKeyDetails . click ( )
2065
+
2066
+ const searchInput = this . page . getByTestId ( 'search' )
2067
+
2068
+ // Wait for search input to be ready
2069
+ await expect ( searchInput ) . toBeVisible ( )
2070
+ await expect ( searchInput ) . toBeEnabled ( )
2071
+
2072
+ // Clear any existing search and enter new term
2073
+ await searchInput . clear ( )
2074
+ await searchInput . fill ( searchTerm )
2075
+ await this . page . keyboard . press ( 'Enter' )
2076
+
2077
+ // Wait for search to complete by checking if search input has the value
2078
+ await expect
2079
+ . poll ( async ( ) => {
2080
+ const inputValue = await searchInput . inputValue ( )
2081
+ return inputValue
2082
+ } )
2083
+ . toBe ( searchTerm )
2084
+ }
2085
+
2086
+ async clearZsetSearch ( ) : Promise < void > {
2087
+ // Wait for search input to be ready
2088
+ const searchInput = this . page . getByTestId ( 'search' )
2089
+ await expect ( searchInput ) . toBeVisible ( )
2090
+ await expect ( searchInput ) . toBeEnabled ( )
2091
+ await searchInput . clear ( )
2092
+ await this . page . keyboard . press ( 'Enter' )
2093
+ }
2094
+
2095
+ async waitForZsetDetailsToBeVisible ( ) : Promise < void > {
2096
+ await expect ( this . page . getByTestId ( 'zset-details' ) ) . toBeVisible ( )
2097
+ }
2098
+
2099
+ async waitForZsetMembersToLoad ( expectedCount ?: number ) : Promise < void > {
2100
+ await this . waitForZsetDetailsToBeVisible ( )
2101
+
2102
+ // Wait for loading to complete
2103
+ await expect (
2104
+ this . page . getByTestId ( 'progress-key-zset' ) ,
2105
+ ) . not . toBeVisible ( )
2106
+
2107
+ // If we expect a specific count, wait for that many elements
2108
+ if ( expectedCount !== undefined && expectedCount > 0 ) {
2109
+ await expect
2110
+ . poll ( async ( ) => {
2111
+ const elements = await this . page
2112
+ . locator ( "[data-testid^='zset-member-value-']" )
2113
+ . all ( )
2114
+ return elements . length
2115
+ } )
2116
+ . toBe ( expectedCount )
2117
+ } else if ( expectedCount === undefined ) {
2118
+ // Just wait for at least one element or verify none exist
2119
+ try {
2120
+ await expect ( this . zsetMembersList . first ( ) ) . toBeVisible ( )
2121
+ } catch {
2122
+ // No elements expected or found - this is fine
2123
+ }
2124
+ }
2125
+ }
1786
2126
}
0 commit comments