mirror of
https://github.com/elastic/kibana.git
synced 2025-04-23 09:19:04 -04:00
[ftr] migrate "queryBar" service to FtrService class (#100612)
Co-authored-by: spalger <spalger@users.noreply.github.com>
This commit is contained in:
parent
9538788611
commit
9f5a61c59b
2 changed files with 70 additions and 76 deletions
|
@ -33,7 +33,7 @@ import { GlobalNavService } from './global_nav';
|
|||
import { InspectorService } from './inspector';
|
||||
import { FieldEditorService } from './field_editor';
|
||||
import { ManagementMenuService } from './management';
|
||||
import { QueryBarProvider } from './query_bar';
|
||||
import { QueryBarService } from './query_bar';
|
||||
import { RemoteProvider } from './remote';
|
||||
import { RenderableService } from './renderable';
|
||||
import { ToastsService } from './toasts';
|
||||
|
@ -54,7 +54,7 @@ export const services = {
|
|||
|
||||
__webdriver__: RemoteProvider,
|
||||
filterBar: FilterBarService,
|
||||
queryBar: QueryBarProvider,
|
||||
queryBar: QueryBarService,
|
||||
find: FindProvider,
|
||||
testSubjects: TestSubjects,
|
||||
docTable: DocTableService,
|
||||
|
|
|
@ -7,82 +7,76 @@
|
|||
*/
|
||||
|
||||
import expect from '@kbn/expect';
|
||||
import { FtrProviderContext } from '../ftr_provider_context';
|
||||
import { FtrService } from '../ftr_provider_context';
|
||||
|
||||
export function QueryBarProvider({ getService, getPageObjects }: FtrProviderContext) {
|
||||
const testSubjects = getService('testSubjects');
|
||||
const retry = getService('retry');
|
||||
const log = getService('log');
|
||||
const PageObjects = getPageObjects(['header', 'common']);
|
||||
const find = getService('find');
|
||||
const browser = getService('browser');
|
||||
export class QueryBarService extends FtrService {
|
||||
private readonly testSubjects = this.ctx.getService('testSubjects');
|
||||
private readonly retry = this.ctx.getService('retry');
|
||||
private readonly log = this.ctx.getService('log');
|
||||
private readonly PageObjects = this.ctx.getPageObjects(['header', 'common']);
|
||||
private readonly find = this.ctx.getService('find');
|
||||
private readonly browser = this.ctx.getService('browser');
|
||||
|
||||
class QueryBar {
|
||||
async getQueryString(): Promise<string> {
|
||||
return await testSubjects.getAttribute('queryInput', 'value');
|
||||
}
|
||||
|
||||
public async setQuery(query: string): Promise<void> {
|
||||
log.debug(`QueryBar.setQuery(${query})`);
|
||||
// Extra caution used because of flaky test here: https://github.com/elastic/kibana/issues/16978 doesn't seem
|
||||
// to be actually setting the query in the query input based off
|
||||
await retry.try(async () => {
|
||||
await testSubjects.click('queryInput');
|
||||
|
||||
// testSubjects.setValue uses input.clearValue which wasn't working, but input.clearValueWithKeyboard does.
|
||||
// So the following lines do the same thing as input.setValue but with input.clearValueWithKeyboard instead.
|
||||
const input = await find.activeElement();
|
||||
await input.clearValueWithKeyboard();
|
||||
await input.type(query);
|
||||
const currentQuery = await this.getQueryString();
|
||||
if (currentQuery !== query) {
|
||||
throw new Error(
|
||||
`Failed to set query input to ${query}, instead query is ${currentQuery}`
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public async clearQuery(): Promise<void> {
|
||||
await this.setQuery('');
|
||||
await PageObjects.common.pressTabKey(); // move outside of input into language switcher
|
||||
await PageObjects.common.pressTabKey(); // move outside of language switcher so time picker appears
|
||||
}
|
||||
|
||||
public async submitQuery(): Promise<void> {
|
||||
log.debug('QueryBar.submitQuery');
|
||||
await testSubjects.click('queryInput');
|
||||
await PageObjects.common.pressEnterKey();
|
||||
await PageObjects.header.waitUntilLoadingHasFinished();
|
||||
}
|
||||
|
||||
public async clickQuerySubmitButton(): Promise<void> {
|
||||
await testSubjects.click('querySubmitButton');
|
||||
}
|
||||
|
||||
public async switchQueryLanguage(lang: 'kql' | 'lucene'): Promise<void> {
|
||||
await testSubjects.click('switchQueryLanguageButton');
|
||||
const kqlToggle = await testSubjects.find('languageToggle');
|
||||
const currentLang =
|
||||
(await kqlToggle.getAttribute('aria-checked')) === 'true' ? 'kql' : 'lucene';
|
||||
if (lang !== currentLang) {
|
||||
await kqlToggle.click();
|
||||
}
|
||||
|
||||
await browser.pressKeys(browser.keys.ESCAPE); // close popover
|
||||
await this.expectQueryLanguageOrFail(lang); // make sure lang is switched
|
||||
}
|
||||
|
||||
public async expectQueryLanguageOrFail(lang: 'kql' | 'lucene'): Promise<void> {
|
||||
const queryLanguageButton = await testSubjects.find('switchQueryLanguageButton');
|
||||
expect((await queryLanguageButton.getVisibleText()).toLowerCase()).to.eql(lang);
|
||||
}
|
||||
|
||||
public async getSuggestions() {
|
||||
const suggestions = await testSubjects.findAll('autoCompleteSuggestionText');
|
||||
return Promise.all(suggestions.map((suggestion) => suggestion.getVisibleText()));
|
||||
}
|
||||
async getQueryString(): Promise<string> {
|
||||
return await this.testSubjects.getAttribute('queryInput', 'value');
|
||||
}
|
||||
|
||||
return new QueryBar();
|
||||
public async setQuery(query: string): Promise<void> {
|
||||
this.log.debug(`QueryBar.setQuery(${query})`);
|
||||
// Extra caution used because of flaky test here: https://github.com/elastic/kibana/issues/16978 doesn't seem
|
||||
// to be actually setting the query in the query input based off
|
||||
await this.retry.try(async () => {
|
||||
await this.testSubjects.click('queryInput');
|
||||
|
||||
// this.testSubjects.setValue uses input.clearValue which wasn't working, but input.clearValueWithKeyboard does.
|
||||
// So the following lines do the same thing as input.setValue but with input.clearValueWithKeyboard instead.
|
||||
const input = await this.find.activeElement();
|
||||
await input.clearValueWithKeyboard();
|
||||
await input.type(query);
|
||||
const currentQuery = await this.getQueryString();
|
||||
if (currentQuery !== query) {
|
||||
throw new Error(`Failed to set query input to ${query}, instead query is ${currentQuery}`);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public async clearQuery(): Promise<void> {
|
||||
await this.setQuery('');
|
||||
await this.PageObjects.common.pressTabKey(); // move outside of input into language switcher
|
||||
await this.PageObjects.common.pressTabKey(); // move outside of language switcher so time picker appears
|
||||
}
|
||||
|
||||
public async submitQuery(): Promise<void> {
|
||||
this.log.debug('QueryBar.submitQuery');
|
||||
await this.testSubjects.click('queryInput');
|
||||
await this.PageObjects.common.pressEnterKey();
|
||||
await this.PageObjects.header.waitUntilLoadingHasFinished();
|
||||
}
|
||||
|
||||
public async clickQuerySubmitButton(): Promise<void> {
|
||||
await this.testSubjects.click('querySubmitButton');
|
||||
}
|
||||
|
||||
public async switchQueryLanguage(lang: 'kql' | 'lucene'): Promise<void> {
|
||||
await this.testSubjects.click('switchQueryLanguageButton');
|
||||
const kqlToggle = await this.testSubjects.find('languageToggle');
|
||||
const currentLang =
|
||||
(await kqlToggle.getAttribute('aria-checked')) === 'true' ? 'kql' : 'lucene';
|
||||
if (lang !== currentLang) {
|
||||
await kqlToggle.click();
|
||||
}
|
||||
|
||||
await this.browser.pressKeys(this.browser.keys.ESCAPE); // close popover
|
||||
await this.expectQueryLanguageOrFail(lang); // make sure lang is switched
|
||||
}
|
||||
|
||||
public async expectQueryLanguageOrFail(lang: 'kql' | 'lucene'): Promise<void> {
|
||||
const queryLanguageButton = await this.testSubjects.find('switchQueryLanguageButton');
|
||||
expect((await queryLanguageButton.getVisibleText()).toLowerCase()).to.eql(lang);
|
||||
}
|
||||
|
||||
public async getSuggestions() {
|
||||
const suggestions = await this.testSubjects.findAll('autoCompleteSuggestionText');
|
||||
return Promise.all(suggestions.map((suggestion) => suggestion.getVisibleText()));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue