Skip to content

Commit f551b57

Browse files
committed
test: verify read operation for list keys in browsers module
* extend the API to support adding list keys * extend browser page locators to provide helper for checking the state of the list keys details drawer * added e2e test to verify whether the information related to a list key is proplery displayed in the details drawer re #RI-6570
1 parent dd59f8c commit f551b57

File tree

3 files changed

+109
-1
lines changed

3 files changed

+109
-1
lines changed

tests/playwright/helpers/api/api-keys.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,31 @@ export class APIKeyRequests {
6262
throw new Error('The creation of new Hash key request failed')
6363
}
6464

65+
async addListKeyApi(
66+
keyParameters: { keyName: string; elements: string[]; expire?: number },
67+
databaseParameters: AddNewDatabaseParameters,
68+
): Promise<void> {
69+
const databaseId = await this.databaseAPIRequests.getDatabaseIdByName(
70+
databaseParameters.databaseName,
71+
)
72+
const requestBody = {
73+
keyName: Buffer.from(keyParameters.keyName, 'utf-8'),
74+
elements: keyParameters.elements.map((element) =>
75+
Buffer.from(element, 'utf-8'),
76+
),
77+
expire: keyParameters?.expire,
78+
}
79+
80+
const response = await this.apiClient.post(
81+
`/databases/${databaseId}/list?encoding=buffer`,
82+
requestBody,
83+
)
84+
85+
if (response.status !== 201) {
86+
throw new Error('The creation of new List key request failed')
87+
}
88+
}
89+
6590
async addStreamKeyApi(
6691
keyParameters: StreamKeyParameters,
6792
databaseParameters: AddNewDatabaseParameters,

tests/playwright/pageObjects/browser-page.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,9 @@ export class BrowserPage extends BasePage {
529529
this.setMembersList = page.getByTestId('set-member-value-')
530530
this.zsetMembersList = page.getByTestId('zset-member-value-')
531531
this.zsetScoresList = page.getByTestId('zset_content-value-')
532-
this.listElementsList = page.getByTestId('list_content-value-')
532+
this.listElementsList = page.locator(
533+
'[data-testid^="list_content-value-"]',
534+
)
533535
this.jsonKeyValue = page.getByTestId('json-data')
534536
this.jsonError = page.getByTestId('edit-json-error')
535537
this.tooltip = page.locator('[role="tooltip"]')
@@ -1380,4 +1382,19 @@ export class BrowserPage extends BasePage {
13801382
async getKeyTTL(): Promise<string | null> {
13811383
return this.keyDetailsTTL.textContent()
13821384
}
1385+
1386+
async getAllListElements(): Promise<string[]> {
1387+
// Get all list elements' text content
1388+
const elements = await this.listElementsList.all()
1389+
const values: string[] = []
1390+
1391+
for (let i = 0; i < elements.length; i += 1) {
1392+
const text = await elements[i].textContent()
1393+
if (text && text.trim()) {
1394+
values.push(text.trim())
1395+
}
1396+
}
1397+
1398+
return values
1399+
}
13831400
}

tests/playwright/tests/browser/keys-read.spec.ts

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,4 +157,70 @@ test.describe('Browser - Read Key Details', () => {
157157
const isDetailsClosed = await browserPage.isKeyDetailsClosed()
158158
expect(isDetailsClosed).toBe(true)
159159
})
160+
161+
test('should open key details when clicking on list key', async ({
162+
api: { keyService },
163+
}) => {
164+
const listElements = [
165+
faker.lorem.word(),
166+
faker.lorem.word(),
167+
faker.lorem.word(),
168+
]
169+
const keyTTL = 3600 // 1 hour
170+
171+
// Create a list key with multiple elements using API
172+
await keyService.addListKeyApi(
173+
{ keyName, elements: listElements, expire: keyTTL },
174+
ossStandaloneConfig,
175+
)
176+
177+
// Search for the key to ensure it's visible
178+
await browserPage.searchByKeyName(keyName)
179+
180+
// Click on the key to open details
181+
await browserPage.openKeyDetailsByKeyName(keyName)
182+
183+
// Verify key details panel is open
184+
const isDetailsOpen = await browserPage.isKeyDetailsOpen(keyName)
185+
expect(isDetailsOpen).toBe(true)
186+
187+
// Verify list elements are displayed
188+
const displayedElements = await browserPage.getAllListElements()
189+
expect(displayedElements).toHaveLength(listElements.length)
190+
191+
// Verify all expected elements are present (order might be different)
192+
listElements.forEach((expectedElement) => {
193+
expect(displayedElements).toContain(expectedElement)
194+
})
195+
196+
// Verify the key length shows correct number of elements
197+
const keyLength = await browserPage.getKeyLength()
198+
expect(keyLength).toBe(listElements.length.toString())
199+
200+
// Verify the key size (bytes) is displayed correctly
201+
const keySizeText = await browserPage.keySizeDetails.textContent()
202+
expect(keySizeText).toBeTruthy()
203+
204+
// Verify the TTL value is displayed correctly
205+
const displayedTTL = await browserPage.getKeyTTL()
206+
expect(displayedTTL).toContain('TTL:')
207+
208+
// Extract the TTL value from the text and verify it's within expected range
209+
const ttlMatch = displayedTTL?.match(/TTL:\s*(\d+|No limit)/)
210+
expect(ttlMatch).toBeTruthy()
211+
212+
if (ttlMatch && ttlMatch[1] !== 'No limit') {
213+
const actualTTL = parseInt(ttlMatch[1], 10)
214+
// TTL should be close to what we set (allowing for some time passage during test execution)
215+
expect(actualTTL).toBeGreaterThan(keyTTL - 60)
216+
expect(actualTTL).toBeLessThanOrEqual(keyTTL)
217+
}
218+
219+
// Close the details
220+
await browserPage.closeKeyDetails()
221+
222+
// Verify details are closed
223+
const isDetailsClosed = await browserPage.isKeyDetailsClosed()
224+
expect(isDetailsClosed).toBe(true)
225+
})
160226
})

0 commit comments

Comments
 (0)