Skip to content

Commit 874c919

Browse files
Merge pull request #3459 from RedisInsight/e2e/feature/RI-5767_update-key-details
E2e/feature/ri 5767 update key details
2 parents 83023f3 + b5d8dcb commit 874c919

File tree

17 files changed

+240
-122
lines changed

17 files changed

+240
-122
lines changed

tests/e2e/helpers/keys.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export function getRandomParagraph(sentences: number): string {
2929

3030
export const keyTypes = [
3131
{ textType: KeyTypesTexts.Hash, keyName: 'hash', data: 'value' },
32-
{ textType: KeyTypesTexts.List, keyName: 'list', data: 'element' },
32+
{ textType: KeyTypesTexts.List, keyName: 'list_', data: 'value' },
3333
{ textType: KeyTypesTexts.Set, keyName: 'set', data: 'member' },
3434
{ textType: KeyTypesTexts.ZSet, keyName: 'zset', data: 'member' },
3535
{ textType: KeyTypesTexts.String, keyName: 'string', data: 'value' },
@@ -39,6 +39,15 @@ export const keyTypes = [
3939
{ textType: KeyTypesTexts.TimeSeries, keyName: 'timeSeries' }
4040
];
4141

42+
export const formattersKeyTypes = [
43+
{ textType: KeyTypesTexts.Hash, keyName: 'hash', data: 'value' },
44+
{ textType: KeyTypesTexts.List, keyName: 'list_', data: 'value' },
45+
{ textType: KeyTypesTexts.Set, keyName: 'set', data: 'member' },
46+
{ textType: KeyTypesTexts.ZSet, keyName: 'zset', data: 'member' },
47+
{ textType: KeyTypesTexts.String, keyName: 'string', data: 'value' },
48+
{ textType: KeyTypesTexts.Stream, keyName: 'stream', data: 'field' }
49+
];
50+
4251
/**
4352
* Adding keys of each type through the cli
4453
* @param keyData The key data

tests/e2e/pageObjects/browser-page.ts

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export class BrowserPage extends InstancePage {
1212
cssSelectorRows = '[aria-label="row"]';
1313
cssSelectorKey = '[data-testid^=key-]';
1414
cssFilteringLabel = '[data-testid=multi-search]';
15+
cssPrimitiveJsonValue = '[data-testid=json-primitive-value]';
1516
cssJsonValue = '[data-testid=value-as-json]';
1617
cssRowInVirtualizedTable = '[role=gridcell]';
1718
cssVirtualTableRow = '[aria-label=row]';
@@ -92,9 +93,9 @@ export class BrowserPage extends InstancePage {
9293
editStreamLastIdButton = Selector('[data-testid^=edit-stream-last-id]');
9394
saveButton = Selector('[data-testid=save-btn]');
9495
bulkActionsButton = Selector('[data-testid=btn-bulk-actions]');
95-
editHashButton = Selector('[data-testid^=edit-hash-button-]');
96-
editZsetButton = Selector('[data-testid^=zset-edit-button-]');
97-
editListButton = Selector('[data-testid^=edit-list-button-]');
96+
editHashButton = Selector('[data-testid^=hash_edit-btn-]');
97+
editZsetButton = Selector('[data-testid^=zset_edit-btn-]');
98+
editListButton = Selector('[data-testid^=list_edit-btn-]');
9899
cancelStreamGroupBtn = Selector('[data-testid=cancel-stream-groups-btn]');
99100
patternModeBtn = Selector('[data-testid=search-mode-pattern-btn]');
100101
redisearchModeBtn = Selector('[data-testid=search-mode-redisearch-btn]');
@@ -159,10 +160,9 @@ export class BrowserPage extends InstancePage {
159160
ttlText = Selector('[data-testid=key-ttl-text] span');
160161
hashFieldValueInput = Selector('[data-testid=field-value]');
161162
hashFieldNameInput = Selector('[data-testid=field-name]');
162-
hashFieldValueEditor = Selector('[data-testid=hash-value-editor]');
163-
listElementEditor = Selector('[data-testid=hash-value-editor]');
163+
hashFieldValueEditor = Selector('[data-testid^=hash_value-editor]');
164164
listKeyElementInput = Selector('[data-testid=element]');
165-
listKeyElementEditorInput = Selector('[data-testid=element-value-editor]');
165+
listKeyElementEditorInput = Selector('[data-testid^=list_value-editor-0]');
166166
stringKeyValueInput = Selector('[data-testid=string-value]');
167167
jsonKeyValueInput = Selector('[data-mode-id=json]');
168168
jsonUploadInput = Selector('[data-testid=upload-input-file]');
@@ -199,13 +199,13 @@ export class BrowserPage extends InstancePage {
199199
keyLengthDetails = Selector('[data-testid=key-length-text]');
200200
keyNameInTheList = Selector(this.cssSelectorKey);
201201
hashFieldsList = Selector('[data-testid^=hash-field-] span');
202-
hashValuesList = Selector('[data-testid^=hash-field-value-] span');
202+
hashValuesList = Selector('[data-testid^=hash_content-value-] span');
203203
hashField = Selector('[data-testid^=hash-field-]').nth(0);
204-
hashFieldValue = Selector('[data-testid^=hash-field-value-]');
204+
hashFieldValue = Selector('[data-testid^=hash_content-value-]');
205205
setMembersList = Selector('[data-testid^=set-member-value-]');
206206
zsetMembersList = Selector('[data-testid^=zset-member-value-]');
207-
zsetScoresList = Selector('[data-testid^=zset-score-value-]');
208-
listElementsList = Selector('[data-testid^=list-element-value-]');
207+
zsetScoresList = Selector('[data-testid^=zset_content-value-]');
208+
listElementsList = Selector('[data-testid^=list_content-value-]');
209209
jsonKeyValue = Selector('[data-testid=json-data]');
210210
jsonError = Selector('[data-testid=edit-json-error]');
211211
tooltip = Selector('[role=tooltip]', { timeout: 500 });
@@ -614,11 +614,12 @@ export class BrowserPage extends InstancePage {
614614
}
615615

616616
/**
617-
* Edit Zset key score from details
618-
* @param value The value of the key
617+
* Edit Zset key the firstscore from details
618+
* @param value The new value of the key
619619
*/
620620
async editZsetKeyScore(value: string): Promise<void> {
621621
await t
622+
.hover(this.zsetScoresList)
622623
.click(this.editZsetButton)
623624
.typeText(this.inlineItemEditor, value, { replace: true, paste: true })
624625
.click(this.applyButton);
@@ -645,11 +646,12 @@ export class BrowserPage extends InstancePage {
645646
}
646647

647648
/**
648-
* Edit Hash key value from details
649-
* @param value The value of the key
649+
* Edit Hash key the first value from details
650+
* @param value The new value of the key
650651
*/
651652
async editHashKeyValue(value: string): Promise<void> {
652653
await t
654+
.hover(this.hashFieldValue)
653655
.click(this.editHashButton)
654656
.typeText(this.hashFieldValueEditor, value, { replace: true, paste: true })
655657
.click(this.applyButton);
@@ -666,6 +668,7 @@ export class BrowserPage extends InstancePage {
666668
*/
667669
async editListKeyValue(value: string): Promise<void> {
668670
await t
671+
.hover(this.listElementsList)
669672
.click(this.editListButton)
670673
.typeText(this.listKeyElementEditorInput, value, { replace: true, paste: true })
671674
.click(this.applyButton);
Lines changed: 74 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1,90 +1,78 @@
1+
import {
2+
ASCIIFormatter,
3+
BinaryFormatter,
4+
HEXFormatter,
5+
JavaFormatter,
6+
JSONFormatter,
7+
MsgpackFormatter,
8+
PHPFormatter,
9+
PickleFormatter,
10+
ProtobufFormatter,
11+
Vector32BitFormatter,
12+
Vector64BitFormatter
13+
} from './formatters';
14+
15+
interface IFormatter {
16+
format: string,
17+
fromText?: string,
18+
fromTextEdit?: string,
19+
fromBigInt?: string,
20+
formattedText?: string,
21+
fromHexText?: string,
22+
formattedTextEdit?: string
23+
}
24+
125
/**
226
* Formatters objects with test data for format convertion
327
*/
4-
export const formatters = [{
5-
format: 'JSON',
6-
fromText: '{ "field": "value" }',
7-
fromTextEdit: '{ "field": "value123" }',
8-
fromBigInt: '{ "field": 248480010225057793 }'
9-
},
10-
{
11-
format: 'Msgpack',
12-
fromHexText: 'DF00000001A56669656C64A576616C7565',
13-
fromText: '{ "field": "value" }',
14-
fromTextEdit: '{ "field": "value123" }',
15-
formattedText: '{ "field": "value" }'
16-
},
17-
{
18-
format: 'Protobuf',
19-
fromHexText: '08d90f10d802',
20-
formattedText: '[ { "1": 2009 }, { "2": 344 } ]'
21-
},
22-
{
23-
format: 'PHP serialized',
24-
fromText: 'a:2:{i:0;s:12:"Sample array";i:1;a:2:{i:0;s:5:"Apple";i:1;s:6:"Orange";}}',
25-
fromTextEdit: '[ "Sample array", [ "Apple", "Orange15" ] ]',
26-
formattedText: '[ "Sample array", [ "Apple", "Orange" ] ]'
27-
},
28-
{
29-
format: 'Java serialized',
30-
fromHexText: 'aced000573720008456d706c6f796565025e743467c6123c0200034900066e756d6265724c0007616464726573737400124c6a6176612f6c616e672f537472696e673b4c00046e616d6571007e000178700000006574001950686f6b6b61204b75616e2c20416d62656874612050656572740009526579616e20416c69',
31-
formattedText: '{ "fields": [ { "number": 101 }, { "address": "Phokka Kuan, Ambehta Peer" }, { "name": "Reyan Ali" } ], "annotations": [], "className": "Employee", "serialVersionUid": 170701604314812988 }'
32-
},
33-
{
34-
format: 'ASCII',
35-
fromText: '山女子水 рус ascii',
36-
fromTextEdit: '山女子水 рус ascii 山女子',
37-
formattedText: '\\xe5\\xb1\\xb1\\xe5\\xa5\\xb3\\xe5\\xad\\x90\\xe6\\xb0\\xb4 \\xd1\\x80\\xd1\\x83\\xd1\\x81 ascii',
38-
formattedTextEdit: '\\xe5\\xb1\\xb1\\xe5\\xa5\\xb3\\xe5\\xad\\x90\\xe6\\xb0\\xb4 \\xd1\\x80\\xd1\\x83\\xd1\\x81 ascii \\xe5\\xb1\\xb1\\xe5\\xa5\\xb3\\xe5\\xad\\x90'
39-
},
40-
{
41-
format: 'HEX',
42-
fromText: '山女子水 рус hex',
43-
fromTextEdit: '山女子水 рус hex 山女子',
44-
formattedText: 'e5b1b1e5a5b3e5ad90e6b0b420d180d183d18120686578',
45-
formattedTextEdit: 'e5b1b1e5a5b3e5ad90e6b0b420d180d183d1812068657820e5b1b1e5a5b3e5ad90'
46-
},
47-
{
48-
format: 'Binary',
49-
fromText: '水 рус bin',
50-
fromTextEdit: '水山 рус bin 子',
51-
formattedText: '1110011010110000101101000010000011010001100000001101000110000011110100011000000100100000011000100110100101101110',
52-
formattedTextEdit: '111001101011000010110100111001011011000110110001001000001101000110000000110100011000001111010001100000010010000001100010011010010110111000100000111001011010110110010000'
53-
},
54-
{
55-
format: 'Pickle',
56-
fromHexText: '286470300a5327617272270a70310a286c70320a49310a6149320a617353276f626a270a70330a286470340a532761270a70350a532762270a70360a7373532748656c6c6f270a70370a5327776f726c64270a70380a732e',
57-
formattedText: '{ "arr": [ 1, 2 ], "obj": { "a": "b" }, "Hello": "world" }'
58-
},
59-
{
60-
format: 'Vector 32-bit',
61-
fromHexText: '0000803f0000004000004040',
62-
formattedText: '[ 1, 2, 3 ]',
63-
},
64-
{
65-
format: 'Vector 64-bit',
66-
fromHexText: '000000000000f03f00000000000000400000000000000840',
67-
formattedText: '[ 1, 2, 3 ]',
68-
}];
28+
export const formatters: IFormatter[] = [
29+
JSONFormatter,
30+
MsgpackFormatter,
31+
ProtobufFormatter,
32+
PHPFormatter,
33+
JavaFormatter,
34+
ASCIIFormatter,
35+
HEXFormatter,
36+
BinaryFormatter,
37+
PickleFormatter,
38+
Vector32BitFormatter,
39+
Vector64BitFormatter
40+
];
6941

70-
/**
71-
* PHP data for convertion including different php serialized data types
72-
*/
73-
export const phpData = [{
74-
dataType: 'Object',
75-
//commented due to bug: RI-4906 it's not a priority. can be removed if users won't submitted bugs for a short period of time
76-
//from: 'a:6:{i:1;s:30:"PHP code tester Sandbox Online";s:5:"emoji";s:24:"😀 😃 😄 😁 😆";i:2;i:5;i:5;i:89009;s:13:"Random number";i:341;s:11:"PHP Version";s:5:"8.1.9";}',
77-
//converted: '{ "1": "PHP code tester Sandbox Online", "2": 5, "5": 89009, "emoji": "😀 😃 😄 😁 😆", "Random number": 341, "PHP Version": "8.1.9" }'
78-
from: 'a:5:{s:1:"1";s:30:"PHP code tester Sandbox Online";s:1:"2";i:5;s:1:"5";i:89009;s:13:"Random number";i:341;s:11:"PHP Version";s:5:"8.1.9";}',
79-
converted: '{ "1": "PHP code tester Sandbox Online", "2": 5, "5": 89009, "Random number": 341, "PHP Version": "8.1.9" }'
80-
},
81-
{
82-
dataType: 'Number',
83-
from: 'i:34567234;',
84-
converted: '34567234'
85-
},
86-
{
87-
dataType: 'String',
88-
from: 's:72:"Dumbledore took Harry in his arms and turned toward the Dursleys\' house.";',
89-
converted: '"Dumbledore took Harry in his arms and turned toward the Dursleys\' house."'
90-
}];
42+
export const binaryFormattersSet: IFormatter[] = [
43+
ASCIIFormatter,
44+
HEXFormatter,
45+
BinaryFormatter
46+
];
47+
48+
export const formattersHighlightedSet: IFormatter[] = [JSONFormatter, PHPFormatter];
49+
export const fromBinaryFormattersSet: IFormatter[] = [
50+
MsgpackFormatter,
51+
ProtobufFormatter,
52+
JavaFormatter,
53+
PickleFormatter,
54+
Vector32BitFormatter,
55+
Vector64BitFormatter
56+
];
57+
export const formattersForEditSet: IFormatter[] = [
58+
JSONFormatter,
59+
MsgpackFormatter,
60+
PHPFormatter
61+
];
62+
export const formattersWithTooltipSet: IFormatter[] = [
63+
JSONFormatter,
64+
MsgpackFormatter,
65+
ProtobufFormatter,
66+
PHPFormatter,
67+
JavaFormatter,
68+
PickleFormatter,
69+
Vector32BitFormatter,
70+
Vector64BitFormatter
71+
];
72+
export const notEditableFormattersSet: IFormatter[] = [
73+
ProtobufFormatter,
74+
JavaFormatter,
75+
PickleFormatter,
76+
Vector32BitFormatter,
77+
Vector64BitFormatter
78+
];
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export const ASCIIFormatter = {
2+
format: 'ASCII',
3+
fromText: '山女子水 рус ascii',
4+
fromTextEdit: '山女子水 рус ascii 山女子',
5+
formattedText: '\\xe5\\xb1\\xb1\\xe5\\xa5\\xb3\\xe5\\xad\\x90\\xe6\\xb0\\xb4 \\xd1\\x80\\xd1\\x83\\xd1\\x81 ascii',
6+
formattedTextEdit: '\\xe5\\xb1\\xb1\\xe5\\xa5\\xb3\\xe5\\xad\\x90\\xe6\\xb0\\xb4 \\xd1\\x80\\xd1\\x83\\xd1\\x81 ascii \\xe5\\xb1\\xb1\\xe5\\xa5\\xb3\\xe5\\xad\\x90'
7+
};
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export const BinaryFormatter = {
2+
format: 'Binary',
3+
fromText: '水 рус bin',
4+
fromTextEdit: '水山 рус bin 子',
5+
formattedText: '1110011010110000101101000010000011010001100000001101000110000011110100011000000100100000011000100110100101101110',
6+
formattedTextEdit: '111001101011000010110100111001011011000110110001001000001101000110000000110100011000001111010001100000010010000001100010011010010110111000100000111001011010110110010000'
7+
};
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export const HEXFormatter = {
2+
format: 'HEX',
3+
fromText: '山女子水 рус hex',
4+
fromTextEdit: '山女子水 рус hex 山女子',
5+
formattedText: 'e5b1b1e5a5b3e5ad90e6b0b420d180d183d18120686578',
6+
formattedTextEdit: 'e5b1b1e5a5b3e5ad90e6b0b420d180d183d1812068657820e5b1b1e5a5b3e5ad90'
7+
};
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export const JSONFormatter = {
2+
format: 'JSON',
3+
fromText: '{ "field": "value" }',
4+
fromTextEdit: '{ "field": "value123" }',
5+
fromBigInt: '{ "field": 248480010225057793 }'
6+
};
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export const JavaFormatter = {
2+
format: 'Java serialized',
3+
fromHexText: 'aced000573720008456d706c6f796565025e743467c6123c0200034900066e756d6265724c0007616464726573737400124c6a6176612f6c616e672f537472696e673b4c00046e616d6571007e000178700000006574001950686f6b6b61204b75616e2c20416d62656874612050656572740009526579616e20416c69',
4+
formattedText: '{ "fields": [ { "number": 101 }, { "address": "Phokka Kuan, Ambehta Peer" }, { "name": "Reyan Ali" } ], "annotations": [], "className": "Employee", "serialVersionUid": 170701604314812988 }'
5+
};
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export const MsgpackFormatter = {
2+
format: 'Msgpack',
3+
fromHexText: 'DF00000001A56669656C64A576616C7565',
4+
fromText: '{ "field": "value" }',
5+
fromTextEdit: '{ "field": "value123" }',
6+
formattedText: '{ "field": "value" }'
7+
};
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
export const PHPFormatter = {
2+
format: 'PHP serialized',
3+
fromText: 'a:2:{i:0;s:12:"Sample array";i:1;a:2:{i:0;s:5:"Apple";i:1;s:6:"Orange";}}',
4+
fromTextEdit: '[ "Sample array", [ "Apple", "Orange15" ] ]',
5+
formattedText: '[ "Sample array", [ "Apple", "Orange" ] ]'
6+
};
7+
8+
/**
9+
* PHP data for convertion including different php serialized data types
10+
*/
11+
export const phpData = [{
12+
dataType: 'Object',
13+
//commented due to bug: RI-4906 it's not a priority. can be removed if users won't submitted bugs for a short period of time
14+
//from: 'a:6:{i:1;s:30:"PHP code tester Sandbox Online";s:5:"emoji";s:24:"😀 😃 😄 😁 😆";i:2;i:5;i:5;i:89009;s:13:"Random number";i:341;s:11:"PHP Version";s:5:"8.1.9";}',
15+
//converted: '{ "1": "PHP code tester Sandbox Online", "2": 5, "5": 89009, "emoji": "😀 😃 😄 😁 😆", "Random number": 341, "PHP Version": "8.1.9" }'
16+
from: 'a:5:{s:1:"1";s:30:"PHP code tester Sandbox Online";s:1:"2";i:5;s:1:"5";i:89009;s:13:"Random number";i:341;s:11:"PHP Version";s:5:"8.1.9";}',
17+
converted: '{ "1": "PHP code tester Sandbox Online", "2": 5, "5": 89009, "Random number": 341, "PHP Version": "8.1.9" }'
18+
},
19+
{
20+
dataType: 'Number',
21+
from: 'i:34567234;',
22+
converted: '34567234'
23+
},
24+
{
25+
dataType: 'String',
26+
from: 's:72:"Dumbledore took Harry in his arms and turned toward the Dursleys\' house.";',
27+
converted: '"Dumbledore took Harry in his arms and turned toward the Dursleys\' house."'
28+
}];

0 commit comments

Comments
 (0)