Skip to content

Commit c82b46b

Browse files
authored
Merge pull request #250 from RedisInsight/e2e/feature/RI-6514_support-multiple-key-name-delimiter
e2e/feature/RI-6514_support-multiple-key-name-delimiter
2 parents a7e18a0 + edd7209 commit c82b46b

File tree

4 files changed

+247
-55
lines changed

4 files changed

+247
-55
lines changed

tests/e2e/src/helpers/common-actions/TreeViewActions.ts

Lines changed: 45 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,24 @@ export class TreeViewActions extends CommonDriverExtension {
1111
* Verify that not patterned keys not visible with delimiter
1212
* @param delimiter string with delimiter value
1313
*/
14-
static async verifyNotPatternedKeys(delimiter: string): Promise<void> {
14+
static async verifyNotPatternedKeysNotDisplayed(
15+
delimiter: string,
16+
): Promise<void> {
1517
let treeView = new TreeView()
16-
const notPatternedKeys = await treeView.getElements(
17-
treeView.getLimitedTreeViewKeys(40),
18-
)
19-
const notPatternedKeysNumber = notPatternedKeys.length
20-
21-
for (let i = 0; i < notPatternedKeysNumber; i++) {
22-
expect(await notPatternedKeys[i].getText()).not.contain(
23-
delimiter,
24-
'Not patterned Keys contain delimiter',
18+
if (
19+
await treeView.isElementDisplayed(treeView.getLimitedTreeViewKeys(40))
20+
) {
21+
const notPatternedKeys = await treeView.getElements(
22+
treeView.getLimitedTreeViewKeys(40),
2523
)
24+
const notPatternedKeysNumber = notPatternedKeys.length
25+
26+
for (let i = 0; i < notPatternedKeysNumber; i++) {
27+
expect(await notPatternedKeys[i].getText()).not.contain(
28+
delimiter,
29+
'Not patterned Keys contain delimiter',
30+
)
31+
}
2632
}
2733
}
2834

@@ -35,9 +41,11 @@ export class TreeViewActions extends CommonDriverExtension {
3541
static getNodeName(
3642
startFolder: string,
3743
folderName: string,
38-
delimiter: string,
44+
delimiter?: string,
3945
): string {
40-
return startFolder + folderName + delimiter
46+
return delimiter
47+
? `${startFolder}${delimiter}${folderName}`
48+
: `${startFolder}${folderName}`
4149
}
4250

4351
/**
@@ -47,37 +55,43 @@ export class TreeViewActions extends CommonDriverExtension {
4755
*/
4856
static async checkTreeViewFoldersStructure(
4957
folders: string[][],
50-
delimiter: string,
58+
delimiters: string[],
5159
): Promise<void> {
5260
let treeView = new TreeView()
5361
// Wait for key refresh
5462
await TreeViewActions.driverSleep(2000)
5563
// Verify not patterned keys
56-
await this.verifyNotPatternedKeys(delimiter)
64+
await this.verifyNotPatternedKeysNotDisplayed(delimiters[0])
5765

58-
const foldersNumber = folders.length
66+
for (let i = 0; i < folders.length; i++) {
67+
const delimiter = delimiters.length > 1 ? '-' : delimiters[0]
68+
let prevNodeName = ''
69+
let prevDelimiter = ''
5970

60-
for (let i = 0; i < foldersNumber; i++) {
61-
const innerFoldersNumber = folders[i].length
62-
let prevNodeSelector = ''
63-
64-
for (let j = 0; j < innerFoldersNumber; j++) {
71+
// Expand subfolders
72+
for (let j = 0; j < folders[i].length; j++) {
6573
const nodeName = this.getNodeName(
66-
prevNodeSelector,
74+
prevNodeName,
6775
folders[i][j],
68-
delimiter,
76+
prevDelimiter,
6977
)
7078
const node = treeView.getFolderSelectorByName(nodeName)
71-
const fullTestIdSelector = await treeView.getElementAttribute(node, 'data-testid')
79+
const fullTestIdSelector = await treeView.getElementAttribute(
80+
node,
81+
'data-testid',
82+
)
83+
7284
if (!fullTestIdSelector?.includes('expanded')) {
7385
await ButtonActions.clickElement(node)
7486
}
75-
prevNodeSelector = nodeName
87+
88+
prevNodeName = nodeName
89+
prevDelimiter = delimiter
7690
}
7791

7892
// Verify that the last folder level contains required keys
7993
const foundKeyName = `${folders[i].join(delimiter)}`
80-
const firstFolderName = this.getNodeName('', folders[i][0], delimiter)
94+
const firstFolderName = this.getNodeName('', folders[i][0])
8195
const firstFolder = treeView.getFolderSelectorByName(firstFolderName)
8296
expect(
8397
await treeView.isElementDisplayed(
@@ -109,7 +123,12 @@ export class TreeViewActions extends CommonDriverExtension {
109123
regExp,
110124
`The database is not automatically scanned by ${i} 000 keys`,
111125
)
112-
await ButtonActions.clickAndWaitForElement(treeView.scanMoreBtn, treeView.loadingIndicator, true, 2000)
126+
await ButtonActions.clickAndWaitForElement(
127+
treeView.scanMoreBtn,
128+
treeView.loadingIndicator,
129+
true,
130+
2000,
131+
)
113132
await treeView.waitForElementVisibility(
114133
treeView.loadingIndicator,
115134
2000,

tests/e2e/src/page-objects/components/editor-view/SettingsView.ts

Lines changed: 63 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import {
55
CheckboxActions,
66
InputActions,
77
} from '@e2eSrc/helpers/common-actions'
8-
import { InputWithButtons } from '../common/InputWithButtons'
98

109
/**
1110
* Settings view
@@ -17,7 +16,29 @@ export class SettingsView extends WebView {
1716
switchAnalyticsCheckbox = By.xpath(
1817
`//input[@data-testid='check-option-analytics']/../../div[contains(@class, 'checkmarkContainer')]`,
1918
)
20-
delimiterInput = By.xpath(`//input[@data-testid='input-delimiter']`)
19+
delimiterComboboxInput = By.xpath(`//input[@id='select-multi-delimiters']`)
20+
applyDelimiterButton = By.xpath(`//*[@data-testid='apply-delimiter-btn']`)
21+
removeDelimiterIcon = By.xpath(
22+
`//div[contains(@class, "multiValue_")]/div[@role='button']`,
23+
)
24+
25+
/**
26+
* Get Delimiter badge selector by title
27+
* @param delimiterTitle title of the delimiter item
28+
*/
29+
getDelimiterBadgeByTitle = (delimiterTitle: string): By =>
30+
By.xpath(
31+
`//*[contains(text(), '${delimiterTitle}')]/parent::div[contains(@class, "multiValue_")]`,
32+
)
33+
34+
/**
35+
* Get Delimiter close button selector by title
36+
* @param delimiterTitle title of the delimiter item
37+
*/
38+
getDelimiterCloseBtnByTitle = (delimiterTitle: string): By =>
39+
By.xpath(
40+
`//*[contains(text(), '${delimiterTitle}')]/parent::div[contains(@class, "multiValue_")]/div[@role='button']`,
41+
)
2142

2243
/**
2344
* Get state of Analytics switcher
@@ -31,7 +52,45 @@ export class SettingsView extends WebView {
3152
* Set delimiter default value
3253
*/
3354
async setDelimiterDefaultValue(): Promise<void> {
34-
await InputActions.slowType(this.delimiterInput, ':')
35-
await ButtonActions.clickElement(InputWithButtons.applyInput)
55+
await this.changeDelimiterInTreeView(':')
56+
}
57+
58+
/**
59+
* Add new delimiter
60+
* @param delimiterName name of the delimiter item
61+
*/
62+
async addDelimiterItem(delimiterName: string): Promise<void> {
63+
await ButtonActions.clickElement(this.delimiterComboboxInput)
64+
await InputActions.slowType(this.delimiterComboboxInput, delimiterName)
65+
await InputActions.pressKey(this.delimiterComboboxInput, 'enter')
66+
await ButtonActions.clickElement(this.applyDelimiterButton)
67+
}
68+
69+
/**
70+
* Delete existing delimiter
71+
* @param delimiterName name of the delimiter item
72+
*/
73+
async removeDelimiterItem(delimiterName: string): Promise<void> {
74+
await ButtonActions.clickElement(
75+
this.getDelimiterCloseBtnByTitle(delimiterName),
76+
)
77+
}
78+
79+
/**
80+
* Remove all existing delimiters in combobox
81+
*/
82+
async clearDelimiterCombobox(): Promise<void> {
83+
while (await super.isElementDisplayed(this.removeDelimiterIcon)) {
84+
await ButtonActions.clickElement(this.removeDelimiterIcon)
85+
}
86+
}
87+
88+
/**
89+
* Change delimiter value
90+
* @param delimiter string with delimiter value
91+
*/
92+
async changeDelimiterInTreeView(delimiter: string): Promise<void> {
93+
await this.clearDelimiterCombobox()
94+
await this.addDelimiterItem(delimiter)
3695
}
3796
}

tests/e2e/src/tests/settings/settings.e2e.ts

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import { expect } from 'chai'
22
import { describe, it } from 'mocha'
3-
import { before, beforeEach, after, afterEach, EditorView } from 'vscode-extension-tester'
4-
import { InnerViews } from '@e2eSrc/page-objects/components/WebView'
53
import {
6-
TreeView,
7-
SettingsView,
8-
InputWithButtons,
9-
} from '@e2eSrc/page-objects/components'
4+
before,
5+
beforeEach,
6+
after,
7+
afterEach,
8+
EditorView,
9+
} from 'vscode-extension-tester'
10+
import { InnerViews } from '@e2eSrc/page-objects/components/WebView'
11+
import { TreeView, SettingsView } from '@e2eSrc/page-objects/components'
1012
import {
1113
ButtonActions,
1214
CheckboxActions,
@@ -50,9 +52,7 @@ describe('Settings', () => {
5052
await ButtonActions.clickElement(treeView.settingsButton)
5153
await settingsView.switchToInnerViewFrame(InnerViews.SettingsInnerView)
5254
// Change delimiter
53-
await ButtonActions.clickElement(settingsView.delimiterInput)
54-
await InputActions.slowType(settingsView.delimiterInput, ':')
55-
await ButtonActions.clickElement(InputWithButtons.applyInput)
55+
await settingsView.setDelimiterDefaultValue()
5656
await settingsView.switchBack()
5757
await DatabaseAPIRequests.deleteAllDatabasesApi()
5858
})
@@ -79,25 +79,31 @@ describe('Settings', () => {
7979

8080
it('Verify that when user changes the delimiter and clicks on Save button delimiter is applied', async function () {
8181
// Check the default delimiter value
82-
expect(await InputActions.getInputValue(settingsView.delimiterInput)).eql(
83-
':',
84-
'Default delimiter not applied',
85-
)
82+
expect(
83+
await settingsView.isElementDisplayed(
84+
settingsView.getDelimiterBadgeByTitle(':'),
85+
),
86+
).eql(true, 'Default delimiter not applied')
8687
// Apply new value to the field
87-
await InputActions.typeText(settingsView.delimiterInput, 'test')
88-
// Click on Cancel button
89-
await ButtonActions.clickElement(InputWithButtons.cancelInput)
88+
await ButtonActions.clickElement(settingsView.delimiterComboboxInput)
89+
await InputActions.slowType(settingsView.delimiterComboboxInput, 'test')
90+
// Click on Apply button without applying by 'Enter' or 'Space' key
91+
await ButtonActions.clickElement(settingsView.applyDelimiterButton)
9092
// Check the previous delimiter value
91-
expect(await InputActions.getInputValue(settingsView.delimiterInput)).eql(
92-
':',
93-
'Default delimiter not applied',
94-
)
93+
expect(
94+
await settingsView.isElementDisplayed(
95+
settingsView.getDelimiterBadgeByTitle(':'),
96+
),
97+
).eql(true, 'Default delimiter not applied')
98+
// Verify that not confirmed by 'Enter' or 'Space' key delimiter not applied
99+
expect(
100+
await settingsView.isElementDisplayed(
101+
settingsView.getDelimiterBadgeByTitle('test'),
102+
),
103+
).eql(false, 'Not confirmed delimiter not applied')
95104

96105
// Change delimiter
97-
await ButtonActions.clickElement(settingsView.delimiterInput)
98-
await InputActions.slowType(settingsView.delimiterInput, '-')
99-
await ButtonActions.clickElement(InputWithButtons.applyInput)
100-
// Verify that user can see that input is not saved when the Cancel button is clicked
106+
await settingsView.changeDelimiterInTreeView('-')
101107
await settingsView.switchBack()
102108
await treeView.switchToInnerViewFrame(InnerViews.TreeInnerView)
103109
// Verify that when user changes the delimiter and clicks on Save button delimiter is applied
@@ -110,7 +116,7 @@ describe('Settings', () => {
110116
['device_eu', 'central'],
111117
['user_eu', 'central'],
112118
],
113-
'-',
119+
['-'],
114120
)
115121
})
116122
})

0 commit comments

Comments
 (0)