Skip to content

Commit 32bccb0

Browse files
committed
e2e RI-5770_enchance_autocomplete_sqlite
1 parent 276c8f5 commit 32bccb0

File tree

15 files changed

+112
-96
lines changed

15 files changed

+112
-96
lines changed

tests/e2e/common-actions/monaco-editor.ts

Lines changed: 0 additions & 28 deletions
This file was deleted.
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { Selector, t } from 'testcafe';
2+
3+
export class MonacoEditor {
4+
//MONACO ELEMENTS
5+
monacoCommandDetails = Selector('div.suggest-details-container');
6+
monacoSuggestion = Selector('span.monaco-icon-name-container');
7+
monacoContextMenu = Selector('div.shadow-root-host').shadowRoot();
8+
monacoShortcutInput = Selector('input.input');
9+
monacoSuggestionOption = Selector('div.monaco-list-row');
10+
monacoHintWithArguments = Selector('[widgetid="editor.widget.parameterHintsWidget"]');
11+
monacoCommandIndicator = Selector('div.monaco-glyph-run-command');
12+
monacoWidget = Selector('[data-testid=monaco-widget]');
13+
nonRedisEditorResizeBottom = Selector('.t_resize-bottom');
14+
nonRedisEditorResizeTop = Selector('.t_resize-top');
15+
16+
/**
17+
* Send commands in monacoEditor
18+
* @param input The input locator
19+
* @param command command
20+
* @param clean if field should be cleaned
21+
*/
22+
async sendTextToMonaco(input: Selector, command: string, clean = true): Promise<void> {
23+
if(clean) {
24+
await t.click(input);
25+
await t
26+
// remove text since replace doesn't work here
27+
.pressKey('ctrl+a')
28+
.pressKey('delete');
29+
}
30+
await t.typeText(input, command);
31+
}
32+
33+
/**
34+
* Get text from monacoEditor
35+
*/
36+
async getTextFromMonaco(): Promise<string> {
37+
const textAreaMonaco = Selector('[class^=view-lines ]');
38+
return (await textAreaMonaco.textContent).replace(/\s+/g, ' ');
39+
}
40+
}

tests/e2e/pageObjects/instance-page.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ import { BasePage } from './base-page';
22
import { Profiler, Cli, CommandHelper } from './components/bottom-panel';
33
import { OverviewPanel } from './components/overview-panel';
44
import { InsightsPanel } from './components/insights-panel';
5+
import { MonacoEditor } from './components/monaco-editor';
56
export class InstancePage extends BasePage {
67
Profiler = new Profiler();
78
Cli = new Cli();
89
CommandHelper = new CommandHelper();
910
OverviewPanel = new OverviewPanel();
1011
InsightsPanel = new InsightsPanel();
12+
MonacoEditor = new MonacoEditor();
1113
}

tests/e2e/pageObjects/rdi-instance-page.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ import { RdiNavigationPanel } from './components/navigation/rdi-navigation-panel
55
import { TestConnectionPanel } from './components/rdi/test-connection-panel';
66
import { RdiHeader } from './components/rdi/rdi-header';
77
import { PipelineManagementPanel } from './components/rdi/pipeline-management-panel';
8+
import { MonacoEditor } from './components/monaco-editor';
89

