Skip to content

Commit d495722

Browse files
Merge pull request #368 from RedisInsight/feature/e2e-tree-view
Feature/e2e tree view
2 parents 429d176 + aae6f26 commit d495722

File tree

6 files changed

+73
-65
lines changed

6 files changed

+73
-65
lines changed

redisinsight/ui/src/components/virtual-tree/components/Node/Node.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ const Node = ({
9090
</div>
9191
<div data-testid={`count_${fullName}`}>
9292
<span>{keyCount ?? ''}</span>
93-
<span className={styles.approximate}>
93+
<span className={styles.approximate} data-testid={`percentage_${fullName}`}>
9494
{keyApproximate ? `${keyApproximate < 1 ? '<1' : Math.round(keyApproximate)}%` : '' }
9595
</span>
9696
</div>

redisinsight/ui/src/pages/browser/components/keys-header/KeysHeader.spec.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ describe('KeysHeader', () => {
5252
it('should render key view type switcher properly', () => {
5353
render(<KeysHeader {...propsMock} />)
5454

55-
const keyViewTypeSwitcherInput = screen.queryByTestId('key-view-type-switcher')
55+
const keyViewTypeSwitcherInput = screen.queryByTestId('view-type-switcher')
5656
expect(keyViewTypeSwitcherInput).toBeInTheDocument()
5757
})
5858
})

redisinsight/ui/src/pages/browser/components/keys-header/KeysHeader.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ const KeysHeader = (props: Props) => {
183183
)
184184

185185
const ViewSwitch = (
186-
<div className={styles.viewTypeSwitch} data-testid="key-view-type-switcher">
186+
<div className={styles.viewTypeSwitch} data-testid="view-type-switcher">
187187
{viewTypes.map((view) => (
188188
<EuiToolTip content={view.tooltipText} position="top" key={view.tooltipText}>
189189
<EuiButtonIcon

tests/e2e/pageObjects/browser-page.ts

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -116,20 +116,22 @@ export class BrowserPage {
116116
treeViewButton: Selector
117117
treeViewArea: Selector
118118
browserViewButton: Selector
119-
treeViewScannedValue: Selector
119+
scannedValue: Selector
120120
treeViewSeparator: Selector
121121
treeViewKeysNumber: Selector
122122
treeViewPercentage: Selector
123123
treeViewFolders: Selector
124-
treeViewMessage: Selector
125124
totalKeysNumber: Selector
126-
keysScanned: Selector
127125
breadcrumbsContainer: Selector
128126
databaseInfoIcon: Selector
129127
databaseInfoToolTip: Selector
130128
removeHashFieldButton: Selector
131129
removeSetMemberButton: Selector
132130
removeZserMemberButton: Selector
131+
treeViewKeysItem: Selector
132+
treeViewNodeArrowIcon: Selector
133+
treeViewDeviceFolder: Selector
134+
treeViewDeviceKyesCount: Selector
133135

134136
constructor() {
135137
//CSS Selectors
@@ -195,9 +197,11 @@ export class BrowserPage {
195197
this.overviewTooltip = Selector('[data-testid=overview-more-info-tooltip]');
196198
this.overviewTooltipStatTitle = Selector('[data-testid=overview-db-stat-title]');
197199
this.databaseInfoIcon = Selector('[data-testid=db-info-icon]');
198-
this.treeViewButton = Selector('');
199-
this.browserViewButton = Selector('');
200-
this.treeViewSeparator = Selector('');
200+
this.treeViewButton = Selector('[data-testid=view-type-list-btn]');
201+
this.browserViewButton = Selector('[data-testid=view-type-browser-btn]');
202+
this.treeViewSeparator = Selector('[data-testid=select-tree-view-separator]');
203+
this.treeViewKeysItem = Selector('[data-testid="keys:keys:"]');
204+
this.treeViewNodeArrowIcon = Selector('[data-test-subj^=node-arrow-icon_]');
201205
//TEXT INPUTS (also referred to as 'Text fields')
202206
this.keySizeDetails = Selector('[data-testid=key-size-text]');
203207
this.keyLengthDetails = Selector('[data-testid=key-length-text]');
@@ -252,15 +256,15 @@ export class BrowserPage {
252256
this.overviewCpu = Selector('[data-test-subj=overview-cpu]');
253257
this.selectedFilterTypeString = Selector('[data-testid=filter-option-type-selected-string]');
254258
this.breadcrumbsContainer = Selector('[data-testid=breadcrumbs-container]');
255-
this.treeViewArea = Selector('');
256-
this.treeViewScannedValue = Selector('');
257-
this.treeViewKeysNumber = Selector('');
258-
this.treeViewPercentage = Selector('');
259-
this.treeViewFolders = Selector('');
260-
this.treeViewMessage = Selector('');
261-
this.totalKeysNumber = Selector('');
262-
this.keysScanned = Selector('');
259+
this.treeViewArea = Selector('[data-test-subj=tree-view-panel]');
260+
this.scannedValue = Selector('[data-testid=keys-number-of-scanned]');
261+
this.treeViewKeysNumber = Selector('[data-testid^=count_]');
262+
this.treeViewPercentage = Selector('[data-testid^=percentage_]');
263+
this.treeViewFolders = Selector('[data-test-subj^=node-arrow-icon_]');
264+
this.totalKeysNumber = Selector('[data-testid=keys-total]');
263265
this.databaseInfoToolTip = Selector('[data-testid=db-info-tooltip]');
266+
this.treeViewDeviceFolder = Selector('[data-testid^=device] div');
267+
this.treeViewDeviceKyesCount = Selector('[data-testid^=count_device] span');
264268
}
265269

266270
/**

tests/e2e/tests/critical-path/tree-view/tree-view.e2e.ts

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,14 @@ import {
55
ossStandaloneBigConfig
66
} from '../../../helpers/conf';
77
import { rte, KeyTypesTexts } from '../../../helpers/constants';
8+
import { Chance } from 'chance';
89

910
const browserPage = new BrowserPage();
11+
const chance = new Chance();
1012

11-
//skipped due the functionality is not yet done
12-
fixture.skip `Tree view verifications`
13+
const keyNameFilter = `keyName${chance.word({ length: 10 })}`;
14+
15+
fixture `Tree view verifications`
1316
.meta({type: 'critical_path'})
1417
.page(commonUrl)
1518
.beforeEach(async () => {
@@ -23,7 +26,7 @@ test
2326
.meta({ rte: rte.standalone })
2427
('Verify that when user opens the application he can see that Tree View is disabled by default(Browser is selected by default)', async t => {
2528
//Verify that Browser view is selected by default and Tree view is disabled
26-
await t.expect(browserPage.browserViewButton.withAttribute('active', 'true')).ok('The Browser is selected by default');
29+
await t.expect(browserPage.browserViewButton.getStyleProperty('background-color')).eql('rgb(33, 37, 54)', 'The Browser is selected by default');
2730
await t.expect(browserPage.treeViewArea.visible).notOk('The tree view is not displayed', { timeout: 20000 });
2831
});
2932
test
@@ -32,56 +35,51 @@ test
3235
await t.click(browserPage.treeViewButton);
3336
await t.eval(() => location.reload());
3437
//Verify that "Tree view" mode enabled state is saved
35-
await t.expect(browserPage.treeViewArea.visible).notOk('The tree view is not displayed');
38+
await t.expect(browserPage.treeViewArea.visible).ok('The tree view is displayed');
3639
});
3740
test
3841
.meta({ rte: rte.standalone })
3942
('Verify that user can see DB is automatically scanned by 10K keys in the background, user can see the number of keys scanned and use the "Scan More" button to search per another 10000 keys', async t => {
43+
let scannedValue = 10;
4044
await t.click(browserPage.treeViewButton);
41-
//Verify the scanned value
42-
await t.expect(browserPage.treeViewScannedValue.textContent).contains('Scanned 10 000', 'The database is automatically scanned by 10K keys');
45+
await t.expect(browserPage.scannedValue.textContent).eql(`${scannedValue} 000`, 'The database is automatically scanned by 10K keys');
4346
//Verify that user can use the "Scan More" button to search per another 10000 keys
44-
await t.click(browserPage.scanMoreButton);
45-
await t.expect(browserPage.treeViewScannedValue.textContent).contains('Scanned 20 000', 'The database is automatically scanned by 10K keys');
46-
});
47-
test
48-
.meta({ rte: rte.standalone })
49-
('Verify that user can see that “:” (colon) used as a default separator for namespaces', async t => {
50-
await t.click(browserPage.treeViewButton);
51-
//Verify the default separator
52-
await t.expect(browserPage.treeViewSeparator.visible).ok('The “:” (colon) used as a default separator for namespaces');
53-
});
54-
test
55-
.meta({ rte: rte.standalone })
56-
('Verify that user can see the number of keys found per each namespace', async t => {
57-
await t.click(browserPage.treeViewButton);
58-
//Verify the number of keys found
59-
await t.expect(browserPage.treeViewKeysNumber.visible).ok('The user can see the number of keys');
47+
for (let i = 0; i < 10; i++){
48+
scannedValue = scannedValue + 10;
49+
await t.click(browserPage.scanMoreButton);
50+
await t.expect(await browserPage.scannedValue.withExactText(`${scannedValue} 000`).exists).ok('The database is automatically scanned by 10K keys');
51+
}
6052
});
6153
test
54+
.after(async() => {
55+
//Clear and delete database
56+
await browserPage.deleteKeyByName(keyNameFilter);
57+
await deleteDatabase(ossStandaloneBigConfig.databaseName);
58+
})
6259
.meta({ rte: rte.standalone })
6360
('Verify that when user enables filtering by key name he can see only folder with appropriate keys are displayed and the number of keys and percentage is recalculated', async t => {
64-
const keyNameFilter = 'key';
61+
await browserPage.addHashKey(keyNameFilter);
62+
await t.click(browserPage.treeViewButton);
6563
const numberOfKeys = await browserPage.treeViewKeysNumber.textContent;
6664
const percentage = await browserPage.treeViewPercentage.textContent;
67-
await t.click(browserPage.treeViewButton);
6865
//Set filter by key name
6966
await browserPage.searchByKeyName(keyNameFilter);
67+
await t.click(browserPage.treeViewKeysItem);
7068
//Verify the results
71-
await t.expect(browserPage.treeViewFolders.textContent).contains(keyNameFilter, 'The appropriate keys are displayed');
7269
await t.expect(browserPage.treeViewKeysNumber.textContent).notEql(numberOfKeys, 'The number of keys is recalculated');
7370
await t.expect(browserPage.treeViewPercentage.textContent).notEql(percentage, 'The percentage is recalculated');
71+
await t.expect(await browserPage.isKeyIsDisplayedInTheList(keyNameFilter)).ok('The appropriate keys are displayed');
7472
});
7573
test
7674
.meta({ rte: rte.standalone })
7775
('Verify that when user switched from Tree View to Browser and goes back state of filer by key name/key type is saved', async t => {
78-
const keyName = 'keyName';
76+
const keyName = 'user*';
7977
await t.click(browserPage.treeViewButton);
8078
await browserPage.searchByKeyName(keyName);
8179
await t.click(browserPage.browserViewButton);
8280
await t.click(browserPage.treeViewButton);
8381
//Verify that state of filer by key name is saved
84-
await t.expect(browserPage.searchInput.textContent).eql(keyName, 'The state of filer by key name is saved');
82+
await t.expect(await browserPage.filterByPatterSearchInput.withAttribute('value', keyName).exists).ok('Filter per key name is still applied');
8583
await t.click(browserPage.treeViewButton);
8684
//Set filter by key type
8785
await browserPage.selectFilterGroupType(KeyTypesTexts.String);

tests/e2e/tests/regression/tree-view/tree-view.e2e.ts

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,14 @@ import {
66
ossStandaloneConfig
77
} from '../../../helpers/conf';
88
import { rte } from '../../../helpers/constants';
9-
import { Chance } from 'chance';
109

1110
const browserPage = new BrowserPage();
12-
const chance = new Chance();
1311

14-
let keyName = chance.word({ length: 10 });
15-
16-
//skipped due the functionality is not yet done
17-
fixture.skip `Tree view verifications`
12+
fixture `Tree view verifications`
1813
.meta({type: 'regression'})
1914
.page(commonUrl)
2015
.beforeEach(async () => {
21-
await acceptLicenseTermsAndAddDatabase(ossStandaloneBigConfig, ossStandaloneConfig.databaseName);
16+
await acceptLicenseTermsAndAddDatabase(ossStandaloneBigConfig, ossStandaloneBigConfig.databaseName);
2217
})
2318
.afterEach(async () => {
2419
//Delete database
@@ -35,33 +30,44 @@ test
3530
})
3631
('Verify that user can see message "No keys to display." when there are no keys in the database', async t => {
3732
//Verify the message
38-
await t.expect(browserPage.treeViewMessage.textContent).eql('No keys to display.', 'The message is displayed');
33+
await t.click(browserPage.treeViewButton);
34+
await t.expect(browserPage.keyListTable.textContent).contains('No keys to display.', 'The message is displayed');
3935
});
40-
test
36+
//skipped due the issue
37+
test.skip
4138
.meta({ rte: rte.standalone })
4239
('Verify that user can see the total number of keys, the number of keys scanned, the “Scan more” control displayed at the top of Tree view and Browser view', async t => {
4340
//Verify the controls on the Browser view
4441
await t.expect(browserPage.totalKeysNumber.visible).ok('The total number of keys is displayed on the Browser view');
45-
await t.expect(browserPage.keysScanned.visible).ok('The number of keys scanned is displayed on the Browser view');
42+
await t.expect(browserPage.scannedValue.visible).ok('The number of keys scanned is displayed on the Browser view');
4643
await t.expect(browserPage.scanMoreButton.visible).ok('The scan more button is displayed on the Browser view');
4744
//Verify the controls on the Tree view
4845
await t.click(browserPage.treeViewButton);
4946
await t.expect(browserPage.totalKeysNumber.visible).ok('The total number of keys is displayed on the Tree view');
50-
await t.expect(browserPage.keysScanned.visible).ok('The number of keys scanned is displayed on the Tree view');
47+
await t.expect(browserPage.scannedValue.visible).ok('The number of keys scanned is displayed on the Tree view');
5148
await t.expect(browserPage.scanMoreButton.visible).ok('The scan more button is displayed on the Tree view');
5249
});
5350
test
5451
.meta({ rte: rte.standalone })
5552
('Verify that when user deletes the key he can see the key is removed from the folder, the number of keys is reduced, the percentage is recalculated', async t => {
56-
//Add new key for deletion
57-
await browserPage.addHashKey(keyName);
58-
await t.click(browserPage.treeViewArea);
59-
const numberOfKeys = await browserPage.treeViewKeysNumber.textContent;
60-
const percentage = await browserPage.treeViewPercentage.textContent;
61-
//Delete key
62-
await browserPage.searchByKeyName(keyName);
53+
//Open the first key in the tree view and remove
54+
await t.click(browserPage.treeViewButton);
55+
await t.click(browserPage.treeViewDeviceFolder);
56+
const numberOfKeys = await browserPage.treeViewDeviceKyesCount.textContent;
57+
const keyFolder = await browserPage.treeViewDeviceFolder.nth(2).textContent;
58+
await t.click(browserPage.treeViewDeviceFolder.nth(2));
59+
await t.click(browserPage.treeViewDeviceFolder.nth(5));
60+
await browserPage.deleteKey();
6361
//Verify the results
64-
await t.expect(browserPage.treeViewFolders.textContent).notContains(keyName, 'The key is removed from the folder');
65-
await t.expect(browserPage.treeViewKeysNumber.textContent).notEql(numberOfKeys, 'The number of keys is recalculated');
66-
await t.expect(browserPage.treeViewPercentage.textContent).notEql(percentage, 'The percentage is recalculated');
62+
await t.expect(browserPage.treeViewDeviceFolder.nth(2).textContent).notEql(keyFolder, 'The key folder is removed from the tree view');
63+
await t.expect(browserPage.treeViewDeviceKyesCount.textContent).notEql(numberOfKeys, 'The number of keys is recalculated');
64+
});
65+
test
66+
.meta({ rte: rte.standalone })
67+
('Verify that user can see that “:” (colon) used as a default separator for namespaces and see the number of keys found per each namespace', async t => {
68+
await t.click(browserPage.treeViewButton);
69+
//Verify the default separator
70+
await t.expect(browserPage.treeViewSeparator.textContent).eql(':', 'The “:” (colon) used as a default separator for namespaces');
71+
//Verify the number of keys found
72+
await t.expect(browserPage.treeViewKeysNumber.visible).ok('The user can see the number of keys');
6773
});

0 commit comments

Comments
 (0)