Skip to content

Commit 0b611a5

Browse files
authored
fix skipped console autocomplete test (elastic#229274)
## Summary Closes elastic#227576. Discovered this whilst attempting to backport this PR elastic#229083, I made some fixes in the aforementioned PR then cherry-picked them unto main, and made a couple of more fixes <!-- ### Checklist Check the PR satisfies following conditions. Reviewers should verify this PR satisfies this list as well. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/src/platform/packages/shared/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This was checked for breaking HTTP API changes, and any breaking changes have been approved by the breaking-change committee. The `release_note:breaking` label should be applied in these situations. - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [ ] The PR description includes the appropriate Release Notes section, and the correct `release_note:*` label is applied per the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) - [ ] Review the [backport guidelines](https://docs.google.com/document/d/1VyN5k91e5OVumlc0Gb9RPa3h1ewuPE705nRtioPiTvY/edit?usp=sharing) and apply applicable `backport:*` labels. ### Identify risks Does this PR introduce any risks? For example, consider risks like hard to test bugs, performance regression, potential of data loss. Describe the risk, its severity, and mitigation for each identified risk. Invite stakeholders and evaluate how to proceed before merging. - [ ] [See some risk examples](https://github.com/elastic/kibana/blob/main/RISK_MATRIX.mdx) - [ ] ... -->
1 parent 214a861 commit 0b611a5

2 files changed

Lines changed: 62 additions & 37 deletions

File tree

src/platform/test/functional/apps/console/_autocomplete.ts

Lines changed: 52 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
2323
// Prompt autocomplete for 'settings'
2424
await PageObjects.console.promptAutocomplete('s');
2525

26-
await retry.waitFor('autocomplete to be visible', () =>
27-
PageObjects.console.isAutocompleteVisible()
26+
await retry.waitFor(
27+
'autocomplete to be visible',
28+
async () => await PageObjects.console.isAutocompleteVisible()
2829
);
2930
await PageObjects.console.pressEnter();
3031
await retry.try(async () => {
@@ -34,8 +35,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
3435
});
3536
}
3637

37-
// Failing: See https://github.com/elastic/kibana/issues/227576
38-
describe.skip('console autocomplete feature', function describeIndexTests() {
38+
describe('console autocomplete feature', function describeIndexTests() {
3939
before(async () => {
4040
log.debug('navigateTo console');
4141
await PageObjects.common.navigateToApp('console');
@@ -57,7 +57,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
5757
await PageObjects.console.pressEnter();
5858
await PageObjects.console.sleepForDebouncePeriod();
5959
await PageObjects.console.promptAutocomplete();
60-
expect(PageObjects.console.isAutocompleteVisible()).to.be.eql(true);
60+
expect(await PageObjects.console.isAutocompleteVisible()).to.be.eql(true);
6161
});
6262

6363
it('correctly autocompletes inline JSON', async () => {
@@ -69,8 +69,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
6969
await PageObjects.console.promptAutocomplete('e');
7070

7171
// 3) Wait for the autocomplete suggestions to appear
72-
await retry.waitFor('autocomplete to be visible', () =>
73-
PageObjects.console.isAutocompleteVisible()
72+
await retry.waitFor(
73+
'autocomplete to be visible',
74+
async () => await PageObjects.console.isAutocompleteVisible()
7475
);
7576

7677
// 4) Press Enter to accept the first suggestion (likely "term")
@@ -97,14 +98,19 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
9798
await PageObjects.console.pressEnter();
9899
await PageObjects.console.sleepForDebouncePeriod();
99100
await PageObjects.console.enterText(`"`);
100-
expect(PageObjects.console.isAutocompleteVisible()).to.be.eql(true);
101+
await retry.waitFor(
102+
'autocomplete to be visible',
103+
async () => await PageObjects.console.isAutocompleteVisible()
104+
);
101105

102106
// Iterate on the first 10 suggestions (the ones that are only visible without scrolling)
103-
const suggestions = [];
107+
const suggestionsPromise = [];
104108
for (let i = 0; i < 10; i++) {
105-
suggestions.push(await PageObjects.console.getAutocompleteSuggestion(i));
109+
suggestionsPromise.push(PageObjects.console.getAutocompleteSuggestion(i));
106110
}
107111

112+
const suggestions = await Promise.all(suggestionsPromise);
113+
108114
// and expect the array to not have duplicates
109115
expect(suggestions).to.eql(_.uniq(suggestions));
110116
});
@@ -126,9 +132,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
126132
log.debug('Key type "%s"', char);
127133
await PageObjects.console.enterText(char);
128134

129-
await retry.waitFor('autocomplete to be visible', () =>
130-
PageObjects.console.isAutocompleteVisible()
135+
await retry.waitFor(
136+
'autocomplete to be visible',
137+
async () => await PageObjects.console.isAutocompleteVisible()
131138
);
139+
132140
expect(await PageObjects.console.isAutocompleteVisible()).to.be.eql(true);
133141

134142
for (const [i, method] of methods.entries()) {
@@ -155,8 +163,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
155163
await PageObjects.console.enterText(char);
156164
}
157165

158-
await retry.waitFor('autocomplete to be visible', () =>
159-
PageObjects.console.isAutocompleteVisible()
166+
await retry.waitFor(
167+
'autocomplete to be visible',
168+
async () => await PageObjects.console.isAutocompleteVisible()
160169
);
161170
expect(await PageObjects.console.isAutocompleteVisible()).to.be.eql(true);
162171

@@ -180,8 +189,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
180189
log.debug('Key type "%s"', char);
181190
await PageObjects.console.enterText(char);
182191
}
183-
await retry.waitFor('autocomplete to be visible', () =>
184-
PageObjects.console.isAutocompleteVisible()
192+
await retry.waitFor(
193+
'autocomplete to be visible',
194+
async () => await PageObjects.console.isAutocompleteVisible()
185195
);
186196
expect(await PageObjects.console.isAutocompleteVisible()).to.be.eql(true);
187197
await PageObjects.console.pressEnter();
@@ -212,8 +222,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
212222
log.debug('Key type "%s"', char);
213223
await PageObjects.console.enterText(char);
214224
}
215-
await retry.waitFor('autocomplete to be visible', () =>
216-
PageObjects.console.isAutocompleteVisible()
225+
await retry.waitFor(
226+
'autocomplete to be visible',
227+
async () => await PageObjects.console.isAutocompleteVisible()
217228
);
218229
expect(await PageObjects.console.isAutocompleteVisible()).to.be.eql(true);
219230

@@ -272,8 +283,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
272283
await PageObjects.console.sleepForDebouncePeriod();
273284
log.debug('Key type "%s"', char);
274285
await PageObjects.console.enterText(char); // e.g. 'P' -> 'Po' -> 'Pos'
275-
await retry.waitFor('autocomplete to be visible', () =>
276-
PageObjects.console.isAutocompleteVisible()
286+
await retry.waitFor(
287+
'autocomplete to be visible',
288+
async () => await PageObjects.console.isAutocompleteVisible()
277289
);
278290
expect(await PageObjects.console.isAutocompleteVisible()).to.be.eql(true);
279291
}
@@ -284,8 +296,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
284296
await PageObjects.console.enterText(char!); // e.g. 'Post ' -> 'Post _'
285297
}
286298

287-
await retry.waitFor('autocomplete to be visible', () =>
288-
PageObjects.console.isAutocompleteVisible()
299+
await retry.waitFor(
300+
'autocomplete to be visible',
301+
async () => await PageObjects.console.isAutocompleteVisible()
289302
);
290303
expect(await PageObjects.console.isAutocompleteVisible()).to.be.eql(true);
291304
}
@@ -300,8 +313,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
300313
await PageObjects.console.enterText(char); // i.e. 'GET .kibana/' -> 'GET .kibana/_'
301314
}
302315

303-
await retry.waitFor('autocomplete to be visible', () =>
304-
PageObjects.console.isAutocompleteVisible()
316+
await retry.waitFor(
317+
'autocomplete to be visible',
318+
async () => await PageObjects.console.isAutocompleteVisible()
305319
);
306320
expect(await PageObjects.console.isAutocompleteVisible()).to.be.eql(true);
307321
});
@@ -317,8 +331,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
317331
log.debug('Key type Ctrl+SPACE');
318332
await PageObjects.console.pressCtrlSpace();
319333

320-
await retry.waitFor('autocomplete to be visible', () =>
321-
PageObjects.console.isAutocompleteVisible()
334+
await retry.waitFor(
335+
'autocomplete to be visible',
336+
async () => await PageObjects.console.isAutocompleteVisible()
322337
);
323338
expect(await PageObjects.console.isAutocompleteVisible()).to.be.eql(true);
324339
});
@@ -438,7 +453,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
438453
await PageObjects.console.enterText(`POST _query\n`);
439454
await PageObjects.console.enterText(`{\n\t"query": """`);
440455
await PageObjects.console.sleepForDebouncePeriod();
441-
expect(PageObjects.console.isAutocompleteVisible()).to.be.eql(true);
456+
await retry.waitFor(
457+
'autocomplete to be visible',
458+
async () => await PageObjects.console.isAutocompleteVisible()
459+
);
442460
const suggestions = await PageObjects.console.getAllAutocompleteSuggestions();
443461
expect(suggestions).to.contain('FROM');
444462
expect(suggestions).to.contain('ROW');
@@ -450,7 +468,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
450468
await PageObjects.console.enterText(`{\n\t"script": """`);
451469
await PageObjects.console.pressEnter();
452470
await PageObjects.console.sleepForDebouncePeriod();
453-
expect(PageObjects.console.isAutocompleteVisible()).to.be.eql(false);
471+
expect(await PageObjects.console.isAutocompleteVisible()).to.be.eql(false);
454472
});
455473

456474
it('does not suggest ESQL in other parts of the request', async () => {
@@ -459,8 +477,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
459477
await PageObjects.console.pressEnter();
460478
await PageObjects.console.sleepForDebouncePeriod();
461479
await PageObjects.console.promptAutocomplete();
462-
expect(PageObjects.console.isAutocompleteVisible()).to.be.eql(true);
463-
const suggestions = PageObjects.console.getAllAutocompleteSuggestions();
480+
expect(await PageObjects.console.isAutocompleteVisible()).to.be.eql(true);
481+
const suggestions = await PageObjects.console.getAllAutocompleteSuggestions();
464482
expect(suggestions).to.not.contain('FROM');
465483
expect(suggestions).to.not.contain('ROW');
466484
expect(suggestions).to.not.contain('SHOW');
@@ -477,29 +495,29 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
477495
await PageObjects.console.enterText(`# GET /`);
478496
await PageObjects.console.sleepForDebouncePeriod();
479497

480-
expect(PageObjects.console.isAutocompleteVisible()).to.be.eql(false);
498+
expect(await PageObjects.console.isAutocompleteVisible()).to.be.eql(false);
481499
});
482500

483501
it('a simple double slash comment', async () => {
484502
await PageObjects.console.enterText(`// GET /`);
485503
await PageObjects.console.sleepForDebouncePeriod();
486504

487-
expect(PageObjects.console.isAutocompleteVisible()).to.be.eql(false);
505+
expect(await PageObjects.console.isAutocompleteVisible()).to.be.eql(false);
488506
});
489507

490508
it('a single line block comment', async () => {
491509
await PageObjects.console.enterText(`/* GET /`);
492510
await PageObjects.console.sleepForDebouncePeriod();
493511

494-
expect(PageObjects.console.isAutocompleteVisible()).to.be.eql(false);
512+
expect(await PageObjects.console.isAutocompleteVisible()).to.be.eql(false);
495513
});
496514

497515
it('a multiline block comment', async () => {
498516
await PageObjects.console.enterText(`/*
499517
GET /`);
500518
await PageObjects.console.sleepForDebouncePeriod();
501519

502-
expect(PageObjects.console.isAutocompleteVisible()).to.be.eql(false);
520+
expect(await PageObjects.console.isAutocompleteVisible()).to.be.eql(false);
503521
});
504522
});
505523
});

