Skip to content

Commit 0059123

Browse files
Merge pull request #243 from RedisInsight/e2e/feature/RI-6525
add tests
2 parents 72ecbec + 9ed5ac0 commit 0059123

File tree

9 files changed

+322
-8
lines changed

9 files changed

+322
-8
lines changed

Diff for: tests/e2e/src/helpers/common-actions/DatabasesActions.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export class DatabasesActions extends CommonDriverExtension {
7979
await treeView.switchToInnerViewFrame(InnerViews.TreeInnerView)
8080
if (
8181
!(await treeView.isElementDisplayed(
82-
treeView.getRefreshDatabaseBtnByName(databaseParameters.databaseName!),
82+
treeView.getRefreshIndexedDatabaseBtnByName(databaseParameters.databaseName!),
8383
))
8484
) {
8585
await treeView.clickDatabaseByName(databaseParameters.databaseName!)

Diff for: tests/e2e/src/page-objects/components/editor-view/EditDatabaseView.ts

+2
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,6 @@ export class EditDatabaseView extends DatabaseDetailsView {
1212
moduleBloomIcon = By.xpath(`//*[contains(@data-testid, 'RedisBloom')]`)
1313
moduleAIIcon = By.xpath(`//*[contains(@data-testid, 'RedisAI')]`)
1414
moduleGearsIcon = By.xpath(`//*[contains(@data-testid, 'RedisGears')]`)
15+
removeCertificateButton = By.xpath(`//button[contains(@data-testid, 'delete-option-')]`)
16+
confirmRemoveCertificateButton = By.xpath(`//vscode-button[contains(@data-testid, 'delete-option-')]`)
1517
}

Diff for: tests/e2e/src/page-objects/components/editor-view/KeyDetailsView.ts

+24
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
import { CommonDriverExtension } from '@e2eSrc/helpers/CommonDriverExtension'
88
import { WebView } from '@e2eSrc/page-objects/components/WebView'
99
import { InputWithButtons } from '../common/InputWithButtons'
10+
import { Key } from 'vscode-extension-tester'
1011

1112
/**
1213
* Key details view
@@ -16,9 +17,14 @@ export class KeyDetailsView extends WebView {
1617
keySize = By.xpath(`//div[@data-testid='key-size-text']`)
1718
keyLength = By.xpath(`//div[@data-testid='key-length-text']`)
1819
refreshKeyButton = By.xpath(`//*[@data-testid='key-refresh-btn']`)
20+
refreshKeyArrow = By.xpath(`//*[@data-testid='key-auto-refresh-config-btn']`)
21+
refreshKeyMessage = By.xpath(`//*[@data-testid='key-refresh-message']`)
22+
autoRefreshInput= By.xpath(`//*[@data-testid='inline-item-editor']`)
23+
autoRefreshCheckBox= By.xpath(`//*[contains(@class, 'popover-auto-refresh-content')]//label`)
1924
applyBtn = By.xpath(
2025
`//*[@class='key-details-body']//*[@data-testid='apply-btn']`,
2126
)
27+
applyRefreshButton = By.xpath(`//*[@data-testid='key-auto-refresh-rate-input']//*[@data-testid="apply-btn"]`)
2228
applyEditButton = By.xpath(`//*[@data-testid='apply-edit-btn']`)
2329
searchInput = By.xpath(`//*[@data-testid='search']`)
2430
clearSearchInput = By.xpath(`//*[@data-testid='decline-search-button']`)
@@ -215,4 +221,22 @@ export class KeyDetailsView extends WebView {
215221
formatter,
216222
)
217223
}
224+
225+
/**
226+
* Set auto-refresh
227+
* @param rate The rate for refresh
228+
*/
229+
async setAutoRefresh(rate: number = 5): Promise<void> {
230+
await ButtonActions.clickElement(this.refreshKeyArrow)
231+
await ButtonActions.clickElement(this.autoRefreshInput)
232+
// clear the input
233+
for (let i = 0; i < 3; i++) {
234+
await InputActions.pressKey(this.autoRefreshInput, Key.BACK_SPACE)
235+
}
236+
await InputActions.typeText(this.autoRefreshInput, rate.toString())
237+
await ButtonActions.clickElement(this.autoRefreshInput)
238+
await ButtonActions.clickElement(this.applyRefreshButton)
239+
await ButtonActions.clickElement(this.autoRefreshCheckBox)
240+
await ButtonActions.clickElement(this.refreshKeyButton)
241+
}
218242
}

Diff for: tests/e2e/src/page-objects/components/tree-view/TreeView.ts

+33-4
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,14 @@ export class TreeView extends WebView {
103103
By.xpath(
104104
`.//div[starts-with(@data-testid, 'database-')][.//*[text()='${name}']]/..//vscode-button[@data-testid='edit-database']`,
105105
)
106-
getRefreshDatabaseBtnByName = (name: string): Locator =>
106+
getRefreshIndexedDatabaseBtnByName = (name: string): Locator =>
107107
By.xpath(
108108
`.//div[starts-with(@data-testid, 'database-')][.//*[text()='${name}']]/../..//button[@data-testid = 'refresh-keys-refresh-btn']`,
109109
)
110+
getRefreshDatabaseBtnByName = (name: string): Locator =>
111+
By.xpath(
112+
`//div[starts-with(@data-testid, 'database-')][.//*[text()='${name}']]/..//vscode-button[@data-testid = 'refresh-databases']`,
113+
)
110114
getCLIDatabaseBtnByName = (name: string): Locator =>
111115
By.xpath(
112116
`.//div[starts-with(@data-testid, 'database-')][.//*[text()='${name}']]/../..//vscode-button[@data-testid = 'terminal-button']`,
@@ -121,7 +125,10 @@ export class TreeView extends WebView {
121125
By.xpath(
122126
`(//div[@role='treeitem']//div[starts-with(@data-testid, 'key-')])[position() <= ${number}]`,
123127
)
124-
128+
getIndexedDataBaseSummary = (number: number): Locator =>
129+
By.xpath(
130+
`//div[contains(@data-testid, 'logical-database') and contains(@data-testid, '-${number}')]//div[@data-testid = 'keys-summary']`,
131+
)
125132
/**
126133
* Open key details of the key by name
127134
* @param keyName The name of the key
@@ -228,11 +235,33 @@ export class TreeView extends WebView {
228235
* @param databaseName The name of the database
229236
*/
230237
async refreshDatabaseByName(databaseName: string): Promise<void> {
238+
await ButtonActions.clickElement(
239+
this.getRefreshIndexedDatabaseBtnByName(databaseName),
240+
)
241+
await this.waitForElementVisibility(this.loadingIndicator, 1000, true)
242+
await this.waitForElementVisibility(this.loadingIndicator, 1000, false)
243+
}
244+
245+
/**
246+
* Click on indexed database in list by its name
247+
* @param index The index of the database
248+
*/
249+
async clickOnIndexedDb(index: number): Promise<void> {
250+
await ButtonActions.clickElement(
251+
this.getIndexedDataBaseSummary(index),
252+
)
253+
await this.waitForElementVisibility(this.loadingIndicator, 1000, true)
254+
await this.waitForElementVisibility(this.loadingIndicator, 1000, false)
255+
}
256+
257+
/**
258+
* Click on refresh database in list by its name
259+
* @param databaseName The name of the database
260+
*/
261+
async refreshNotIndexedDatabaseByName(databaseName: string): Promise<void> {
231262
await ButtonActions.clickElement(
232263
this.getRefreshDatabaseBtnByName(databaseName),
233264
)
234-
// Hover to CLI btn to not display refresh popover
235-
await ButtonActions.hoverElement(this.getCLIDatabaseBtnByName(databaseName))
236265
await this.waitForElementVisibility(this.loadingIndicator, 1000, true)
237266
await this.waitForElementVisibility(this.loadingIndicator, 1000, false)
238267
}

Diff for: tests/e2e/src/tests/browser/formatters.e2e.ts

+72-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import {
1818
TreeView,
1919
KeyDetailsView,
2020
HashKeyDetailsView,
21-
StringKeyDetailsView,
21+
StringKeyDetailsView, CliViewPanel,
2222
} from '@e2eSrc/page-objects/components'
2323
import {
2424
ButtonActions,
@@ -73,6 +73,7 @@ describe('Formatters', () => {
7373
let hashKeyDetailsView: HashKeyDetailsView
7474
let stringKeyDetailsView: StringKeyDetailsView
7575
let doubleColumnKeyDetailsView: DoubleColumnKeyDetailsView
76+
let cliViewPanel: CliViewPanel
7677

7778
let keysData = keyTypesShort
7879
.map((object: any) => ({ ...object }))
@@ -98,6 +99,7 @@ describe('Formatters', () => {
9899
hashKeyDetailsView = new HashKeyDetailsView()
99100
stringKeyDetailsView = new StringKeyDetailsView()
100101
doubleColumnKeyDetailsView = new DoubleColumnKeyDetailsView()
102+
cliViewPanel = new CliViewPanel()
101103

102104
await DatabasesActions.acceptLicenseTermsAndAddDatabaseApi(
103105
Config.ossStandaloneConfig,
@@ -576,4 +578,73 @@ describe('Formatters', () => {
576578
}
577579
})
578580
})
581+
it('Verify that Datatime is parse for Java', async function () {
582+
const DataTimeValue1 = "ACED00057372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000075371FBB0078"
583+
const DataTimeValue2 = "ACED00057372000E6A6176612E7574696C2E44617465686A81014B59741903000078707708FFFFFF98C729B30078"
584+
const expectedDate1 = '"1985-12-14T19:20:00.000Z"'
585+
const expectedDate2 = '"1955-12-14T19:20:00.000Z"'
586+
587+
let keyName = Common.generateWord(10)
588+
589+
await KeyAPIRequests.addKeyApi(
590+
{ keyName: keyName, keyType: KeyTypesShort.Hash },
591+
Config.ossStandaloneConfig.databaseName,
592+
)
593+
// Refresh database
594+
await treeView.refreshDatabaseByName(
595+
Config.ossStandaloneConfig.databaseName,
596+
)
597+
598+
// Open Hash key details
599+
await KeyDetailsActions.openKeyDetailsByKeyNameInIframe(keyName)
600+
await keyDetailsView.selectFormatter(Formatters.HEX)
601+
602+
await hashKeyDetailsView.editHashKeyValue(DataTimeValue1, 'test_field')
603+
await keyDetailsView.selectFormatter(Formatters.Java)
604+
605+
expect(
606+
await hashKeyDetailsView.getElementText(
607+
hashKeyDetailsView.hashValuesList,),).contains(
608+
expectedDate1,'the value is not parsed')
609+
610+
await keyDetailsView.selectFormatter(Formatters.HEX)
611+
612+
await hashKeyDetailsView.editHashKeyValue(DataTimeValue2, 'test_field')
613+
await keyDetailsView.selectFormatter(Formatters.Java)
614+
615+
expect(
616+
await hashKeyDetailsView.getElementText(
617+
hashKeyDetailsView.hashValuesList,),).contains(
618+
expectedDate2,'the value is not parsed')
619+
})
620+
621+
it('Verify that UTF8 in PHP serialized', async function () {
622+
const phpValueChinese = '测试'
623+
const phpValueCRussian = 'Привет мир!'
624+
let keyName = Common.generateWord(10)
625+
const setValue =`SET ${keyName} "a:3:{s:4:\\"name\\";s:6:\\"${phpValueChinese}\\";s:3:\\"age\\";i:30;s:7:\\"message\\";s:20:\\"${phpValueCRussian}\\";}"`
626+
627+
await treeView.switchBack()
628+
await treeView.switchToInnerViewFrame(InnerViews.TreeInnerView)
629+
await treeView.openCliByDatabaseName(
630+
Config.ossStandaloneConfig.databaseName
631+
)
632+
await treeView.switchBack()
633+
await CommonDriverExtension.driverSleep(1000)
634+
await cliViewPanel.switchToInnerViewFrame(InnerViews.CliInnerView)
635+
await cliViewPanel.executeCommand(setValue)
636+
await cliViewPanel.switchBack()
637+
await treeView.switchToInnerViewFrame(InnerViews.TreeInnerView)
638+
await treeView.refreshDatabaseByName(Config.ossStandaloneConfig.databaseName)
639+
await KeyDetailsActions.openKeyDetailsByKeyNameInIframe(keyName)
640+
await keyDetailsView.selectFormatter(Formatters.PHP)
641+
642+
expect(
643+
await stringKeyDetailsView.getStringKeyValue(),).contains(
644+
phpValueChinese,'Chinese value is not parsed')
645+
646+
expect(
647+
await stringKeyDetailsView.getStringKeyValue(),).contains(
648+
phpValueCRussian,'russian value is not parsed')
649+
})
579650
})

Diff for: tests/e2e/src/tests/browser/hash-key.e2e.ts

+37
Original file line numberDiff line numberDiff line change
@@ -202,4 +202,41 @@ describe('Hash Key fields verification', () => {
202202
// Verify that details panel is closed for hash key after deletion
203203
await KeyDetailsActions.verifyDetailsPanelClosed()
204204
})
205+
206+
it('Verify that auto-refresh can be set', async function () {
207+
keyName = Common.generateWord(10)
208+
209+
const hashKeyParameters: HashKeyParameters = {
210+
keyName: keyName,
211+
fields: [
212+
{
213+
field: 'field',
214+
value: 'value',
215+
},
216+
],
217+
}
218+
await KeyAPIRequests.addHashKeyApi(
219+
hashKeyParameters,
220+
Config.ossStandaloneConfig.databaseName,
221+
)
222+
// Refresh database
223+
await treeView.refreshDatabaseByName(
224+
Config.ossStandaloneConfig.databaseName,
225+
)
226+
227+
// Open key details iframe
228+
await KeyDetailsActions.openKeyDetailsByKeyNameInIframe(keyName)
229+
await keyDetailsView.setAutoRefresh(1)
230+
let elements = await keyDetailsView.getElements(keyDetailsView.refreshKeyMessage)
231+
let text = await elements[0].getText()
232+
expect(text).eql('1 s', 'value is not set')
233+
234+
await ButtonActions.clickElement(keyDetailsView.refreshKeyArrow)
235+
await ButtonActions.clickElement(keyDetailsView.autoRefreshCheckBox)
236+
await ButtonActions.clickElement(keyDetailsView.refreshKeyButton)
237+
238+
elements = await keyDetailsView.getElements(keyDetailsView.refreshKeyMessage)
239+
text = await elements[0].getText()
240+
expect(text).eql('now', 'value is still set')
241+
})
205242
})

Diff for: tests/e2e/src/tests/browser/json-key.e2e.ts

+16
Original file line numberDiff line numberDiff line change
@@ -294,4 +294,20 @@ describe('Add JSON Key verification', () => {
294294
// Check the notification message that key added
295295
await NotificationActions.checkNotificationMessage(`Key has been added`)
296296
})
297+
it('Verify that user can add big int', async function () {
298+
keyName = Common.generateWord(10)
299+
const bigInt = '12345678998768'
300+
const jsonStructure = `{"bigInt": ${bigInt}, "string":"${bigInt}"}`
301+
const jsonKeyParameters: JsonKeyParameters = {
302+
keyName: keyName,
303+
data: jsonStructure,
304+
}
305+
await addJsonKeyView.addKey(jsonKeyParameters, KeyTypesShort.ReJSON)
306+
await addJsonKeyView.switchBack()
307+
await treeView.switchToInnerViewFrame(InnerViews.KeyDetailsInnerView)
308+
await addJsonKeyView.waitForElementVisibility(keyDetailsView.jsonKeyValue)
309+
const jsonValue = await keyDetailsView.getElementText(keyDetailsView.jsonKeyValue)
310+
expect(jsonValue).contains(bigInt, 'the big int value is truncated')
311+
expect(jsonValue).contains(`"${bigInt}"`, 'the big int value is not string')
312+
})
297313
})

Diff for: tests/e2e/src/tests/database/edit-db.e2e.ts

+29-2
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,11 @@ describe('Edit Databases', () => {
6969
)
7070

7171
expect(caCertFieldValue).not.contains(
72-
'NO_CA_CERT',
72+
'No CA Certificate',
7373
'CA certificate is incorrect',
7474
)
7575
expect(clientCertFieldValue).not.contains(
76-
'ADD_NEW',
76+
'Add new certificate',
7777
'Client certificate is incorrect',
7878
)
7979

@@ -85,4 +85,31 @@ describe('Edit Databases', () => {
8585
await editDatabaseView.switchBack()
8686
await DatabasesActions.verifyDatabaseEdited()
8787
})
88+
89+
it('Verify that user can remove certificates', async function () {
90+
await ButtonActions.clickElement(editDatabaseView.caCertField)
91+
await ButtonActions.clickElement(editDatabaseView.removeCertificateButton)
92+
await ButtonActions.clickElement(editDatabaseView.confirmRemoveCertificateButton)
93+
94+
await ButtonActions.clickElement(editDatabaseView.clientCertField)
95+
await ButtonActions.clickElement(editDatabaseView.removeCertificateButton)
96+
await ButtonActions.clickElement(editDatabaseView.confirmRemoveCertificateButton)
97+
98+
const caCertFieldValue = await editDatabaseView.getElementText(
99+
editDatabaseView.caCertField,
100+
)
101+
const clientCertFieldValue = await editDatabaseView.getElementText(
102+
editDatabaseView.clientCertField,
103+
)
104+
105+
expect(caCertFieldValue).contains(
106+
'No CA Certificate',
107+
'CA certificate is not removed',
108+
)
109+
expect(clientCertFieldValue).contains(
110+
'Add new certificate',
111+
'Client certificate is incorrect',
112+
)
113+
await editDatabaseView.switchBack()
114+
})
88115
})

0 commit comments

Comments
 (0)