Skip to content

Commit 4f5b6ab

Browse files
Merge pull request #812 from RedisInsight/feature/e2e-optional-paramenters
e2e - Stream tests
2 parents 86546a3 + db67ec0 commit 4f5b6ab

File tree

7 files changed

+174
-9
lines changed

7 files changed

+174
-9
lines changed

redisinsight/ui/src/components/range-filter/RangeFilter.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,16 +138,16 @@ const RangeFilter = (props: Props) => {
138138
return (
139139
<div data-testid="mock-fill-range" className={styles.rangeWrapper}>
140140
<div className={cx(styles.sliderRange, styles.mockRange)}>
141-
<div className={styles.sliderLeftValue}>{getFormatTime(start?.toString())}</div>
142-
<div className={styles.sliderRightValue}>{getFormatTime(end?.toString())}</div>
141+
<div className={styles.sliderLeftValue} data-testid="range-left-timestamp">{getFormatTime(start?.toString())}</div>
142+
<div className={styles.sliderRightValue} data-testid="range-right-timestamp">{getFormatTime(end?.toString())}</div>
143143
</div>
144144
</div>
145145
)
146146
}
147147

148148
return (
149149
<>
150-
<div className={styles.rangeWrapper}>
150+
<div className={styles.rangeWrapper} data-testid="range-bar">
151151
<input
152152
type="range"
153153
min={min}

tests/e2e/pageObjects/browser-page.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ export class BrowserPage {
7979
consumerDestinationSelect = Selector('[data-testid=destination-select]');
8080
removeConsumerButton = Selector('[data-testid^=remove-consumer-button]');
8181
removeConsumerGroupButton = Selector('[data-testid^=remove-groups-button]');
82+
optionalParametersSwitcher = Selector('[data-testid=optional-parameters-switcher]');
83+
forceClaimCheckbox = Selector('[data-testid=force-claim-checkbox]').sibling();
84+
editStreamLastIdButton = Selector('[data-testid^=edit-stream-last-id]');
85+
saveButton = Selector('[data-testid=save-btn]');
8286
//CONTAINERS
8387
streamGroupsContainer = Selector('[data-testid=stream-groups-container]');
8488
streamConsumersContainer = Selector('[data-testid=stream-consumers-container]');
@@ -102,6 +106,9 @@ export class BrowserPage {
102106
filterByKeyTypeDropDown = Selector('[data-testid=filter-option-type-default]');
103107
filterOptionTypeSelected = Selector('[data-testid^=filter-option-type-selected]');
104108
consumerOption = Selector('[data-testid=consumer-option]');
109+
claimTimeOptionSelect = Selector('[data-testid=time-option-select]');
110+
relativeTimeOption = Selector('#idle');
111+
timestampOption = Selector('#time');
105112
//TABS
106113
streamTabGroups = Selector('[data-testid=stream-tab-Groups]');
107114
streamTabConsumers = Selector('[data-testid=stream-tab-Consumers]');
@@ -137,6 +144,9 @@ export class BrowserPage {
137144
groupNameInput = Selector('[data-testid=group-name-field]');
138145
consumerIdInput = Selector('[data-testid=id-field]');
139146
streamMinIdleTimeInput = Selector('[data-testid=min-idle-time]');
147+
claimIdleTimeInput = Selector('[data-testid=time-count]');
148+
claimRetryCountInput = Selector('[data-testid=retry-count]');
149+
lastIdInput = Selector('[data-testid=last-id-field]');
140150
//TEXT ELEMENTS
141151
keySizeDetails = Selector('[data-testid=key-size-text]');
142152
keyLengthDetails = Selector('[data-testid=key-length-text]');
@@ -209,6 +219,9 @@ export class BrowserPage {
209219
entryIdError = Selector('[data-testid=id-error]');
210220
pendingCount = Selector('[data-testid=pending-count]');
211221
lastRefreshMessage = Selector('[data-testid=refresh-message]');
222+
streamRangeBar = Selector('[data-testid=mock-fill-range]');
223+
rangeLeftTimestamp = Selector('[data-testid=range-left-timestamp]');
224+
rangeRightTimestamp = Selector('[data-testid=range-right-timestamp]');
212225

213226
/**
214227
* Common part for Add any new key

tests/e2e/tests/critical-path/browser/consumer-group.e2e.ts

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ let keyName = chance.word({ length: 20 });
1515
let consumerGroupName = chance.word({ length: 20 });
1616
const keyField = chance.word({ length: 20 });
1717
const keyValue = chance.word({ length: 20 });
18+
const entryIds = [
19+
'0',
20+
'$',
21+
'1654594146318-0'
22+
];
1823

1924
fixture `Consumer group`
2025
.meta({ type: 'critical_path', rte: rte.standalone })
@@ -59,11 +64,6 @@ test('Verify that user can create a new Consumer Group in the current Stream', a
5964
test('Verify that user can input the 0, $ and Valid Entry ID in the ID field', async t => {
6065
keyName = chance.word({ length: 20 });
6166
consumerGroupName = chance.word({ length: 20 });
62-
const entryIds = [
63-
'0',
64-
'$',
65-
'1654594146318-0'
66-
];
6767
// Add New Stream Key
6868
await browserPage.addStreamKey(keyName, keyField, keyValue);
6969
await t.click(browserPage.fullScreenModeButton);
@@ -197,3 +197,27 @@ test('Verify that user can delete a Consumer Group', async t => {
197197
await t.click(browserPage.removeConsumerGroupButton.nth(1));
198198
await t.expect(browserPage.streamGroupsContainer.textContent).contains('Your Key has no Consumer Groups available.', 'The Consumer Group is removed from the table');
199199
});
200+
test('Verify that user can change the ID set for the Consumer Group when click on the Pencil button', async t => {
201+
keyName = chance.word({ length: 20 });
202+
let consumerGroupName = chance.word({ length: 20 });
203+
const cliCommands = [
204+
`XGROUP CREATE ${keyName} ${consumerGroupName} $ MKSTREAM`,
205+
`XADD ${keyName} * message apple`,
206+
`XREADGROUP GROUP ${consumerGroupName} Alice COUNT 1 STREAMS ${keyName} >`
207+
];
208+
// Add New Stream Key with groups and consumers
209+
for(const command of cliCommands){
210+
await cliPage.sendCommandInCli(command);
211+
}
212+
// Open Stream consumer info view
213+
await browserPage.openKeyDetails(keyName);
214+
await t.click(browserPage.streamTabGroups);
215+
// Change the ID set for the Consumer Group
216+
for(const id of entryIds){
217+
const idBefore = await browserPage.streamGroupId.textContent;
218+
await t.click(browserPage.editStreamLastIdButton);
219+
await t.typeText(browserPage.lastIdInput, id, { replace: true });
220+
await t.click(browserPage.saveButton);
221+
await t.expect(browserPage.streamGroupId.textContent).notEql(idBefore, 'The last delivered ID is modified and the table is reloaded');
222+
}
223+
});

tests/e2e/tests/critical-path/browser/stream-key.e2e.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ import { Selector } from 'testcafe';
33
import { toNumber, toString } from 'lodash';
44
import { rte } from '../../../helpers/constants';
55
import { acceptLicenseTermsAndAddDatabase, deleteDatabase } from '../../../helpers/database';
6-
import { BrowserPage } from '../../../pageObjects';
6+
import { BrowserPage, CliPage } from '../../../pageObjects';
77
import {
88
commonUrl,
99
ossStandaloneConfig
1010
} from '../../../helpers/conf';
1111

1212
const browserPage = new BrowserPage();
13+
const cliPage = new CliPage();
1314
const chance = new Chance();
1415

1516
let keyName = chance.word({ length: 20 });
@@ -136,3 +137,14 @@ test('Verify that user can add several fields and values to the existing Stream
136137
const streamLength = await browserPage.getKeyLength();
137138
await t.expect(streamLength).eql('2', 'Stream length after adding new entry');
138139
});
140+
test('Verify that user can see the Stream range filter', async t => {
141+
keyName = chance.word({length: 20});
142+
//Add new Stream key with 1 field
143+
await cliPage.sendCommandInCli(`XADD ${keyName} * fields values`);
144+
//Open key details and check filter
145+
await browserPage.openKeyDetails(keyName);
146+
await t.debug();
147+
await t.expect(browserPage.rangeLeftTimestamp.visible).ok('The stream range start timestamp visibility');
148+
await t.expect(browserPage.rangeRightTimestamp.visible).ok('The stream range end timestamp visibility');
149+
await t.expect(browserPage.streamRangeBar.visible).ok('The stream range bar visibility');
150+
});

tests/e2e/tests/critical-path/browser/stream-pending-messages.e2e.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,32 @@ test('Verify that user can claim any message in the list of pending messages', a
7575
await t.click(browserPage.streamConsumerName.nth(1));
7676
await t.expect(browserPage.streamMessage.count).eql(2, 'The claimed messages is in the selected Consumer');
7777
});
78+
test('Verify that claim with optional parameters, the message removed from this Consumer and appeared in the selected Consumer', async t => {
79+
keyName = chance.word({ length: 20 });
80+
consumerGroupName = chance.word({ length: 20 });
81+
const cliCommands = [
82+
`XGROUP CREATE ${keyName} ${consumerGroupName} $ MKSTREAM`,
83+
`XADD ${keyName} * message apple`,
84+
`XADD ${keyName} * message orange`,
85+
`XREADGROUP GROUP ${consumerGroupName} Alice COUNT 1 STREAMS ${keyName} >`,
86+
`XREADGROUP GROUP ${consumerGroupName} Bob COUNT 1 STREAMS ${keyName} >`
87+
];
88+
// Add New Stream Key with pending message
89+
for(const command of cliCommands){
90+
await cliPage.sendCommandInCli(command);
91+
}
92+
// Open Stream pendings view
93+
await browserPage.openStreamPendingsView(keyName);
94+
await t.click(browserPage.fullScreenModeButton);
95+
// Claim message with optional parameters and check result
96+
await t.click(browserPage.claimPendingMessageButton);
97+
await t.expect(browserPage.optionalParametersSwitcher.withAttribute('aria-checked', 'false').exists).ok('By default toggle for optional parameters is off');
98+
await t.click(browserPage.optionalParametersSwitcher);
99+
await t.typeText(browserPage.claimIdleTimeInput, '100');
100+
await t.click(browserPage.forceClaimCheckbox);
101+
await t.click(browserPage.submitButton);
102+
await t.expect(browserPage.streamMessagesContainer.textContent).contains('Your Consumer has no pending messages.', 'The messages is claimed and removed from the table');
103+
await t.click(browserPage.streamTabConsumers);
104+
await t.click(browserPage.streamConsumerName.nth(1));
105+
await t.expect(browserPage.streamMessage.count).eql(2, 'The claimed messages is in the selected Consumer');
106+
});

tests/e2e/tests/regression/browser/consumer-group.e2e.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,3 +127,33 @@ test('Verify that A>Z is default table sorting in Consumer column', async t => {
127127
await t.expect(browserPage.streamConsumerName.nth(i).textContent).contains(consumerNames[i], 'The Consumers default sorting');
128128
}
129129
});
130+
test('Verify that user can see error message if enter invalid last delivered ID', async t => {
131+
keyName = chance.word({ length: 20 });
132+
let consumerGroupName = chance.word({ length: 20 });
133+
const cliCommands = [
134+
`XGROUP CREATE ${keyName} ${consumerGroupName} $ MKSTREAM`,
135+
`XADD ${keyName} * message apple`,
136+
`XREADGROUP GROUP ${consumerGroupName} Alice COUNT 1 STREAMS ${keyName} >`
137+
];
138+
const invalidEntryIds = [
139+
'!@#%^&*()_',
140+
'12345678901242532366121324'
141+
];
142+
const errorMessage = 'ID format is not correct';
143+
// Add New Stream Key with groups and consumers
144+
for(const command of cliCommands){
145+
await cliPage.sendCommandInCli(command);
146+
}
147+
// Open Stream consumer info view
148+
await browserPage.openKeyDetails(keyName);
149+
await t.click(browserPage.streamTabGroups);
150+
// Change the ID set for the Consumer Group
151+
for(const id of invalidEntryIds){
152+
const idBefore = await browserPage.streamGroupId.textContent;
153+
await t.click(browserPage.editStreamLastIdButton);
154+
await t.typeText(browserPage.lastIdInput, id, { replace: true });
155+
await t.click(browserPage.saveButton);
156+
await t.expect(browserPage.streamGroupId.textContent).eql(idBefore, 'The last delivered ID is not modified');
157+
await t.expect(browserPage.entryIdError.textContent).eql(errorMessage, 'The error message');
158+
}
159+
});

tests/e2e/tests/regression/browser/stream-pending-messages.e2e.ts

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,60 @@ test('Verify that the message is claimed only if its idle time is greater than t
7979
await t.expect(browserPage.notificationMessage.textContent).contains('No messages claimed', 'The message is not claimed notification');
8080
await t.expect(browserPage.streamMessage.count).eql(streamMessageBefore, 'The number of pendings in the table');
8181
});
82+
test('Verify that when user toggle optional parameters on, he can see optional fields', async t => {
83+
keyName = chance.word({ length: 20 });
84+
consumerGroupName = chance.word({ length: 20 });
85+
const cliCommands = [
86+
`XGROUP CREATE ${keyName} ${consumerGroupName} $ MKSTREAM`,
87+
`XADD ${keyName} * message apple`,
88+
`XADD ${keyName} * message orange`,
89+
`XREADGROUP GROUP ${consumerGroupName} Alice COUNT 1 STREAMS ${keyName} >`,
90+
`XREADGROUP GROUP ${consumerGroupName} Bob COUNT 1 STREAMS ${keyName} >`
91+
];
92+
// Add New Stream Key with pending message
93+
for(const command of cliCommands){
94+
await cliPage.sendCommandInCli(command);
95+
}
96+
// Open Stream pendings view
97+
await browserPage.openStreamPendingsView(keyName);
98+
await t.click(browserPage.fullScreenModeButton);
99+
// Click Claim message with optional parameters and check fields
100+
await t.click(browserPage.claimPendingMessageButton);
101+
await t.click(browserPage.optionalParametersSwitcher);
102+
await t.expect(browserPage.claimIdleTimeInput.visible).ok('The Idle Time field is in optional parameters');
103+
await t.expect(browserPage.claimRetryCountInput.visible).ok('The Retry Count field is in optional parameters');
104+
await t.expect(browserPage.claimTimeOptionSelect.visible).ok('The Idle Time Format is in optional parameters');
105+
await t.expect(browserPage.forceClaimCheckbox.visible).ok('The Force Claim is in optional parameters');
106+
await t.click(browserPage.claimTimeOptionSelect);
107+
await t.expect(browserPage.relativeTimeOption.textContent).eql('Relative Time', 'The first option in the time format select list');
108+
await t.expect(browserPage.timestampOption.textContent).eql('Timestamp', 'The second option in the time format select list');
109+
});
110+
test('Verify that user see the column names in the Pending messages table and navigate by tabs', async t => {
111+
keyName = chance.word({ length: 20 });
112+
consumerGroupName = chance.word({ length: 20 });
113+
const columns = [
114+
'Entry ID',
115+
'Last Message Delivered',
116+
'Times Message Delivered'
117+
];
118+
const cliCommands = [
119+
`XGROUP CREATE ${keyName} ${consumerGroupName} $ MKSTREAM`,
120+
`XADD ${keyName} * message apple`,
121+
`XREADGROUP GROUP ${consumerGroupName} Alice COUNT 1 STREAMS ${keyName} >`
122+
];
123+
// Add New Stream Key with pending message
124+
for(const command of cliCommands){
125+
await cliPage.sendCommandInCli(command);
126+
}
127+
// Open Stream pendings view and check columns
128+
await browserPage.openStreamPendingsView(keyName);
129+
// Click Claim message with optional parameters and check fields
130+
for(const column of columns){
131+
await t.expect(browserPage.streamMessagesContainer.textContent).contains(column, `The column name ${column}`);
132+
}
133+
// Check navigation
134+
await t.click(browserPage.streamTabConsumers);
135+
await t.expect(browserPage.scoreButton.textContent).eql('Consumer Name', 'The Conusmer view is opened');
136+
await t.click(browserPage.streamTabGroups);
137+
await t.expect(browserPage.scoreButton.textContent).eql('Group Name', 'The Consumer Groups view is opened');
138+
});

0 commit comments

Comments
 (0)