Skip to content

Commit 9e570ba

Browse files
Merge pull request #3753 from RedisInsight/e2e/feature/RI-5934-format-timestamps-across-entire-application
E2e/feature/ri 5934 format timestamps across entire application
2 parents b311ea5 + 51eacfc commit 9e570ba

File tree

4 files changed

+124
-3
lines changed

4 files changed

+124
-3
lines changed

redisinsight/ui/src/pages/settings/components/general-settings/datetime-formatter/DateTimeFormatter.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,8 @@ const DateTimeFormatter = () => {
170170
</div>
171171
<EuiSuperSelect
172172
className={styles.datetimeInput}
173-
options={dateTimeOptions}
173+
options={dateTimeOptions
174+
.map((option) => ({ ...option, 'data-test-subj': `date-option-${option.value}` }))}
174175
valueOfSelected={formik.values.commonFormat}
175176
onChange={(option) => onCommonFormatChange(option)}
176177
disabled={formik.values.selectedRadioOption !== DatetimeRadioOption.Common}
@@ -247,7 +248,8 @@ const DateTimeFormatter = () => {
247248
<div>
248249
<EuiSuperSelect
249250
className={styles.datetimeInput}
250-
options={timezoneOptions}
251+
options={timezoneOptions
252+
.map((option) => ({ ...option, 'data-test-subj': `zone-option-${option.value}` }))}
251253
valueOfSelected={formik.values.timezone}
252254
onChange={(option) => onTimezoneChange(option)}
253255
data-test-subj="select-timezone"
@@ -257,7 +259,7 @@ const DateTimeFormatter = () => {
257259
<EuiFlexItem grow={2}>
258260
<div className={styles.previewContainer}>
259261
<EuiText className={styles.dateTimeSubtitle} color="subdued">Preview:</EuiText>
260-
<EuiText className={styles.preview}>{preview}</EuiText>
262+
<EuiText className={styles.preview} data-testid="data-preview">{preview}</EuiText>
261263
</div>
262264
</EuiFlexItem>
263265
</EuiFlexGroup>

tests/e2e/pageObjects/memory-efficiency-page.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export class MemoryEfficiencyPage extends InstancePage {
1313
cssReadMoreLink = '[data-testid=read-more-link]';
1414
cssKeyName = '[data-testid=recommendation-key-name]';
1515
// BUTTONS
16+
databaseAnalysisTab = Selector('[data-testid=analytics-tab-DatabaseAnalysis]');
1617
newReportBtn = Selector('[data-testid=start-database-analysis-btn]');
1718
expandArrowBtn = Selector('[data-testid^=expand-arrow-]');
1819
sortByKeyPattern = Selector('[data-testid=tableHeaderSortButton]');

tests/e2e/pageObjects/settings-page.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,19 @@ export class SettingsPage extends BasePage {
2525
commandsInPipelineInput = Selector('[data-testid=pipeline-bunch-input]');
2626
pipelineLink = Selector('[data-testid=pipelining-link]');
2727

28+
//Date and Time Format
29+
selectFormatDropdown = Selector('[data-test-subj=select-datetime]');
30+
selectTimezoneDropdown = Selector('[data-test-subj=select-timezone]');
31+
dataPreview = Selector('[data-testid=data-preview]');
32+
customRadioButton = Selector('[id=custom]').sibling();
33+
customTextField = Selector('[data-testid=custom-datetime-input]');
34+
saveCustomFormatButton = Selector('[data-testid=datetime-custom-btn]');
35+
36+
getDateTimeOption = (option: string): Selector =>
37+
Selector(`[data-test-subj^=date-option-${option}]`);
38+
getZoneOption = (option: string): Selector =>
39+
Selector(`[data-test-subj=zone-option-${option}]`);
40+
2841
/**
2942
* Change Keys to Scan value
3043
* @param value Value for scan
@@ -107,4 +120,26 @@ export class SettingsPage extends BasePage {
107120
await t.click(this.switchAnalyticsOption);
108121
}
109122
}
123+
124+
/**
125+
* Select data time option in Settings
126+
*/
127+
async selectDataFormatDropdown(value: string): Promise<void>{
128+
await t.click(this.selectFormatDropdown);
129+
await t.click(this.getDateTimeOption(value));
130+
}
131+
132+
/**
133+
* Select timezone option in Settings
134+
*/
135+
async selectTimeZoneDropdown(value: string): Promise<void>{
136+
await t.click(this.selectTimezoneDropdown);
137+
await t.click(this.getZoneOption(value));
138+
}
139+
/**
140+
* Enter text in custom field Select timezone option in Settings
141+
*/
142+
async enterTextInCustom(command: string): Promise<void>{
143+
await t.typeText(this.customTextField, command, { replace: true });
144+
}
110145
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import { rte } from '../../../../helpers/constants';
2+
import { BrowserPage, MemoryEfficiencyPage, SettingsPage, WorkbenchPage } from '../../../../pageObjects';
3+
import {
4+
commonUrl, ossClusterConfig
5+
} from '../../../../helpers/conf';
6+
import { DatabaseAPIRequests } from '../../../../helpers/api/api-database';
7+
import { deleteAllKeysFromDB } from '../../../../helpers/keys';
8+
import { DatabaseHelper } from '../../../../helpers';
9+
10+
const browserPage = new BrowserPage();
11+
const databaseAPIRequests = new DatabaseAPIRequests();
12+
const workbenchPage = new WorkbenchPage();
13+
const settingsPage = new SettingsPage();
14+
const memoryEfficiencyPage = new MemoryEfficiencyPage();
15+
const databaseHelper = new DatabaseHelper();
16+
17+
fixture `DataTime format setting`
18+
.meta({
19+
type: 'regression',
20+
rte: rte.standalone
21+
})
22+
.page(commonUrl)
23+
.beforeEach(async() => {
24+
await databaseHelper.acceptLicenseTermsAndAddOSSClusterDatabase(ossClusterConfig);
25+
})
26+
.afterEach(async() => {
27+
await deleteAllKeysFromDB(ossClusterConfig.ossClusterPort, ossClusterConfig.ossClusterPort);
28+
await databaseAPIRequests.deleteAllDatabasesApi();
29+
});
30+
test('Verify that user can select date time format', async t => {
31+
const defaultDateRegExp = /^([01]\d|2[0-3]):[0-5]\d:[0-5]\d\.\d{3} \d{1,2} (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{4}$/;
32+
const selectedDateReqExp = /^(0[1-9]|[12]\d|3[01])\.(0[1-9]|1[0-2])\.\d{4} ([01]\d|2[0-3]):[0-5]\d:[0-5]\d$/;
33+
const keyName = 'DateTimeTestKey';
34+
const hashField = '1724674140';
35+
36+
const selectorForOption = 'dd\\.MM\\.yyyy';
37+
const selectedOption = 'dd.MM.yyyy HH:mm:ss';
38+
const zoneSelectOption = 'UTC';
39+
40+
await browserPage.addHashKey(keyName, '100000', hashField, hashField);
41+
await browserPage.openKeyDetails(keyName);
42+
await browserPage.selectFormatter('DateTime');
43+
await t.expect(defaultDateRegExp.test(await browserPage.getHashKeyValue())).ok('date is not in default format HH:mm:ss.SSS d MMM yyyy');
44+
45+
await t.click(workbenchPage.NavigationPanel.settingsButton);
46+
await t.click(settingsPage.accordionAppearance);
47+
await settingsPage.selectDataFormatDropdown(selectorForOption);
48+
await t.expect(settingsPage.selectFormatDropdown.textContent).eql(selectedOption, 'option is not selected');
49+
await t.expect(selectedDateReqExp.test(await settingsPage.dataPreview.textContent)).ok(`preview is not valid for ${selectedOption}`);
50+
51+
await t.click(workbenchPage.NavigationPanel.myRedisDBButton);
52+
await t.click(workbenchPage.NavigationPanel.browserButton);
53+
await browserPage.openKeyDetails(keyName);
54+
await t.expect(selectedDateReqExp.test(await browserPage.getHashKeyValue())).ok(`date is not in selected format ${selectedOption}`);
55+
56+
await t.click(workbenchPage.NavigationPanel.settingsButton);
57+
await t.click(settingsPage.accordionAppearance);
58+
await settingsPage.selectTimeZoneDropdown(zoneSelectOption);
59+
await t.expect(settingsPage.selectTimezoneDropdown.textContent).eql(zoneSelectOption, 'option is not selected');
60+
61+
await t.click(browserPage.NavigationPanel.workbenchButton);
62+
await workbenchPage.sendCommandInWorkbench('info');
63+
const dateTime = await workbenchPage.queryCardContainer.nth(0).find(workbenchPage.cssCommandExecutionDateTime).textContent;
64+
await t.expect(selectedDateReqExp.test(dateTime)).ok('date is not in default format HH:mm:ss.SSS d MMM yyyy');
65+
66+
});
67+
68+
test('Verify that user can set custom date time format', async t => {
69+
const enteredFormat = 'MMM dd yyyy/ HH.mm.ss';
70+
const enteredDateReqExp = /^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ([0-2]\d|3[01]) \d{4}\/ ([01]\d|2[0-3])\.[0-5]\d\.[0-5]\d$/;
71+
72+
await t.click(workbenchPage.NavigationPanel.settingsButton);
73+
await t.click(settingsPage.accordionAppearance);
74+
await t.click(settingsPage.customRadioButton);
75+
await settingsPage.enterTextInCustom(enteredFormat);
76+
await t.expect(enteredDateReqExp.test(await settingsPage.dataPreview.textContent)).ok(`preview is not valid for ${enteredFormat}`);
77+
await t.click(settingsPage.saveCustomFormatButton);
78+
79+
await t.click(settingsPage.NavigationPanel.analysisPageButton);
80+
await t.click(memoryEfficiencyPage.databaseAnalysisTab);
81+
await t.click(memoryEfficiencyPage.newReportBtn);
82+
await t.expect(enteredDateReqExp.test(await memoryEfficiencyPage.selectedReport.textContent)).ok(`custom format is not working ${enteredFormat}`);
83+
});

0 commit comments

Comments
 (0)