Skip to content

Commit d8596df

Browse files
authored
Merge pull request #1141 from RedisInsight/e2e/feature/pickle-formatter
e2e/feature/pickle-formatter
2 parents 9cede76 + d9ea452 commit d8596df

File tree

4 files changed

+77
-46
lines changed

4 files changed

+77
-46
lines changed

tests/e2e/pageObjects/browser-page.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ export class BrowserPage {
114114
claimTimeOptionSelect = Selector('[data-testid=time-option-select]');
115115
relativeTimeOption = Selector('#idle');
116116
timestampOption = Selector('#time');
117-
formatSwitcher = Selector('[data-testid=select-format-key-value]');
117+
formatSwitcher = Selector('[data-testid=select-format-key-value]', { timeout: 2000 });
118118
formatSwitcherIcon = Selector('img[data-testid^=key-value-formatter-option-selected]');
119119
//TABS
120120
streamTabGroups = Selector('[data-testid=stream-tab-Groups]');

tests/e2e/test-data/formatters-data.ts

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,27 @@ export const formatters = [{
55
format: 'JSON',
66
fromText: '{ "field": "value" }',
77
fromTextEdit: '{ "field": "value123" }'
8-
}, {
8+
},
9+
{
910
format: 'Msgpack',
1011
fromHexText: 'DF00000001A56669656C64A576616C7565',
1112
fromText: '{ "field": "value" }',
1213
fromTextEdit: '{ "field": "value123" }',
1314
formattedText: '{ "field": "value" }'
14-
}, {
15+
},
16+
{
1517
format: 'Protobuf',
1618
fromHexText: '08d90f10d802',
1719
formattedText: '[ { "1": 2009 }, { "2": 344 } ]'
18-
}, {
19-
format: 'PHP Unserialize',
20+
},
21+
{
22+
format: 'PHP serialized',
2023
fromText: 'a:2:{i:0;s:12:"Sample array";i:1;a:2:{i:0;s:5:"Apple";i:1;s:6:"Orange";}}',
2124
fromTextEdit: '[ "Sample array", [ "Apple", "Orange15" ] ]',
2225
formattedText: '[ "Sample array", [ "Apple", "Orange" ] ]'
23-
}, {
24-
format: 'Java Object',
26+
},
27+
{
28+
format: 'Java serialized',
2529
fromHexText: 'aced000573720008456d706c6f796565025e743467c6123c0200034900066e756d6265724c0007616464726573737400124c6a6176612f6c616e672f537472696e673b4c00046e616d6571007e000178700000006574001950686f6b6b61204b75616e2c20416d62656874612050656572740009526579616e20416c69',
2630
formattedText: '{ "fields": [ { "number": 101 }, { "address": "Phokka Kuan, Ambehta Peer" }, { "name": "Reyan Ali" } ], "annotations": [], "className": "Employee", "serialVersionUid": "170701604314812988" }'
2731
},
@@ -45,10 +49,15 @@ export const formatters = [{
4549
fromTextEdit: '水山 рус bin 子',
4650
formattedText: '1110011010110000101101000010000011010001100000001101000110000011110100011000000100100000011000100110100101101110',
4751
formattedTextEdit: '111001101011000010110100111001011011000110110001001000001101000110000000110100011000001111010001100000010010000001100010011010010110111000100000111001011010110110010000'
52+
},
53+
{
54+
format: 'Pickle',
55+
fromHexText: '286470300a5327617272270a70310a286c70320a49310a6149320a617353276f626a270a70330a286470340a532761270a70350a532762270a70360a7373532748656c6c6f270a70370a5327776f726c64270a70380a732e',
56+
formattedText: '{ "arr": [ 1, 2 ], "obj": { "a": "b" }, "Hello": "world" }'
4857
}];
4958

5059
/**
51-
* PHP data for convertion including different php unserialize data types
60+
* PHP data for convertion including different php serialized data types
5261
*/
5362
export const phpData = [{
5463
dataType: 'Object',

tests/e2e/tests/critical-path/browser/formatters.e2e.ts

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@ const keysData = keyTypes.map(object => ({ ...object })).filter((v, i) => i <= 6
1515
keysData.forEach(key => key.keyName = `${key.keyName}` + '-' + `${common.generateWord(keyLength)}`);
1616
const binaryFormattersSet = [formatters[5], formatters[6], formatters[7]];
1717
const formattersHighlightedSet = [formatters[0], formatters[3]];
18-
const fromBinaryFormattersSet = [formatters[1], formatters[2], formatters[4]];
18+
const fromBinaryFormattersSet = [formatters[1], formatters[2], formatters[4], formatters[8]];
1919
const formattersForEditSet = [formatters[0], formatters[1], formatters[3]];
20-
const formattersWithTooltipSet = [formatters[0], formatters[1], formatters[2], formatters[3], formatters[4]];
21-
const notEditableFormattersSet = [formatters[2], formatters[4]];
20+
const formattersWithTooltipSet = [formatters[0], formatters[1], formatters[2], formatters[3], formatters[4], formatters[8]];
21+
const notEditableFormattersSet = [formatters[2], formatters[4], formatters[8]];
22+
const defaultFormatter = 'Unicode';
2223

2324
fixture `Formatters`
2425
.meta({
@@ -43,21 +44,22 @@ formattersHighlightedSet.forEach(formatter => {
4344
// Create new keys
4445
await addKeysViaCli(keysData, formatter.fromText, formatter.fromText);
4546
})(`Verify that user can see highlighted key details in ${formatter.format} format`, async t => {
46-
// Verify for JSON and PHP Unserialize
47+
// Verify for JSON and PHP serialized
4748
// Verify for Hash, List, Set, ZSet, String, Stream keys
4849
for (const key of keysData) {
4950
const valueSelector = Selector(`[data-testid^=${key.keyName.split('-')[0]}-][data-testid*=${key.data}]`);
5051
await browserPage.openKeyDetailsByKeyName(key.keyName);
5152
// Verify that value not formatted with default formatter
53+
await browserPage.selectFormatter(defaultFormatter);
5254
await t.expect(valueSelector.find(browserPage.cssJsonValue).exists).notOk(`${key.textType} Value is formatted to ${formatter.format}`);
5355
await browserPage.selectFormatter(formatter.format);
5456
// Verify that value is formatted and highlighted
5557
await t.expect(valueSelector.find(browserPage.cssJsonValue).exists).ok(`${key.textType} Value is not formatted to ${formatter.format}`);
56-
// Verify that Hash field is formatted and highlighted for JSON and PHP Unserialize
58+
// Verify that Hash field is formatted and highlighted for JSON and PHP serialized
5759
if (key.keyName === 'hash') {
5860
await t.expect(browserPage.hashField.find(browserPage.cssJsonValue).exists).ok(`Hash field is not formatted to ${formatter.format}`);
5961
}
60-
// Verify that Stream field is formatted and highlighted for JSON and PHP Unserialize
62+
// Verify that Stream field is formatted and highlighted for JSON and PHP serialized
6163
if (key.keyName === 'stream') {
6264
await t.expect(Selector(browserPage.cssJsonValue).count).eql(2, `Hash field is not formatted to ${formatter.format}`);
6365
}
@@ -66,7 +68,7 @@ formattersHighlightedSet.forEach(formatter => {
6668
});
6769
fromBinaryFormattersSet.forEach(formatter => {
6870
test(`Verify that user can see highlighted key details in ${formatter.format} format`, async t => {
69-
// Verify for Msgpack, Protobuf, Java Object formats
71+
// Verify for Msgpack, Protobuf, Java serialized, Pickle formats
7072
// Open Hash key details
7173
await browserPage.openKeyDetailsByKeyName(keysData[0].keyName);
7274
// Add valid value in HEX format for convertion
@@ -81,7 +83,7 @@ fromBinaryFormattersSet.forEach(formatter => {
8183
});
8284
formattersForEditSet.forEach(formatter => {
8385
test(`Verify that user can edit the values in the key regardless if they are valid in ${formatter.format} format or not`, async t => {
84-
// Verify for JSON, Msgpack, PHP unserialise formatters
86+
// Verify for JSON, Msgpack, PHP serialized formatters
8587
const invalidText = 'invalid text';
8688
// Open key details and select formatter
8789
await browserPage.openKeyDetails(keysData[0].keyName);
@@ -92,7 +94,7 @@ formattersForEditSet.forEach(formatter => {
9294
// Add valid value which can be converted
9395
await browserPage.editHashKeyValue(formatter.fromText ?? '');
9496
// Verify that valid value can be saved on edit
95-
formatter.format === 'PHP Unserialize'
97+
formatter.format === 'PHP serialized'
9698
? await t.expect(browserPage.hashFieldValue.innerText).contains(formatter.formattedText ?? '', `Valid ${formatter.format} value is not saved`)
9799
: await t.expect(browserPage.hashFieldValue.innerText).contains(formatter.fromText ?? '', `Valid ${formatter.format} value is not saved`);
98100
await t.expect(browserPage.hashFieldValue.find(browserPage.cssJsonValue).exists).ok(`Value is not formatted to ${formatter.format}`);
@@ -104,7 +106,7 @@ formattersForEditSet.forEach(formatter => {
104106
});
105107
formattersWithTooltipSet.forEach(formatter => {
106108
test(`Verify that user can see tooltip with convertion failed message on hover when data is not valid ${formatter.format}`, async t => {
107-
// Verify for JSON, Msgpack, Protobuf, PHP unserialise, Java serialized object formatters
109+
// Verify for JSON, Msgpack, Protobuf, PHP serialized, Java serialized object, Pickle formatters
108110
const failedMessage = `Failed to convert to ${formatter.format}`;
109111
for (let i = 0; i < keysData.length; i++) {
110112
const valueSelector = Selector(`[data-testid^=${keysData[i].keyName.split('-')[0]}-][data-testid*=${keysData[i].data}]`);
@@ -132,6 +134,7 @@ binaryFormattersSet.forEach(formatter => {
132134
const valueSelector = Selector(`[data-testid^=${keysData[i].keyName.split('-')[0]}-][data-testid*=${keysData[i].data}]`);
133135
await browserPage.openKeyDetailsByKeyName(keysData[i].keyName);
134136
// Verify that value not formatted with default formatter
137+
await browserPage.selectFormatter(defaultFormatter);
135138
await t.expect(valueSelector.innerText).contains(formatter.fromText ?? '', `Value is formatted as ${formatter.format} in Unicode`);
136139
await browserPage.selectFormatter(formatter.format);
137140
// Verify that value is formatted
@@ -163,7 +166,7 @@ binaryFormattersSet.forEach(formatter => {
163166
await t.expect(browserPage.hashFieldValue.innerText).contains(formatter.fromTextEdit ?? '', `${formatter.format} value is not converted to Unicode`);
164167
});
165168
});
166-
test('Verify that user can format different data types of PHP unserialize', async t => {
169+
test('Verify that user can format different data types of PHP serialized', async t => {
167170
// Open Hash key details
168171
await browserPage.openKeyDetailsByKeyName(keysData[0].keyName);
169172
for (const type of phpData) {
@@ -172,15 +175,15 @@ test('Verify that user can format different data types of PHP unserialize', asyn
172175
await browserPage.addFieldToHash(type.dataType, type.from);
173176
//Search the added field
174177
await browserPage.searchByTheValueInKeyDetails(type.dataType);
175-
await browserPage.selectFormatter('PHP Unserialize');
176-
// Verify that PHP Unserialize value is formatted and highlighted
178+
await browserPage.selectFormatter('PHP serialized');
179+
// Verify that PHP serialized value is formatted and highlighted
177180
await t.expect(browserPage.hashFieldValue.innerText).contains(type.converted, `Value is not saved as PHP ${type.dataType}`);
178181
await t.expect(browserPage.hashFieldValue.find(browserPage.cssJsonValue).exists).ok(`Value is not formatted to PHP ${type.dataType}`);
179182
}
180183
});
181184
notEditableFormattersSet.forEach(formatter => {
182185
test(`Verify that user see edit icon disabled for all keys when ${formatter.format} selected`, async t => {
183-
// Verify for Protobuf and Java Object
186+
// Verify for Protobuf, Java serialized, Pickle
184187
// Verify for Hash, List, ZSet, String keys
185188
for (const key of keysData) {
186189
if (key.keyName === 'hash' || key.keyName === 'list' || key.keyName === 'zset' || key.keyName === 'string') {

tests/e2e/tests/regression/browser/format-switcher.e2e.ts

Lines changed: 43 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
import { keyLength, rte } from '../../../helpers/constants';
22
import { addKeysViaCli, deleteKeysViaCli, keyTypes } from '../../../helpers/keys';
3-
import { acceptLicenseTermsAndAddDatabaseApi } from '../../../helpers/database';
4-
import { BrowserPage } from '../../../pageObjects';
3+
import { acceptLicenseTerms, acceptLicenseTermsAndAddDatabaseApi } from '../../../helpers/database';
4+
import { BrowserPage, MyRedisDatabasePage } from '../../../pageObjects';
55
import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf';
6-
import { deleteStandaloneDatabaseApi } from '../../../helpers/api/api-database';
6+
import { addNewStandaloneDatabasesApi, deleteStandaloneDatabaseApi, deleteStandaloneDatabasesApi } from '../../../helpers/api/api-database';
77
import { Common } from '../../../helpers/common';
88

99
const browserPage = new BrowserPage();
1010
const common = new Common();
11+
const myRedisDatabasePage = new MyRedisDatabasePage();
1112

1213
const keysData = keyTypes.map(object => ({ ...object }));
1314
keysData.forEach(key => key.keyName = `${key.keyName}` + '-' + `${common.generateWord(keyLength)}`);
14-
const defaultValue = 'Unicode';
15+
const databasesForAdding = [
16+
{ host: ossStandaloneConfig.host, port: ossStandaloneConfig.port, databaseName: 'testDB1' },
17+
{ host: ossStandaloneConfig.host, port: ossStandaloneConfig.port, databaseName: 'testDB2' }
18+
];
1519

1620
fixture `Format switcher functionality`
1721
.meta({
@@ -29,26 +33,41 @@ fixture `Format switcher functionality`
2933
await deleteKeysViaCli(keysData);
3034
await deleteStandaloneDatabaseApi(ossStandaloneConfig);
3135
});
32-
test('Verify that user can see switcher changed to default for key when reopening key details', async t => {
33-
// Open key details and select JSON formatter
34-
await browserPage.openKeyDetails(keysData[0].keyName);
35-
await browserPage.selectFormatter('JSON');
36-
// Reopen key details
37-
await t.click(browserPage.closeKeyButton);
38-
await browserPage.openKeyDetailsByKeyName(keysData[0].keyName);
39-
// Verify that formatter changed to default 'Unicode'
40-
await t.expect(browserPage.formatSwitcher.withExactText(defaultValue).visible).ok('Formatter value is not default');
41-
});
42-
test('Verify that user can see switcher changed to default for key when switching between keys when details tab opened', async t => {
43-
// Open key details and select HEX formatter
44-
await t.click(browserPage.searchButton);
45-
await browserPage.openKeyDetailsByKeyName(keysData[1].keyName);
46-
await browserPage.selectFormatter('HEX');
47-
// Open another key details
48-
await browserPage.openKeyDetailsByKeyName(keysData[3].keyName);
49-
// Verify that formatter changed to default 'Unicode'
50-
await t.expect(browserPage.formatSwitcher.withExactText(defaultValue).visible).ok('Formatter value is not default');
51-
});
36+
test
37+
.before(async() => {
38+
// Add new databases using API
39+
await acceptLicenseTerms();
40+
await addNewStandaloneDatabasesApi(databasesForAdding);
41+
// Reload Page
42+
await common.reloadPage();
43+
await myRedisDatabasePage.clickOnDBByName(databasesForAdding[0].databaseName);
44+
// Create new keys
45+
await addKeysViaCli(keysData);
46+
})
47+
.after(async() => {
48+
// Clear keys and database
49+
await deleteKeysViaCli(keysData);
50+
await deleteStandaloneDatabasesApi(databasesForAdding);
51+
})('Formatters saved selection', async t => {
52+
// Open key details and select JSON formatter
53+
await browserPage.openKeyDetails(keysData[0].keyName);
54+
await browserPage.selectFormatter('JSON');
55+
// Reopen key details
56+
await t.click(browserPage.closeKeyButton);
57+
await browserPage.openKeyDetailsByKeyName(keysData[0].keyName);
58+
// Verify that formatters selection is saved when user switches between keys
59+
await t.expect(browserPage.formatSwitcher.withExactText('JSON').visible).ok('Formatter value is not saved');
60+
// Verify that formatters selection is saved when user reloads the page
61+
await common.reloadPage();
62+
await browserPage.openKeyDetailsByKeyName(keysData[1].keyName);
63+
await t.expect(browserPage.formatSwitcher.withExactText('JSON').visible).ok('Formatter value is not saved');
64+
// Go to another database
65+
await t.click(myRedisDatabasePage.myRedisDBButton);
66+
await myRedisDatabasePage.clickOnDBByName(databasesForAdding[1].databaseName);
67+
await browserPage.openKeyDetailsByKeyName(keysData[2].keyName);
68+
// Verify that formatters selection is saved when user switches between databases
69+
await t.expect(browserPage.formatSwitcher.withExactText('JSON').visible).ok('Formatter value is not saved');
70+
});
5271
test('Verify that user don`t see format switcher for JSON, GRAPH, TS keys', async t => {
5372
// Create array with JSON, GRAPH, TS keys
5473
const keysWithoutSwitcher = [keysData[5], keysData[7], keysData[8]];

0 commit comments

Comments
 (0)