src/platform/test/functional/page_objects/console_page.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,18 +85,25 @@ export class ConsolePageObject extends FtrService {
8585
public async promptAutocomplete(letter = 'b') {
8686
const textArea = await this.getTextArea();
8787
await textArea.type(letter);
88-
await this.retry.waitFor('autocomplete to be visible', () => this.isAutocompleteVisible());
88+
await this.retry.waitFor(
89+
'autocomplete to be visible',
90+
async () => await this.isAutocompleteVisible()
91+
);
8992
}
9093

9194
public async isAutocompleteVisible() {
9295
const element = await this.find.byClassName('suggest-widget').catch(() => null);
9396
if (!element) return false;
9497

95-
const attribute = await element.getAttribute('style');
96-
return !attribute?.includes('display: none;');
98+
return await element.isDisplayed();
9799
}
98100

99101
public async getAutocompleteSuggestion(index: number) {
102+
await this.retry.waitFor(
103+
'verify suggestions widget is displayed',
104+
async () => await this.isAutocompleteVisible()
105+
);
106+
100107
const suggestionsWidget = await this.find.byClassName('suggest-widget');
101108
const suggestions = await suggestionsWidget.findAllByClassName('monaco-list-row');
102109
const suggestion = suggestions[index];

0 commit comments

Comments
 (0)