|
6 | 6 | * Side Public License, v 1. |
7 | 7 | */ |
8 | 8 |
|
9 | | -import { FtrProviderContext } from '../ftr_provider_context'; |
| 9 | +import { FtrService } from '../ftr_provider_context'; |
10 | 10 |
|
11 | | -export function MenuToggleProvider({ getService }: FtrProviderContext) { |
12 | | - const log = getService('log'); |
13 | | - const retry = getService('retry'); |
14 | | - const testSubjects = getService('testSubjects'); |
15 | | - |
16 | | - interface Options { |
17 | | - name: string; |
18 | | - menuTestSubject: string; |
19 | | - toggleButtonTestSubject: string; |
20 | | - } |
21 | | - |
22 | | - return class MenuToggle { |
23 | | - private readonly name: string; |
24 | | - private readonly menuTestSubject: string; |
25 | | - private readonly toggleButtonTestSubject: string; |
| 11 | +interface Options { |
| 12 | + name: string; |
| 13 | + menuTestSubject: string; |
| 14 | + toggleButtonTestSubject: string; |
| 15 | +} |
26 | 16 |
|
27 | | - constructor(options: Options) { |
28 | | - this.name = options.name; |
29 | | - this.menuTestSubject = options.menuTestSubject; |
30 | | - this.toggleButtonTestSubject = options.toggleButtonTestSubject; |
31 | | - } |
| 17 | +export class MenuToggleService extends FtrService { |
| 18 | + private readonly log = this.ctx.getService('log'); |
| 19 | + private readonly retry = this.ctx.getService('retry'); |
| 20 | + private readonly testSubjects = this.ctx.getService('testSubjects'); |
32 | 21 |
|
33 | | - async open() { |
34 | | - await this.setState(true); |
35 | | - } |
| 22 | + create(options: Options) { |
| 23 | + const { log, retry, testSubjects } = this; |
| 24 | + const { name, menuTestSubject, toggleButtonTestSubject } = options; |
36 | 25 |
|
37 | | - async close() { |
38 | | - await this.setState(false); |
39 | | - } |
40 | | - |
41 | | - private async setState(expectedState: boolean) { |
| 26 | + async function setState(expectedState: boolean) { |
42 | 27 | log.debug( |
43 | | - `setting menu open state [name=${this.name}] [state=${expectedState ? 'open' : 'closed'}]` |
| 28 | + `setting menu open state [name=${name}] [state=${expectedState ? 'open' : 'closed'}]` |
44 | 29 | ); |
45 | 30 |
|
46 | 31 | await retry.try(async () => { |
47 | 32 | // if the menu is clearly in the expected state already, bail out quickly if so |
48 | | - const isOpen = await testSubjects.exists(this.menuTestSubject, { timeout: 1000 }); |
| 33 | + const isOpen = await testSubjects.exists(menuTestSubject, { timeout: 1000 }); |
49 | 34 | if (isOpen === expectedState) { |
50 | 35 | return; |
51 | 36 | } |
52 | 37 |
|
53 | 38 | // toggle the view state by clicking the button |
54 | | - await testSubjects.click(this.toggleButtonTestSubject); |
| 39 | + await testSubjects.click(toggleButtonTestSubject); |
55 | 40 |
|
56 | 41 | if (expectedState === true) { |
57 | 42 | // wait for up to 10 seconds for the menu to show up, otherwise fail and retry |
58 | | - await testSubjects.existOrFail(this.menuTestSubject, { timeout: 10000 }); |
| 43 | + await testSubjects.existOrFail(menuTestSubject, { timeout: 10000 }); |
59 | 44 | } else { |
60 | 45 | // wait for the form to hide, otherwise fail and retry |
61 | | - await testSubjects.waitForDeleted(this.menuTestSubject); |
| 46 | + await testSubjects.waitForDeleted(menuTestSubject); |
62 | 47 | } |
63 | 48 | }); |
64 | 49 | } |
65 | | - }; |
| 50 | + |
| 51 | + return { |
| 52 | + async open() { |
| 53 | + await setState(true); |
| 54 | + }, |
| 55 | + |
| 56 | + async close() { |
| 57 | + await setState(false); |
| 58 | + }, |
| 59 | + }; |
| 60 | + } |
66 | 61 | } |
0 commit comments