Skip to content

Commit 21979f1

Browse files
committed
test: verify edit operation for sorted set key value in browsers module
* added e2e test to verify whether the edit key value functionality is working fine for the sorted set type in the browser module re #RI-6570
1 parent 4e64aaf commit 21979f1

File tree

2 files changed

+647
-0
lines changed

2 files changed

+647
-0
lines changed

tests/playwright/pageObjects/browser-page.ts

Lines changed: 305 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1783,4 +1783,309 @@ export class BrowserPage extends BasePage {
17831783
}
17841784
}
17851785
}
1786+
1787+
async addMemberToZsetKey(member: string, score: number): Promise<void> {
1788+
if (await this.toast.isCloseButtonVisible()) {
1789+
await this.toast.closeToast()
1790+
}
1791+
await this.addKeyValueItemsButton.click()
1792+
await this.setMemberInput.fill(member)
1793+
await this.zsetMemberScoreInput.fill(score.toString())
1794+
await this.saveMemberButton.click()
1795+
}
1796+
1797+
async editZsetMemberScore(member: string, newScore: number): Promise<void> {
1798+
// First ensure we're on the right page and elements are loaded
1799+
await this.waitForZsetDetailsToBeVisible()
1800+
1801+
// Find the member element first and ensure it exists
1802+
const memberElement = this.page.locator(
1803+
`[data-testid="zset-member-value-${member}"]`,
1804+
)
1805+
await expect(memberElement).toBeVisible()
1806+
1807+
// We need to hover over the score element, not the member element
1808+
// Wait for score elements to be ready
1809+
await expect(
1810+
this.page.locator('[data-testid^="zset_content-value-"]').first(),
1811+
).toBeVisible()
1812+
1813+
// Get all zset content value elements and try each one until we find the right row
1814+
const allScoreElements = await this.page
1815+
.locator('[data-testid^="zset_content-value-"]')
1816+
.all()
1817+
1818+
let editButton
1819+
let foundVisible = false
1820+
1821+
for (let i = 0; i < allScoreElements.length && !foundVisible; i += 1) {
1822+
const scoreElement = allScoreElements[i]
1823+
// Hover over this score element
1824+
await scoreElement.hover()
1825+
1826+
// Check if an edit button becomes visible
1827+
editButton = this.page
1828+
.locator('[data-testid^="zset_edit-btn-"]')
1829+
.first()
1830+
foundVisible = await editButton.isVisible()
1831+
}
1832+
1833+
// Click the edit button if we found one
1834+
if (editButton && foundVisible) {
1835+
await editButton.click()
1836+
} else {
1837+
throw new Error(`Could not find edit button for member: ${member}`)
1838+
}
1839+
1840+
// Use the correct editor element from the unit tests
1841+
const editorLocator = this.page.locator(
1842+
'[data-testid="inline-item-editor"]',
1843+
)
1844+
await expect(editorLocator).toBeVisible()
1845+
await editorLocator.clear()
1846+
await editorLocator.fill(newScore.toString())
1847+
await this.applyButton.click()
1848+
}
1849+
1850+
async cancelZsetMemberScoreEdit(
1851+
member: string,
1852+
newScore: number,
1853+
): Promise<void> {
1854+
// We need to hover over the score element to make the edit button appear
1855+
// Wait for score elements to be ready
1856+
await expect(
1857+
this.page.locator('[data-testid^="zset_content-value-"]').first(),
1858+
).toBeVisible()
1859+
1860+
// Get all zset content value elements and try each one until we find the right row
1861+
const allScoreElements = await this.page
1862+
.locator('[data-testid^="zset_content-value-"]')
1863+
.all()
1864+
1865+
let editButton
1866+
let foundVisible = false
1867+
1868+
for (let i = 0; i < allScoreElements.length && !foundVisible; i += 1) {
1869+
const scoreElement = allScoreElements[i]
1870+
// Hover over this score element
1871+
await scoreElement.hover()
1872+
1873+
// Check if an edit button becomes visible
1874+
editButton = this.page
1875+
.locator('[data-testid^="zset_edit-btn-"]')
1876+
.first()
1877+
foundVisible = await editButton.isVisible()
1878+
}
1879+
1880+
// Click the edit button if we found one
1881+
if (editButton && foundVisible) {
1882+
await editButton.click()
1883+
} else {
1884+
throw new Error(`Could not find edit button for member: ${member}`)
1885+
}
1886+
1887+
// Use the correct editor element from the unit tests
1888+
const editorLocator = this.page.locator(
1889+
'[data-testid="inline-item-editor"]',
1890+
)
1891+
await expect(editorLocator).toBeVisible()
1892+
await editorLocator.clear()
1893+
await editorLocator.fill(newScore.toString())
1894+
1895+
// Cancel using Escape key
1896+
await this.page.keyboard.press('Escape')
1897+
await expect(editorLocator).not.toBeVisible()
1898+
}
1899+
1900+
async removeMemberFromZset(member: string): Promise<void> {
1901+
const memberElement = this.page.locator(
1902+
`[data-testid="zset-member-value-${member}"]`,
1903+
)
1904+
await memberElement.hover()
1905+
await this.page
1906+
.locator(`[data-testid="zset-remove-button-${member}-icon"]`)
1907+
.click()
1908+
await this.page
1909+
.locator(`[data-testid^="zset-remove-button-${member}"]`)
1910+
.getByText('Remove')
1911+
.click()
1912+
}
1913+
1914+
async removeMultipleMembersFromZset(memberNames: string[]): Promise<void> {
1915+
for (let i = 0; i < memberNames.length; i += 1) {
1916+
await this.removeMemberFromZset(memberNames[i])
1917+
}
1918+
}
1919+
1920+
async removeAllZsetMembers(
1921+
members: Array<{ name: string; score: number }>,
1922+
): Promise<void> {
1923+
for (let i = 0; i < members.length; i += 1) {
1924+
await this.removeMemberFromZset(members[i].name)
1925+
}
1926+
}
1927+
1928+
async waitForZsetLengthToUpdate(expectedLength: number): Promise<void> {
1929+
await expect
1930+
.poll(async () => {
1931+
const keyLength = await this.getKeyLength()
1932+
return parseInt(keyLength, 10)
1933+
})
1934+
.toBe(expectedLength)
1935+
}
1936+
1937+
async verifyZsetContainsMembers(
1938+
expectedMembers: Array<{ name: string; score: number }>,
1939+
): Promise<void> {
1940+
const displayedMembers = await this.getAllZsetMembers()
1941+
1942+
expect(displayedMembers).toHaveLength(expectedMembers.length)
1943+
expectedMembers.forEach((expectedMember) => {
1944+
const foundMember = displayedMembers.find(
1945+
(member) => member.name === expectedMember.name,
1946+
)
1947+
expect(foundMember).toBeDefined()
1948+
expect(foundMember?.score).toBe(expectedMember.score.toString())
1949+
})
1950+
}
1951+
1952+
async verifyZsetDoesNotContainMembers(
1953+
unwantedMembers: string[],
1954+
): Promise<void> {
1955+
const displayedMembers = await this.getAllZsetMembers()
1956+
unwantedMembers.forEach((unwantedMember) => {
1957+
const foundMember = displayedMembers.find(
1958+
(member) => member.name === unwantedMember,
1959+
)
1960+
expect(foundMember).toBeUndefined()
1961+
})
1962+
}
1963+
1964+
async verifyZsetMemberExists(member: string): Promise<void> {
1965+
const memberElement = this.page.locator(
1966+
`[data-testid="zset-member-value-${member}"]`,
1967+
)
1968+
await expect(memberElement).toBeVisible()
1969+
}
1970+
1971+
async verifyZsetMemberNotExists(member: string): Promise<void> {
1972+
const memberElement = this.page.locator(
1973+
`[data-testid="zset-member-value-${member}"]`,
1974+
)
1975+
await expect(memberElement).not.toBeVisible()
1976+
}
1977+
1978+
async verifyZsetMemberScore(
1979+
member: string,
1980+
expectedScore: number,
1981+
): Promise<void> {
1982+
// Since we can't reliably match member to score element by DOM traversal,
1983+
// let's verify that ANY score element contains our expected score
1984+
// This is sufficient for our test since we're editing a specific score
1985+
1986+
const allScoreElements = await this.page
1987+
.locator('[data-testid^="zset_content-value-"]')
1988+
.all()
1989+
1990+
let found = false
1991+
for (const scoreElement of allScoreElements) {
1992+
const scoreText = await scoreElement.textContent()
1993+
if (scoreText && scoreText.includes(expectedScore.toString())) {
1994+
found = true
1995+
break
1996+
}
1997+
}
1998+
1999+
if (!found) {
2000+
throw new Error(
2001+
`Expected score ${expectedScore} not found in any zset score elements`,
2002+
)
2003+
}
2004+
}
2005+
2006+
async waitForZsetScoreToUpdate(expectedScore: number): Promise<void> {
2007+
await expect
2008+
.poll(async () => {
2009+
const allScoreElements = await this.page
2010+
.locator('[data-testid^="zset_content-value-"]')
2011+
.all()
2012+
2013+
const textContents = await Promise.all(
2014+
allScoreElements.map((element) => element.textContent()),
2015+
)
2016+
2017+
return textContents.some(
2018+
(text) => text && text.includes(expectedScore.toString()),
2019+
)
2020+
})
2021+
.toBe(true)
2022+
}
2023+
2024+
async searchInZsetMembers(searchTerm: string): Promise<void> {
2025+
// Wait for zset details to be visible first
2026+
await this.waitForZsetDetailsToBeVisible()
2027+
2028+
// Try clicking the search button first to make search input visible
2029+
await this.searchButtonInKeyDetails.click()
2030+
2031+
const searchInput = this.page.getByTestId('search')
2032+
2033+
// Wait for search input to be ready
2034+
await expect(searchInput).toBeVisible()
2035+
await expect(searchInput).toBeEnabled()
2036+
2037+
// Clear any existing search and enter new term
2038+
await searchInput.clear()
2039+
await searchInput.fill(searchTerm)
2040+
await this.page.keyboard.press('Enter')
2041+
2042+
// Wait for search to complete by checking if search input has the value
2043+
await expect
2044+
.poll(async () => {
2045+
const inputValue = await searchInput.inputValue()
2046+
return inputValue
2047+
})
2048+
.toBe(searchTerm)
2049+
}
2050+
2051+
async clearZsetSearch(): Promise<void> {
2052+
// Wait for search input to be ready
2053+
const searchInput = this.page.getByTestId('search')
2054+
await expect(searchInput).toBeVisible()
2055+
await expect(searchInput).toBeEnabled()
2056+
await searchInput.clear()
2057+
await this.page.keyboard.press('Enter')
2058+
}
2059+
2060+
async waitForZsetDetailsToBeVisible(): Promise<void> {
2061+
await expect(this.page.getByTestId('zset-details')).toBeVisible()
2062+
}
2063+
2064+
async waitForZsetMembersToLoad(expectedCount?: number): Promise<void> {
2065+
await this.waitForZsetDetailsToBeVisible()
2066+
2067+
// Wait for loading to complete
2068+
await expect(
2069+
this.page.getByTestId('progress-key-zset'),
2070+
).not.toBeVisible()
2071+
2072+
// If we expect a specific count, wait for that many elements
2073+
if (expectedCount !== undefined && expectedCount > 0) {
2074+
await expect
2075+
.poll(async () => {
2076+
const elements = await this.page
2077+
.locator("[data-testid^='zset-member-value-']")
2078+
.all()
2079+
return elements.length
2080+
})
2081+
.toBe(expectedCount)
2082+
} else if (expectedCount === undefined) {
2083+
// Just wait for at least one element or verify none exist
2084+
try {
2085+
await expect(this.zsetMembersList.first()).toBeVisible()
2086+
} catch {
2087+
// No elements expected or found - this is fine
2088+
}
2089+
}
2090+
}
17862091
}

0 commit comments

Comments
 (0)