Skip to content

Commit 7126dff

Browse files
e2e - create consumer group tests
1 parent 442eda0 commit 7126dff

File tree

4 files changed

+174
-5
lines changed

4 files changed

+174
-5
lines changed

redisinsight/ui/src/pages/browser/components/key-details-add-items/add-stream-group/AddStreamGroup.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ const AddStreamGroup = (props: Props) => {
113113
title="Enter Valid ID, 0 or $"
114114
content={lastDeliveredIDTooltipText}
115115
>
116-
<EuiIcon type="iInCircle" style={{ cursor: 'pointer' }} />
116+
<EuiIcon type="iInCircle" style={{ cursor: 'pointer' }} data-testid="entry-id-info-icon" />
117117
</EuiToolTip>
118118
)}
119119
autoComplete="off"

tests/e2e/pageObjects/browser-page.ts

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@ export class BrowserPage {
7171
removeEntryButton = Selector('[data-testid^=remove-entry-button-]');
7272
confirmRemoveEntryButton = Selector('[data-testid^=remove-entry-button-]').withExactText('Remove');
7373
clearStreamEntryInputs = Selector('[data-testid=remove-item]');
74+
saveGroupsButton = Selector('[data-testid=save-groups-btn]');
75+
//CONTAINERS
76+
streamGroupsContainer = Selector('[data-testid=stream-groups-container]');
77+
breadcrumbsContainer = Selector('[data-testid=breadcrumbs-container]');
78+
virtualTableContainer = Selector('[data-testid=virtual-table-container]');
79+
streamEntriesContainer = Selector('[data-test-id=stream-entries-container]');
7480
//LINKS
7581
internalLinkToWorkbench = Selector('[data-testid=internal-workbench-link]');
7682
//OPTION ELEMENTS
@@ -86,6 +92,8 @@ export class BrowserPage {
8692
filterOptionType = Selector('[data-test-subj^=filter-option-type-]');
8793
filterByKeyTypeDropDown = Selector('[data-testid=filter-option-type-default]');
8894
filterOptionTypeSelected = Selector('[data-testid^=filter-option-type-selected]');
95+
//TABS
96+
streamTabGroups = Selector('[data-testid=stream-tab-Groups]');
8997
//TEXT INPUTS (also referred to as 'Text fields')
9098
addKeyNameInput = Selector('[data-testid=key]');
9199
keyNameInput = Selector('[data-testid=edit-key-input]');
@@ -113,6 +121,10 @@ export class BrowserPage {
113121
streamValue = Selector('[data-testid=field-value]');
114122
addStreamRow = Selector('[data-testid=add-new-item]');
115123
streamFieldsValues = Selector('[data-testid^=stream-entry-field-]');
124+
streamRangeStartInput = Selector('._3MW0_WsJsq1s4bsuMNXOaV');
125+
streamRangeEndInput = Selector('[data-testid=range-end-input]');
126+
groupNameInput = Selector('[data-testid=group-name-field]');
127+
consumerIdInput = Selector('[data-testid=id-field]');
116128
//TEXT ELEMENTS
117129
keySizeDetails = Selector('[data-testid=key-size-text]');
118130
keyLengthDetails = Selector('[data-testid=key-length-text]');
@@ -137,8 +149,7 @@ export class BrowserPage {
137149
overviewTotalMemory = Selector('[data-test-subj=overview-total-memory]');
138150
overviewConnectedClients = Selector('[data-test-subj=overview-connected-clients]');
139151
overviewCommandsSec = Selector('[data-test-subj=overview-commands-sec]');
140-
overviewCpu = Selector('[data-test-subj=overview-cpu]');
141-
breadcrumbsContainer = Selector('[data-testid=breadcrumbs-container]');
152+
overviewCpu = Selector('[data-test-subj=overview-cpu]');
142153
treeViewArea = Selector('[data-test-subj=tree-view-panel]');
143154
scannedValue = Selector('[data-testid=keys-number-of-scanned]');
144155
treeViewKeysNumber = Selector('[data-testid^=count_]');
@@ -167,15 +178,19 @@ export class BrowserPage {
167178
progressKeyList = Selector('[data-testid=progress-key-list]');
168179
jsonScalarValue = Selector('[data-testid=json-scalar-value]');
169180
noKeysToDisplayText = Selector('[data-testid=no-keys-selected-text]');
170-
virtualTableContainer = Selector('[data-testid=virtual-table-container]');
171-
streamEntriesContainer = Selector('[data-testid=stream-entries-container]');
172181
streamEntryColumns = Selector(this.streamEntriesContainer.find('[aria-colcount]'));
173182
streamEntryRows = Selector(this.streamEntriesContainer.find('[aria-rowcount]'));
174183
streamEntryDate = Selector('[data-testid*=-date][data-testid*=stream-entry]');
175184
streamEntryIdValue = Selector('.streamItemId[data-testid*=stream-entry]');
176185
streamFields = Selector('[data-testid=stream-entries-container] .truncateText span');
177186
streamEntryFields = Selector('[data-testid^=stream-entry-field]');
178187
confirmationMessagePopover = Selector('div.euiPopover__panel .euiText ');
188+
streamRangeLeftTimestamp = Selector('[data-testid=range-left-timestamp]');
189+
streamRangeRightTimestamp = Selector('[data-testid=range-right-timestamp]');
190+
streamGroupId = Selector('.streamItemId[data-testid^=stream-group-]');
191+
entryIdInfoIcon = Selector('[data-testid=entry-id-info-icon]');
192+
errorMessage = Selector('[data-test-subj=toast-error]');
193+
entryIdError = Selector('[data-testid=id-error]');
179194

180195
/**
181196
* Common part for Add any new key
@@ -734,6 +749,20 @@ export class BrowserPage {
734749
const rawValue = await this.keyLengthDetails.textContent;
735750
return rawValue.split(' ')[rawValue.split(' ').length - 1];
736751
}
752+
753+
/**
754+
* Create new consumer group in Stream key
755+
* @groupName The name of the Consumer Group
756+
* @id The ID of the Consumer Group
757+
*/
758+
async createConsumerGroup(groupName: string, id?: string): Promise<void> {
759+
await t.click(this.addKeyValueItemsButton);
760+
await t.typeText(this.groupNameInput, groupName, { replace: true, paste: true });
761+
if (id !== undefined) {
762+
await t.typeText(this.consumerIdInput, id, { replace: true, paste: true });
763+
}
764+
await t.click(this.saveGroupsButton);
765+
}
737766
}
738767

739768
/**
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import { Chance } from 'chance';
2+
import { rte } from '../../../helpers/constants';
3+
import { acceptLicenseTermsAndAddDatabase, deleteDatabase } from '../../../helpers/database';
4+
import { BrowserPage } from '../../../pageObjects';
5+
import {
6+
commonUrl,
7+
ossStandaloneConfig
8+
} from '../../../helpers/conf';
9+
10+
const browserPage = new BrowserPage();
11+
const chance = new Chance();
12+
13+
let keyName = chance.word({ length: 20 });
14+
const keyField = chance.word({ length: 20 });
15+
const keyValue = chance.word({ length: 20 });
16+
17+
fixture `Consumer group`
18+
.meta({ type: 'critical_path', rte: rte.standalone })
19+
.page(commonUrl)
20+
.beforeEach(async() => {
21+
await acceptLicenseTermsAndAddDatabase(ossStandaloneConfig, ossStandaloneConfig.databaseName);
22+
})
23+
.afterEach(async t => {
24+
//Clear and delete database
25+
if (t.expect(browserPage.closeKeyButton.visible).ok){
26+
await t.click(browserPage.closeKeyButton);
27+
}
28+
await browserPage.deleteKeyByName(keyName);
29+
await deleteDatabase(ossStandaloneConfig.databaseName);
30+
});
31+
test('Verify that user can create a new Consumer Group in the current Stream', async t => {
32+
const toolTip = [
33+
'Enter Valid ID, 0 or $',
34+
'\nSpecify the ID of the last delivered entry in the stream from the new group\'s perspective.',
35+
'\nOtherwise, ',
36+
'$',
37+
'represents the ID of the last entry in the stream,',
38+
'0',
39+
'fetches the entire stream from the beginning.'
40+
];
41+
keyName = chance.word({ length: 20 });
42+
const consumerGroupName = `qwerty123456${chance.word({ length: 20 })}!@#$%^&*()_+=`;
43+
// Add New Stream Key
44+
await browserPage.addStreamKey(keyName, keyField, keyValue);
45+
await t.click(browserPage.fullScreenModeButton);
46+
// Open Stream consumer groups and add group
47+
await t.click(browserPage.streamTabGroups);
48+
await browserPage.createConsumerGroup(consumerGroupName);
49+
await t.expect(browserPage.streamGroupsContainer.textContent).contains(consumerGroupName, 'The new Consumer Group is added');
50+
// Verify the tooltip under 'i' element
51+
await t.click(browserPage.addKeyValueItemsButton);
52+
await t.hover(browserPage.entryIdInfoIcon);
53+
for(const text of toolTip){
54+
await t.expect(await browserPage.tooltip.innerText).contains(text, 'The toolTip message');
55+
}
56+
});
57+
test('Verify that user can input the 0, $ and Valid Entry ID in the ID field', async t => {
58+
keyName = chance.word({ length: 20 });
59+
const consumerGroupName = chance.word({ length: 20 });
60+
const entryIds = [
61+
'0',
62+
'$',
63+
'1654594146318-0'
64+
];
65+
// Add New Stream Key
66+
await browserPage.addStreamKey(keyName, keyField, keyValue);
67+
await t.click(browserPage.fullScreenModeButton);
68+
// Open Stream consumer groups and add group with different IDs
69+
await t.click(browserPage.streamTabGroups);
70+
for(const entryId of entryIds){
71+
await browserPage.createConsumerGroup(`${consumerGroupName}${entryId}`, entryId);
72+
await t.expect(browserPage.streamGroupsContainer.textContent).contains(`${consumerGroupName}${entryId}`, 'The new Consumer Group is added');
73+
}
74+
});
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import { Chance } from 'chance';
2+
import { rte } from '../../../helpers/constants';
3+
import { acceptLicenseTermsAndAddDatabase, deleteDatabase } from '../../../helpers/database';
4+
import { BrowserPage } from '../../../pageObjects';
5+
import {
6+
commonUrl,
7+
ossStandaloneConfig
8+
} from '../../../helpers/conf';
9+
10+
const browserPage = new BrowserPage();
11+
const chance = new Chance();
12+
13+
let keyName = chance.word({ length: 20 });
14+
let consumerGroupName = chance.word({ length: 20 });
15+
const keyField = chance.word({ length: 20 });
16+
const keyValue = chance.word({ length: 20 });
17+
18+
fixture `Consumer group`
19+
.meta({ type: 'regression', rte: rte.standalone })
20+
.page(commonUrl)
21+
.beforeEach(async() => {
22+
await acceptLicenseTermsAndAddDatabase(ossStandaloneConfig, ossStandaloneConfig.databaseName);
23+
})
24+
.afterEach(async t => {
25+
//Clear and delete database
26+
if (t.expect(browserPage.closeKeyButton.visible).ok){
27+
await t.click(browserPage.closeKeyButton);
28+
}
29+
await browserPage.deleteKeyByName(keyName);
30+
await deleteDatabase(ossStandaloneConfig.databaseName);
31+
});
32+
test('Verify that when user enter invalid Group Name the error message appears', async t => {
33+
keyName = chance.word({ length: 20 });
34+
consumerGroupName = chance.word({ length: 20 });
35+
const error = 'BUSYGROUP Consumer Group name already exists';
36+
// Add New Stream Key
37+
await browserPage.addStreamKey(keyName, keyField, keyValue);
38+
await t.click(browserPage.fullScreenModeButton);
39+
// Open Stream consumer groups and add group
40+
await t.click(browserPage.streamTabGroups);
41+
await browserPage.createConsumerGroup(consumerGroupName);
42+
// Verify the error message
43+
await t.click(browserPage.streamTabGroups);
44+
await browserPage.createConsumerGroup(consumerGroupName);
45+
await t.expect(browserPage.errorMessage.textContent).contains(error, 'The error message that the Group name already exists');
46+
});
47+
test('Verify that when user enter invalid format ID the error message appears', async t => {
48+
keyName = chance.word({ length: 20 });
49+
consumerGroupName = chance.word({ length: 20 });
50+
const error = 'ID format is not correct';
51+
const invalidEntryIds = [
52+
'qwerty12344545',
53+
'16545941463181654594146318'
54+
];
55+
// Add New Stream Key
56+
await browserPage.addStreamKey(keyName, keyField, keyValue);
57+
await t.click(browserPage.fullScreenModeButton);
58+
// Open Stream consumer groups and enter invalid EntryIds
59+
await t.click(browserPage.streamTabGroups);
60+
await t.click(browserPage.addKeyValueItemsButton);
61+
for(const entryId of invalidEntryIds){
62+
await t.typeText(browserPage.consumerIdInput, entryId, { replace: true, paste: true });
63+
await t.click(browserPage.saveGroupsButton);
64+
await t.expect(browserPage.entryIdError.textContent).eql(error, 'The invalid Id error message');
65+
}
66+
});

0 commit comments

Comments
 (0)