910
export class RdiInstancePage extends BaseOverviewPage {
1011

1112
NavigationPanel = new RdiNavigationPanel();
1213
TestConnectionPanel = new TestConnectionPanel();
1314
PipelineManagementPanel = new PipelineManagementPanel();
1415
RdiHeader = new RdiHeader();
16+
MonacoEditor = new MonacoEditor();
1517

1618
dryRunButton = Selector('[data-testid=rdi-jobs-dry-run]');
1719
dryRunSubmitBtn = Selector('[data-testid=dry-run-btn]');

tests/e2e/pageObjects/triggers-and-functions-libraries-page.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { Selector, t } from 'testcafe';
22
import { TriggersAndFunctionLibrary } from '../interfaces/triggers-and-functions';
33
import { LibrariesSections, MonacoEditorInputs } from '../helpers/constants';
4-
import { MonacoEditor } from '../common-actions/monaco-editor';
54
import { InstancePage } from './instance-page';
65

76
export class TriggersAndFunctionsLibrariesPage extends InstancePage {
@@ -71,10 +70,10 @@ export class TriggersAndFunctionsLibrariesPage extends InstancePage {
7170
*/
7271
async sendTextToMonaco(input: MonacoEditorInputs, commandPart1: string, commandPart2?: string): Promise<void> {
7372
const inputSelector = Selector(this.inputMonaco.replace(/\$name/g, input));
74-
await MonacoEditor.sendTextToMonaco(inputSelector, commandPart1);
73+
await this.MonacoEditor.sendTextToMonaco(inputSelector, commandPart1);
7574
if (commandPart2) {
7675
await t.pressKey('enter');
77-
await MonacoEditor.sendTextToMonaco(inputSelector, commandPart2, false);
76+
await this.MonacoEditor.sendTextToMonaco(inputSelector, commandPart2, false);
7877
}
7978
}
8079

tests/e2e/pageObjects/workbench-page.ts

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -84,17 +84,6 @@ export class WorkbenchPage extends InstancePage {
8484
executionCommandIcon = Selector('[data-testid=command-execution-time-icon]');
8585
executedCommandTitle = Selector('[data-testid=query-card-tooltip-anchor]', { timeout: 500 });
8686
queryResult = Selector('[data-testid=query-common-result]');
87-
//MONACO ELEMENTS
88-
monacoCommandDetails = Selector('div.suggest-details-container');
89-
monacoSuggestion = Selector('span.monaco-icon-name-container');
90-
monacoContextMenu = Selector('div.shadow-root-host').shadowRoot();
91-
monacoShortcutInput = Selector('input.input');
92-
monacoSuggestionOption = Selector('div.monaco-list-row');
93-
monacoHintWithArguments = Selector('[widgetid="editor.widget.parameterHintsWidget"]');
94-
monacoCommandIndicator = Selector('div.monaco-glyph-run-command');
95-
monacoWidget = Selector('[data-testid=monaco-widget]');
96-
nonRedisEditorResizeBottom = Selector('.t_resize-bottom');
97-
nonRedisEditorResizeTop = Selector('.t_resize-top');
9887
//OPTIONS
9988
selectViewType = Selector('[data-testid=select-view-type]');
10089
textViewTypeOption = Selector('[data-test-subj^=view-type-option-Text]');

tests/e2e/tests/web/critical-path/rdi/add-job.e2e.ts

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import { MyRedisDatabasePage } from '../../../../pageObjects';
66
import { RdiPopoverOptions, RdiTemplatePipelineType, RedisOverviewPage } from '../../../../helpers/constants';
77
import { RdiInstancesListPage } from '../../../../pageObjects/rdi-instances-list-page';
88
import { DatabaseHelper } from '../../../../helpers';
9-
import { MonacoEditor } from '../../../../common-actions/monaco-editor';
109

1110
const rdiInstancePage = new RdiInstancePage();
1211
const rdiApiRequests = new RdiApiRequests();
@@ -98,7 +97,7 @@ test('Verify that user insert template for jobs', async() => {
9897
await rdiInstancePage.setTemplateDropdownValue(RdiTemplatePipelineType.WriteBehind);
9998

10099
//verify uniq templates words - should be undated when templates are added
101-
const enteredText = await MonacoEditor.getTextFromMonaco();
100+
const enteredText = await rdiInstancePage.MonacoEditor.getTextFromMonaco();
102101
await t.expect(enteredText).contains(templateWords, 'template is incorrect');
103102

104103
await t.click(rdiInstancePage.templateButton);
@@ -109,17 +108,20 @@ test('Verify that user can change job config', async() => {
109108
const textForMonaco = 'here should be a job';
110109

111110
await rdiInstancePage.PipelineManagementPanel.addJob(jobName);
112-
let text = await MonacoEditor.getTextFromMonaco();
111+
let text = await rdiInstancePage.MonacoEditor.getTextFromMonaco();
113112
await t.expect(text).eql('', 'monacoEditor for the job is not empty');
114-
await MonacoEditor.sendTextToMonaco(rdiInstancePage.jobsInput, textForMonaco, false);
115-
text = await MonacoEditor.getTextFromMonaco();
113+
await rdiInstancePage.MonacoEditor.sendTextToMonaco(rdiInstancePage.jobsInput, textForMonaco, false);
114+
text = await rdiInstancePage.MonacoEditor.getTextFromMonaco();
116115
await t.expect(text).eql(textForMonaco, 'user can not enter a text');
117116
});
117+
// https://redislabs.atlassian.net/browse/RI-5770
118118
test('Verify that user can open an additional editor to work with SQL and JMESPath expressions', async() => {
119119
const jobName = 'testJob';
120120
const sqlText = 'SELECT test FROM test1';
121-
const JMESPathText = 'ba';
122-
const JMESPathAutoCompleteText = 'base64_decode';
121+
const SQLiteText = 's';
122+
const SQLiteAutoCompleteText = 'STRFTIME(format, time_value)';
123+
const JMESPathText = 'r';
124+
const JMESPathAutoCompleteText = 'regex_replace';
123125

124126
await rdiInstancePage.PipelineManagementPanel.addJob(jobName);
125127
await rdiInstancePage.PipelineManagementPanel.openJobByName(jobName);
@@ -136,24 +138,37 @@ test('Verify that user can open an additional editor to work with SQL and JMESPa
136138
await t.expect(rdiInstancePage.dedicatedLanguageSelect.textContent).eql('SQL', 'SQL is not set by default');
137139

138140
// Verify that user can close the additional editor
139-
await MonacoEditor.sendTextToMonaco(rdiInstancePage.draggableArea, sqlText, false);
141+
await rdiInstancePage.MonacoEditor.sendTextToMonaco(rdiInstancePage.draggableArea, sqlText, false);
140142
await t.click(rdiInstancePage.EditorButton.cancelBtn);
141143
await t.expect(rdiInstancePage.draggableArea.exists).notOk('SQL/JMESPath editor is displayed after closing');
142-
await t.expect(await MonacoEditor.getTextFromMonaco()).eql('', 'Text from canceled SQL editor applied');
144+
await t.expect(await rdiInstancePage.MonacoEditor.getTextFromMonaco()).eql('', 'Text from canceled SQL editor applied');
143145

144146
await t.pressKey('shift+space');
145-
await MonacoEditor.sendTextToMonaco(rdiInstancePage.draggableArea, sqlText, false);
147+
await rdiInstancePage.MonacoEditor.sendTextToMonaco(rdiInstancePage.draggableArea, sqlText, false);
146148
await t.click(rdiInstancePage.EditorButton.applyBtn);
147-
await t.expect(await MonacoEditor.getTextFromMonaco()).eql(sqlText, 'Text from SQL editor not applied');
149+
await t.expect(await rdiInstancePage.MonacoEditor.getTextFromMonaco()).eql(sqlText, 'Text from SQL editor not applied');
148150

149151
//verify that autocomplete works for JMESPath
150152
await t.hover(rdiInstancePage.sqlEditorButton);
151153
await rdiInstancePage.verifyTooltipContainsText('Open a dedicated SQL or JMESPath editor:');
152154
await t.click(rdiInstancePage.sqlEditorButton);
153155
await t.click(rdiInstancePage.languageDropdown);
154156
await t.click(rdiInstancePage.jmesPathOption);
155-
await MonacoEditor.sendTextToMonaco(rdiInstancePage.draggableArea, JMESPathText);
157+
// Start type characters and select command
158+
await rdiInstancePage.MonacoEditor.sendTextToMonaco(rdiInstancePage.draggableArea, JMESPathText);
159+
// Verify that the list with auto-suggestions is displayed
160+
await t.expect(rdiInstancePage.MonacoEditor.monacoSuggestion.count).eql(3, 'Auto-suggestions are not displayed');
156161
await t.pressKey('tab');
157162
await t.click(rdiInstancePage.EditorButton.applyBtn);
158-
await t.expect(await MonacoEditor.getTextFromMonaco()).contains(JMESPathAutoCompleteText, 'Text from SQL editor not applied');
163+
await t.expect(await rdiInstancePage.MonacoEditor.getTextFromMonaco()).contains(JMESPathAutoCompleteText, 'Text from JMESPath editor not applied');
164+
165+
// Verify that autocomplete works for SQLite functions
166+
await t.click(rdiInstancePage.sqlEditorButton);
167+
// Start type characters and select command
168+
await rdiInstancePage.MonacoEditor.sendTextToMonaco(rdiInstancePage.draggableArea, SQLiteText);
169+
// Verify that the list with auto-suggestions is displayed
170+
await t.expect(rdiInstancePage.MonacoEditor.monacoSuggestion.count).eql(3, 'Auto-suggestions are not displayed');
171+
await t.pressKey('tab');
172+
await t.click(rdiInstancePage.EditorButton.applyBtn);
173+
await t.expect(await rdiInstancePage.MonacoEditor.getTextFromMonaco()).contains(SQLiteAutoCompleteText, 'Text from SQLite editor not applied');
159174
});

tests/e2e/tests/web/critical-path/rdi/configuration.e2e.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import {
1212
TextConnectionSection
1313
} from '../../../../helpers/constants';
1414
import { DatabaseHelper } from '../../../../helpers';
15-
import { MonacoEditor } from '../../../../common-actions/monaco-editor';
1615
import { goBackHistory } from '../../../../helpers/utils';
1716

1817
const myRedisDatabasePage = new MyRedisDatabasePage();
@@ -91,7 +90,7 @@ test('Verify that user can insert template', async() => {
9190
await rdiInstancePage.setTemplateDropdownValue(RdiTemplatePipelineType.Ingest, RdiTemplateDatabaseType.MyQal);
9291

9392
//verify uniq templates words - should be undated when templates are added
94-
const enteredText = await MonacoEditor.getTextFromMonaco();
93+
const enteredText = await rdiInstancePage.MonacoEditor.getTextFromMonaco();
9594
await t.expect(enteredText).contains(templateWords, 'template is incorrect');
9695

9796
await t.click(rdiInstancePage.templateButton);

tests/e2e/tests/web/critical-path/rdi/pipeline.e2e.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import * as path from 'path';
44
import { t } from 'testcafe';
55
import { RdiInstancePage } from '../../../../pageObjects/rdi-instance-page';
66
import { AddNewRdiParameters, RdiApiRequests } from '../../../../helpers/api/api-rdi';
7-
import { MonacoEditor } from '../../../../common-actions/monaco-editor';
87
import { BrowserActions } from '../../../../common-actions/browser-actions';
98
import { fileDownloadPath, commonUrl } from '../../../../helpers/conf';
109
import { DatabasesActions } from '../../../../common-actions/databases-actions';
@@ -57,15 +56,15 @@ test('Verify that user can refresh pipeline', async() => {
5756
let testId = await rdiInstancePage.PipelineManagementPanel.configurationTabLink.getAttribute('data-testid');
5857
await t.expect(testId).notContains('updated', 'config text was not changed');
5958

60-
await MonacoEditor.sendTextToMonaco(rdiInstancePage.configurationInput, text);
61-
const enteredText = await MonacoEditor.getTextFromMonaco();
59+
await rdiInstancePage.MonacoEditor.sendTextToMonaco(rdiInstancePage.configurationInput, text);
60+
const enteredText = await rdiInstancePage.MonacoEditor.getTextFromMonaco();
6261
await t.expect(enteredText).eql(text, 'config text was not changed');
6362
testId = await rdiInstancePage.PipelineManagementPanel.configurationTabLink.getAttribute('data-testid');
6463
await t.expect(testId).contains('updated', 'config text was not changed');
6564

6665
await t.click(rdiInstancePage.RdiHeader.uploadPipelineButton);
6766
await t.click(rdiInstancePage.RdiHeader.confirmUploadingPipelineBatton);
68-
const updatedText = await MonacoEditor.getTextFromMonaco();
67+
const updatedText = await rdiInstancePage.MonacoEditor.getTextFromMonaco();
6968
await t.expect(updatedText).contains(expectedText, 'config text was not updated');
7069
await t.expect(updatedText).notContains(text, 'config text was not updated');
7170

@@ -119,7 +118,7 @@ test('Verify that user can import pipeline', async() => {
119118
await rdiInstancePage.selectStartPipelineOption(RdiPopoverOptions.File);
120119
await rdiInstancePage.RdiHeader.uploadPipeline(filePathes.successful);
121120
await t.click(rdiInstancePage.okUploadPipelineBtn);
122-
const updatedText = await MonacoEditor.getTextFromMonaco();
121+
const updatedText = await rdiInstancePage.MonacoEditor.getTextFromMonaco();
123122
await t.expect(updatedText).contains(expectedText, 'config text was not updated');
124123
// check unsuccessful uploading
125124
await t.click(rdiInstancePage.RdiHeader.uploadFromFileButton);

tests/e2e/tests/web/critical-path/workbench/autocomplete.e2e.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ test('Verify that when user have selected a command (via “Enter” from the li
3030
// Start type characters and select command
3131
await t.typeText(workbenchPage.queryInput, 'LI', { replace: true });
3232
// Verify that the list with auto-suggestions is displayed
33-
await t.expect(workbenchPage.monacoSuggestion.exists).ok('Auto-suggestions are displayed');
33+
await t.expect(workbenchPage.MonacoEditor.monacoSuggestion.exists).ok('Auto-suggestions are displayed');
3434
// Select command and check result
3535
await t.pressKey('enter');
3636
const script = await workbenchPage.queryInputScriptArea.textContent;

0 commit comments

Comments
 (0)