Skip to content

Commit 0c4b7e3

Browse files
ci-bothsy822
authored andcommitted
update switchEnvironment test
1 parent 51e5c55 commit 0c4b7e3

File tree

4 files changed

+146
-198
lines changed

4 files changed

+146
-198
lines changed

apps/remix-ide-e2e/src/commands/switchEnvironment.ts

Lines changed: 140 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,49 +3,151 @@ import EventEmitter from 'events'
33

44
class switchEnvironment extends EventEmitter {
55
command (this: NightwatchBrowser, provider: string, returnWhenInitialized?: boolean): NightwatchBrowser {
6-
this.api.useCss().waitForElementVisible('[data-id="settingsSelectEnvOptions"]')
7-
.perform((done) => {
8-
this.api.isPresent({ selector: `[data-id="selected-provider-${provider}"]`, suppressNotFoundErrors: true, timeout: 5000 }, (result) => {
9-
if (result.value) {
6+
const submenuLabels = ['Remix VM', 'Browser extension', 'Dev']
7+
8+
const clickAndMaybeWait = (
9+
browser: NightwatchBrowser,
10+
cssSelector: string,
11+
providerName: string,
12+
shouldWait?: boolean
13+
) => {
14+
browser
15+
.waitForElementVisible(cssSelector, 10000)
16+
.click(cssSelector)
17+
.perform((done) => {
18+
if (shouldWait) {
19+
browser
20+
.waitForElementVisible(`[data-id="selected-provider-${providerName}"]`, 15000)
21+
.perform(() => done())
22+
} else {
1023
done()
24+
}
25+
})
26+
}
27+
28+
const ensureDropdownClosed = (browser: NightwatchBrowser) => {
29+
browser
30+
.isVisible('body .dropdown-menu.show', (open) => {
31+
if (open.value) browser.click('[data-id="settingsSelectEnvOptions"] button')
32+
})
33+
}
34+
35+
const waitForSelectedOrModal = (
36+
browser: NightwatchBrowser,
37+
providerName: string,
38+
timeoutMs = 10000,
39+
cb?: (ok: boolean) => void
40+
) => {
41+
const start = Date.now()
42+
const poll = () => {
43+
browser.isPresent({ selector: `[data-id="selected-provider-${providerName}"]`, suppressNotFoundErrors: true, timeout: 0 }, (selRes) => {
44+
if (selRes.value) return cb && cb(true)
45+
browser.isPresent({ selector: `*[data-id="${providerName}ModalDialogModalBody-react"]`, suppressNotFoundErrors: true, timeout: 0 }, (modalBody) => {
46+
if (modalBody.value) return cb && cb(true)
47+
browser.isPresent({ selector: `*[data-id="${providerName}ModalDialogContainer-react"]`, suppressNotFoundErrors: true, timeout: 0 }, (modalContainer) => {
48+
if (modalContainer.value) return cb && cb(true)
49+
if (Date.now() - start > timeoutMs) return cb && cb(false)
50+
browser.pause(200).perform(poll)
51+
})
52+
})
53+
})
54+
}
55+
poll()
56+
}
57+
58+
const tryHoverSubmenusAndClick = (
59+
browser: NightwatchBrowser,
60+
labels: string[],
61+
providerName: string,
62+
shouldWait: boolean,
63+
onDone: VoidFunction
64+
) => {
65+
const tryOne = (i: number) => {
66+
if (i >= labels.length) return onDone()
67+
browser
68+
.useXpath()
69+
.isPresent({
70+
selector: `//span[contains(@class,'dropdown-item') and normalize-space()='${labels[i]}']`,
71+
suppressNotFoundErrors: true,
72+
timeout: 0
73+
}, (present) => {
74+
if (!present.value) {
75+
browser.useCss()
76+
return tryOne(i + 1)
77+
}
78+
browser
79+
.moveToElement(`//span[contains(@class,'dropdown-item') and normalize-space()='${labels[i]}']`, 5, 5)
80+
.pause(250)
81+
.useCss()
82+
.isPresent({
83+
selector: `body .dropdown-menu.show [data-id="dropdown-item-${providerName}"]`,
84+
suppressNotFoundErrors: true,
85+
timeout: 1000
86+
}, (inPortal) => {
87+
if (inPortal.value) {
88+
clickAndMaybeWait(browser, `body .dropdown-menu.show [data-id="dropdown-item-${providerName}"]`, providerName, shouldWait)
89+
onDone()
90+
} else {
91+
tryOne(i + 1)
92+
}
93+
})
94+
})
95+
}
96+
tryOne(0)
97+
}
98+
99+
const attemptSelect = (
100+
browser: NightwatchBrowser,
101+
providerName: string,
102+
shouldWait?: boolean,
103+
onComplete?: VoidFunction
104+
) => {
105+
browser
106+
.isPresent({ selector: `[data-id="dropdown-item-${providerName}"]`, suppressNotFoundErrors: true, timeout: 1500 }, (topLevel) => {
107+
if (topLevel.value) {
108+
clickAndMaybeWait(browser, `[data-id="dropdown-item-${providerName}"]`, providerName, shouldWait)
109+
onComplete && browser.perform(() => onComplete())
11110
} else {
12-
browser.perform(() => {
13-
this.api
14-
.click('[data-id="settingsSelectEnvOptions"] button') // open dropdown
15-
.isPresent({ selector: `[data-id="dropdown-item-${provider}"]`, suppressNotFoundErrors: true, timeout: 5000 }, (result) => {
16-
console.log(result)
17-
this.api.click('[data-id="settingsSelectEnvOptions"] button') // close dropdown
18-
if (!result.value) {
19-
this.api.pinGrid(provider, true)
20-
.click('[data-id="settingsSelectEnvOptions"] button')
21-
.waitForElementVisible(`[data-id="dropdown-item-${provider}"]`)
22-
.click(`[data-id="dropdown-item-${provider}"]`)
23-
.perform((done) => {
24-
if (returnWhenInitialized) {
25-
browser.waitForElementVisible(`[data-id="selected-provider-${provider}"]`).perform(() => done())
26-
} else {
27-
done()
28-
}
29-
})
30-
.perform(() => done())
31-
} else {
32-
browser.click('[data-id="settingsSelectEnvOptions"] button')
33-
.waitForElementVisible(`[data-id="dropdown-item-${provider}"]`)
34-
.click(`[data-id="dropdown-item-${provider}"]`)
35-
.perform((done) => {
36-
if (returnWhenInitialized) {
37-
browser.waitForElementVisible(`[data-id="selected-provider-${provider}"]`).perform(() => done())
38-
} else {
39-
done()
40-
}
41-
})
42-
.perform(() => done())
43-
}
44-
})
111+
tryHoverSubmenusAndClick(browser, submenuLabels, providerName, !!shouldWait, () => {
112+
onComplete && browser.perform(() => onComplete())
45113
})
46114
}
47115
})
48-
}).perform(() => this.emit('complete'))
116+
}
117+
118+
this.api
119+
.useCss()
120+
.waitForElementVisible('[data-id="settingsSelectEnvOptions"]', 10000)
121+
.perform((done) => {
122+
this.api.isPresent({ selector: `[data-id="selected-provider-${provider}"]`, suppressNotFoundErrors: true, timeout: 1000 }, (result) => {
123+
if (result.value) return done()
124+
125+
this.api.click('[data-id="settingsSelectEnvOptions"] button')
126+
127+
attemptSelect(this.api, provider, returnWhenInitialized, () => {
128+
waitForSelectedOrModal(this.api, provider, 10000, (ok) => {
129+
if (ok) return done()
130+
131+
this.api.isPresent({
132+
selector: `*[data-id="${provider}ModalDialogContainer-react"]`,
133+
suppressNotFoundErrors: true,
134+
timeout: 0
135+
}, (hasModal) => {
136+
if (!hasModal.value) {
137+
ensureDropdownClosed(this.api)
138+
}
139+
this.api
140+
.pinGrid(provider, true)
141+
.click('[data-id="settingsSelectEnvOptions"] button')
142+
attemptSelect(this.api, provider, returnWhenInitialized, () => {
143+
waitForSelectedOrModal(this.api, provider, 10000, () => done())
144+
})
145+
})
146+
})
147+
})
148+
})
149+
})
150+
.perform(() => this.emit('complete'))
49151

50152
return this
51153
}

apps/remix-ide-e2e/src/commands/switchEnvironmentWithSubmenu.ts

Lines changed: 0 additions & 153 deletions
This file was deleted.

apps/remix-ide-e2e/src/tests/providers.test.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ module.exports = {
1111
'Should switch to ganache provider, set a custom URL and fail to connect #group1': function (browser: NightwatchBrowser) {
1212
browser.waitForElementVisible('div[data-id="remixIdeIconPanel"]', 10000)
1313
.clickLaunchIcon('udapp')
14-
.switchEnvironmentWithSubmenu('ganache-provider')
14+
.switchEnvironment('ganache-provider')
1515
.waitForElementVisible('*[data-id="ganache-providerModalDialogModalBody-react"]')
1616

1717
.execute(() => {
@@ -29,9 +29,9 @@ module.exports = {
2929

3030
'Should switch to ganache provider, use the default ganache URL and succeed to connect #group1': function (browser: NightwatchBrowser) {
3131
browser
32-
.switchEnvironmentWithSubmenu('vm-cancun')
32+
.switchEnvironment('vm-cancun')
3333
.pause(2000)
34-
.switchEnvironmentWithSubmenu('ganache-provider')
34+
.switchEnvironment('ganache-provider')
3535
.waitForElementVisible('*[data-id="ganache-providerModalDialogModalBody-react"]')
3636
.modalFooterOKClick('ganache-provider')
3737
.waitForElementNotVisible('*[data-id="ganache-providerModalDialogContainer-react"]', 15000)
@@ -40,7 +40,7 @@ module.exports = {
4040

4141
'Should switch to foundry provider, set a custom URL and fail to connect #group1': function (browser: NightwatchBrowser) {
4242
browser.waitForElementVisible('div[data-id="remixIdeIconPanel"]', 10000)
43-
.switchEnvironmentWithSubmenu('foundry-provider')
43+
.switchEnvironment('foundry-provider')
4444
.waitForElementVisible('*[data-id="foundry-providerModalDialogModalBody-react"]')
4545
.execute(() => {
4646
(document.querySelector('*[data-id="foundry-providerModalDialogModalBody-react"] input') as any).focus()
@@ -51,7 +51,7 @@ module.exports = {
5151
.pause(1000)
5252
},
5353
'Should switch to foundry provider, use the default foundry URL and succeed to connect #group1': function (browser: NightwatchBrowser) {
54-
browser.switchEnvironmentWithSubmenu('foundry-provider')
54+
browser.switchEnvironment('foundry-provider')
5555
.waitForElementVisible('*[data-id="foundry-providerModalDialogModalBody-react"]')
5656
.modalFooterOKClick('foundry-provider')
5757
.waitForElementContainsText('*[data-id="settingsNetworkEnv"]', 'Custom (')
@@ -60,7 +60,7 @@ module.exports = {
6060
'Should switch to custom provider #group2': function (browser: NightwatchBrowser) {
6161
browser.waitForElementVisible('div[data-id="remixIdeIconPanel"]', 10000)
6262
.clickLaunchIcon('udapp')
63-
.switchEnvironmentWithSubmenu('ganache-provider')
63+
.switchEnvironment('ganache-provider')
6464
.waitForElementVisible('*[data-id="ganache-providerModalDialogModalBody-react"]')
6565

6666
.execute(() => {

apps/remix-ide-e2e/src/types/index.d.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ declare module 'nightwatch' {
7070
currentSelectedFileIs(name: string): NightwatchBrowser
7171
switchWorkspace: (workspaceName: string) => NightwatchBrowser
7272
switchEnvironment: (provider: string, returnWhenInitialized?: boolean) => NightwatchBrowser
73-
switchEnvironmentWithSubmenu: (provider: string, returnWhenInitialized?: boolean) => NightwatchBrowser
7473
pinGrid: (provider: string, status: boolean) => NightwatchBrowser
7574
connectToExternalHttpProvider: (url: string, identifier: string) => NightwatchBrowser
7675
waitForElementNotContainsText: (id: string, value: string, timeout: number = 10000) => NightwatchBrowser

0 commit comments

Comments
 (0)