diff --git a/.circleci/config.yml b/.circleci/config.yml index a936e1eec6..f5e5e4bb1d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -47,7 +47,7 @@ jobs: - checkout - run: npm install - run: npm run lint - # - run: npm run lint remix-ide-e2e + - run: npm run lint remix-ide-e2e - run: npm run build:libs - run: npm run build - run: @@ -84,7 +84,7 @@ jobs: - checkout - run: npm install - run: npm run lint - # - run: npm run lint remix-ide-e2e + - run: npm run lint remix-ide-e2e - run: npm run build:libs - run: npm run build - run: @@ -126,7 +126,7 @@ jobs: - checkout - run: npm install - run: npm run lint - # - run: npm run lint remix-ide-e2e + - run: npm run lint remix-ide-e2e - run: npm run build:libs - run: npm run build - run: diff --git a/apps/remix-ide-e2e/.eslintrc b/apps/remix-ide-e2e/.eslintrc index 0868946880..f21e0fc224 100644 --- a/apps/remix-ide-e2e/.eslintrc +++ b/apps/remix-ide-e2e/.eslintrc @@ -5,7 +5,9 @@ "files": ["**/*.ts"], "rules": { "no-undef": "off", - "@typescript-eslint/no-var-requires": 0 + "@typescript-eslint/no-var-requires": 0, + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": "error" } } ], diff --git a/apps/remix-ide-e2e/nightwatch.ts b/apps/remix-ide-e2e/nightwatch.ts index e9af1d2866..1473cbaf2b 100644 --- a/apps/remix-ide-e2e/nightwatch.ts +++ b/apps/remix-ide-e2e/nightwatch.ts @@ -4,79 +4,79 @@ const crxFile = fs.readFileSync('apps/remix-ide-e2e/src/extensions/chrome/metama const metamaskExtension = Buffer.from(crxFile).toString('base64') module.exports = { - 'src_folders': ['dist/apps/remix-ide-e2e/src/tests'], - 'output_folder': './reports/tests', - 'custom_commands_path': ['dist/apps/remix-ide-e2e/src/commands'], - 'custom_assertions_path': '', - 'page_objects_path': '', - 'globals_path': '', + src_folders: ['dist/apps/remix-ide-e2e/src/tests'], + output_folder: './reports/tests', + custom_commands_path: ['dist/apps/remix-ide-e2e/src/commands'], + custom_assertions_path: '', + page_objects_path: '', + globals_path: '', - 'test_settings': { - 'default': { - 'selenium_port': 4444, - 'selenium_host': 'localhost', - 'globals': { - 'waitForConditionTimeout': 10000, - 'asyncHookTimeout': 100000 + test_settings: { + default: { + selenium_port: 4444, + selenium_host: 'localhost', + globals: { + waitForConditionTimeout: 10000, + asyncHookTimeout: 100000 }, - 'screenshots': { - 'enabled': true, - 'path': './reports/screenshots', - 'on_failure': true, - 'on_error': true + screenshots: { + enabled: true, + path: './reports/screenshots', + on_failure: true, + on_error: true }, - 'desiredCapabilities': { - 'browserName': 'firefox', - 'javascriptEnabled': true, - 'acceptSslCerts': true + desiredCapabilities: { + browserName: 'firefox', + javascriptEnabled: true, + acceptSslCerts: true }, - 'exclude': ['dist/apps/remix-ide-e2e/src/tests/runAndDeploy.js'] + exclude: ['dist/apps/remix-ide-e2e/src/tests/runAndDeploy.js'] }, - 'chrome': { - 'desiredCapabilities': { - 'browserName': 'chrome', - 'javascriptEnabled': true, - 'acceptSslCerts': true, + chrome: { + desiredCapabilities: { + browserName: 'chrome', + javascriptEnabled: true, + acceptSslCerts: true, 'goog:chromeOptions': { - 'args': ['window-size=2560,1440', 'start-fullscreen'] + args: ['window-size=2560,1440', 'start-fullscreen'] } } }, 'chrome-runAndDeploy': { - 'desiredCapabilities': { - 'browserName': 'chrome', - 'javascriptEnabled': true, - 'acceptSslCerts': true, + desiredCapabilities: { + browserName: 'chrome', + javascriptEnabled: true, + acceptSslCerts: true, 'goog:chromeOptions': { - 'args': ['window-size=2560,1440', 'start-fullscreen'], - 'extensions': [metamaskExtension] + args: ['window-size=2560,1440', 'start-fullscreen'], + extensions: [metamaskExtension] } } }, - 'safari': { - 'desiredCapabilities': { - 'browserName': 'safari', - 'javascriptEnabled': true, - 'acceptSslCerts': true + safari: { + desiredCapabilities: { + browserName: 'safari', + javascriptEnabled: true, + acceptSslCerts: true } }, - 'ie': { - 'desiredCapabilities': { - 'browserName': 'internet explorer', - 'javascriptEnabled': true, - 'acceptSslCerts': true + ie: { + desiredCapabilities: { + browserName: 'internet explorer', + javascriptEnabled: true, + acceptSslCerts: true } }, - 'firefox': { - 'desiredCapabilities': { - 'browserName': 'firefox', - 'javascriptEnabled': true, - 'acceptSslCerts': true + firefox: { + desiredCapabilities: { + browserName: 'firefox', + javascriptEnabled: true, + acceptSslCerts: true } } } diff --git a/apps/remix-ide-e2e/src/commands/addAtAddressInstance.ts b/apps/remix-ide-e2e/src/commands/addAtAddressInstance.ts index 5adb6a9fd4..50116dec42 100644 --- a/apps/remix-ide-e2e/src/commands/addAtAddressInstance.ts +++ b/apps/remix-ide-e2e/src/commands/addAtAddressInstance.ts @@ -1,5 +1,5 @@ import { NightwatchBrowser } from 'nightwatch' -import EventEmitter from "events" +import EventEmitter from 'events' class addAtAddressInstance extends EventEmitter { command (this: NightwatchBrowser, address: string, isValidFormat: boolean, isValidChecksum: boolean): NightwatchBrowser { @@ -19,7 +19,7 @@ function addInstance (browser: NightwatchBrowser, address: string, isValidFormat .execute(function () { const ret = document.querySelector('div[class^="modal-body"] div').innerHTML const modal = document.querySelector('#modal-footer-ok') as HTMLElement - + modal.click() return ret }, [], function (result) { diff --git a/apps/remix-ide-e2e/src/commands/addFile.ts b/apps/remix-ide-e2e/src/commands/addFile.ts index 18260926c8..9bb7d04c09 100644 --- a/apps/remix-ide-e2e/src/commands/addFile.ts +++ b/apps/remix-ide-e2e/src/commands/addFile.ts @@ -1,5 +1,5 @@ import { NightwatchBrowser, NightwatchContractContent } from 'nightwatch' -import EventEmitter from "events" +import EventEmitter from 'events' class AddFile extends EventEmitter { command (this: NightwatchBrowser, name: string, content: NightwatchContractContent): NightwatchBrowser { diff --git a/apps/remix-ide-e2e/src/commands/checkVariableDebug.ts b/apps/remix-ide-e2e/src/commands/checkVariableDebug.ts index 8769339a1a..8ce47f222a 100644 --- a/apps/remix-ide-e2e/src/commands/checkVariableDebug.ts +++ b/apps/remix-ide-e2e/src/commands/checkVariableDebug.ts @@ -1,5 +1,5 @@ import { NightwatchBrowser, NightwatchCheckVariableDebugValue } from 'nightwatch' -import EventEmitter from "events" +import EventEmitter from 'events' const deepequal = require('deep-equal') @@ -16,7 +16,7 @@ class CheckVariableDebug extends EventEmitter { } function checkDebug (browser: NightwatchBrowser, id: string, debugValue: NightwatchCheckVariableDebugValue, done: VoidFunction) { - // id is soliditylocals or soliditystate + // id is soliditylocals or soliditystate browser.execute(function (id: string) { const elem = document.querySelector('#' + id + ' .dropdownrawcontent') as HTMLElement diff --git a/apps/remix-ide-e2e/src/commands/clearEditableContent.ts b/apps/remix-ide-e2e/src/commands/clearEditableContent.ts index ad433d3af1..89f5b1bbda 100644 --- a/apps/remix-ide-e2e/src/commands/clearEditableContent.ts +++ b/apps/remix-ide-e2e/src/commands/clearEditableContent.ts @@ -23,7 +23,7 @@ function clearContent (browser: NightwatchBrowser, cssSelector: string, callback selection.addRange(range) }, [cssSelector], function () { browser.sendKeys(cssSelector, browser.Keys.BACK_SPACE) - .pause(5000) + .pause(5000) callback() }) } diff --git a/apps/remix-ide-e2e/src/commands/clickElementAtPosition.ts b/apps/remix-ide-e2e/src/commands/clickElementAtPosition.ts index f66315c3b0..289f8da83b 100644 --- a/apps/remix-ide-e2e/src/commands/clickElementAtPosition.ts +++ b/apps/remix-ide-e2e/src/commands/clickElementAtPosition.ts @@ -15,13 +15,13 @@ class ClickElement extends EventEmitter { function _clickElement (browser: NightwatchBrowser, cssSelector: string, index: number, cb: VoidFunction) { browser.waitForElementPresent(cssSelector) - .execute(function (cssSelector: string, index: number) { - const elem = document.querySelectorAll(cssSelector)[index] as HTMLElement - - elem.click() - }, [cssSelector, index], function () { - cb() - }) + .execute(function (cssSelector: string, index: number) { + const elem = document.querySelectorAll(cssSelector)[index] as HTMLElement + + elem.click() + }, [cssSelector, index], function () { + cb() + }) } module.exports = ClickElement diff --git a/apps/remix-ide-e2e/src/commands/clickFunction.ts b/apps/remix-ide-e2e/src/commands/clickFunction.ts index 12976f53d5..e84be6a0d0 100644 --- a/apps/remix-ide-e2e/src/commands/clickFunction.ts +++ b/apps/remix-ide-e2e/src/commands/clickFunction.ts @@ -1,24 +1,24 @@ import { NightwatchBrowser, NightwatchClickFunctionExpectedInput } from 'nightwatch' -import EventEmitter from "events" +import EventEmitter from 'events' class ClickFunction extends EventEmitter { command (this: NightwatchBrowser, fnFullName: string, expectedInput?: NightwatchClickFunctionExpectedInput): NightwatchBrowser { this.api.waitForElementPresent('.instance button[title="' + fnFullName + '"]') - .perform(function (client, done) { - client.execute(function () { - document.querySelector('#runTabView').scrollTop = document.querySelector('#runTabView').scrollHeight - }, [], function () { - if (expectedInput) { - client.setValue('#runTabView input[title="' + expectedInput.types + '"]', expectedInput.values, _ => _) - } - done() + .perform(function (client, done) { + client.execute(function () { + document.querySelector('#runTabView').scrollTop = document.querySelector('#runTabView').scrollHeight + }, [], function () { + if (expectedInput) { + client.setValue('#runTabView input[title="' + expectedInput.types + '"]', expectedInput.values, _ => _) + } + done() + }) + }) + .scrollAndClick('.instance button[title="' + fnFullName + '"]') + .pause(2000) + .perform(() => { + this.emit('complete') }) - }) - .scrollAndClick('.instance button[title="' + fnFullName + '"]') - .pause(2000) - .perform(() => { - this.emit('complete') - }) return this } } diff --git a/apps/remix-ide-e2e/src/commands/clickInstance.ts b/apps/remix-ide-e2e/src/commands/clickInstance.ts index 3d92144966..ca88a71a0b 100644 --- a/apps/remix-ide-e2e/src/commands/clickInstance.ts +++ b/apps/remix-ide-e2e/src/commands/clickInstance.ts @@ -1,5 +1,5 @@ import { NightwatchBrowser } from 'nightwatch' -import EventEmitter from "events" +import EventEmitter from 'events' class ClickInstance extends EventEmitter { command (this: NightwatchBrowser, index: number): NightwatchBrowser { diff --git a/apps/remix-ide-e2e/src/commands/clickLaunchIcon.ts b/apps/remix-ide-e2e/src/commands/clickLaunchIcon.ts index b458cfb0ac..7b307f0c4d 100644 --- a/apps/remix-ide-e2e/src/commands/clickLaunchIcon.ts +++ b/apps/remix-ide-e2e/src/commands/clickLaunchIcon.ts @@ -1,5 +1,5 @@ -import { NightwatchBrowser } from "nightwatch" -import EventEmitter from "events" +import { NightwatchBrowser } from 'nightwatch' +import EventEmitter from 'events' class ClickLaunchIcon extends EventEmitter { command (this: NightwatchBrowser, icon: string): NightwatchBrowser { diff --git a/apps/remix-ide-e2e/src/commands/createContract.ts b/apps/remix-ide-e2e/src/commands/createContract.ts index 5246050e4c..d3f7befee1 100644 --- a/apps/remix-ide-e2e/src/commands/createContract.ts +++ b/apps/remix-ide-e2e/src/commands/createContract.ts @@ -1,5 +1,5 @@ -import { NightwatchBrowser } from "nightwatch" -import EventEmitter from "events" +import { NightwatchBrowser } from 'nightwatch' +import EventEmitter from 'events' class CreateContract extends EventEmitter { command (this: NightwatchBrowser, inputParams: string): NightwatchBrowser { @@ -20,9 +20,9 @@ function createContract (browser: NightwatchBrowser, inputParams: string, callba }) } else { browser - .click('#runTabView button[class^="instanceButton"]') - .pause(500) - .perform(function () { callback() }) + .click('#runTabView button[class^="instanceButton"]') + .pause(500) + .perform(function () { callback() }) } } diff --git a/apps/remix-ide-e2e/src/commands/debugTransaction.ts b/apps/remix-ide-e2e/src/commands/debugTransaction.ts index d4d9100800..37a63acb9f 100644 --- a/apps/remix-ide-e2e/src/commands/debugTransaction.ts +++ b/apps/remix-ide-e2e/src/commands/debugTransaction.ts @@ -1,5 +1,5 @@ -import { NightwatchBrowser } from "nightwatch" -import EventEmitter from "events" +import { NightwatchBrowser } from 'nightwatch' +import EventEmitter from 'events' class debugTransaction extends EventEmitter { command (this: NightwatchBrowser, index = 0): NightwatchBrowser { @@ -19,7 +19,7 @@ function checkStyle (browser: NightwatchBrowser, index: number, callback: VoidFu debugBtn && debugBtn.click() }, [index], function () { - browser.waitForElementVisible('*[data-id="buttonNavigatorJumpPreviousBreakpoint"]').perform(() => callback()) + browser.waitForElementVisible('*[data-id="buttonNavigatorJumpPreviousBreakpoint"]').perform(() => callback()) }) } diff --git a/apps/remix-ide-e2e/src/commands/editorScroll.ts b/apps/remix-ide-e2e/src/commands/editorScroll.ts index 6d48571f68..93118d816f 100644 --- a/apps/remix-ide-e2e/src/commands/editorScroll.ts +++ b/apps/remix-ide-e2e/src/commands/editorScroll.ts @@ -1,5 +1,5 @@ -import { NightwatchBrowser } from "nightwatch" -import EventEmitter from "events" +import { NightwatchBrowser } from 'nightwatch' +import EventEmitter from 'events' // fix for editor scroll class ScrollEditor extends EventEmitter { diff --git a/apps/remix-ide-e2e/src/commands/executeScript.ts b/apps/remix-ide-e2e/src/commands/executeScript.ts index c89f6bd500..77649a2664 100644 --- a/apps/remix-ide-e2e/src/commands/executeScript.ts +++ b/apps/remix-ide-e2e/src/commands/executeScript.ts @@ -1,5 +1,5 @@ -import { NightwatchBrowser } from "nightwatch" -import EventEmitter from "events" +import { NightwatchBrowser } from 'nightwatch' +import EventEmitter from 'events' class ExecuteScript extends EventEmitter { command (this: NightwatchBrowser, script: string): NightwatchBrowser { diff --git a/apps/remix-ide-e2e/src/commands/getAddressAtPosition.ts b/apps/remix-ide-e2e/src/commands/getAddressAtPosition.ts index 40319db14d..a1ea787335 100644 --- a/apps/remix-ide-e2e/src/commands/getAddressAtPosition.ts +++ b/apps/remix-ide-e2e/src/commands/getAddressAtPosition.ts @@ -1,5 +1,5 @@ -import { NightwatchBrowser } from "nightwatch" -import EventEmitter from "events" +import { NightwatchBrowser } from 'nightwatch' +import EventEmitter from 'events' class GetAddressAtPosition extends EventEmitter { command (this: NightwatchBrowser, index: number, cb: (pos: string) => void): NightwatchBrowser { @@ -16,16 +16,16 @@ class GetAddressAtPosition extends EventEmitter { function getAddressAtPosition (browser: NightwatchBrowser, index: number, callback: (pos: string) => void) { browser.waitForElementPresent('*[data-shared="universalDappUiInstance"]') - .execute(function (index) { - const deployedContracts = document.querySelectorAll('*[data-shared="universalDappUiInstance"]') - const id = deployedContracts[index].getAttribute('id') + .execute(function (index) { + const deployedContracts = document.querySelectorAll('*[data-shared="universalDappUiInstance"]') + const id = deployedContracts[index].getAttribute('id') - return id.replace('instance', '') - }, [index], function (result) { - const pos = typeof result.value === 'string' ? result.value : null + return id.replace('instance', '') + }, [index], function (result) { + const pos = typeof result.value === 'string' ? result.value : null - callback(pos) - }) + callback(pos) + }) } module.exports = GetAddressAtPosition diff --git a/apps/remix-ide-e2e/src/commands/getEditorValue.ts b/apps/remix-ide-e2e/src/commands/getEditorValue.ts index 9b8ea7b456..b995b4dc4e 100644 --- a/apps/remix-ide-e2e/src/commands/getEditorValue.ts +++ b/apps/remix-ide-e2e/src/commands/getEditorValue.ts @@ -1,11 +1,11 @@ -import { NightwatchBrowser } from "nightwatch" -import EventEmitter from "events" +import { NightwatchBrowser } from 'nightwatch' +import EventEmitter from 'events' class GetEditorValue extends EventEmitter { command (this: NightwatchBrowser, callback: (content: string) => void): NightwatchBrowser { this.api.perform((client, done) => { this.api.execute(function () { - const elem: any = document.getElementById('input') + const elem: any = document.getElementById('input') return elem.editor.getValue() }, [], (result) => { diff --git a/apps/remix-ide-e2e/src/commands/getInstalledPlugins.ts b/apps/remix-ide-e2e/src/commands/getInstalledPlugins.ts index cbccd215a4..4dd190e99b 100644 --- a/apps/remix-ide-e2e/src/commands/getInstalledPlugins.ts +++ b/apps/remix-ide-e2e/src/commands/getInstalledPlugins.ts @@ -1,26 +1,26 @@ -import { NightwatchBrowser } from "nightwatch" -import EventEmitter from "events" +import { NightwatchBrowser } from 'nightwatch' +import EventEmitter from 'events' class GetInstalledPlugins extends EventEmitter { command (this: NightwatchBrowser, cb: (plugins: string[]) => void): NightwatchBrowser { const browser = this.api browser.waitForElementPresent('[plugin]:not([plugin=""]') - .perform((done) => { - browser.execute(function() { - const pluginNames = [] - const plugins = document.querySelectorAll('[plugin]:not([plugin=""]') + .perform((done) => { + browser.execute(function () { + const pluginNames = [] + const plugins = document.querySelectorAll('[plugin]:not([plugin=""]') - plugins.forEach(plugin => { - pluginNames.push(plugin.getAttribute('plugin')) + plugins.forEach(plugin => { + pluginNames.push(plugin.getAttribute('plugin')) + }) + return pluginNames + }, [], (result) => { + done() + Array.isArray(result.value) && cb(result.value) + this.emit('complete') }) - return pluginNames - }, [], (result) => { - done() - Array.isArray(result.value) && cb(result.value) - this.emit('complete') }) - }) return this } } diff --git a/apps/remix-ide-e2e/src/commands/getModalBody.ts b/apps/remix-ide-e2e/src/commands/getModalBody.ts index 103044c0f2..80e2169ff7 100644 --- a/apps/remix-ide-e2e/src/commands/getModalBody.ts +++ b/apps/remix-ide-e2e/src/commands/getModalBody.ts @@ -1,17 +1,17 @@ -import { NightwatchBrowser } from "nightwatch" -import EventEmitter from "events" +import { NightwatchBrowser } from 'nightwatch' +import EventEmitter from 'events' class GetModalBody extends EventEmitter { command (this: NightwatchBrowser, callback: (value: string, cb: VoidFunction) => void) { this.api.waitForElementPresent('.modal-body') - .getText('#modal-dialog', (result) => { - console.log(result) - const value = typeof result.value === 'string' ? result.value : null + .getText('#modal-dialog', (result) => { + console.log(result) + const value = typeof result.value === 'string' ? result.value : null - callback(value, () => { - this.emit('complete') + callback(value, () => { + this.emit('complete') + }) }) - }) return this } } diff --git a/apps/remix-ide-e2e/src/commands/goToVMTraceStep.ts b/apps/remix-ide-e2e/src/commands/goToVMTraceStep.ts index c7eda61ebf..9baac64849 100644 --- a/apps/remix-ide-e2e/src/commands/goToVMTraceStep.ts +++ b/apps/remix-ide-e2e/src/commands/goToVMTraceStep.ts @@ -1,8 +1,8 @@ import { NightwatchBrowser } from 'nightwatch' -import EventEmitter from "events" +import EventEmitter from 'events' class GoToVmTraceStep extends EventEmitter { command (this: NightwatchBrowser, step: number, incr?: number): NightwatchBrowser { - goToVMtraceStep(this.api, step, incr, () => { + goToVMtraceStep(this.api, step, incr, () => { this.emit('complete') }) return this @@ -15,7 +15,7 @@ function goToVMtraceStep (browser: NightwatchBrowser, step: number, incr: number return document.querySelector('#stepdetail').innerHTML }, [], function (result) { console.log('goToVMtraceStep', result) - if (typeof result.value === 'string' && ( result.value.indexOf('vm trace step:') !== -1 && result.value.indexOf(step.toString()) !== -1)) { + if (typeof result.value === 'string' && (result.value.indexOf('vm trace step:') !== -1 && result.value.indexOf(step.toString()) !== -1)) { done() } else if (incr > 1000) { browser.assert.fail('goToVMtraceStep fails', 'info about error', '') @@ -23,11 +23,11 @@ function goToVMtraceStep (browser: NightwatchBrowser, step: number, incr: number } else { incr++ browser.click('#intoforward') - .perform(() => { - setTimeout(() => { - goToVMtraceStep(browser, step, incr, done) - }, 200) - }) + .perform(() => { + setTimeout(() => { + goToVMtraceStep(browser, step, incr, done) + }, 200) + }) } }) } diff --git a/apps/remix-ide-e2e/src/commands/journalChildIncludes.ts b/apps/remix-ide-e2e/src/commands/journalChildIncludes.ts index a831edc843..af9a061136 100644 --- a/apps/remix-ide-e2e/src/commands/journalChildIncludes.ts +++ b/apps/remix-ide-e2e/src/commands/journalChildIncludes.ts @@ -1,5 +1,5 @@ import { NightwatchBrowser } from 'nightwatch' -import EventEmitter from "events" +import EventEmitter from 'events' /* Checks if any child elements of journal (console) contains a matching value. diff --git a/apps/remix-ide-e2e/src/commands/journalLastChild.ts b/apps/remix-ide-e2e/src/commands/journalLastChild.ts index 6837988b8f..0ff5020de5 100644 --- a/apps/remix-ide-e2e/src/commands/journalLastChild.ts +++ b/apps/remix-ide-e2e/src/commands/journalLastChild.ts @@ -1,13 +1,13 @@ import { NightwatchBrowser } from 'nightwatch' -import EventEmitter from "events" +import EventEmitter from 'events' class JournalLastChild extends EventEmitter { command (this: NightwatchBrowser, val: string): NightwatchBrowser { this.api - .waitForElementVisible('*[data-id="terminalJournal"] > div:last-child', 10000) - .assert.containsText('*[data-id="terminalJournal"] > div:last-child', val).perform(() => { - this.emit('complete') - }) + .waitForElementVisible('*[data-id="terminalJournal"] > div:last-child', 10000) + .assert.containsText('*[data-id="terminalJournal"] > div:last-child', val).perform(() => { + this.emit('complete') + }) return this } } diff --git a/apps/remix-ide-e2e/src/commands/journalLastChildIncludes.ts b/apps/remix-ide-e2e/src/commands/journalLastChildIncludes.ts index e215e6c24d..e99f611a79 100644 --- a/apps/remix-ide-e2e/src/commands/journalLastChildIncludes.ts +++ b/apps/remix-ide-e2e/src/commands/journalLastChildIncludes.ts @@ -1,5 +1,5 @@ import { NightwatchBrowser } from 'nightwatch' -import EventEmitter from "events" +import EventEmitter from 'events' /* Check if the last log in the console contains a specific text @@ -7,13 +7,13 @@ import EventEmitter from "events" class JournalLastChildIncludes extends EventEmitter { command (this: NightwatchBrowser, val: string): NightwatchBrowser { this.api - .waitForElementVisible('*[data-id="terminalJournal"] > div:last-child', 10000) - .getText('*[data-id="terminalJournal"] > div:last-child', (result) => { - console.log('JournalLastChildIncludes', result.value) - if (typeof result.value === 'string' && result.value.indexOf(val) === -1) return this.api.assert.fail(`wait for ${val} in ${result.value}`) - else this.api.assert.ok(true, `<*[data-id="terminalJournal"] > div:last-child> contains ${val}.`) - this.emit('complete') - }) + .waitForElementVisible('*[data-id="terminalJournal"] > div:last-child', 10000) + .getText('*[data-id="terminalJournal"] > div:last-child', (result) => { + console.log('JournalLastChildIncludes', result.value) + if (typeof result.value === 'string' && result.value.indexOf(val) === -1) return this.api.assert.fail(`wait for ${val} in ${result.value}`) + else this.api.assert.ok(true, `<*[data-id="terminalJournal"] > div:last-child> contains ${val}.`) + this.emit('complete') + }) return this } } diff --git a/apps/remix-ide-e2e/src/commands/modalFooterCancelClick.ts b/apps/remix-ide-e2e/src/commands/modalFooterCancelClick.ts index 429a423898..e3f90e0c1b 100644 --- a/apps/remix-ide-e2e/src/commands/modalFooterCancelClick.ts +++ b/apps/remix-ide-e2e/src/commands/modalFooterCancelClick.ts @@ -1,12 +1,12 @@ import { NightwatchBrowser } from 'nightwatch' -import EventEmitter from "events" +import EventEmitter from 'events' class ModalFooterOKClick extends EventEmitter { command (this: NightwatchBrowser): NightwatchBrowser { this.api.waitForElementVisible('#modal-footer-cancel').perform((client, done) => { this.api.execute(function () { const elem = document.querySelector('#modal-footer-cancel') as HTMLElement - + elem.click() }, [], () => { done() diff --git a/apps/remix-ide-e2e/src/commands/modalFooterOKClick.ts b/apps/remix-ide-e2e/src/commands/modalFooterOKClick.ts index db9cf29df7..bea13a01b2 100644 --- a/apps/remix-ide-e2e/src/commands/modalFooterOKClick.ts +++ b/apps/remix-ide-e2e/src/commands/modalFooterOKClick.ts @@ -1,5 +1,5 @@ -import { NightwatchBrowser } from "nightwatch" -import EventEmitter from "events" +import { NightwatchBrowser } from 'nightwatch' +import EventEmitter from 'events' class ModalFooterOKClick extends EventEmitter { command (this: NightwatchBrowser): NightwatchBrowser { diff --git a/apps/remix-ide-e2e/src/commands/noWorkerErrorFor.ts b/apps/remix-ide-e2e/src/commands/noWorkerErrorFor.ts index 05dab2734e..bc8abf0146 100644 --- a/apps/remix-ide-e2e/src/commands/noWorkerErrorFor.ts +++ b/apps/remix-ide-e2e/src/commands/noWorkerErrorFor.ts @@ -1,5 +1,5 @@ -import { NightwatchBrowser } from "nightwatch" -import EventEmitter from "events" +import { NightwatchBrowser } from 'nightwatch' +import EventEmitter from 'events' class NoWorkerErrorFor extends EventEmitter { command (this: NightwatchBrowser, version: string): NightwatchBrowser { diff --git a/apps/remix-ide-e2e/src/commands/notContainsText.ts b/apps/remix-ide-e2e/src/commands/notContainsText.ts index 8b3794d61e..ff3358cc85 100644 --- a/apps/remix-ide-e2e/src/commands/notContainsText.ts +++ b/apps/remix-ide-e2e/src/commands/notContainsText.ts @@ -1,5 +1,5 @@ -import { NightwatchBrowser } from "nightwatch" -import EventEmitter from "events" +import { NightwatchBrowser } from 'nightwatch' +import EventEmitter from 'events' class NotContainsText extends EventEmitter { command (this: NightwatchBrowser, cssSelector: string, text: string): NightwatchBrowser { @@ -9,9 +9,9 @@ class NotContainsText extends EventEmitter { if (typeof result.value === 'string' && result.value.includes(text)) return this.api.assert.fail(`${cssSelector} contains ${text}.`) else this.api.assert.ok(true, `${cssSelector} does not contains ${text}.`) }) - .perform(() => { - this.emit('complete') - }) + .perform(() => { + this.emit('complete') + }) return this } } diff --git a/apps/remix-ide-e2e/src/commands/openFile.ts b/apps/remix-ide-e2e/src/commands/openFile.ts index 00e411b234..56a6f6ed9d 100644 --- a/apps/remix-ide-e2e/src/commands/openFile.ts +++ b/apps/remix-ide-e2e/src/commands/openFile.ts @@ -16,12 +16,12 @@ class OpenFile extends EventEmitter { // click on fileExplorer can toggle it. We go through settings to be sure FE is open function openFile (browser: NightwatchBrowser, name: string, done: VoidFunction) { browser.clickLaunchIcon('settings').clickLaunchIcon('fileExplorers') - .waitForElementVisible('li[data-id="treeViewLitreeViewItem' + name + '"') - .click('li[data-id="treeViewLitreeViewItem' + name + '"') - .pause(2000) - .perform(() => { - done() - }) + .waitForElementVisible('li[data-id="treeViewLitreeViewItem' + name + '"') + .click('li[data-id="treeViewLitreeViewItem' + name + '"') + .pause(2000) + .perform(() => { + done() + }) } module.exports = OpenFile diff --git a/apps/remix-ide-e2e/src/commands/removeFile.ts b/apps/remix-ide-e2e/src/commands/removeFile.ts index 89281eeb41..7ecf683b6d 100644 --- a/apps/remix-ide-e2e/src/commands/removeFile.ts +++ b/apps/remix-ide-e2e/src/commands/removeFile.ts @@ -1,4 +1,4 @@ -import { NightwatchBrowser } from "nightwatch" +import { NightwatchBrowser } from 'nightwatch' const EventEmitter = require('events') @@ -21,13 +21,13 @@ function removeFile (browser: NightwatchBrowser, path: string, done: VoidFunctio const RIGHT_CLICK_BUTTON_CODE = 2 // the same for FF and IE evt.initMouseEvent('contextmenu', true, true, - element.ownerDocument.defaultView, 1, 0, 0, 0, 0, false, - false, false, false, RIGHT_CLICK_BUTTON_CODE, null) + element.ownerDocument.defaultView, 1, 0, 0, 0, 0, false, + false, false, false, RIGHT_CLICK_BUTTON_CODE, null) if (Object.prototype.hasOwnProperty.call(document, 'createEventObject')) { - // dispatch for IE + // dispatch for IE return element.fireEvent('onclick', evt) } else { - // dispatch for firefox + others + // dispatch for firefox + others return !element.dispatchEvent(evt) } } diff --git a/apps/remix-ide-e2e/src/commands/renamePath.ts b/apps/remix-ide-e2e/src/commands/renamePath.ts index 552f159587..606771b23e 100644 --- a/apps/remix-ide-e2e/src/commands/renamePath.ts +++ b/apps/remix-ide-e2e/src/commands/renamePath.ts @@ -20,13 +20,13 @@ function renamePath (browser: NightwatchBrowser, path: string, newFileName: stri const RIGHT_CLICK_BUTTON_CODE = 2 // the same for FF and IE evt.initMouseEvent('contextmenu', true, true, - element.ownerDocument.defaultView, 1, 0, 0, 0, 0, false, - false, false, false, RIGHT_CLICK_BUTTON_CODE, null) + element.ownerDocument.defaultView, 1, 0, 0, 0, 0, false, + false, false, false, RIGHT_CLICK_BUTTON_CODE, null) if (Object.prototype.hasOwnProperty.call(document, 'createEventObject')) { - // dispatch for IE + // dispatch for IE return element.fireEvent('onclick', evt) } else { - // dispatch for firefox + others + // dispatch for firefox + others return !element.dispatchEvent(evt) } } diff --git a/apps/remix-ide-e2e/src/commands/rightClick.ts b/apps/remix-ide-e2e/src/commands/rightClick.ts index c373c99d6b..09fa8643b1 100644 --- a/apps/remix-ide-e2e/src/commands/rightClick.ts +++ b/apps/remix-ide-e2e/src/commands/rightClick.ts @@ -20,13 +20,13 @@ function rightClick (browser: NightwatchBrowser, cssSelector: string, callback: const RIGHT_CLICK_BUTTON_CODE = 2 evt.initMouseEvent('contextmenu', true, true, - element.ownerDocument.defaultView, 1, 0, 0, 0, 0, false, - false, false, false, RIGHT_CLICK_BUTTON_CODE, null) + element.ownerDocument.defaultView, 1, 0, 0, 0, 0, false, + false, false, false, RIGHT_CLICK_BUTTON_CODE, null) if (Object.prototype.hasOwnProperty.call(document, 'createEventObject')) { - // dispatch for IE + // dispatch for IE return element.fireEvent('onclick', evt) } else { - // dispatch for firefox + others + // dispatch for firefox + others return !element.dispatchEvent(evt) } }, [cssSelector], function () { diff --git a/apps/remix-ide-e2e/src/commands/scrollAndClick.ts b/apps/remix-ide-e2e/src/commands/scrollAndClick.ts index cfcf8a016d..151075d225 100644 --- a/apps/remix-ide-e2e/src/commands/scrollAndClick.ts +++ b/apps/remix-ide-e2e/src/commands/scrollAndClick.ts @@ -1,14 +1,14 @@ import { NightwatchBrowser } from 'nightwatch' -import EventEmitter from "events" +import EventEmitter from 'events' class scrollAndClick extends EventEmitter { command (this: NightwatchBrowser, target: string): NightwatchBrowser { this.api - .scrollInto(target) - .click(target) - .perform(() => { - this.emit('complete') - }) + .scrollInto(target) + .click(target) + .perform(() => { + this.emit('complete') + }) return this } } diff --git a/apps/remix-ide-e2e/src/commands/scrollInto.ts b/apps/remix-ide-e2e/src/commands/scrollInto.ts index 7ccab49cc8..f477eac15f 100644 --- a/apps/remix-ide-e2e/src/commands/scrollInto.ts +++ b/apps/remix-ide-e2e/src/commands/scrollInto.ts @@ -1,5 +1,5 @@ import { NightwatchBrowser } from 'nightwatch' -import EventEmitter from "events" +import EventEmitter from 'events' class ScrollInto extends EventEmitter { command (this: NightwatchBrowser, target: string): NightwatchBrowser { @@ -15,7 +15,7 @@ class ScrollInto extends EventEmitter { function _scrollInto (browser: NightwatchBrowser, target: string, cb: VoidFunction): void { browser.execute(function (target) { - document.querySelector(target).scrollIntoView(({block: 'center'})) + document.querySelector(target).scrollIntoView(({ block: 'center' })) }, [target], function () { cb() }) diff --git a/apps/remix-ide-e2e/src/commands/selectAccount.ts b/apps/remix-ide-e2e/src/commands/selectAccount.ts index 413012acdd..d7447d891c 100644 --- a/apps/remix-ide-e2e/src/commands/selectAccount.ts +++ b/apps/remix-ide-e2e/src/commands/selectAccount.ts @@ -1,5 +1,5 @@ import { NightwatchBrowser } from 'nightwatch' -import EventEmitter from "events" +import EventEmitter from 'events' class SelectAccount extends EventEmitter { command (this: NightwatchBrowser, account?: string): NightwatchBrowser { diff --git a/apps/remix-ide-e2e/src/commands/selectContract.ts b/apps/remix-ide-e2e/src/commands/selectContract.ts index b5dfee271d..fcd181ee3e 100644 --- a/apps/remix-ide-e2e/src/commands/selectContract.ts +++ b/apps/remix-ide-e2e/src/commands/selectContract.ts @@ -1,5 +1,5 @@ import { NightwatchBrowser } from 'nightwatch' -import EventEmitter from "events" +import EventEmitter from 'events' const selector = '#runTabView select[class^="contractNames"]' diff --git a/apps/remix-ide-e2e/src/commands/sendLowLevelTx.ts b/apps/remix-ide-e2e/src/commands/sendLowLevelTx.ts index f818a34862..a910a391c8 100644 --- a/apps/remix-ide-e2e/src/commands/sendLowLevelTx.ts +++ b/apps/remix-ide-e2e/src/commands/sendLowLevelTx.ts @@ -1,19 +1,19 @@ import { NightwatchBrowser } from 'nightwatch' -import EventEmitter from "events" +import EventEmitter from 'events' class sendLowLevelTx extends EventEmitter { command (this: NightwatchBrowser, address: string, value: string, callData: string): NightwatchBrowser { console.log('low level transact to ', address, value, callData) this.api.waitForElementVisible(`#instance${address} #deployAndRunLLTxSendTransaction`, 1000) - .clearValue(`#instance${address} #deployAndRunLLTxCalldata`) - .setValue(`#instance${address} #deployAndRunLLTxCalldata`, callData) - .waitForElementVisible('#value') - .clearValue('#value') - .setValue('#value', value) - .scrollAndClick(`#instance${address} #deployAndRunLLTxSendTransaction`) - .perform(() => { - this.emit('complete') - }) + .clearValue(`#instance${address} #deployAndRunLLTxCalldata`) + .setValue(`#instance${address} #deployAndRunLLTxCalldata`, callData) + .waitForElementVisible('#value') + .clearValue('#value') + .setValue('#value', value) + .scrollAndClick(`#instance${address} #deployAndRunLLTxSendTransaction`) + .perform(() => { + this.emit('complete') + }) return this } } diff --git a/apps/remix-ide-e2e/src/commands/setupMetamask.ts b/apps/remix-ide-e2e/src/commands/setupMetamask.ts index 1e322aa141..a113611237 100644 --- a/apps/remix-ide-e2e/src/commands/setupMetamask.ts +++ b/apps/remix-ide-e2e/src/commands/setupMetamask.ts @@ -1,4 +1,4 @@ -import { NightwatchBrowser } from "nightwatch" +import { NightwatchBrowser } from 'nightwatch' const EventEmitter = require('events') @@ -16,25 +16,25 @@ class MetaMask extends EventEmitter { function setupMetaMask (browser: NightwatchBrowser, passphrase: string, password: string, done: VoidFunction) { browser - .switchBrowserWindow('chrome-extension://poemojpkcjbpmcccohjnomjffeinlafe/home.html#initialize/welcome', 'MetaMask', (browser) => { - browser.waitForElementPresent('.first-time-flow__button') - .click('.first-time-flow__button') - .waitForElementPresent('.select-action__select-button:nth-of-type(1) > .first-time-flow__button') - .click('.select-action__select-button:nth-of-type(1) > .first-time-flow__button') - .waitForElementPresent('.page-container__footer-button:nth-of-type(2)') - .click('.page-container__footer-button:nth-of-type(2)') - .waitForElementPresent('.first-time-flow__textarea') - .setValue('.first-time-flow__textarea', passphrase) - .setValue('*[autocomplete="new-password"]', password) - .setValue('*[autocomplete="confirm-password"]', password) - .click('.first-time-flow__checkbox') - .click('.first-time-flow__button') - .pause(5000) - .click('.first-time-flow__button') - .perform(() => { - done() + .switchBrowserWindow('chrome-extension://poemojpkcjbpmcccohjnomjffeinlafe/home.html#initialize/welcome', 'MetaMask', (browser) => { + browser.waitForElementPresent('.first-time-flow__button') + .click('.first-time-flow__button') + .waitForElementPresent('.select-action__select-button:nth-of-type(1) > .first-time-flow__button') + .click('.select-action__select-button:nth-of-type(1) > .first-time-flow__button') + .waitForElementPresent('.page-container__footer-button:nth-of-type(2)') + .click('.page-container__footer-button:nth-of-type(2)') + .waitForElementPresent('.first-time-flow__textarea') + .setValue('.first-time-flow__textarea', passphrase) + .setValue('*[autocomplete="new-password"]', password) + .setValue('*[autocomplete="confirm-password"]', password) + .click('.first-time-flow__checkbox') + .click('.first-time-flow__button') + .pause(5000) + .click('.first-time-flow__button') + .perform(() => { + done() + }) }) - }) } module.exports = MetaMask diff --git a/apps/remix-ide-e2e/src/commands/signMessage.ts b/apps/remix-ide-e2e/src/commands/signMessage.ts index c62b6b4a27..d40735d76e 100644 --- a/apps/remix-ide-e2e/src/commands/signMessage.ts +++ b/apps/remix-ide-e2e/src/commands/signMessage.ts @@ -1,4 +1,4 @@ -import { NightwatchBrowser } from "nightwatch" +import { NightwatchBrowser } from 'nightwatch' const EventEmitter = require('events') @@ -18,15 +18,15 @@ class SelectContract extends EventEmitter { function signMsg (browser: NightwatchBrowser, msg: string, cb: (hash: { value: string }, signature: { value: string }) => void) { let hash, signature browser - .waitForElementPresent('i[id="remixRunSignMsg"]') - .click('i[id="remixRunSignMsg"]') - .waitForElementVisible('textarea[id="prompt_text"]') - .setValue('textarea[id="prompt_text"]', msg, () => { - browser.modalFooterOKClick().perform( - (client, done) => { - browser.waitForElementVisible('span[id="remixRunSignMsgHash"]').getText('span[id="remixRunSignMsgHash"]', (v) => { hash = v; done() }) - } - ) + .waitForElementPresent('i[id="remixRunSignMsg"]') + .click('i[id="remixRunSignMsg"]') + .waitForElementVisible('textarea[id="prompt_text"]') + .setValue('textarea[id="prompt_text"]', msg, () => { + browser.modalFooterOKClick().perform( + (client, done) => { + browser.waitForElementVisible('span[id="remixRunSignMsgHash"]').getText('span[id="remixRunSignMsgHash"]', (v) => { hash = v; done() }) + } + ) .perform( (client, done) => { browser.waitForElementVisible('span[id="remixRunSignMsgSignature"]').getText('span[id="remixRunSignMsgSignature"]', (v) => { signature = v; done() }) @@ -38,7 +38,7 @@ function signMsg (browser: NightwatchBrowser, msg: string, cb: (hash: { value: s cb(hash, signature) } ) - }) + }) } module.exports = SelectContract diff --git a/apps/remix-ide-e2e/src/commands/switchBrowserTab.ts b/apps/remix-ide-e2e/src/commands/switchBrowserTab.ts index a5ef30228c..c37abe39a7 100644 --- a/apps/remix-ide-e2e/src/commands/switchBrowserTab.ts +++ b/apps/remix-ide-e2e/src/commands/switchBrowserTab.ts @@ -1,5 +1,5 @@ -import { NightwatchBrowser, NightwatchAPI } from "nightwatch" -import EventEmitter from "events" +import { NightwatchBrowser, NightwatchAPI } from 'nightwatch' +import EventEmitter from 'events' /* Switches between browser tabs diff --git a/apps/remix-ide-e2e/src/commands/switchBrowserWindow.ts b/apps/remix-ide-e2e/src/commands/switchBrowserWindow.ts index 396e838a58..18ffdfa203 100644 --- a/apps/remix-ide-e2e/src/commands/switchBrowserWindow.ts +++ b/apps/remix-ide-e2e/src/commands/switchBrowserWindow.ts @@ -1,4 +1,4 @@ -import { NightwatchBrowser, NightwatchCallbackResult } from "nightwatch" +import { NightwatchBrowser, NightwatchCallbackResult } from 'nightwatch' const EventEmitter = require('events') @@ -18,9 +18,9 @@ function switchWindow (browser: NightwatchBrowser, url: string, windowName: stri return window.open('', windowName, 'width=2560, height=1440') }, [windowName], (newWindow) => { browser.switchWindow(windowName) - .url(url) - .pause(5000) - .assert.urlContains(url) + .url(url) + .pause(5000) + .assert.urlContains(url) if (cb) cb(browser, newWindow) }) } diff --git a/apps/remix-ide-e2e/src/commands/testConstantFunction.ts b/apps/remix-ide-e2e/src/commands/testConstantFunction.ts index 1446796a2f..db0d3b0946 100644 --- a/apps/remix-ide-e2e/src/commands/testConstantFunction.ts +++ b/apps/remix-ide-e2e/src/commands/testConstantFunction.ts @@ -1,5 +1,5 @@ -import { NightwatchBrowser, NightwatchTestConstantFunctionExpectedInput } from "nightwatch" -import EventEmitter from "events" +import { NightwatchBrowser, NightwatchTestConstantFunctionExpectedInput } from 'nightwatch' +import EventEmitter from 'events' class TestConstantFunction extends EventEmitter { command (this: NightwatchBrowser, address: string, fnFullName: string, expectedInput: NightwatchTestConstantFunctionExpectedInput | null, expectedOutput: string): NightwatchBrowser { diff --git a/apps/remix-ide-e2e/src/commands/testContracts.ts b/apps/remix-ide-e2e/src/commands/testContracts.ts index 7b7192348e..a6caf021ba 100644 --- a/apps/remix-ide-e2e/src/commands/testContracts.ts +++ b/apps/remix-ide-e2e/src/commands/testContracts.ts @@ -1,8 +1,8 @@ import { NightwatchBrowser, NightwatchContractContent } from 'nightwatch' -import EventEmitter from "events" +import EventEmitter from 'events' class TestContracts extends EventEmitter { - command (this: NightwatchBrowser,fileName: string, contractCode: NightwatchContractContent, compiledContractNames: string[]): NightwatchBrowser { + command (this: NightwatchBrowser, fileName: string, contractCode: NightwatchContractContent, compiledContractNames: string[]): NightwatchBrowser { this.api.perform((done) => { testContracts(this.api, fileName, contractCode, compiledContractNames, () => { done() diff --git a/apps/remix-ide-e2e/src/commands/testEditorValue.ts b/apps/remix-ide-e2e/src/commands/testEditorValue.ts index 54f65117c8..4c24ddc3d8 100644 --- a/apps/remix-ide-e2e/src/commands/testEditorValue.ts +++ b/apps/remix-ide-e2e/src/commands/testEditorValue.ts @@ -1,5 +1,5 @@ import { NightwatchBrowser } from 'nightwatch' -import EventEmitter from "events" +import EventEmitter from 'events' class TestEditorValue extends EventEmitter { command (this: NightwatchBrowser, testvalue: string): NightwatchBrowser { diff --git a/apps/remix-ide-e2e/src/commands/testFunction.ts b/apps/remix-ide-e2e/src/commands/testFunction.ts index feb2440510..dcdb0d1174 100644 --- a/apps/remix-ide-e2e/src/commands/testFunction.ts +++ b/apps/remix-ide-e2e/src/commands/testFunction.ts @@ -1,5 +1,5 @@ import { NightwatchBrowser, NightwatchTestFunctionExpectedInput } from 'nightwatch' -import EventEmitter from "events" +import EventEmitter from 'events' const deepequal = require('deep-equal') @@ -10,38 +10,38 @@ class TestFunction extends EventEmitter { const setLog = (index: number, value: string) => { logs[Object.keys(logs)[index]] = typeof value === 'string' ? value.trim() : value } browser - .waitForElementVisible(`[data-id="block_tx${txHash}"]`) - .click(`[data-id="block_tx${txHash}"]`) - .waitForElementVisible(`*[data-id="txLoggerTable${txHash}"]`) + .waitForElementVisible(`[data-id="block_tx${txHash}"]`) + .click(`[data-id="block_tx${txHash}"]`) + .waitForElementVisible(`*[data-id="txLoggerTable${txHash}"]`) // fetch and format transaction logs as key => pair object - .elements('css selector', `*[data-shared="key_${txHash}"]`, (res) => { - Array.isArray(res.value) && res.value.forEach(function (jsonWebElement) { - const jsonWebElementId: string = jsonWebElement.ELEMENT || jsonWebElement[Object.keys(jsonWebElement)[0]] + .elements('css selector', `*[data-shared="key_${txHash}"]`, (res) => { + Array.isArray(res.value) && res.value.forEach(function (jsonWebElement) { + const jsonWebElementId: string = jsonWebElement.ELEMENT || jsonWebElement[Object.keys(jsonWebElement)[0]] - browser.elementIdText(jsonWebElementId, (jsonElement) => { - const key = typeof jsonElement.value === 'string' ? jsonElement.value.trim() : null + browser.elementIdText(jsonWebElementId, (jsonElement) => { + const key = typeof jsonElement.value === 'string' ? jsonElement.value.trim() : null - logs[key] = null + logs[key] = null + }) }) }) - }) - .elements('css selector', `*[data-shared="pair_${txHash}"]`, (res) => { - Array.isArray(res.value) && res.value.forEach(function (jsonWebElement, index) { - const jsonWebElementId = jsonWebElement.ELEMENT || jsonWebElement[Object.keys(jsonWebElement)[0]] - - browser.elementIdText(jsonWebElementId, (jsonElement) => { - let value = jsonElement.value - - try { - value = JSON.parse(jsonElement.value) - setLog(index, value) - } catch (e) { - setLog(index, value) - } + .elements('css selector', `*[data-shared="pair_${txHash}"]`, (res) => { + Array.isArray(res.value) && res.value.forEach(function (jsonWebElement, index) { + const jsonWebElementId = jsonWebElement.ELEMENT || jsonWebElement[Object.keys(jsonWebElement)[0]] + + browser.elementIdText(jsonWebElementId, (jsonElement) => { + let value = jsonElement.value + + try { + value = JSON.parse(jsonElement.value) + setLog(index, value) + } catch (e) { + setLog(index, value) + } + }) }) }) - }) browser.perform(() => { Object.keys(expectedValue).forEach(key => { diff --git a/apps/remix-ide-e2e/src/commands/validateValueInput.ts b/apps/remix-ide-e2e/src/commands/validateValueInput.ts index 9fcede400b..2ea3e403bf 100644 --- a/apps/remix-ide-e2e/src/commands/validateValueInput.ts +++ b/apps/remix-ide-e2e/src/commands/validateValueInput.ts @@ -6,13 +6,13 @@ class ValidateValueInput extends EventEmitter { const browser = this.api browser.perform((done) => { browser.clearValue(selector) - .setValue(selector, valueTosSet) - .execute(function (selector) { - const elem = document.querySelector(selector) as HTMLInputElement - return elem.value - }, [selector], function (result) { - browser.assert.equal(result.value, expectedValue) - }) + .setValue(selector, valueTosSet) + .execute(function (selector) { + const elem = document.querySelector(selector) as HTMLInputElement + return elem.value + }, [selector], function (result) { + browser.assert.equal(result.value, expectedValue) + }) done() this.emit('complete') }) diff --git a/apps/remix-ide-e2e/src/commands/verifyCallReturnValue.ts b/apps/remix-ide-e2e/src/commands/verifyCallReturnValue.ts index 0f59662023..af049164f7 100644 --- a/apps/remix-ide-e2e/src/commands/verifyCallReturnValue.ts +++ b/apps/remix-ide-e2e/src/commands/verifyCallReturnValue.ts @@ -1,5 +1,5 @@ import { NightwatchBrowser } from 'nightwatch' -import EventEmitter from "events" +import EventEmitter from 'events' class VerifyCallReturnValue extends EventEmitter { command (this: NightwatchBrowser, address: string, checks: string[]): NightwatchBrowser { diff --git a/apps/remix-ide-e2e/src/commands/verifyContracts.ts b/apps/remix-ide-e2e/src/commands/verifyContracts.ts index bc27e7ba24..cd9acd3ce1 100644 --- a/apps/remix-ide-e2e/src/commands/verifyContracts.ts +++ b/apps/remix-ide-e2e/src/commands/verifyContracts.ts @@ -1,8 +1,8 @@ import { NightwatchBrowser, NightwatchCallbackResult } from 'nightwatch' -import EventEmitter from "events" +import EventEmitter from 'events' class VerifyContracts extends EventEmitter { - command (this: NightwatchBrowser,compiledContractNames: string[], opts = { wait: 1000, version: null }): NightwatchBrowser { + command (this: NightwatchBrowser, compiledContractNames: string[], opts = { wait: 1000, version: null }): NightwatchBrowser { this.api.perform((done) => { verifyContracts(this.api, compiledContractNames, opts, () => { done() @@ -15,37 +15,37 @@ class VerifyContracts extends EventEmitter { function getCompiledContracts (browser: NightwatchBrowser, opts: { wait: number, version?: string }, callback: (result: NightwatchCallbackResult) => void) { browser - .clickLaunchIcon('solidity') - .pause(opts.wait) - .waitForElementPresent('*[data-id="compiledContracts"] option') - .perform((done) => { - if (opts.version) { - browser - .click('*[data-id="compilation-details"]') - .waitForElementVisible('*[data-id="treeViewDivcompiler"]') - .pause(2000) - .click('*[data-id="treeViewDivcompiler"]') - .waitForElementVisible('*[data-id="treeViewLicompiler/version"]') - .assert.containsText('*[data-id="treeViewLicompiler/version"]', `version:\n ${opts.version}`) - .perform(done) - } else done() - }) - .execute(function () { - const contracts = document.querySelectorAll('*[data-id="compiledContracts"] option') as NodeListOf + .clickLaunchIcon('solidity') + .pause(opts.wait) + .waitForElementPresent('*[data-id="compiledContracts"] option') + .perform((done) => { + if (opts.version) { + browser + .click('*[data-id="compilation-details"]') + .waitForElementVisible('*[data-id="treeViewDivcompiler"]') + .pause(2000) + .click('*[data-id="treeViewDivcompiler"]') + .waitForElementVisible('*[data-id="treeViewLicompiler/version"]') + .assert.containsText('*[data-id="treeViewLicompiler/version"]', `version:\n ${opts.version}`) + .perform(done) + } else done() + }) + .execute(function () { + const contracts = document.querySelectorAll('*[data-id="compiledContracts"] option') as NodeListOf - if (!contracts) { - return null - } else { - const ret = [] - - for (let c = 0; c < contracts.length; c++) { - ret.push(contracts[c].value) + if (!contracts) { + return null + } else { + const ret = [] + + for (let c = 0; c < contracts.length; c++) { + ret.push(contracts[c].value) + } + return ret } - return ret - } - }, [], function (result) { - callback(result) - }) + }, [], function (result) { + callback(result) + }) } function verifyContracts (browser: NightwatchBrowser, compiledContractNames: string[], opts: { wait: number, version?: string }, callback: VoidFunction) { diff --git a/apps/remix-ide-e2e/src/examples/example-contracts.ts b/apps/remix-ide-e2e/src/examples/example-contracts.ts index a02bf6d608..467f35ca3d 100644 --- a/apps/remix-ide-e2e/src/examples/example-contracts.ts +++ b/apps/remix-ide-e2e/src/examples/example-contracts.ts @@ -214,7 +214,7 @@ contract Ballot { } } ` - +// eslint-disable-next-line const ballot_0_4_11 = `pragma solidity >=0.4.10 <0.7.0; contract Ballot { @@ -308,9 +308,9 @@ contract BallotTest { ` export default { - storage: { name: '1_Storage.sol', content: storage }, - owner: { name: '2_Owner.sol', content: owner }, - ballot: { name: '3_Ballot.sol', content: ballot }, - ballot_0_4_11: { name: 'ballot_0_4_11.sol', content: ballot_0_4_11 }, - ballot_test: { name: 'tests/4_Ballot_test.sol', content: ballotTest } + storage: { name: '1_Storage.sol', content: storage }, + owner: { name: '2_Owner.sol', content: owner }, + ballot: { name: '3_Ballot.sol', content: ballot }, + ballot_0_4_11: { name: 'ballot_0_4_11.sol', content: ballot_0_4_11 }, + ballot_test: { name: 'tests/4_Ballot_test.sol', content: ballotTest } } diff --git a/apps/remix-ide-e2e/src/helpers/init.ts b/apps/remix-ide-e2e/src/helpers/init.ts index 9bbdc1e39f..90422a355d 100644 --- a/apps/remix-ide-e2e/src/helpers/init.ts +++ b/apps/remix-ide-e2e/src/helpers/init.ts @@ -1,4 +1,4 @@ -import { NightwatchBrowser } from "nightwatch" +import { NightwatchBrowser } from 'nightwatch' require('dotenv').config() @@ -11,9 +11,9 @@ export default function (browser: NightwatchBrowser, callback: VoidFunction, url if (preloadPlugins) { initModules(browser, () => { browser.clickLaunchIcon('solidity') - .waitForElementVisible('[for="autoCompile"]') - .click('[for="autoCompile"]') - .verify.elementPresent('[data-id="compilerContainerAutoCompile"]:checked') + .waitForElementVisible('[for="autoCompile"]') + .click('[for="autoCompile"]') + .verify.elementPresent('[data-id="compilerContainerAutoCompile"]:checked') }) } }) diff --git a/apps/remix-ide-e2e/src/tests/ballot.test.ts b/apps/remix-ide-e2e/src/tests/ballot.test.ts index 80528bf886..4728197006 100644 --- a/apps/remix-ide-e2e/src/tests/ballot.test.ts +++ b/apps/remix-ide-e2e/src/tests/ballot.test.ts @@ -6,7 +6,7 @@ import sauce from './sauce' import examples from '../examples/example-contracts' const sources = [ - {'browser/Untitled.sol': { content: examples.ballot.content }} + { 'browser/Untitled.sol': { content: examples.ballot.content } } ] module.exports = { @@ -18,136 +18,136 @@ module.exports = { }, 'Deploy Ballot': function (browser: NightwatchBrowser) { browser - .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) - .clickLaunchIcon('solidity') - .testContracts('Untitled.sol', sources[0]['browser/Untitled.sol'], ['Ballot']) - .clickLaunchIcon('udapp') - .selectAccount('0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c') - .setValue('input[placeholder="bytes32[] proposalNames"]', '["0x48656c6c6f20576f726c64210000000000000000000000000000000000000000"]') - .click('*[data-id="Deploy - transact (not payable)"]') - .waitForElementPresent('*[data-id="universalDappUiContractActionWrapper"]') - .click('*[data-id="universalDappUiTitleExpander"]') - .clickFunction('delegate - transact (not payable)', {types: 'address to', values: '"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"'}) - .testFunction('0x41fab8ea5b1d9fba5e0a6545ca1a2d62fff518578802c033c2b9a031a01c31b3', - { - status: 'true Transaction mined and execution succeed', - 'transaction hash': '0x41fab8ea5b1d9fba5e0a6545ca1a2d62fff518578802c033c2b9a031a01c31b3', - 'decoded input': { 'address to': '0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB' } - }) + .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) + .clickLaunchIcon('solidity') + .testContracts('Untitled.sol', sources[0]['browser/Untitled.sol'], ['Ballot']) + .clickLaunchIcon('udapp') + .selectAccount('0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c') + .setValue('input[placeholder="bytes32[] proposalNames"]', '["0x48656c6c6f20576f726c64210000000000000000000000000000000000000000"]') + .click('*[data-id="Deploy - transact (not payable)"]') + .waitForElementPresent('*[data-id="universalDappUiContractActionWrapper"]') + .click('*[data-id="universalDappUiTitleExpander"]') + .clickFunction('delegate - transact (not payable)', { types: 'address to', values: '"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"' }) + .testFunction('0x41fab8ea5b1d9fba5e0a6545ca1a2d62fff518578802c033c2b9a031a01c31b3', + { + status: 'true Transaction mined and execution succeed', + 'transaction hash': '0x41fab8ea5b1d9fba5e0a6545ca1a2d62fff518578802c033c2b9a031a01c31b3', + 'decoded input': { 'address to': '0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB' } + }) }, 'Debug Ballot / delegate': function (browser: NightwatchBrowser) { browser.pause(500) - .click('*[data-id="txLoggerDebugButton0x41fab8ea5b1d9fba5e0a6545ca1a2d62fff518578802c033c2b9a031a01c31b3"]') - .waitForElementVisible('*[data-id="buttonNavigatorJumpPreviousBreakpoint"]') + .click('*[data-id="txLoggerDebugButton0x41fab8ea5b1d9fba5e0a6545ca1a2d62fff518578802c033c2b9a031a01c31b3"]') + .waitForElementVisible('*[data-id="buttonNavigatorJumpPreviousBreakpoint"]') // .clickLaunchIcon('debugger') - .click('*[data-id="buttonNavigatorJumpPreviousBreakpoint"]') - .pause(2000) - .waitForElementVisible('#stepdetail') - .goToVMTraceStep(79) - .pause(1000) - .checkVariableDebug('soliditystate', stateCheck) - .checkVariableDebug('soliditylocals', localsCheck) + .click('*[data-id="buttonNavigatorJumpPreviousBreakpoint"]') + .pause(2000) + .waitForElementVisible('#stepdetail') + .goToVMTraceStep(79) + .pause(1000) + .checkVariableDebug('soliditystate', stateCheck) + .checkVariableDebug('soliditylocals', localsCheck) }, 'Access Ballot via at address': function (browser: NightwatchBrowser) { browser.clickLaunchIcon('udapp') - .click('*[data-id="universalDappUiUdappClose"]') - .addFile('ballot.abi', { content: ballotABI }) - .addAtAddressInstance('0x692a70D2e424a56D2C6C27aA97D1a86395877b3B', true, false) - .clickLaunchIcon('fileExplorers') - .addAtAddressInstance('0x692a70D2e424a56D2C6C27aA97D1a86395877b3A', true, true) - .pause(500) - .waitForElementPresent('*[data-id="universalDappUiContractActionWrapper"]') - .click('*[data-id="universalDappUiTitleExpander"]') - .clickFunction('delegate - transact (not payable)', {types: 'address to', values: '"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"'}) - .testFunction('0xca58080c8099429caeeffe43b8104df919c2c543dceb9edf9242fa55f045c803', - { - status: 'false Transaction mined but execution failed', - 'transaction hash': '0xca58080c8099429caeeffe43b8104df919c2c543dceb9edf9242fa55f045c803', - 'decoded input': { 'address to': '0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB' } - }) + .click('*[data-id="universalDappUiUdappClose"]') + .addFile('ballot.abi', { content: ballotABI }) + .addAtAddressInstance('0x692a70D2e424a56D2C6C27aA97D1a86395877b3B', true, false) + .clickLaunchIcon('fileExplorers') + .addAtAddressInstance('0x692a70D2e424a56D2C6C27aA97D1a86395877b3A', true, true) + .pause(500) + .waitForElementPresent('*[data-id="universalDappUiContractActionWrapper"]') + .click('*[data-id="universalDappUiTitleExpander"]') + .clickFunction('delegate - transact (not payable)', { types: 'address to', values: '"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"' }) + .testFunction('0xca58080c8099429caeeffe43b8104df919c2c543dceb9edf9242fa55f045c803', + { + status: 'false Transaction mined but execution failed', + 'transaction hash': '0xca58080c8099429caeeffe43b8104df919c2c543dceb9edf9242fa55f045c803', + 'decoded input': { 'address to': '0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB' } + }) }, 'Deploy and use Ballot using external web3': function (browser: NightwatchBrowser) { browser - .click('*[data-id="settingsWeb3Mode"]') - .modalFooterOKClick() - .clickLaunchIcon('solidity') - .testContracts('Untitled.sol', sources[0]['browser/Untitled.sol'], ['Ballot']) - .clickLaunchIcon('udapp') - .setValue('input[placeholder="bytes32[] proposalNames"]', '["0x48656c6c6f20576f726c64210000000000000000000000000000000000000000"]') - .click('*[data-id="Deploy - transact (not payable)"]') - .clickInstance(0) - .click('*[data-id="terminalClearConsole"]') - .clickFunction('delegate - transact (not payable)', {types: 'address to', values: '0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c'}) - .journalLastChildIncludes('Ballot.delegate(address)') - .journalLastChildIncludes('data: 0x5c1...a733c') - .end() + .click('*[data-id="settingsWeb3Mode"]') + .modalFooterOKClick() + .clickLaunchIcon('solidity') + .testContracts('Untitled.sol', sources[0]['browser/Untitled.sol'], ['Ballot']) + .clickLaunchIcon('udapp') + .setValue('input[placeholder="bytes32[] proposalNames"]', '["0x48656c6c6f20576f726c64210000000000000000000000000000000000000000"]') + .click('*[data-id="Deploy - transact (not payable)"]') + .clickInstance(0) + .click('*[data-id="terminalClearConsole"]') + .clickFunction('delegate - transact (not payable)', { types: 'address to', values: '0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c' }) + .journalLastChildIncludes('Ballot.delegate(address)') + .journalLastChildIncludes('data: 0x5c1...a733c') + .end() }, tearDown: sauce } const localsCheck = { - 'to': { - 'value': '0x4B0897B0513FDC7C541B6D9D7E929C4E5364D2DB', - 'type': 'address' + to: { + value: '0x4B0897B0513FDC7C541B6D9D7E929C4E5364D2DB', + type: 'address' } } const stateCheck = { - 'chairperson': { - 'value': '0xCA35B7D915458EF540ADE6068DFE2F44E8FA733C', - 'type': 'address', - 'constant': false + chairperson: { + value: '0xCA35B7D915458EF540ADE6068DFE2F44E8FA733C', + type: 'address', + constant: false }, - 'voters': { - 'value': { + voters: { + value: { '000000000000000000000000ca35b7d915458ef540ade6068dfe2f44e8fa733c': { - 'value': { - 'weight': { - 'value': '1', - 'type': 'uint256' + value: { + weight: { + value: '1', + type: 'uint256' }, - 'voted': { - 'value': false, - 'type': 'bool' + voted: { + value: false, + type: 'bool' }, - 'delegate': { - 'value': '0x0000000000000000000000000000000000000000', - 'type': 'address' + delegate: { + value: '0x0000000000000000000000000000000000000000', + type: 'address' }, - 'vote': { - 'value': '0', - 'type': 'uint256' + vote: { + value: '0', + type: 'uint256' } }, - 'type': 'struct Ballot.Voter' + type: 'struct Ballot.Voter' } }, - 'type': 'mapping(address => struct Ballot.Voter)', - 'constant': false + type: 'mapping(address => struct Ballot.Voter)', + constant: false }, - 'proposals': { - 'value': [ + proposals: { + value: [ { - 'value': { - 'name': { - 'value': '0x48656C6C6F20576F726C64210000000000000000000000000000000000000000', - 'type': 'bytes32' + value: { + name: { + value: '0x48656C6C6F20576F726C64210000000000000000000000000000000000000000', + type: 'bytes32' }, - 'voteCount': { - 'value': '0', - 'type': 'uint256' + voteCount: { + value: '0', + type: 'uint256' } }, - 'type': 'struct Ballot.Proposal' + type: 'struct Ballot.Proposal' } ], - 'length': '0x1', - 'type': 'struct Ballot.Proposal[]', - 'constant': false + length: '0x1', + type: 'struct Ballot.Proposal[]', + constant: false } } diff --git a/apps/remix-ide-e2e/src/tests/ballot_0_4_11.test.ts b/apps/remix-ide-e2e/src/tests/ballot_0_4_11.test.ts index ee71c13a58..109f048fef 100644 --- a/apps/remix-ide-e2e/src/tests/ballot_0_4_11.test.ts +++ b/apps/remix-ide-e2e/src/tests/ballot_0_4_11.test.ts @@ -6,7 +6,7 @@ import sauce from './sauce' import examples from '../examples/example-contracts' const sources = [ - {'browser/Untitled.sol': { content: examples.ballot_0_4_11.content }} + { 'browser/Untitled.sol': { content: examples.ballot_0_4_11.content } } ] module.exports = { @@ -18,152 +18,151 @@ module.exports = { }, 'Compile Ballot with compiler version 0.4.11': function (browser: NightwatchBrowser) { browser - .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) - .clickLaunchIcon('solidity') - .setSolidityCompilerVersion('soljson-v0.4.11+commit.68ef5810.js') - .waitForElementVisible('[for="autoCompile"]') - .click('[for="autoCompile"]') - .verify.elementPresent('[data-id="compilerContainerAutoCompile"]:checked') - .testContracts('Untitled.sol', sources[0]['browser/Untitled.sol'], ['Ballot']) - + .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) + .clickLaunchIcon('solidity') + .setSolidityCompilerVersion('soljson-v0.4.11+commit.68ef5810.js') + .waitForElementVisible('[for="autoCompile"]') + .click('[for="autoCompile"]') + .verify.elementPresent('[data-id="compilerContainerAutoCompile"]:checked') + .testContracts('Untitled.sol', sources[0]['browser/Untitled.sol'], ['Ballot']) }, 'Deploy Ballot': function (browser: NightwatchBrowser) { browser.pause(500) - .testContracts('Untitled.sol', sources[0]['browser/Untitled.sol'], ['Ballot']) - .clickLaunchIcon('udapp') - .selectAccount('0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c') - .setValue('input[placeholder="uint8 _numProposals"]', '2') - .click('*[data-id="Deploy - transact (not payable)"]') - .waitForElementPresent('*[data-id="universalDappUiContractActionWrapper"]') - .click('*[data-id="universalDappUiTitleExpander"]') - .clickFunction('delegate - transact (not payable)', {types: 'address to', values: '"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"'}) - .testFunction('0x41fab8ea5b1d9fba5e0a6545ca1a2d62fff518578802c033c2b9a031a01c31b3', - { - status: 'true Transaction mined and execution succeed', - 'transaction hash': '0x41fab8ea5b1d9fba5e0a6545ca1a2d62fff518578802c033c2b9a031a01c31b3', - 'decoded input': { 'address to': '0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB' } - }) + .testContracts('Untitled.sol', sources[0]['browser/Untitled.sol'], ['Ballot']) + .clickLaunchIcon('udapp') + .selectAccount('0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c') + .setValue('input[placeholder="uint8 _numProposals"]', '2') + .click('*[data-id="Deploy - transact (not payable)"]') + .waitForElementPresent('*[data-id="universalDappUiContractActionWrapper"]') + .click('*[data-id="universalDappUiTitleExpander"]') + .clickFunction('delegate - transact (not payable)', { types: 'address to', values: '"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"' }) + .testFunction('0x41fab8ea5b1d9fba5e0a6545ca1a2d62fff518578802c033c2b9a031a01c31b3', + { + status: 'true Transaction mined and execution succeed', + 'transaction hash': '0x41fab8ea5b1d9fba5e0a6545ca1a2d62fff518578802c033c2b9a031a01c31b3', + 'decoded input': { 'address to': '0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB' } + }) }, 'Debug Ballot / delegate': function (browser: NightwatchBrowser) { browser.pause(500) - .click('*[data-id="txLoggerDebugButton0x41fab8ea5b1d9fba5e0a6545ca1a2d62fff518578802c033c2b9a031a01c31b3"]') - .pause(2000) - .waitForElementVisible('*[data-id="buttonNavigatorJumpPreviousBreakpoint"]') - .click('*[data-id="buttonNavigatorJumpPreviousBreakpoint"]') - .pause(2000) - .waitForElementVisible('#stepdetail') - .goToVMTraceStep(20) - .pause(1000) - .checkVariableDebug('callstackpanel', ["0x692a70D2e424a56D2C6C27aA97D1a86395877b3A"]) + .click('*[data-id="txLoggerDebugButton0x41fab8ea5b1d9fba5e0a6545ca1a2d62fff518578802c033c2b9a031a01c31b3"]') + .pause(2000) + .waitForElementVisible('*[data-id="buttonNavigatorJumpPreviousBreakpoint"]') + .click('*[data-id="buttonNavigatorJumpPreviousBreakpoint"]') + .pause(2000) + .waitForElementVisible('#stepdetail') + .goToVMTraceStep(20) + .pause(1000) + .checkVariableDebug('callstackpanel', ['0x692a70D2e424a56D2C6C27aA97D1a86395877b3A']) }, 'Access Ballot via at address': function (browser: NightwatchBrowser) { browser.clickLaunchIcon('udapp') - .click('*[data-id="universalDappUiUdappClose"]') - .addFile('ballot.abi', { content: ballotABI }) - .addAtAddressInstance('0x692a70D2e424a56D2C6C27aA97D1a86395877b3B', true, false) - .clickLaunchIcon('fileExplorers') - .addAtAddressInstance('0x692a70D2e424a56D2C6C27aA97D1a86395877b3A', true, true) - .pause(500) - .waitForElementPresent('*[data-id="universalDappUiContractActionWrapper"]') - .click('*[data-id="universalDappUiTitleExpander"]') - .clickFunction('delegate - transact (not payable)', {types: 'address to', values: '"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"'}) - .testFunction('0xca58080c8099429caeeffe43b8104df919c2c543dceb9edf9242fa55f045c803', - { - status: 'true Transaction mined and execution succeed', - 'transaction hash': '0xca58080c8099429caeeffe43b8104df919c2c543dceb9edf9242fa55f045c803', - 'decoded input': { 'address to': '0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB' } - }) + .click('*[data-id="universalDappUiUdappClose"]') + .addFile('ballot.abi', { content: ballotABI }) + .addAtAddressInstance('0x692a70D2e424a56D2C6C27aA97D1a86395877b3B', true, false) + .clickLaunchIcon('fileExplorers') + .addAtAddressInstance('0x692a70D2e424a56D2C6C27aA97D1a86395877b3A', true, true) + .pause(500) + .waitForElementPresent('*[data-id="universalDappUiContractActionWrapper"]') + .click('*[data-id="universalDappUiTitleExpander"]') + .clickFunction('delegate - transact (not payable)', { types: 'address to', values: '"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"' }) + .testFunction('0xca58080c8099429caeeffe43b8104df919c2c543dceb9edf9242fa55f045c803', + { + status: 'true Transaction mined and execution succeed', + 'transaction hash': '0xca58080c8099429caeeffe43b8104df919c2c543dceb9edf9242fa55f045c803', + 'decoded input': { 'address to': '0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB' } + }) }, 'Deploy and use Ballot using external web3': function (browser: NightwatchBrowser) { browser - .click('*[data-id="settingsWeb3Mode"]') - .modalFooterOKClick() - .clickLaunchIcon('solidity') - .testContracts('Untitled.sol', sources[0]['browser/Untitled.sol'], ['Ballot']) - .clickLaunchIcon('udapp') - .setValue('input[placeholder="uint8 _numProposals"]', '2') - .click('*[data-id="Deploy - transact (not payable)"]') - .clickInstance(0) - .click('*[data-id="terminalClearConsole"]') - .clickFunction('delegate - transact (not payable)', {types: 'address to', values: '0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c'}) - .journalLastChildIncludes('Ballot.delegate(address)') - .journalLastChildIncludes('data: 0x5c1...a733c') - .end() + .click('*[data-id="settingsWeb3Mode"]') + .modalFooterOKClick() + .clickLaunchIcon('solidity') + .testContracts('Untitled.sol', sources[0]['browser/Untitled.sol'], ['Ballot']) + .clickLaunchIcon('udapp') + .setValue('input[placeholder="uint8 _numProposals"]', '2') + .click('*[data-id="Deploy - transact (not payable)"]') + .clickInstance(0) + .click('*[data-id="terminalClearConsole"]') + .clickFunction('delegate - transact (not payable)', { types: 'address to', values: '0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c' }) + .journalLastChildIncludes('Ballot.delegate(address)') + .journalLastChildIncludes('data: 0x5c1...a733c') + .end() }, tearDown: sauce } const ballotABI = `[ - { - "constant": false, - "inputs": [ - { - "name": "to", - "type": "address" - } - ], - "name": "delegate", - "outputs": [], - "payable": false, - "type": "function", - "stateMutability": "nonpayable" - }, - { - "constant": false, - "inputs": [], - "name": "winningProposal", - "outputs": [ - { - "name": "_winningProposal", - "type": "uint8" - } - ], - "payable": false, - "type": "function", - "stateMutability": "nonpayable" - }, - { - "constant": false, - "inputs": [ - { - "name": "toVoter", - "type": "address" - } - ], - "name": "giveRightToVote", - "outputs": [], - "payable": false, - "type": "function", - "stateMutability": "nonpayable" - }, - { - "constant": false, - "inputs": [ - { - "name": "toProposal", - "type": "uint8" - } - ], - "name": "vote", - "outputs": [], - "payable": false, - "type": "function", - "stateMutability": "nonpayable" - }, - { - "inputs": [ - { - "name": "_numProposals", - "type": "uint8" - } - ], - "payable": false, - "type": "constructor", - "stateMutability": "nonpayable" - } + { + "constant": false, + "inputs": [ + { + "name": "to", + "type": "address" + } + ], + "name": "delegate", + "outputs": [], + "payable": false, + "type": "function", + "stateMutability": "nonpayable" + }, + { + "constant": false, + "inputs": [], + "name": "winningProposal", + "outputs": [ + { + "name": "_winningProposal", + "type": "uint8" + } + ], + "payable": false, + "type": "function", + "stateMutability": "nonpayable" + }, + { + "constant": false, + "inputs": [ + { + "name": "toVoter", + "type": "address" + } + ], + "name": "giveRightToVote", + "outputs": [], + "payable": false, + "type": "function", + "stateMutability": "nonpayable" + }, + { + "constant": false, + "inputs": [ + { + "name": "toProposal", + "type": "uint8" + } + ], + "name": "vote", + "outputs": [], + "payable": false, + "type": "function", + "stateMutability": "nonpayable" + }, + { + "inputs": [ + { + "name": "_numProposals", + "type": "uint8" + } + ], + "payable": false, + "type": "constructor", + "stateMutability": "nonpayable" + } ]` diff --git a/apps/remix-ide-e2e/src/tests/compiler_api.test.ts b/apps/remix-ide-e2e/src/tests/compiler_api.test.ts index 9c82762a49..bc819905ff 100644 --- a/apps/remix-ide-e2e/src/tests/compiler_api.test.ts +++ b/apps/remix-ide-e2e/src/tests/compiler_api.test.ts @@ -6,50 +6,50 @@ import sauce from './sauce' import examples from '../examples/example-contracts' const sources = [ - {'browser/Untitled.sol': { content: examples.ballot.content }} + { 'browser/Untitled.sol': { content: examples.ballot.content } } ] module.exports = { before: function (browser: NightwatchBrowser, done: VoidFunction) { init(browser, done) }, - + '@sources': function () { return sources }, 'Should compile using "compileWithParamaters" API': function (browser: NightwatchBrowser) { browser - .addFile('test_jsCompile.js', { content: jsCompile }) - .executeScript('remix.exeCurrent()') - .pause(5000) - .journalChildIncludes(`"languageversion": "0.6.8+commit.0bbfe453"`) + .addFile('test_jsCompile.js', { content: jsCompile }) + .executeScript('remix.exeCurrent()') + .pause(5000) + .journalChildIncludes('"languageversion": "0.6.8+commit.0bbfe453"') }, 'Should compile using "compileWithParamaters" API with optimization On': function (browser: NightwatchBrowser) { browser - .addFile('test_jsCompileWithOptimization.js', { content: jsCompileWithOptimization }) - .executeScript('remix.exeCurrent()') - .pause(10000) - .journalChildIncludes(`\\"optimizer\\":{\\"enabled\\":true,\\"runs\\":300}`) + .addFile('test_jsCompileWithOptimization.js', { content: jsCompileWithOptimization }) + .executeScript('remix.exeCurrent()') + .pause(10000) + .journalChildIncludes('\\"optimizer\\":{\\"enabled\\":true,\\"runs\\":300}') }, 'Should compile using "compileWithParamaters" API with optimization off check default runs': function (browser: NightwatchBrowser) { browser - .addFile('test_jsCompileWithOptimizationDefault.js', { content: jsCompileWithOptimizationDefault }) - .executeScript('remix.exeCurrent()') - .pause(10000) - .journalChildIncludes(`\\"optimizer\\":{\\"enabled\\":false,\\"runs\\":200}`) + .addFile('test_jsCompileWithOptimizationDefault.js', { content: jsCompileWithOptimizationDefault }) + .executeScript('remix.exeCurrent()') + .pause(10000) + .journalChildIncludes('\\"optimizer\\":{\\"enabled\\":false,\\"runs\\":200}') }, 'Should update the compiler configuration with "setCompilerConfig" API': function (browser: NightwatchBrowser) { browser - .addFile('test_updateConfiguration.js', { content: updateConfiguration }) - .executeScript('remix.exeCurrent()') - .pause(5000) - .addFile('test_updateConfiguration.sol', { content: simpleContract }) - .verifyContracts(['StorageTestUpdateConfiguration'], { wait: 5000, version: '0.6.8+commit.0bbfe453' }) - .end() + .addFile('test_updateConfiguration.js', { content: updateConfiguration }) + .executeScript('remix.exeCurrent()') + .pause(5000) + .addFile('test_updateConfiguration.sol', { content: simpleContract }) + .verifyContracts(['StorageTestUpdateConfiguration'], { wait: 5000, version: '0.6.8+commit.0bbfe453' }) + .end() }, tearDown: sauce @@ -140,7 +140,6 @@ const jsCompileWithOptimizationDefault = `(async () => { } })()` - const updateConfiguration = `(async () => { try { const params = { diff --git a/apps/remix-ide-e2e/src/tests/debugger.test.ts b/apps/remix-ide-e2e/src/tests/debugger.test.ts index fa444e578a..e28b0fa775 100644 --- a/apps/remix-ide-e2e/src/tests/debugger.test.ts +++ b/apps/remix-ide-e2e/src/tests/debugger.test.ts @@ -15,89 +15,89 @@ module.exports = { 'Should launch debugger': function (browser: NightwatchBrowser) { browser.addFile('blah.sol', sources[0]['browser/blah.sol']) - .clickLaunchIcon('udapp') - .waitForElementPresent('*[title="Deploy - transact (not payable)"]', 45000) - .click('*[title="Deploy - transact (not payable)"]') - .debugTransaction(0) - .assert.containsText('*[data-id="sidePanelSwapitTitle"]', 'DEBUGGER') + .clickLaunchIcon('udapp') + .waitForElementPresent('*[title="Deploy - transact (not payable)"]', 45000) + .click('*[title="Deploy - transact (not payable)"]') + .debugTransaction(0) + .assert.containsText('*[data-id="sidePanelSwapitTitle"]', 'DEBUGGER') }, 'Should debug failing transaction': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="verticalIconsKindudapp"]') - .clickLaunchIcon('udapp') - .waitForElementPresent('*[data-id="universalDappUiTitleExpander"]') - .click('*[data-id="universalDappUiTitleExpander"]') - .scrollAndClick('*[title="string name, uint256 goal"]') - .setValue('*[title="string name, uint256 goal"]', '"toast", 999') - .click('*[data-id="createProject - transact (not payable)"]') - .debugTransaction(1) - .pause(2000) - .scrollAndClick('*[data-id="solidityLocals"]') - .assert.containsText('*[data-id="solidityLocals"]', 'toast') - .assert.containsText('*[data-id="solidityLocals"]', '999') + .clickLaunchIcon('udapp') + .waitForElementPresent('*[data-id="universalDappUiTitleExpander"]') + .click('*[data-id="universalDappUiTitleExpander"]') + .scrollAndClick('*[title="string name, uint256 goal"]') + .setValue('*[title="string name, uint256 goal"]', '"toast", 999') + .click('*[data-id="createProject - transact (not payable)"]') + .debugTransaction(1) + .pause(2000) + .scrollAndClick('*[data-id="solidityLocals"]') + .assert.containsText('*[data-id="solidityLocals"]', 'toast') + .assert.containsText('*[data-id="solidityLocals"]', '999') }, 'Should debug transaction using slider': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="verticalIconsKindudapp"]') - .waitForElementVisible('*[data-id="slider"]') - .click('*[data-id="slider"]') - .setValue('*[data-id="slider"]', '50') - .pause(2000) - .click('*[data-id="dropdownPanelSolidityLocals"]') - .assert.containsText('*[data-id="solidityLocals"]', 'no locals') - .assert.containsText('*[data-id="stepdetail"]', 'vm trace step:\n92') + .waitForElementVisible('*[data-id="slider"]') + .click('*[data-id="slider"]') + .setValue('*[data-id="slider"]', '50') + .pause(2000) + .click('*[data-id="dropdownPanelSolidityLocals"]') + .assert.containsText('*[data-id="solidityLocals"]', 'no locals') + .assert.containsText('*[data-id="stepdetail"]', 'vm trace step:\n92') }, 'Should step back and forward transaction': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="verticalIconsKindudapp"]') - .waitForElementPresent('*[data-id="buttonNavigatorIntoBack"]') - .scrollAndClick('*[data-id="buttonNavigatorIntoBack"]') - .pause(2000) - .assert.containsText('*[data-id="stepdetail"]', 'vm trace step:\n91') - .assert.containsText('*[data-id="stepdetail"]', 'execution step:\n91') - .click('*[data-id="buttonNavigatorIntoForward"]') - .pause(2000) - .assert.containsText('*[data-id="stepdetail"]', 'vm trace step:\n92') - .assert.containsText('*[data-id="stepdetail"]', 'execution step:\n92') + .waitForElementPresent('*[data-id="buttonNavigatorIntoBack"]') + .scrollAndClick('*[data-id="buttonNavigatorIntoBack"]') + .pause(2000) + .assert.containsText('*[data-id="stepdetail"]', 'vm trace step:\n91') + .assert.containsText('*[data-id="stepdetail"]', 'execution step:\n91') + .click('*[data-id="buttonNavigatorIntoForward"]') + .pause(2000) + .assert.containsText('*[data-id="stepdetail"]', 'vm trace step:\n92') + .assert.containsText('*[data-id="stepdetail"]', 'execution step:\n92') }, 'Should jump through breakpoints': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="editorInput"]') - .click('.ace_gutter-cell:nth-of-type(10)') - .click('.ace_gutter-cell:nth-of-type(20)') - .waitForElementVisible('*[data-id="buttonNavigatorJumpPreviousBreakpoint"]') - .click('*[data-id="buttonNavigatorJumpPreviousBreakpoint"]') - .pause(2000) - .assert.containsText('*[data-id="stepdetail"]', 'vm trace step:\n0') - .assert.containsText('*[data-id="stepdetail"]', 'execution step:\n0') - .click('*[data-id="buttonNavigatorJumpNextBreakpoint"]') - .pause(2000) - .assert.containsText('*[data-id="stepdetail"]', 'vm trace step:\n184') - .assert.containsText('*[data-id="stepdetail"]', 'execution step:\n184') + .click('.ace_gutter-cell:nth-of-type(10)') + .click('.ace_gutter-cell:nth-of-type(20)') + .waitForElementVisible('*[data-id="buttonNavigatorJumpPreviousBreakpoint"]') + .click('*[data-id="buttonNavigatorJumpPreviousBreakpoint"]') + .pause(2000) + .assert.containsText('*[data-id="stepdetail"]', 'vm trace step:\n0') + .assert.containsText('*[data-id="stepdetail"]', 'execution step:\n0') + .click('*[data-id="buttonNavigatorJumpNextBreakpoint"]') + .pause(2000) + .assert.containsText('*[data-id="stepdetail"]', 'vm trace step:\n184') + .assert.containsText('*[data-id="stepdetail"]', 'execution step:\n184') }, 'Should display solidity imported code while debugging github import': function (browser: NightwatchBrowser) { browser - .clickLaunchIcon('solidity') - .setSolidityCompilerVersion('soljson-v0.8.0+commit.c7dfd78e.js') - .pause(2000) - .clickLaunchIcon('udapp') - .testContracts('externalImport.sol', sources[1]['browser/externalImport.sol'], ['ERC20']) - .clickLaunchIcon('udapp') - .waitForElementPresent('*[title="Deploy - transact (not payable)"]', 35000) - .selectContract('ERC20') - .createContract('"tokenName", "symbol"') - .debugTransaction(2) - .pause(2000) - .waitForElementVisible('#stepdetail') - .goToVMTraceStep(10) - .getEditorValue((content) => { - browser.assert.ok(content.indexOf(`constructor (string memory name_, string memory symbol_) { + .clickLaunchIcon('solidity') + .setSolidityCompilerVersion('soljson-v0.8.0+commit.c7dfd78e.js') + .pause(2000) + .clickLaunchIcon('udapp') + .testContracts('externalImport.sol', sources[1]['browser/externalImport.sol'], ['ERC20']) + .clickLaunchIcon('udapp') + .waitForElementPresent('*[title="Deploy - transact (not payable)"]', 35000) + .selectContract('ERC20') + .createContract('"tokenName", "symbol"') + .debugTransaction(2) + .pause(2000) + .waitForElementVisible('#stepdetail') + .goToVMTraceStep(10) + .getEditorValue((content) => { + browser.assert.ok(content.indexOf(`constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; - }`) != -1, - 'current displayed content is not from the ERC20 source code') - }) + }`) !== -1, + 'current displayed content is not from the ERC20 source code') + }) }, 'Should display correct source highlighting while debugging a contract which has ABIEncoderV2': function (browser: NightwatchBrowser) { @@ -107,21 +107,21 @@ module.exports = { This is still an issue @todo(https://github.com/ethereum/remix-project/issues/481), so this test will fail when this issue is fixed */ browser - .clickLaunchIcon('solidity') - .setSolidityCompilerVersion('soljson-v0.6.12+commit.27d51765.js') - .clickLaunchIcon('fileExplorers') - .click('li[data-id="treeViewLitreeViewItembrowser/externalImport.sol"') - .testContracts('withABIEncoderV2.sol', sources[2]['browser/withABIEncoderV2.sol'], ['test']) - .clickLaunchIcon('udapp') - .selectContract('test') - .createContract('') - .clickInstance(2) - .clickFunction('test1 - transact (not payable)', {types: 'bytes userData', values: '0x000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000015b38da6a701c568545dcfcb03fcb875f56beddc4'}) - .debugTransaction(4) - .pause(2000) - .waitForElementVisible('#stepdetail') - .goToVMTraceStep(261) - .pause(1000) + .clickLaunchIcon('solidity') + .setSolidityCompilerVersion('soljson-v0.6.12+commit.27d51765.js') + .clickLaunchIcon('fileExplorers') + .click('li[data-id="treeViewLitreeViewItembrowser/externalImport.sol"') + .testContracts('withABIEncoderV2.sol', sources[2]['browser/withABIEncoderV2.sol'], ['test']) + .clickLaunchIcon('udapp') + .selectContract('test') + .createContract('') + .clickInstance(2) + .clickFunction('test1 - transact (not payable)', { types: 'bytes userData', values: '0x000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000015b38da6a701c568545dcfcb03fcb875f56beddc4' }) + .debugTransaction(4) + .pause(2000) + .waitForElementVisible('#stepdetail') + .goToVMTraceStep(261) + .pause(1000) /* for the test below: source highlight should remain line `bytes32 idAsk = abi.decode(userData[:33], (bytes32));` @@ -130,86 +130,86 @@ module.exports = { But the debugger uses now validSourcelocation, which means file is not -1. In that case the source highlight at 261 should be the same as for step 262 */ - .waitForElementPresent('.highlightLine7') - .goToVMTraceStep(266) - .pause(1000) - .checkVariableDebug('soliditylocals', localVariable_step266_ABIEncoder) // locals should not be initiated at this point, only idAsk should - .goToVMTraceStep(717) - .pause(5000) - .checkVariableDebug('soliditylocals', localVariable_step717_ABIEncoder) // all locals should be initiaed - .clickLaunchIcon('udapp') - .clickInstance(2) + .waitForElementPresent('.highlightLine7') + .goToVMTraceStep(266) + .pause(1000) + .checkVariableDebug('soliditylocals', localVariable_step266_ABIEncoder) // locals should not be initiated at this point, only idAsk should + .goToVMTraceStep(717) + .pause(5000) + .checkVariableDebug('soliditylocals', localVariable_step717_ABIEncoder) // all locals should be initiaed + .clickLaunchIcon('udapp') + .clickInstance(2) }, 'Should load more solidity locals array': function (browser: NightwatchBrowser) { browser - .clickLaunchIcon('solidity') - .testContracts('locals.sol', sources[3]['browser/locals.sol'], ['testLocals']) - .clickLaunchIcon('udapp') - .waitForElementPresent('*[title="Deploy - transact (not payable)"]', 40000) - .createContract('') - .pause(2000) - .clickInstance(3) - .clickFunction('t - transact (not payable)') - .pause(2000) - .debugTransaction(6) - .waitForElementVisible('*[data-id="slider"]') - .click('*[data-id="slider"]') - .setValue('*[data-id="slider"]', '5000') - .waitForElementPresent('*[data-id="treeViewDivtreeViewItemarray"]') - .click('*[data-id="treeViewDivtreeViewItemarray"]') - .waitForElementPresent('*[data-id="treeViewDivtreeViewLoadMore"]') - .assert.containsText('*[data-id="solidityLocals"]', '9: 9 uint256') - .notContainsText('*[data-id="solidityLocals"]', '10: 10 uint256') + .clickLaunchIcon('solidity') + .testContracts('locals.sol', sources[3]['browser/locals.sol'], ['testLocals']) + .clickLaunchIcon('udapp') + .waitForElementPresent('*[title="Deploy - transact (not payable)"]', 40000) + .createContract('') + .pause(2000) + .clickInstance(3) + .clickFunction('t - transact (not payable)') + .pause(2000) + .debugTransaction(6) + .waitForElementVisible('*[data-id="slider"]') + .click('*[data-id="slider"]') + .setValue('*[data-id="slider"]', '5000') + .waitForElementPresent('*[data-id="treeViewDivtreeViewItemarray"]') + .click('*[data-id="treeViewDivtreeViewItemarray"]') + .waitForElementPresent('*[data-id="treeViewDivtreeViewLoadMore"]') + .assert.containsText('*[data-id="solidityLocals"]', '9: 9 uint256') + .notContainsText('*[data-id="solidityLocals"]', '10: 10 uint256') }, 'Should debug using generated sources': function (browser: NightwatchBrowser) { browser - .clickLaunchIcon('solidity') - .setSolidityCompilerVersion('soljson-v0.7.2+commit.51b20bc0.js') - .pause(2000) - .testContracts('withGeneratedSources.sol', sources[4]['browser/withGeneratedSources.sol'], ['A']) - .clickLaunchIcon('udapp') - .createContract('') - .clickInstance(4) - .clickFunction('f - transact (not payable)', {types: 'uint256[] ', values: '[]'}) - .debugTransaction(8) - .pause(2000) - .click('*[data-id="debuggerTransactionStartButton"]') // stop debugging - .click('*[data-id="debugGeneratedSourcesLabel"]') // select debug with generated sources - .click('*[data-id="debuggerTransactionStartButton"]') // start debugging - .pause(2000) - .getEditorValue((content) => { - browser.assert.ok(content.indexOf('if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }') != -1, 'current displayed content is not a generated source') - }) - .click('*[data-id="debuggerTransactionStartButton"]') + .clickLaunchIcon('solidity') + .setSolidityCompilerVersion('soljson-v0.7.2+commit.51b20bc0.js') + .pause(2000) + .testContracts('withGeneratedSources.sol', sources[4]['browser/withGeneratedSources.sol'], ['A']) + .clickLaunchIcon('udapp') + .createContract('') + .clickInstance(4) + .clickFunction('f - transact (not payable)', { types: 'uint256[] ', values: '[]' }) + .debugTransaction(8) + .pause(2000) + .click('*[data-id="debuggerTransactionStartButton"]') // stop debugging + .click('*[data-id="debugGeneratedSourcesLabel"]') // select debug with generated sources + .click('*[data-id="debuggerTransactionStartButton"]') // start debugging + .pause(2000) + .getEditorValue((content) => { + browser.assert.ok(content.indexOf('if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }') !== -1, 'current displayed content is not a generated source') + }) + .click('*[data-id="debuggerTransactionStartButton"]') }, 'Should call the debugger api: getTrace': function (browser: NightwatchBrowser) { browser - .addFile('test_jsGetTrace.js', { content: jsGetTrace }) - .executeScript('remix.exeCurrent()') - .pause(3000) - .journalChildIncludes(`{ "gas": "0x2dc6c0", "return": "0x", "structLogs":`) + .addFile('test_jsGetTrace.js', { content: jsGetTrace }) + .executeScript('remix.exeCurrent()') + .pause(3000) + .journalChildIncludes('{ "gas": "0x2dc6c0", "return": "0x", "structLogs":') }, 'Should call the debugger api: debug': function (browser: NightwatchBrowser) { browser - .addFile('test_jsDebug.js', { content: jsDebug }) - .executeScript('remix.exeCurrent()') - .pause(3000) - .clickLaunchIcon('debugger') - .waitForElementVisible('*[data-id="slider"]') - .click('*[data-id="slider"]') - .setValue('*[data-id="slider"]', '5') - .pause(1000) + .addFile('test_jsDebug.js', { content: jsDebug }) + .executeScript('remix.exeCurrent()') + .pause(3000) + .clickLaunchIcon('debugger') + .waitForElementVisible('*[data-id="slider"]') + .click('*[data-id="slider"]') + .setValue('*[data-id="slider"]', '5') + .pause(1000) /* setting the slider to 5 leads to "vm trace step: 91" for chrome and "vm trace step: 92" for firefox => There is something going wrong with the nightwatch API here. As we are only testing if debugger is active, this is ok to keep that for now. */ - .assert.containsText('*[data-id="stepdetail"]', 'vm trace step:\n9') - .end() + .assert.containsText('*[data-id="stepdetail"]', 'vm trace step:\n9') + .end() }, tearDown: sauce @@ -250,10 +250,11 @@ const sources = [ } }, { - 'browser/externalImport.sol': {content: 'import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol"; contract test7 {}'} + 'browser/externalImport.sol': { content: 'import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol"; contract test7 {}' } }, { - 'browser/withABIEncoderV2.sol': {content: ` + 'browser/withABIEncoderV2.sol': { + content: ` pragma experimental ABIEncoderV2; contract test { @@ -272,7 +273,8 @@ const sources = [ return abi.decode(userData[:4], (bytes4)); } } - `} + ` + } }, { 'browser/locals.sol': { @@ -302,68 +304,68 @@ const sources = [ } ] -const localVariable_step266_ABIEncoder = { - "<1>": { - "length": "0xNaN", - "type": "bytes", - "value": "0x" +const localVariable_step266_ABIEncoder = { // eslint-disable-line + '<1>': { + length: '0xNaN', + type: 'bytes', + value: '0x' }, - "<2>": { - "type": "bytes32", - "value": "0x0000000000000000000000000000000000000000000000000000000000000000" + '<2>': { + type: 'bytes32', + value: '0x0000000000000000000000000000000000000000000000000000000000000000' }, - "<3>": { - "type": "bytes32", - "value": "0x0000000000000000000000000000000000000000000000000000000000000000" + '<3>': { + type: 'bytes32', + value: '0x0000000000000000000000000000000000000000000000000000000000000000' }, - "<4>": { - "type": "uint256", - "value": "0" + '<4>': { + type: 'uint256', + value: '0' }, - "idAsk": { - "type": "bytes32", - "value": "0x0000000000000000000000000000000000000000000000000000000000000002" + idAsk: { + type: 'bytes32', + value: '0x0000000000000000000000000000000000000000000000000000000000000002' }, - "userData": { - "error": "", - "type": "bytes" + userData: { + error: '', + type: 'bytes' } } -const localVariable_step717_ABIEncoder = { - "<1>": { - "length": "0xd0", - "type": "bytes", - "value": "0x5b38da6a701c568545dcfcb03fcb875f56beddc45b38da6a701c568545dcfcb03fcb875f56beddc400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001" +const localVariable_step717_ABIEncoder = { // eslint-disable-line + '<1>': { + length: '0xd0', + type: 'bytes', + value: '0x5b38da6a701c568545dcfcb03fcb875f56beddc45b38da6a701c568545dcfcb03fcb875f56beddc400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001' }, - "<2>": { - "type": "bytes32", - "value": "0x0000000000000000000000000000000000000000000000000000000000000002" + '<2>': { + type: 'bytes32', + value: '0x0000000000000000000000000000000000000000000000000000000000000002' }, - "<3>": { - "type": "bytes32", - "value": "0x0000000000000000000000000000000000000000000000000000000000000001" + '<3>': { + type: 'bytes32', + value: '0x0000000000000000000000000000000000000000000000000000000000000001' }, - "<4>": { - "type": "uint256", - "value": "84" + '<4>': { + type: 'uint256', + value: '84' }, - "idAsk": { - "type": "bytes32", - "value": "0x0000000000000000000000000000000000000000000000000000000000000002" + idAsk: { + type: 'bytes32', + value: '0x0000000000000000000000000000000000000000000000000000000000000002' }, - "idOffer": { - "type": "bytes32", - "value": "0x0000000000000000000000000000000000000000000000000000000000000001" + idOffer: { + type: 'bytes32', + value: '0x0000000000000000000000000000000000000000000000000000000000000001' }, - "ro": { - "length": "0xd0", - "type": "bytes", - "value": "0x5b38da6a701c568545dcfcb03fcb875f56beddc45b38da6a701c568545dcfcb03fcb875f56beddc400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001" + ro: { + length: '0xd0', + type: 'bytes', + value: '0x5b38da6a701c568545dcfcb03fcb875f56beddc45b38da6a701c568545dcfcb03fcb875f56beddc400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001' }, - "userData": { - "error": "", - "type": "bytes" + userData: { + error: '', + type: 'bytes' } } diff --git a/apps/remix-ide-e2e/src/tests/defaultLayout.test.ts b/apps/remix-ide-e2e/src/tests/defaultLayout.test.ts index 3378a49c85..a8574b81c7 100644 --- a/apps/remix-ide-e2e/src/tests/defaultLayout.test.ts +++ b/apps/remix-ide-e2e/src/tests/defaultLayout.test.ts @@ -10,74 +10,74 @@ module.exports = { 'Loads Icon\'s Panel': function (browser: NightwatchBrowser) { browser.waitForElementVisible('div[data-id="remixIdeIconPanel"]', 10000) - .waitForElementVisible('div[data-id="verticalIconsHomeIcon"]') - .waitForElementVisible('div[plugin="fileExplorers"]') - .waitForElementVisible('div[plugin="pluginManager"]') - .waitForElementVisible('div[plugin="settings"]') + .waitForElementVisible('div[data-id="verticalIconsHomeIcon"]') + .waitForElementVisible('div[plugin="fileExplorers"]') + .waitForElementVisible('div[plugin="pluginManager"]') + .waitForElementVisible('div[plugin="settings"]') }, 'Loads Side Panel': function (browser: NightwatchBrowser) { browser.waitForElementVisible('div[data-id="remixIdeSidePanel"]') - .assert.containsText('h6[data-id="sidePanelSwapitTitle"]', 'FILE EXPLORERS') - .waitForElementVisible('div[data-id="filePanelFileExplorerTree"]') - .waitForElementVisible('[data-id="treeViewLitreeViewItembrowser/contracts"]') - .waitForElementVisible('[data-id="treeViewLitreeViewItembrowser/scripts"]') - .waitForElementVisible('[data-id="treeViewLitreeViewItembrowser/tests"]') - .waitForElementVisible('[data-id="treeViewLitreeViewItembrowser/README.txt"]') + .assert.containsText('h6[data-id="sidePanelSwapitTitle"]', 'FILE EXPLORERS') + .waitForElementVisible('div[data-id="filePanelFileExplorerTree"]') + .waitForElementVisible('[data-id="treeViewLitreeViewItembrowser/contracts"]') + .waitForElementVisible('[data-id="treeViewLitreeViewItembrowser/scripts"]') + .waitForElementVisible('[data-id="treeViewLitreeViewItembrowser/tests"]') + .waitForElementVisible('[data-id="treeViewLitreeViewItembrowser/README.txt"]') }, 'Loads Main View': function (browser: NightwatchBrowser) { browser.waitForElementVisible('div[data-id="mainPanelPluginsContainer"]') - .waitForElementVisible('div[data-id="landingPageHomeContainer"]') - .waitForElementVisible('div[data-id="landingPageHpSections"]') - .waitForElementVisible('div[data-id="terminalContainer"]') + .waitForElementVisible('div[data-id="landingPageHomeContainer"]') + .waitForElementVisible('div[data-id="landingPageHpSections"]') + .waitForElementVisible('div[data-id="terminalContainer"]') }, 'Loads terminal': function (browser: NightwatchBrowser) { browser - .waitForElementVisible('div[data-id="terminalCli"]', 10000) - .journalLastChildIncludes('Welcome to Remix') + .waitForElementVisible('div[data-id="terminalCli"]', 10000) + .journalLastChildIncludes('Welcome to Remix') }, 'Toggles Side Panel': function (browser: NightwatchBrowser) { browser.waitForElementVisible('div[data-id="remixIdeSidePanel"]') - .assert.containsText('h6[data-id="sidePanelSwapitTitle"]', 'FILE EXPLORERS') - .clickLaunchIcon('fileExplorers') - .assert.hidden('div[data-id="remixIdeSidePanel"]') - .clickLaunchIcon('fileExplorers') - .assert.visible('div[data-id="remixIdeSidePanel"]') - .assert.containsText('h6[data-id="sidePanelSwapitTitle"]', 'FILE EXPLORERS') + .assert.containsText('h6[data-id="sidePanelSwapitTitle"]', 'FILE EXPLORERS') + .clickLaunchIcon('fileExplorers') + .assert.hidden('div[data-id="remixIdeSidePanel"]') + .clickLaunchIcon('fileExplorers') + .assert.visible('div[data-id="remixIdeSidePanel"]') + .assert.containsText('h6[data-id="sidePanelSwapitTitle"]', 'FILE EXPLORERS') }, 'Toggles Terminal': function (browser: NightwatchBrowser) { browser.waitForElementVisible('div[data-id="terminalContainer"]') - .assert.visible('div[data-id="terminalContainerDisplay"]') - .click('i[data-id="terminalToggleIcon"]') - .checkElementStyle('div[data-id="terminalToggleMenu"]', 'height', '35px') - .click('i[data-id="terminalToggleIcon"]') - .assert.visible('div[data-id="terminalContainerDisplay"]') + .assert.visible('div[data-id="terminalContainerDisplay"]') + .click('i[data-id="terminalToggleIcon"]') + .checkElementStyle('div[data-id="terminalToggleMenu"]', 'height', '35px') + .click('i[data-id="terminalToggleIcon"]') + .assert.visible('div[data-id="terminalContainerDisplay"]') }, 'Toggles File Explorer Browser': function (browser: NightwatchBrowser) { browser - .waitForElementVisible('div[data-id="filePanelFileExplorerTree"]') - .waitForElementPresent('[data-id="treeViewLitreeViewItembrowser/contracts"]') - .click('[data-path="browser"]') - .waitForElementNotPresent('[data-id="treeViewLitreeViewItembrowser/contracts"]') - .click('[data-path="browser"]') - .waitForElementPresent('[data-id="treeViewLitreeViewItembrowser/contracts"]') + .waitForElementVisible('div[data-id="filePanelFileExplorerTree"]') + .waitForElementPresent('[data-id="treeViewLitreeViewItembrowser/contracts"]') + .click('[data-path="browser"]') + .waitForElementNotPresent('[data-id="treeViewLitreeViewItembrowser/contracts"]') + .click('[data-path="browser"]') + .waitForElementPresent('[data-id="treeViewLitreeViewItembrowser/contracts"]') }, 'Switch Tabs using tabs icon': function (browser: NightwatchBrowser) { browser - .waitForElementVisible('div[data-id="filePanelFileExplorerTree"]') - .click('[data-id="treeViewLitreeViewItembrowser/contracts"]') - .openFile('browser/contracts/3_Ballot.sol') - .assert.containsText('div[title="browser/contracts/3_Ballot.sol"]', '3_Ballot.sol') - .click('span[class^=dropdownCaret]') - .click('#homeItem') - .assert.containsText('div[title="home"]', 'Home') - .end() + .waitForElementVisible('div[data-id="filePanelFileExplorerTree"]') + .click('[data-id="treeViewLitreeViewItembrowser/contracts"]') + .openFile('browser/contracts/3_Ballot.sol') + .assert.containsText('div[title="browser/contracts/3_Ballot.sol"]', '3_Ballot.sol') + .click('span[class^=dropdownCaret]') + .click('#homeItem') + .assert.containsText('div[title="home"]', 'Home') + .end() }, tearDown: sauce diff --git a/apps/remix-ide-e2e/src/tests/editor.test.ts b/apps/remix-ide-e2e/src/tests/editor.test.ts index e6ef792298..998e30e61e 100644 --- a/apps/remix-ide-e2e/src/tests/editor.test.ts +++ b/apps/remix-ide-e2e/src/tests/editor.test.ts @@ -1,6 +1,6 @@ 'use strict' -import { NightwatchBrowser } from "nightwatch" +import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' import sauce from './sauce' @@ -12,64 +12,64 @@ module.exports = { 'Should zoom in editor': function (browser: NightwatchBrowser) { browser.waitForElementVisible('div[data-id="mainPanelPluginsContainer"]') - .clickLaunchIcon('fileExplorers') - .waitForElementVisible('div[data-id="filePanelFileExplorerTree"]') - .openFile('browser/contracts/1_Storage.sol') - .waitForElementVisible('*[data-id="editorInput"]') - .checkElementStyle('*[data-id="editorInput"]', 'font-size', '12px') - .click('*[data-id="tabProxyZoomIn"]') - .click('*[data-id="tabProxyZoomIn"]') - .checkElementStyle('*[data-id="editorInput"]', 'font-size', '14px') + .clickLaunchIcon('fileExplorers') + .waitForElementVisible('div[data-id="filePanelFileExplorerTree"]') + .openFile('browser/contracts/1_Storage.sol') + .waitForElementVisible('*[data-id="editorInput"]') + .checkElementStyle('*[data-id="editorInput"]', 'font-size', '12px') + .click('*[data-id="tabProxyZoomIn"]') + .click('*[data-id="tabProxyZoomIn"]') + .checkElementStyle('*[data-id="editorInput"]', 'font-size', '14px') }, 'Should zoom out editor': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="editorInput"]') - .checkElementStyle('*[data-id="editorInput"]', 'font-size', '14px') - .click('*[data-id="tabProxyZoomOut"]') - .click('*[data-id="tabProxyZoomOut"]') - .checkElementStyle('*[data-id="editorInput"]', 'font-size', '12px') + .checkElementStyle('*[data-id="editorInput"]', 'font-size', '14px') + .click('*[data-id="tabProxyZoomOut"]') + .click('*[data-id="tabProxyZoomOut"]') + .checkElementStyle('*[data-id="editorInput"]', 'font-size', '12px') }, 'Should display compile error in editor': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="editorInput"]') - .waitForElementVisible('*[class="ace_content"]') - .click('*[class="ace_content"]') - .sendKeys('*[class="ace_text-input"]', 'error') - .pause(2000) - .waitForElementVisible('.ace_error') + .waitForElementVisible('*[class="ace_content"]') + .click('*[class="ace_content"]') + .sendKeys('*[class="ace_text-input"]', 'error') + .pause(2000) + .waitForElementVisible('.ace_error') }, 'Should minimize and maximize codeblock in editor': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="editorInput"]') - .waitForElementVisible('.ace_open') - .click('.ace_start:nth-of-type(1)') - .waitForElementVisible('.ace_closed') - .click('.ace_start:nth-of-type(1)') - .waitForElementVisible('.ace_open') + .waitForElementVisible('.ace_open') + .click('.ace_start:nth-of-type(1)') + .waitForElementVisible('.ace_closed') + .click('.ace_start:nth-of-type(1)') + .waitForElementVisible('.ace_open') }, 'Should add breakpoint to editor': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="editorInput"]') - .waitForElementNotPresent('.ace_breakpoint') - .click('.ace_gutter-cell:nth-of-type(1)') - .waitForElementVisible('.ace_breakpoint') + .waitForElementNotPresent('.ace_breakpoint') + .click('.ace_gutter-cell:nth-of-type(1)') + .waitForElementVisible('.ace_breakpoint') }, 'Should load syntax highlighter for ace light theme': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="editorInput"]') - .checkElementStyle('.ace_keyword', 'color', aceThemes.light.keyword) - .checkElementStyle('.ace_comment.ace_doc', 'color', aceThemes.light.comment) - .checkElementStyle('.ace_function', 'color', aceThemes.light.function) - .checkElementStyle('.ace_variable', 'color', aceThemes.light.variable) + .checkElementStyle('.ace_keyword', 'color', aceThemes.light.keyword) + .checkElementStyle('.ace_comment.ace_doc', 'color', aceThemes.light.comment) + .checkElementStyle('.ace_function', 'color', aceThemes.light.function) + .checkElementStyle('.ace_variable', 'color', aceThemes.light.variable) }, 'Should load syntax highlighter for ace dark theme': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="verticalIconsKindsettings"]') - .click('*[data-id="verticalIconsKindsettings"]') - .waitForElementVisible('*[data-id="settingsTabThemeLabelDark"]') - .click('*[data-id="settingsTabThemeLabelDark"]') - .pause(2000) - .waitForElementVisible('*[data-id="editorInput"]') + .click('*[data-id="verticalIconsKindsettings"]') + .waitForElementVisible('*[data-id="settingsTabThemeLabelDark"]') + .click('*[data-id="settingsTabThemeLabelDark"]') + .pause(2000) + .waitForElementVisible('*[data-id="editorInput"]') /* @todo(#2863) ch for class and not colors .checkElementStyle('.ace_keyword', 'color', aceThemes.dark.keyword) .checkElementStyle('.ace_comment.ace_doc', 'color', aceThemes.dark.comment) @@ -81,46 +81,46 @@ module.exports = { 'Should highlight source code': function (browser: NightwatchBrowser) { // include all files here because switching between plugins in side-panel removes highlight browser - .addFile('sourcehighlight.js', sourcehighlightScript) - .addFile('removeSourcehighlightScript.js', removeSourcehighlightScript) - .addFile('removeAllSourcehighlightScript.js', removeAllSourcehighlightScript) - .openFile('browser/sourcehighlight.js') - .executeScript('remix.exeCurrent()') - .editorScroll('down', 60) - .waitForElementPresent('.highlightLine32') - .checkElementStyle('.highlightLine32', 'background-color', 'rgb(8, 108, 181)') - .waitForElementPresent('.highlightLine40') - .checkElementStyle('.highlightLine40', 'background-color', 'rgb(8, 108, 181)') - .waitForElementPresent('.highlightLine50') - .checkElementStyle('.highlightLine50', 'background-color', 'rgb(8, 108, 181)') + .addFile('sourcehighlight.js', sourcehighlightScript) + .addFile('removeSourcehighlightScript.js', removeSourcehighlightScript) + .addFile('removeAllSourcehighlightScript.js', removeAllSourcehighlightScript) + .openFile('browser/sourcehighlight.js') + .executeScript('remix.exeCurrent()') + .editorScroll('down', 60) + .waitForElementPresent('.highlightLine32') + .checkElementStyle('.highlightLine32', 'background-color', 'rgb(8, 108, 181)') + .waitForElementPresent('.highlightLine40') + .checkElementStyle('.highlightLine40', 'background-color', 'rgb(8, 108, 181)') + .waitForElementPresent('.highlightLine50') + .checkElementStyle('.highlightLine50', 'background-color', 'rgb(8, 108, 181)') }, 'Should remove 1 highlight from source code': function (browser: NightwatchBrowser) { browser.waitForElementVisible('li[data-id="treeViewLitreeViewItembrowser/removeSourcehighlightScript.js"]') - .click('li[data-id="treeViewLitreeViewItembrowser/removeSourcehighlightScript.js"]') - .pause(2000) - .executeScript('remix.exeCurrent()') - .waitForElementVisible('li[data-id="treeViewLitreeViewItembrowser/contracts"]') - .click('li[data-id="treeViewLitreeViewItembrowser/contracts"]') - .waitForElementVisible('li[data-id="treeViewLitreeViewItembrowser/contracts/3_Ballot.sol"]') - .click('li[data-id="treeViewLitreeViewItembrowser/contracts/3_Ballot.sol"]') - .waitForElementNotPresent('.highlightLine32') - .checkElementStyle('.highlightLine40', 'background-color', 'rgb(8, 108, 181)') - .checkElementStyle('.highlightLine50', 'background-color', 'rgb(8, 108, 181)') + .click('li[data-id="treeViewLitreeViewItembrowser/removeSourcehighlightScript.js"]') + .pause(2000) + .executeScript('remix.exeCurrent()') + .waitForElementVisible('li[data-id="treeViewLitreeViewItembrowser/contracts"]') + .click('li[data-id="treeViewLitreeViewItembrowser/contracts"]') + .waitForElementVisible('li[data-id="treeViewLitreeViewItembrowser/contracts/3_Ballot.sol"]') + .click('li[data-id="treeViewLitreeViewItembrowser/contracts/3_Ballot.sol"]') + .waitForElementNotPresent('.highlightLine32') + .checkElementStyle('.highlightLine40', 'background-color', 'rgb(8, 108, 181)') + .checkElementStyle('.highlightLine50', 'background-color', 'rgb(8, 108, 181)') }, 'Should remove all highlights from source code': function (browser: NightwatchBrowser) { browser.waitForElementVisible('li[data-id="treeViewLitreeViewItembrowser/removeAllSourcehighlightScript.js"]') - .click('li[data-id="treeViewLitreeViewItembrowser/removeAllSourcehighlightScript.js"]') - .pause(2000) - .executeScript('remix.exeCurrent()') - .waitForElementVisible('li[data-id="treeViewLitreeViewItembrowser/contracts/3_Ballot.sol"]') - .click('li[data-id="treeViewLitreeViewItembrowser/contracts/3_Ballot.sol"]') - .pause(2000) - .waitForElementNotPresent('.highlightLine32') - .waitForElementNotPresent('.highlightLine40') - .waitForElementNotPresent('.highlightLine50') - .end() + .click('li[data-id="treeViewLitreeViewItembrowser/removeAllSourcehighlightScript.js"]') + .pause(2000) + .executeScript('remix.exeCurrent()') + .waitForElementVisible('li[data-id="treeViewLitreeViewItembrowser/contracts/3_Ballot.sol"]') + .click('li[data-id="treeViewLitreeViewItembrowser/contracts/3_Ballot.sol"]') + .pause(2000) + .waitForElementNotPresent('.highlightLine32') + .waitForElementNotPresent('.highlightLine40') + .waitForElementNotPresent('.highlightLine50') + .end() }, tearDown: sauce diff --git a/apps/remix-ide-e2e/src/tests/fileExplorer.test.ts b/apps/remix-ide-e2e/src/tests/fileExplorer.test.ts index b0bbb056d8..c8b5e9b649 100644 --- a/apps/remix-ide-e2e/src/tests/fileExplorer.test.ts +++ b/apps/remix-ide-e2e/src/tests/fileExplorer.test.ts @@ -1,5 +1,5 @@ 'use strict' -import { NightwatchBrowser } from "nightwatch" +import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' import sauce from './sauce' import * as path from 'path' @@ -18,99 +18,98 @@ module.exports = { 'Should create a new file `5_New_contract.sol` in file explorer': function (browser: NightwatchBrowser) { browser.waitForElementVisible('div[data-id="remixIdeSidePanel"]') - .clickLaunchIcon('fileExplorers') - .assert.containsText('h6[data-id="sidePanelSwapitTitle"]', 'FILE EXPLORERS') - .click('*[data-id="fileExplorerNewFilecreateNewFile"]') - .pause(1000) - .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/blank"]') - .sendKeys('*[data-id="treeViewLitreeViewItembrowser/blank"] .remixui_items', '5_New_contract.sol') - .sendKeys('*[data-id="treeViewLitreeViewItembrowser/blank"] .remixui_items', browser.Keys.ENTER) - .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/5_New_contract.sol"]', 7000) + .clickLaunchIcon('fileExplorers') + .assert.containsText('h6[data-id="sidePanelSwapitTitle"]', 'FILE EXPLORERS') + .click('*[data-id="fileExplorerNewFilecreateNewFile"]') + .pause(1000) + .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/blank"]') + .sendKeys('*[data-id="treeViewLitreeViewItembrowser/blank"] .remixui_items', '5_New_contract.sol') + .sendKeys('*[data-id="treeViewLitreeViewItembrowser/blank"] .remixui_items', browser.Keys.ENTER) + .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/5_New_contract.sol"]', 7000) }, 'Should rename `5_New_contract.sol` to 5_Renamed_Contract.sol': function (browser: NightwatchBrowser) { browser - .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/5_New_contract.sol"]') - .renamePath('browser/5_New_contract.sol', '5_Renamed_Contract.sol', 'browser/5_Renamed_Contract.sol') - .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/5_Renamed_Contract.sol"]') + .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/5_New_contract.sol"]') + .renamePath('browser/5_New_contract.sol', '5_Renamed_Contract.sol', 'browser/5_Renamed_Contract.sol') + .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/5_Renamed_Contract.sol"]') }, 'Should delete file `5_Renamed_Contract.sol` from file explorer': function (browser: NightwatchBrowser) { browser - .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/5_Renamed_Contract.sol"]') - .rightClick('[data-path="browser/5_Renamed_Contract.sol"]') - .click('*[id="menuitemdelete"]') - .waitForElementVisible('*[data-id="browserModalDialogContainer-react"]') - .pause(2000) - .click('.modal-ok') - .waitForElementNotPresent('*[data-id="treeViewLitreeViewItembrowser/5_Renamed_Contract.sol"') + .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/5_Renamed_Contract.sol"]') + .rightClick('[data-path="browser/5_Renamed_Contract.sol"]') + .click('*[id="menuitemdelete"]') + .waitForElementVisible('*[data-id="browserModalDialogContainer-react"]') + .pause(2000) + .click('.modal-ok') + .waitForElementNotPresent('*[data-id="treeViewLitreeViewItembrowser/5_Renamed_Contract.sol"') }, 'Should create a new folder': function (browser: NightwatchBrowser) { browser - .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/README.txt"]') - .click('[data-id="fileExplorerNewFilecreateNewFolder"]') - .pause(1000) - .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/blank"]') - .sendKeys('*[data-id="treeViewLitreeViewItembrowser/blank"] .remixui_items', 'Browser_Tests') - .sendKeys('*[data-id="treeViewLitreeViewItembrowser/blank"] .remixui_items', browser.Keys.ENTER) - .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/Browser_Tests"]') + .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/README.txt"]') + .click('[data-id="fileExplorerNewFilecreateNewFolder"]') + .pause(1000) + .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/blank"]') + .sendKeys('*[data-id="treeViewLitreeViewItembrowser/blank"] .remixui_items', 'Browser_Tests') + .sendKeys('*[data-id="treeViewLitreeViewItembrowser/blank"] .remixui_items', browser.Keys.ENTER) + .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/Browser_Tests"]') }, 'Should rename Browser_Tests folder to Browser_E2E_Tests': function (browser: NightwatchBrowser) { browser - .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/Browser_Tests"]') - .renamePath('browser/Browser_Tests', 'Browser_E2E_Tests', 'browser/Browser_E2E_Tests') - .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/Browser_E2E_Tests"]') + .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/Browser_Tests"]') + .renamePath('browser/Browser_Tests', 'Browser_E2E_Tests', 'browser/Browser_E2E_Tests') + .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/Browser_E2E_Tests"]') }, 'Should delete Browser_E2E_Tests folder': function (browser: NightwatchBrowser) { browser - .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/Browser_E2E_Tests"]') - .rightClick('[data-path="browser/Browser_E2E_Tests"]') - .click('*[id="menuitemdelete"]') - .waitForElementVisible('*[data-id="browserModalDialogContainer-react"]') - .pause(2000) - .click('.modal-ok') - .waitForElementNotPresent('*[data-id="treeViewLitreeViewItembrowser/Browser_E2E_Tests"]') + .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/Browser_E2E_Tests"]') + .rightClick('[data-path="browser/Browser_E2E_Tests"]') + .click('*[id="menuitemdelete"]') + .waitForElementVisible('*[data-id="browserModalDialogContainer-react"]') + .pause(2000) + .click('.modal-ok') + .waitForElementNotPresent('*[data-id="treeViewLitreeViewItembrowser/Browser_E2E_Tests"]') }, 'Should publish all explorer files to github gist': function (browser: NightwatchBrowser) { const runtimeBrowser = browser.options.desiredCapabilities.browserName browser.refresh() - .pause(10000) - .waitForElementVisible('*[data-id="fileExplorerNewFilepublishToGist"]') - .click('*[data-id="fileExplorerNewFilepublishToGist"]') - .waitForElementVisible('*[data-id="browserModalDialogContainer-react"]') - .pause(2000) - .click('.modal-ok') - .pause(2000) - .waitForElementVisible('*[data-id="browserModalDialogContainer-react"]') - .pause(2000) - .click('.modal-ok') - .pause(2000) - .perform((done) => { - if (runtimeBrowser === 'chrome') { - browser.switchBrowserTab(1) - .assert.urlContains('https://gist.github.com') - .switchBrowserTab(0) - } - done() - }) + .pause(10000) + .waitForElementVisible('*[data-id="fileExplorerNewFilepublishToGist"]') + .click('*[data-id="fileExplorerNewFilepublishToGist"]') + .waitForElementVisible('*[data-id="browserModalDialogContainer-react"]') + .pause(2000) + .click('.modal-ok') + .pause(2000) + .waitForElementVisible('*[data-id="browserModalDialogContainer-react"]') + .pause(2000) + .click('.modal-ok') + .pause(2000) + .perform((done) => { + if (runtimeBrowser === 'chrome') { + browser.switchBrowserTab(1) + .assert.urlContains('https://gist.github.com') + .switchBrowserTab(0) + } + done() + }) }, 'Should open local filesystem explorer': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="filePanelFileExplorerTree"]') - .setValue('*[data-id="fileExplorerFileUpload"]', testData.testFile1) - .setValue('*[data-id="fileExplorerFileUpload"]', testData.testFile2) - .setValue('*[data-id="fileExplorerFileUpload"]', testData.testFile3) - .waitForElementVisible('[data-id="treeViewLitreeViewItembrowser/editor.test.js"]') - .waitForElementVisible('[data-id="treeViewLitreeViewItembrowser/fileExplorer.test.js"]') - .waitForElementVisible('[data-id="treeViewLitreeViewItembrowser/generalSettings.test.js"]') - .end() - }, + .setValue('*[data-id="fileExplorerFileUpload"]', testData.testFile1) + .setValue('*[data-id="fileExplorerFileUpload"]', testData.testFile2) + .setValue('*[data-id="fileExplorerFileUpload"]', testData.testFile3) + .waitForElementVisible('[data-id="treeViewLitreeViewItembrowser/editor.test.js"]') + .waitForElementVisible('[data-id="treeViewLitreeViewItembrowser/fileExplorer.test.js"]') + .waitForElementVisible('[data-id="treeViewLitreeViewItembrowser/generalSettings.test.js"]') + .end() + }, tearDown: sauce } - diff --git a/apps/remix-ide-e2e/src/tests/fileManager_api.test.ts b/apps/remix-ide-e2e/src/tests/fileManager_api.test.ts index 2eb4c73d00..df7d0106a6 100644 --- a/apps/remix-ide-e2e/src/tests/fileManager_api.test.ts +++ b/apps/remix-ide-e2e/src/tests/fileManager_api.test.ts @@ -1,5 +1,5 @@ 'use strict' -import { NightwatchBrowser } from "nightwatch" +import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' import sauce from './sauce' @@ -10,94 +10,94 @@ module.exports = { 'Should execute `file` api from file manager external api': function (browser: NightwatchBrowser) { browser - .addFile('file.js', { content: executeFile }) - .executeScript(`remix.exeCurrent()`) - .pause(5000) - .journalLastChildIncludes('browser/file.js') + .addFile('file.js', { content: executeFile }) + .executeScript('remix.exeCurrent()') + .pause(5000) + .journalLastChildIncludes('browser/file.js') }, 'Should execute `exists` api from file manager external api': function (browser: NightwatchBrowser) { browser - .addFile('exists.js', { content: executeExists }) - .executeScript(`remix.exeCurrent()`) - .pause(2000) - .journalChildIncludes('browser/exists.js true') - .journalChildIncludes('browser/non-exists.js false') + .addFile('exists.js', { content: executeExists }) + .executeScript('remix.exeCurrent()') + .pause(2000) + .journalChildIncludes('browser/exists.js true') + .journalChildIncludes('browser/non-exists.js false') }, 'Should execute `open` api from file manager external api': function (browser: NightwatchBrowser) { browser - .addFile('open.js', { content: executeOpen }) - .executeScript(`remix.exeCurrent()`) - .pause(2000) - .journalLastChildIncludes('browser/contracts/3_Ballot.sol') + .addFile('open.js', { content: executeOpen }) + .executeScript('remix.exeCurrent()') + .pause(2000) + .journalLastChildIncludes('browser/contracts/3_Ballot.sol') }, 'Should execute `writeFile` api from file manager external api': function (browser: NightwatchBrowser) { browser - .addFile('writeFile.js', { content: executeWriteFile }) - .executeScript(`remix.exeCurrent()`) - .pause(2000) - .openFile('browser/new_contract.sol') - .assert.containsText('[data-id="editorInput"]', 'pragma solidity ^0.6.0') + .addFile('writeFile.js', { content: executeWriteFile }) + .executeScript('remix.exeCurrent()') + .pause(2000) + .openFile('browser/new_contract.sol') + .assert.containsText('[data-id="editorInput"]', 'pragma solidity ^0.6.0') }, 'Should execute `readFile` api from file manager external api': function (browser: NightwatchBrowser) { browser - .addFile('readFile.js', { content: executeReadFile }) - .executeScript(`remix.exeCurrent()`) - .pause(2000) - .journalLastChildIncludes('pragma solidity ^0.6.0') + .addFile('readFile.js', { content: executeReadFile }) + .executeScript('remix.exeCurrent()') + .pause(2000) + .journalLastChildIncludes('pragma solidity ^0.6.0') }, 'Should execute `copyFile` api from file manager external api': function (browser: NightwatchBrowser) { browser - .addFile('copyFile.js', { content: executeCopyFile }) - .executeScript(`remix.exeCurrent()`) - .pause(2000) - .journalLastChildIncludes('pragma solidity >=0.7.0 <0.8.0;') + .addFile('copyFile.js', { content: executeCopyFile }) + .executeScript('remix.exeCurrent()') + .pause(2000) + .journalLastChildIncludes('pragma solidity >=0.7.0 <0.8.0;') }, 'Should execute `rename` api from file manager external api': function (browser: NightwatchBrowser) { browser - .addFile('renameFile.js', { content: executeRename }) - .executeScript(`remix.exeCurrent()`) - .pause(2000) - .waitForElementPresent('[data-id="treeViewLitreeViewItembrowser/old_contract.sol"]') + .addFile('renameFile.js', { content: executeRename }) + .executeScript('remix.exeCurrent()') + .pause(2000) + .waitForElementPresent('[data-id="treeViewLitreeViewItembrowser/old_contract.sol"]') }, 'Should execute `mkdir` api from file manager external api': function (browser: NightwatchBrowser) { browser - .addFile('mkdirFile.js', { content: executeMkdir }) - .executeScript(`remix.exeCurrent()`) - .pause(2000) - .waitForElementPresent('[data-id="treeViewLitreeViewItembrowser/Test_Folder"]') + .addFile('mkdirFile.js', { content: executeMkdir }) + .executeScript('remix.exeCurrent()') + .pause(2000) + .waitForElementPresent('[data-id="treeViewLitreeViewItembrowser/Test_Folder"]') }, 'Should execute `readdir` api from file manager external api': function (browser: NightwatchBrowser) { browser - .addFile('readdirFile.js', { content: executeReaddir }) - .executeScript(`remix.exeCurrent()`) - .pause(2000) - .journalLastChildIncludes('Test_Folder isDirectory true') + .addFile('readdirFile.js', { content: executeReaddir }) + .executeScript('remix.exeCurrent()') + .pause(2000) + .journalLastChildIncludes('Test_Folder isDirectory true') }, 'Should execute `remove` api from file manager external api': function (browser: NightwatchBrowser) { browser - .addFile('removeFile.js', { content: executeRemove }) - .executeScript(`remix.exeCurrent()`) - .pause(2000) - .waitForElementNotPresent('[data-id="treeViewLitreeViewItembrowser/old_contract.sol"]') + .addFile('removeFile.js', { content: executeRemove }) + .executeScript('remix.exeCurrent()') + .pause(2000) + .waitForElementNotPresent('[data-id="treeViewLitreeViewItembrowser/old_contract.sol"]') }, // TODO: Fix remove root directory prefix for browser and localhost 'Should execute `remove` api from file manager external api on a folder': '' + function (browser: NightwatchBrowser) { browser - .addFile('test_jsRemoveFolder.js', { content: executeRemoveOnFolder }) - .executeScript('remix.exeCurrent()') - .pause(2000) - .waitForElementNotPresent('[data-id="treeViewLitreeViewItembrowser/tests"]') - .end() + .addFile('test_jsRemoveFolder.js', { content: executeRemoveOnFolder }) + .executeScript('remix.exeCurrent()') + .pause(2000) + .waitForElementNotPresent('[data-id="treeViewLitreeViewItembrowser/tests"]') + .end() }, tearDown: sauce diff --git a/apps/remix-ide-e2e/src/tests/generalSettings.test.ts b/apps/remix-ide-e2e/src/tests/generalSettings.test.ts index 8fbdf2ae51..071cd944a5 100644 --- a/apps/remix-ide-e2e/src/tests/generalSettings.test.ts +++ b/apps/remix-ide-e2e/src/tests/generalSettings.test.ts @@ -1,5 +1,5 @@ 'use strict' -import { NightwatchBrowser } from "nightwatch" +import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' import sauce from './sauce' @@ -10,125 +10,125 @@ module.exports = { 'Should display settings menu': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) - .click('*[data-id="landingPageStartSolidity"]') - .waitForElementVisible('*[data-id="verticalIconsKindsettings"]', 5000) - .click('*[data-id="verticalIconsKindsettings"]') - .waitForElementContainsText('h6[data-id="sidePanelSwapitTitle"]', 'SETTINGS') + .click('*[data-id="landingPageStartSolidity"]') + .waitForElementVisible('*[data-id="verticalIconsKindsettings"]', 5000) + .click('*[data-id="verticalIconsKindsettings"]') + .waitForElementContainsText('h6[data-id="sidePanelSwapitTitle"]', 'SETTINGS') }, 'Should activate `generate contract metadata`': function (browser) { browser.waitForElementVisible('*[data-id="remixIdeSidePanel"]', 5000) - .waitForElementVisible('*[data-id="settingsTabGenerateContractMetadataLabel"]', 5000) - .click('*[data-id="verticalIconsFileExplorerIcons"]') - .click('[data-id="treeViewLitreeViewItembrowser/contracts"]') - .openFile('browser/contracts/3_Ballot.sol') - .click('*[data-id="verticalIconsKindsolidity"]') - .pause(2000) - .click('*[data-id="compilerContainerCompileBtn"]') - .pause(3000) - .click('*[data-id="verticalIconsKindfileExplorers"]') - .openFile('browser/contracts/artifacts/Ballot.json') - .openFile('browser/contracts/artifacts/Ballot_metadata.json') - .getEditorValue((content) => { - const metadata = JSON.parse(content) - browser.assert.equal(metadata.language, 'Solidity') - }) + .waitForElementVisible('*[data-id="settingsTabGenerateContractMetadataLabel"]', 5000) + .click('*[data-id="verticalIconsFileExplorerIcons"]') + .click('[data-id="treeViewLitreeViewItembrowser/contracts"]') + .openFile('browser/contracts/3_Ballot.sol') + .click('*[data-id="verticalIconsKindsolidity"]') + .pause(2000) + .click('*[data-id="compilerContainerCompileBtn"]') + .pause(3000) + .click('*[data-id="verticalIconsKindfileExplorers"]') + .openFile('browser/contracts/artifacts/Ballot.json') + .openFile('browser/contracts/artifacts/Ballot_metadata.json') + .getEditorValue((content) => { + const metadata = JSON.parse(content) + browser.assert.equal(metadata.language, 'Solidity') + }) }, 'Should add new github access token': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="verticalIconsKindsettings"]', 5000) - .click('*[data-id="verticalIconsKindsettings"]') - .setValue('*[data-id="settingsTabGistAccessToken"]', '**********') - .click('*[data-id="settingsTabSaveGistToken"]') - .waitForElementVisible('*[data-shared="tooltipPopup"]:nth-last-of-type(1)', 5000) - .assert.containsText('*[data-shared="tooltipPopup"]:nth-last-of-type(1)', 'Access token has been saved') + .click('*[data-id="verticalIconsKindsettings"]') + .setValue('*[data-id="settingsTabGistAccessToken"]', '**********') + .click('*[data-id="settingsTabSaveGistToken"]') + .waitForElementVisible('*[data-shared="tooltipPopup"]:nth-last-of-type(1)', 5000) + .assert.containsText('*[data-shared="tooltipPopup"]:nth-last-of-type(1)', 'Access token has been saved') }, 'Should copy github access token to clipboard': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="verticalIconsKindsettings"]', 5000) - .click('*[data-id="copyToClipboardCopyIcon"]') - .waitForElementVisible('*[data-shared="tooltipPopup"]:nth-last-of-type(1)', 5000) - .assert.containsText('*[data-shared="tooltipPopup"]:nth-last-of-type(1)', 'Copied value to clipboard.') + .click('*[data-id="copyToClipboardCopyIcon"]') + .waitForElementVisible('*[data-shared="tooltipPopup"]:nth-last-of-type(1)', 5000) + .assert.containsText('*[data-shared="tooltipPopup"]:nth-last-of-type(1)', 'Copied value to clipboard.') }, 'Should remove github access token': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="verticalIconsKindsettings"]', 5000) - .click('*[data-id="settingsTabRemoveGistToken"]') - .waitForElementVisible('*[data-shared="tooltipPopup"]:nth-last-of-type(1)', 5000) - .assert.containsText('*[data-shared="tooltipPopup"]:nth-last-of-type(1)', 'Access token removed') - .assert.containsText('*[data-id="settingsTabGistAccessToken"]', '') + .click('*[data-id="settingsTabRemoveGistToken"]') + .waitForElementVisible('*[data-shared="tooltipPopup"]:nth-last-of-type(1)', 5000) + .assert.containsText('*[data-shared="tooltipPopup"]:nth-last-of-type(1)', 'Access token removed') + .assert.containsText('*[data-id="settingsTabGistAccessToken"]', '') }, 'Should load dark theme': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="verticalIconsKindsettings"]', 5000) - .click('*[data-id="settingsTabThemeLabelDark"]') - .pause(2000) - .checkElementStyle(':root', '--primary', remixIdeThemes.dark.primary) - .checkElementStyle(':root', '--secondary', remixIdeThemes.dark.secondary) - .checkElementStyle(':root', '--success', remixIdeThemes.dark.success) - .checkElementStyle(':root', '--info', remixIdeThemes.dark.info) - .checkElementStyle(':root', '--warning', remixIdeThemes.dark.warning) - .checkElementStyle(':root', '--danger', remixIdeThemes.dark.danger) + .click('*[data-id="settingsTabThemeLabelDark"]') + .pause(2000) + .checkElementStyle(':root', '--primary', remixIdeThemes.dark.primary) + .checkElementStyle(':root', '--secondary', remixIdeThemes.dark.secondary) + .checkElementStyle(':root', '--success', remixIdeThemes.dark.success) + .checkElementStyle(':root', '--info', remixIdeThemes.dark.info) + .checkElementStyle(':root', '--warning', remixIdeThemes.dark.warning) + .checkElementStyle(':root', '--danger', remixIdeThemes.dark.danger) }, 'Should load light theme': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="verticalIconsKindsettings"]', 5000) - .click('*[data-id="settingsTabThemeLabelLight"]') - .pause(2000) - .checkElementStyle(':root', '--primary', remixIdeThemes.light.primary) - .checkElementStyle(':root', '--secondary', remixIdeThemes.light.secondary) - .checkElementStyle(':root', '--success', remixIdeThemes.light.success) - .checkElementStyle(':root', '--info', remixIdeThemes.light.info) - .checkElementStyle(':root', '--warning', remixIdeThemes.light.warning) - .checkElementStyle(':root', '--danger', remixIdeThemes.light.danger) + .click('*[data-id="settingsTabThemeLabelLight"]') + .pause(2000) + .checkElementStyle(':root', '--primary', remixIdeThemes.light.primary) + .checkElementStyle(':root', '--secondary', remixIdeThemes.light.secondary) + .checkElementStyle(':root', '--success', remixIdeThemes.light.success) + .checkElementStyle(':root', '--info', remixIdeThemes.light.info) + .checkElementStyle(':root', '--warning', remixIdeThemes.light.warning) + .checkElementStyle(':root', '--danger', remixIdeThemes.light.danger) }, 'Should load Cerulean theme': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="verticalIconsKindsettings"]', 5000) - .click('*[data-id="settingsTabThemeLabelCerulean"]') - .pause(5000) - .checkElementStyle(':root', '--primary', remixIdeThemes.curelean.primary) - .checkElementStyle(':root', '--secondary', remixIdeThemes.curelean.secondary) - .checkElementStyle(':root', '--success', remixIdeThemes.curelean.success) - .checkElementStyle(':root', '--info', remixIdeThemes.curelean.info) - .checkElementStyle(':root', '--warning', remixIdeThemes.curelean.warning) - .checkElementStyle(':root', '--danger', remixIdeThemes.curelean.danger) + .click('*[data-id="settingsTabThemeLabelCerulean"]') + .pause(5000) + .checkElementStyle(':root', '--primary', remixIdeThemes.curelean.primary) + .checkElementStyle(':root', '--secondary', remixIdeThemes.curelean.secondary) + .checkElementStyle(':root', '--success', remixIdeThemes.curelean.success) + .checkElementStyle(':root', '--info', remixIdeThemes.curelean.info) + .checkElementStyle(':root', '--warning', remixIdeThemes.curelean.warning) + .checkElementStyle(':root', '--danger', remixIdeThemes.curelean.danger) }, 'Should load Flatly theme': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="verticalIconsKindsettings"]', 5000) - .click('*[data-id="settingsTabThemeLabelFlatly"]') - .pause(2000) - .checkElementStyle(':root', '--primary', remixIdeThemes.flatly.primary) - .checkElementStyle(':root', '--secondary', remixIdeThemes.flatly.secondary) - .checkElementStyle(':root', '--success', remixIdeThemes.flatly.success) - .checkElementStyle(':root', '--info', remixIdeThemes.flatly.info) - .checkElementStyle(':root', '--warning', remixIdeThemes.flatly.warning) - .checkElementStyle(':root', '--danger', remixIdeThemes.flatly.danger) + .click('*[data-id="settingsTabThemeLabelFlatly"]') + .pause(2000) + .checkElementStyle(':root', '--primary', remixIdeThemes.flatly.primary) + .checkElementStyle(':root', '--secondary', remixIdeThemes.flatly.secondary) + .checkElementStyle(':root', '--success', remixIdeThemes.flatly.success) + .checkElementStyle(':root', '--info', remixIdeThemes.flatly.info) + .checkElementStyle(':root', '--warning', remixIdeThemes.flatly.warning) + .checkElementStyle(':root', '--danger', remixIdeThemes.flatly.danger) }, 'Should load Spacelab theme': function (browser) { browser.waitForElementVisible('*[data-id="verticalIconsKindsettings"]', 5000) - .click('*[data-id="settingsTabThemeLabelSpacelab"]') - .pause(2000) - .checkElementStyle(':root', '--primary', remixIdeThemes.spacelab.primary) - .checkElementStyle(':root', '--secondary', remixIdeThemes.spacelab.secondary) - .checkElementStyle(':root', '--success', remixIdeThemes.spacelab.success) - .checkElementStyle(':root', '--info', remixIdeThemes.spacelab.info) - .checkElementStyle(':root', '--warning', remixIdeThemes.spacelab.warning) - .checkElementStyle(':root', '--danger', remixIdeThemes.spacelab.danger) + .click('*[data-id="settingsTabThemeLabelSpacelab"]') + .pause(2000) + .checkElementStyle(':root', '--primary', remixIdeThemes.spacelab.primary) + .checkElementStyle(':root', '--secondary', remixIdeThemes.spacelab.secondary) + .checkElementStyle(':root', '--success', remixIdeThemes.spacelab.success) + .checkElementStyle(':root', '--info', remixIdeThemes.spacelab.info) + .checkElementStyle(':root', '--warning', remixIdeThemes.spacelab.warning) + .checkElementStyle(':root', '--danger', remixIdeThemes.spacelab.danger) }, 'Should load Cyborg theme': function (browser) { browser.waitForElementVisible('*[data-id="verticalIconsKindsettings"]', 5000) - .click('*[data-id="settingsTabThemeLabelCyborg"]') - .pause(2000) - .checkElementStyle(':root', '--primary', remixIdeThemes.cyborg.primary) - .checkElementStyle(':root', '--secondary', remixIdeThemes.cyborg.secondary) - .checkElementStyle(':root', '--success', remixIdeThemes.cyborg.success) - .checkElementStyle(':root', '--info', remixIdeThemes.cyborg.info) - .checkElementStyle(':root', '--warning', remixIdeThemes.cyborg.warning) - .checkElementStyle(':root', '--danger', remixIdeThemes.cyborg.danger) + .click('*[data-id="settingsTabThemeLabelCyborg"]') + .pause(2000) + .checkElementStyle(':root', '--primary', remixIdeThemes.cyborg.primary) + .checkElementStyle(':root', '--secondary', remixIdeThemes.cyborg.secondary) + .checkElementStyle(':root', '--success', remixIdeThemes.cyborg.success) + .checkElementStyle(':root', '--info', remixIdeThemes.cyborg.info) + .checkElementStyle(':root', '--warning', remixIdeThemes.cyborg.warning) + .checkElementStyle(':root', '--danger', remixIdeThemes.cyborg.danger) }, tearDown: sauce diff --git a/apps/remix-ide-e2e/src/tests/gist.test.ts b/apps/remix-ide-e2e/src/tests/gist.test.ts index 4884904123..890c7248b8 100644 --- a/apps/remix-ide-e2e/src/tests/gist.test.ts +++ b/apps/remix-ide-e2e/src/tests/gist.test.ts @@ -1,5 +1,5 @@ 'use strict' -import { NightwatchBrowser } from "nightwatch" +import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' import sauce from './sauce' @@ -14,7 +14,7 @@ module.exports = { init(browser, done) }, UploadToGists: function (browser: NightwatchBrowser) { - /* + /* - set the access token - publish to gist - retrieve the gist @@ -24,81 +24,81 @@ module.exports = { const runtimeBrowser = browser.options.desiredCapabilities.browserName browser - .refresh() - .pause(10000) - .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) - .click('[data-id="fileExplorerNewFilecreateNewFolder"]') - .pause(1000) - .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/blank"]') - .sendKeys('*[data-id="treeViewLitreeViewItembrowser/blank"] .remixui_items', 'Browser_Tests') - .sendKeys('*[data-id="treeViewLitreeViewItembrowser/blank"] .remixui_items', browser.Keys.ENTER) - .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/Browser_Tests"]') - .addFile('File.sol', { content: '' }) - .click('*[data-id="fileExplorerNewFilepublishToGist"]') - .waitForElementVisible('*[data-id="browserModalDialogContainer-react"]') - .pause(2000) - .click('.modal-ok') - .pause(10000) - .getText('[data-id="browserModalDialogModalBody-react"]', (result) => { - console.log(result) - const value = typeof result.value === 'string' ? result.value : null - const reg = /gist.github.com\/([^.]+)/ - const id = value.match(reg) + .refresh() + .pause(10000) + .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) + .click('[data-id="fileExplorerNewFilecreateNewFolder"]') + .pause(1000) + .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/blank"]') + .sendKeys('*[data-id="treeViewLitreeViewItembrowser/blank"] .remixui_items', 'Browser_Tests') + .sendKeys('*[data-id="treeViewLitreeViewItembrowser/blank"] .remixui_items', browser.Keys.ENTER) + .waitForElementVisible('*[data-id="treeViewLitreeViewItembrowser/Browser_Tests"]') + .addFile('File.sol', { content: '' }) + .click('*[data-id="fileExplorerNewFilepublishToGist"]') + .waitForElementVisible('*[data-id="browserModalDialogContainer-react"]') + .pause(2000) + .click('.modal-ok') + .pause(10000) + .getText('[data-id="browserModalDialogModalBody-react"]', (result) => { + console.log(result) + const value = typeof result.value === 'string' ? result.value : null + const reg = /gist.github.com\/([^.]+)/ + const id = value.match(reg) - console.log('gist regex', id) - if (!id) { - browser.assert.fail('cannot get the gist id', '', '') - } else { - const gistid = id[1] - browser - .click('[data-id="browser-modal-footer-cancel-react"]') - .executeScript(`remix.loadgist('${gistid}')`) - .perform((done) => { if (runtimeBrowser === 'chrome') { browser.openFile('browser/gists') } done() }) - .waitForElementVisible(`[data-id="treeViewLitreeViewItembrowser/gists/${gistid}"]`) - .click(`[data-id="treeViewLitreeViewItembrowser/gists/${gistid}"]`) - .openFile(`browser/gists/${gistid}/README.txt`) - } - }) + console.log('gist regex', id) + if (!id) { + browser.assert.fail('cannot get the gist id', '', '') + } else { + const gistid = id[1] + browser + .click('[data-id="browser-modal-footer-cancel-react"]') + .executeScript(`remix.loadgist('${gistid}')`) + .perform((done) => { if (runtimeBrowser === 'chrome') { browser.openFile('browser/gists') } done() }) + .waitForElementVisible(`[data-id="treeViewLitreeViewItembrowser/gists/${gistid}"]`) + .click(`[data-id="treeViewLitreeViewItembrowser/gists/${gistid}"]`) + .openFile(`browser/gists/${gistid}/README.txt`) + } + }) }, 'Load Gist Modal': function (browser: NightwatchBrowser) { browser.clickLaunchIcon('home') - .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) - .clickLaunchIcon('fileExplorers') - .scrollAndClick('*[data-id="landingPageImportFromGistButton"]') - .waitForElementVisible('*[data-id="modalDialogModalTitle"]') - .assert.containsText('*[data-id="modalDialogModalTitle"]', 'Load a Gist') - .waitForElementVisible('*[data-id="modalDialogModalBody"]') - .assert.containsText('*[data-id="modalDialogModalBody"]', 'Enter the ID of the Gist or URL you would like to load.') - .waitForElementVisible('*[data-id="modalDialogCustomPromptText"]') - .modalFooterCancelClick() + .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) + .clickLaunchIcon('fileExplorers') + .scrollAndClick('*[data-id="landingPageImportFromGistButton"]') + .waitForElementVisible('*[data-id="modalDialogModalTitle"]') + .assert.containsText('*[data-id="modalDialogModalTitle"]', 'Load a Gist') + .waitForElementVisible('*[data-id="modalDialogModalBody"]') + .assert.containsText('*[data-id="modalDialogModalBody"]', 'Enter the ID of the Gist or URL you would like to load.') + .waitForElementVisible('*[data-id="modalDialogCustomPromptText"]') + .modalFooterCancelClick() }, 'Display Error Message For Invalid Gist ID': function (browser: NightwatchBrowser) { browser - .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) - .clickLaunchIcon('fileExplorers') - .scrollAndClick('*[data-id="landingPageImportFromGistButton"]') - .waitForElementVisible('*[data-id="modalDialogCustomPromptText"]') - .setValue('*[data-id="modalDialogCustomPromptText"]', testData.invalidGistId) - .modalFooterOKClick() - .waitForElementVisible('*[data-id="modalDialogModalBody"]') - .assert.containsText('*[data-id="modalDialogModalBody"]', 'Gist load error: Not Found') - .modalFooterOKClick() + .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) + .clickLaunchIcon('fileExplorers') + .scrollAndClick('*[data-id="landingPageImportFromGistButton"]') + .waitForElementVisible('*[data-id="modalDialogCustomPromptText"]') + .setValue('*[data-id="modalDialogCustomPromptText"]', testData.invalidGistId) + .modalFooterOKClick() + .waitForElementVisible('*[data-id="modalDialogModalBody"]') + .assert.containsText('*[data-id="modalDialogModalBody"]', 'Gist load error: Not Found') + .modalFooterOKClick() }, 'Import From Gist For Valid Gist ID': function (browser: NightwatchBrowser) { browser - .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) - .clickLaunchIcon('fileExplorers') - .scrollAndClick('*[data-id="landingPageImportFromGistButton"]') - .waitForElementVisible('*[data-id="modalDialogCustomPromptText"]') - .setValue('*[data-id="modalDialogCustomPromptText"]', testData.validGistId) - .modalFooterOKClick() - .openFile(`browser/gists/${testData.validGistId}/ApplicationRegistry`) - .waitForElementVisible(`div[title='browser/gists/${testData.validGistId}/ApplicationRegistry']`) - .assert.containsText(`div[title='browser/gists/${testData.validGistId}/ApplicationRegistry'] > span`, 'ApplicationRegistry') - .end() + .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) + .clickLaunchIcon('fileExplorers') + .scrollAndClick('*[data-id="landingPageImportFromGistButton"]') + .waitForElementVisible('*[data-id="modalDialogCustomPromptText"]') + .setValue('*[data-id="modalDialogCustomPromptText"]', testData.validGistId) + .modalFooterOKClick() + .openFile(`browser/gists/${testData.validGistId}/ApplicationRegistry`) + .waitForElementVisible(`div[title='browser/gists/${testData.validGistId}/ApplicationRegistry']`) + .assert.containsText(`div[title='browser/gists/${testData.validGistId}/ApplicationRegistry'] > span`, 'ApplicationRegistry') + .end() }, tearDown: sauce diff --git a/apps/remix-ide-e2e/src/tests/libraryDeployment.test.ts b/apps/remix-ide-e2e/src/tests/libraryDeployment.test.ts index 39b6204e51..ca9876de06 100644 --- a/apps/remix-ide-e2e/src/tests/libraryDeployment.test.ts +++ b/apps/remix-ide-e2e/src/tests/libraryDeployment.test.ts @@ -1,5 +1,5 @@ 'use strict' -import { NightwatchBrowser } from "nightwatch" +import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' import sauce from './sauce' @@ -93,7 +93,7 @@ function checkDeployShouldSucceed (browser: NightwatchBrowser, address: string, .getEditorValue((content) => { config = JSON.parse(content) config.deploy['VM:-'].autoDeployLib = false - config.deploy['VM:-']['linkReferences']['browser/Untitled5.sol'].lib = address + config.deploy['VM:-'].linkReferences['browser/Untitled5.sol'].lib = address }) .perform(() => { browser.setEditorValue(JSON.stringify(config)) @@ -116,7 +116,8 @@ function checkDeployShouldSucceed (browser: NightwatchBrowser, address: string, const sources = [ { - 'browser/Untitled5.sol': {content: `library lib { + 'browser/Untitled5.sol': { + content: `library lib { function getInt () public view returns (uint) { return 45; } @@ -126,6 +127,7 @@ const sources = [ function get () public view returns (uint) { return lib.getInt(); } - }`} + }` + } } ] diff --git a/apps/remix-ide-e2e/src/tests/pluginManager.test.ts b/apps/remix-ide-e2e/src/tests/pluginManager.test.ts index eb8422e156..3fcafbb6b4 100644 --- a/apps/remix-ide-e2e/src/tests/pluginManager.test.ts +++ b/apps/remix-ide-e2e/src/tests/pluginManager.test.ts @@ -1,5 +1,5 @@ 'use strict' -import { NightwatchBrowser } from "nightwatch" +import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' import sauce from './sauce' @@ -16,52 +16,52 @@ module.exports = { 'Should Load Plugin Manager': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="remixIdeSidePanel"]') - .pause(3000) - .click('*[plugin="pluginManager"]') - .waitForElementVisible('*[data-id="pluginManagerComponentPluginManager"]') - .assert.containsText('*[data-id="sidePanelSwapitTitle"]', 'PLUGIN MANAGER') + .pause(3000) + .click('*[plugin="pluginManager"]') + .waitForElementVisible('*[data-id="pluginManagerComponentPluginManager"]') + .assert.containsText('*[data-id="sidePanelSwapitTitle"]', 'PLUGIN MANAGER') }, 'Should Search for plugins': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="pluginManagerComponentPluginManager"]') - .click('*[data-id="pluginManagerComponentSearchInput"]') - .keys('debugger') - .waitForElementVisible('*[data-id="pluginManagerComponentActivateButtondebugger"]') - .clearValue('*[data-id="pluginManagerComponentSearchInput"]') - .click('*[data-id="pluginManagerComponentSearchInput"]') - .keys('Vyper') - .waitForElementVisible('*[data-id="pluginManagerComponentActivateButtonvyper"]') - .clearValue('*[data-id="pluginManagerComponentSearchInput"]') - .click('*[data-id="pluginManagerComponentSearchInput"]') - .keys('ZoKrates') - .waitForElementVisible('*[data-id="pluginManagerComponentActivateButtonZoKrates"]') - .clearValue('*[data-id="pluginManagerComponentSearchInput"]') - .click('*[data-id="pluginManagerComponentSearchInput"]') - .keys(browser.Keys.ENTER) + .click('*[data-id="pluginManagerComponentSearchInput"]') + .keys('debugger') + .waitForElementVisible('*[data-id="pluginManagerComponentActivateButtondebugger"]') + .clearValue('*[data-id="pluginManagerComponentSearchInput"]') + .click('*[data-id="pluginManagerComponentSearchInput"]') + .keys('Vyper') + .waitForElementVisible('*[data-id="pluginManagerComponentActivateButtonvyper"]') + .clearValue('*[data-id="pluginManagerComponentSearchInput"]') + .click('*[data-id="pluginManagerComponentSearchInput"]') + .keys('ZoKrates') + .waitForElementVisible('*[data-id="pluginManagerComponentActivateButtonZoKrates"]') + .clearValue('*[data-id="pluginManagerComponentSearchInput"]') + .click('*[data-id="pluginManagerComponentSearchInput"]') + .keys(browser.Keys.ENTER) }, 'Should activate plugins': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="pluginManagerComponentPluginManager"]') - .click('*[data-id="pluginManagerComponentPluginManager"]') - .scrollAndClick('*[data-id="pluginManagerComponentActivateButtondebugger"]') - .pause(2000) - .waitForElementVisible('*[data-id="pluginManagerComponentDeactivateButtondebugger"]') - .scrollAndClick('*[data-id="pluginManagerComponentActivateButtonvyper"]') - .waitForElementVisible('*[data-id="pluginManagerComponentDeactivateButtonvyper"]') - .scrollAndClick('*[data-id="pluginManagerComponentActivateButtonZoKrates"]') - .waitForElementVisible('*[data-id="pluginManagerComponentDeactivateButtonZoKrates"]') + .click('*[data-id="pluginManagerComponentPluginManager"]') + .scrollAndClick('*[data-id="pluginManagerComponentActivateButtondebugger"]') + .pause(2000) + .waitForElementVisible('*[data-id="pluginManagerComponentDeactivateButtondebugger"]') + .scrollAndClick('*[data-id="pluginManagerComponentActivateButtonvyper"]') + .waitForElementVisible('*[data-id="pluginManagerComponentDeactivateButtonvyper"]') + .scrollAndClick('*[data-id="pluginManagerComponentActivateButtonZoKrates"]') + .waitForElementVisible('*[data-id="pluginManagerComponentDeactivateButtonZoKrates"]') }, 'Should deactivate plugins': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="pluginManagerComponentPluginManager"]') - .click('*[data-id="pluginManagerComponentPluginManager"]') - .waitForElementVisible('*[data-id="pluginManagerComponentDeactivateButtondebugger"]') - .pause(2000) - .scrollAndClick('*[data-id="pluginManagerComponentDeactivateButtondebugger"]') - .waitForElementVisible('*[data-id="pluginManagerComponentActivateButtondebugger"]') - .waitForElementVisible('*[data-id="pluginManagerComponentDeactivateButtonvyper"]') - .scrollAndClick('*[data-id="pluginManagerComponentDeactivateButtonvyper"]') - .waitForElementVisible('*[data-id="pluginManagerComponentActivateButtonvyper"]') + .click('*[data-id="pluginManagerComponentPluginManager"]') + .waitForElementVisible('*[data-id="pluginManagerComponentDeactivateButtondebugger"]') + .pause(2000) + .scrollAndClick('*[data-id="pluginManagerComponentDeactivateButtondebugger"]') + .waitForElementVisible('*[data-id="pluginManagerComponentActivateButtondebugger"]') + .waitForElementVisible('*[data-id="pluginManagerComponentDeactivateButtonvyper"]') + .scrollAndClick('*[data-id="pluginManagerComponentDeactivateButtonvyper"]') + .waitForElementVisible('*[data-id="pluginManagerComponentActivateButtonvyper"]') }, /* @@ -104,56 +104,56 @@ module.exports = { 'Should connect a local plugin': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="pluginManagerComponentPluginManager"]') - .click('*[data-id="pluginManagerComponentPluginSearchButton"]') - .waitForElementVisible('*[data-id="modalDialogContainer"]') - .click('*[data-id="modalDialogModalBody"]') - .waitForElementVisible('*[data-id="localPluginName"]') - .setValue('*[data-id="localPluginName"]', testData.pluginName) - .setValue('*[data-id="localPluginDisplayName"]', testData.pluginDisplayName) - .setValue('*[data-id="localPluginUrl"]', testData.pluginUrl) - .click('*[data-id="localPluginRadioButtoniframe"]') - .click('*[data-id="localPluginRadioButtonsidePanel"]') - .click('*[data-id="modalDialogModalFooter"]') - .modalFooterOKClick() - .waitForElementVisible('*[data-id="pluginManagerComponentDeactivateButtonremixIde"]') + .click('*[data-id="pluginManagerComponentPluginSearchButton"]') + .waitForElementVisible('*[data-id="modalDialogContainer"]') + .click('*[data-id="modalDialogModalBody"]') + .waitForElementVisible('*[data-id="localPluginName"]') + .setValue('*[data-id="localPluginName"]', testData.pluginName) + .setValue('*[data-id="localPluginDisplayName"]', testData.pluginDisplayName) + .setValue('*[data-id="localPluginUrl"]', testData.pluginUrl) + .click('*[data-id="localPluginRadioButtoniframe"]') + .click('*[data-id="localPluginRadioButtonsidePanel"]') + .click('*[data-id="modalDialogModalFooter"]') + .modalFooterOKClick() + .waitForElementVisible('*[data-id="pluginManagerComponentDeactivateButtonremixIde"]') }, 'Should display error message for creating already existing plugin': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="pluginManagerComponentPluginManager"]') - .click('*[data-id="pluginManagerComponentPluginSearchButton"]') - .waitForElementVisible('*[data-id="modalDialogContainer"]') - .click('*[data-id="modalDialogModalBody"]') - .waitForElementVisible('*[data-id="localPluginName"]') - .clearValue('*[data-id="localPluginName"]').setValue('*[data-id="localPluginName"]', testData.pluginName) - .clearValue('*[data-id="localPluginDisplayName"]').setValue('*[data-id="localPluginDisplayName"]', testData.pluginDisplayName) - .clearValue('*[data-id="localPluginUrl"]').setValue('*[data-id="localPluginUrl"]', testData.pluginUrl) - .click('*[data-id="localPluginRadioButtoniframe"]') - .click('*[data-id="localPluginRadioButtonsidePanel"]') - .click('*[data-id="modalDialogModalFooter"]') - .modalFooterOKClick() - .pause(5000) - .waitForElementVisible('*[data-shared="tooltipPopup"]:nth-last-of-type(1)') - .pause(2000) - .assert.containsText('*[data-shared="tooltipPopup"]:nth-last-of-type(1)', 'Cannot create Plugin : This name has already been used') + .click('*[data-id="pluginManagerComponentPluginSearchButton"]') + .waitForElementVisible('*[data-id="modalDialogContainer"]') + .click('*[data-id="modalDialogModalBody"]') + .waitForElementVisible('*[data-id="localPluginName"]') + .clearValue('*[data-id="localPluginName"]').setValue('*[data-id="localPluginName"]', testData.pluginName) + .clearValue('*[data-id="localPluginDisplayName"]').setValue('*[data-id="localPluginDisplayName"]', testData.pluginDisplayName) + .clearValue('*[data-id="localPluginUrl"]').setValue('*[data-id="localPluginUrl"]', testData.pluginUrl) + .click('*[data-id="localPluginRadioButtoniframe"]') + .click('*[data-id="localPluginRadioButtonsidePanel"]') + .click('*[data-id="modalDialogModalFooter"]') + .modalFooterOKClick() + .pause(5000) + .waitForElementVisible('*[data-shared="tooltipPopup"]:nth-last-of-type(1)') + .pause(2000) + .assert.containsText('*[data-shared="tooltipPopup"]:nth-last-of-type(1)', 'Cannot create Plugin : This name has already been used') }, 'Should load back installed plugins after reload': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="pluginManagerComponentPluginManager"]') - .getInstalledPlugins((plugins) => { - browser.refresh() - .waitForElementVisible('*[data-id="remixIdeSidePanel"]') - .pause(3000) - .perform((done) => { - plugins.forEach(plugin => { - if (plugin !== testData.pluginName) { - browser.waitForElementVisible(`[plugin="${plugin}"`) - } - }) - done() + .getInstalledPlugins((plugins) => { + browser.refresh() + .waitForElementVisible('*[data-id="remixIdeSidePanel"]') + .pause(3000) + .perform((done) => { + plugins.forEach(plugin => { + if (plugin !== testData.pluginName) { + browser.waitForElementVisible(`[plugin="${plugin}"`) + } + }) + done() + }) }) - }) - .end() + .end() }, - + tearDown: sauce } diff --git a/apps/remix-ide-e2e/src/tests/publishContract.test.ts b/apps/remix-ide-e2e/src/tests/publishContract.test.ts index 671893a26e..ca9f7084e6 100644 --- a/apps/remix-ide-e2e/src/tests/publishContract.test.ts +++ b/apps/remix-ide-e2e/src/tests/publishContract.test.ts @@ -1,5 +1,5 @@ 'use strict' -import { NightwatchBrowser } from "nightwatch" +import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' import sauce from './sauce' @@ -14,60 +14,60 @@ module.exports = { 'Publish on IPFS': function (browser: NightwatchBrowser) { browser - .waitForElementVisible('#icon-panel', 10000) - .clickLaunchIcon('fileExplorers') - .click('[data-id="treeViewLitreeViewItembrowser/contracts"]') - .openFile('browser/contracts/3_Ballot.sol') - .verifyContracts(['Ballot']) - .click('#publishOnIpfs') - .pause(8000) - .getModalBody((value, done) => { - if (value.indexOf('Metadata of "ballot" was published successfully.') === -1) browser.assert.fail('ipfs deploy failed', '', '') - if (value.indexOf('dweb:/ipfs') === -1) browser.assert.fail('ipfs deploy failed', '', '') - done() - }) - .modalFooterOKClick() + .waitForElementVisible('#icon-panel', 10000) + .clickLaunchIcon('fileExplorers') + .click('[data-id="treeViewLitreeViewItembrowser/contracts"]') + .openFile('browser/contracts/3_Ballot.sol') + .verifyContracts(['Ballot']) + .click('#publishOnIpfs') + .pause(8000) + .getModalBody((value, done) => { + if (value.indexOf('Metadata of "ballot" was published successfully.') === -1) browser.assert.fail('ipfs deploy failed', '', '') + if (value.indexOf('dweb:/ipfs') === -1) browser.assert.fail('ipfs deploy failed', '', '') + done() + }) + .modalFooterOKClick() }, 'Publish on Swarm': '' + function (browser: NightwatchBrowser) { browser - .click('#publishOnSwarm') - .pause(8000) - .getModalBody((value, done) => { - if (value.indexOf('Metadata of "ballot" was successfully.') === -1) browser.assert.fail('swarm deploy failed', '', '') - if (value.indexOf('bzz') === -1) browser.assert.fail('swarm deploy failed', '', '') - done() - }) - .modalFooterOKClick() + .click('#publishOnSwarm') + .pause(8000) + .getModalBody((value, done) => { + if (value.indexOf('Metadata of "ballot" was successfully.') === -1) browser.assert.fail('swarm deploy failed', '', '') + if (value.indexOf('bzz') === -1) browser.assert.fail('swarm deploy failed', '', '') + done() + }) + .modalFooterOKClick() }, 'Should publish contract metadata to ipfs on deploy': function (browser: NightwatchBrowser) { browser - .waitForElementVisible('#icon-panel') - .clickLaunchIcon('fileExplorers') - .openFile('browser/contracts/1_Storage.sol') - .clickLaunchIcon('udapp') - .waitForElementPresent('*[data-id="contractDropdownIpfsCheckbox"]') - .click('*[data-id="contractDropdownIpfsCheckbox"]') - .click('*[data-id="Deploy - transact (not payable)"]') - .pause(8000) - .getModalBody((value, done) => { - if (value.indexOf('Metadata of "storage" was published successfully.') === -1) browser.assert.fail('ipfs deploy failed', '', '') - done() - }) - .modalFooterOKClick() + .waitForElementVisible('#icon-panel') + .clickLaunchIcon('fileExplorers') + .openFile('browser/contracts/1_Storage.sol') + .clickLaunchIcon('udapp') + .waitForElementPresent('*[data-id="contractDropdownIpfsCheckbox"]') + .click('*[data-id="contractDropdownIpfsCheckbox"]') + .click('*[data-id="Deploy - transact (not payable)"]') + .pause(8000) + .getModalBody((value, done) => { + if (value.indexOf('Metadata of "storage" was published successfully.') === -1) browser.assert.fail('ipfs deploy failed', '', '') + done() + }) + .modalFooterOKClick() }, 'Should remember choice after page refresh': function (browser: NightwatchBrowser) { browser - .refresh() - .waitForElementVisible('[data-id="treeViewLitreeViewItembrowser/contracts"]') - .click('[data-id="treeViewLitreeViewItembrowser/contracts"]') - .openFile('browser/contracts/1_Storage.sol') - .clickLaunchIcon('udapp') - .waitForElementPresent('*[data-id="contractDropdownIpfsCheckbox"]') - .verify.elementPresent('*[data-id="contractDropdownIpfsCheckbox"]:checked') - .end() + .refresh() + .waitForElementVisible('[data-id="treeViewLitreeViewItembrowser/contracts"]') + .click('[data-id="treeViewLitreeViewItembrowser/contracts"]') + .openFile('browser/contracts/1_Storage.sol') + .clickLaunchIcon('udapp') + .waitForElementPresent('*[data-id="contractDropdownIpfsCheckbox"]') + .verify.elementPresent('*[data-id="contractDropdownIpfsCheckbox"]:checked') + .end() }, tearDown: sauce diff --git a/apps/remix-ide-e2e/src/tests/recorder.test.ts b/apps/remix-ide-e2e/src/tests/recorder.test.ts index e13130029d..44e9e0354a 100644 --- a/apps/remix-ide-e2e/src/tests/recorder.test.ts +++ b/apps/remix-ide-e2e/src/tests/recorder.test.ts @@ -1,5 +1,5 @@ 'use strict' -import { NightwatchBrowser } from "nightwatch" +import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' import sauce from './sauce' @@ -14,94 +14,99 @@ module.exports = { 'Test Recorder': function (browser: NightwatchBrowser) { let addressRef - browser.addFile('scenario.json', {content: records}) - .pause(5000) - .clickLaunchIcon('udapp') - .selectAccount('0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c') // this account will be used for this test suite - .click('div[class^="cardContainer"] i[class^="arrow"]') - .click('#runTabView .runtransaction') - .waitForElementPresent('.instance:nth-of-type(2)') - .click('.instance:nth-of-type(2) > div > button') - .waitForElementPresent('.instance:nth-of-type(3)') - .click('.instance:nth-of-type(3) > div > button') - .clickFunction('getInt - call') - .clickFunction('getAddress - call') - .clickFunction('getFromLib - call') - .waitForElementPresent('div[class^="contractActionsContainer"] div[class^="value"] ul') - .getAddressAtPosition(1, (address) => { - console.log('Test Recorder ' + address) - addressRef = address - }) - .perform((done) => { - browser.verifyCallReturnValue(addressRef, ['0:uint256: 1', '0:uint256: 3456', '0:address: 0xbBF289D846208c16EDc8474705C748aff07732dB']) + browser.addFile('scenario.json', { content: records }) + .pause(5000) + .clickLaunchIcon('udapp') + .selectAccount('0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c') // this account will be used for this test suite + .click('div[class^="cardContainer"] i[class^="arrow"]') + .click('#runTabView .runtransaction') + .waitForElementPresent('.instance:nth-of-type(2)') + .click('.instance:nth-of-type(2) > div > button') + .waitForElementPresent('.instance:nth-of-type(3)') + .click('.instance:nth-of-type(3) > div > button') + .clickFunction('getInt - call') + .clickFunction('getAddress - call') + .clickFunction('getFromLib - call') + .waitForElementPresent('div[class^="contractActionsContainer"] div[class^="value"] ul') + .getAddressAtPosition(1, (address) => { + console.log('Test Recorder ' + address) + addressRef = address + }) + .perform((done) => { + browser.verifyCallReturnValue(addressRef, ['0:uint256: 1', '0:uint256: 3456', '0:address: 0xbBF289D846208c16EDc8474705C748aff07732dB']) .perform(() => done()) - }) - .click('*[data-id="deployAndRunClearInstances"]') - .testContracts('testRecorder.sol', sources[0]['browser/testRecorder.sol'], ['testRecorder']) - .clickLaunchIcon('udapp') - .createContract('12') - .waitForElementPresent('.instance:nth-of-type(2)') - .click('.instance:nth-of-type(2) > div > button') - .clickFunction('set - transact (not payable)', {types: 'uint256 _p', values: '34'}) - .click('i.savetransaction') - .modalFooterOKClick() - .getEditorValue(function (result) { - const parsed = JSON.parse(result) - browser.assert.equal(JSON.stringify(parsed.transactions[0].record.parameters), JSON.stringify(scenario.transactions[0].record.parameters)) - browser.assert.equal(JSON.stringify(parsed.transactions[0].record.name), JSON.stringify(scenario.transactions[0].record.name)) - browser.assert.equal(JSON.stringify(parsed.transactions[0].record.type), JSON.stringify(scenario.transactions[0].record.type)) - browser.assert.equal(JSON.stringify(parsed.transactions[0].record.from), JSON.stringify(scenario.transactions[0].record.from)) - browser.assert.equal(JSON.stringify(parsed.transactions[0].record.contractName), JSON.stringify(scenario.transactions[0].record.contractName)) + }) + .click('*[data-id="deployAndRunClearInstances"]') + .testContracts('testRecorder.sol', sources[0]['browser/testRecorder.sol'], ['testRecorder']) + .clickLaunchIcon('udapp') + .createContract('12') + .waitForElementPresent('.instance:nth-of-type(2)') + .click('.instance:nth-of-type(2) > div > button') + .clickFunction('set - transact (not payable)', { types: 'uint256 _p', values: '34' }) + .click('i.savetransaction') + .modalFooterOKClick() + .getEditorValue(function (result) { + const parsed = JSON.parse(result) + browser.assert.equal(JSON.stringify(parsed.transactions[0].record.parameters), JSON.stringify(scenario.transactions[0].record.parameters)) + browser.assert.equal(JSON.stringify(parsed.transactions[0].record.name), JSON.stringify(scenario.transactions[0].record.name)) + browser.assert.equal(JSON.stringify(parsed.transactions[0].record.type), JSON.stringify(scenario.transactions[0].record.type)) + browser.assert.equal(JSON.stringify(parsed.transactions[0].record.from), JSON.stringify(scenario.transactions[0].record.from)) + browser.assert.equal(JSON.stringify(parsed.transactions[0].record.contractName), JSON.stringify(scenario.transactions[0].record.contractName)) - browser.assert.equal(JSON.stringify(parsed.transactions[1].record.parameters), JSON.stringify(scenario.transactions[1].record.parameters)) - browser.assert.equal(JSON.stringify(parsed.transactions[1].record.name), JSON.stringify(scenario.transactions[1].record.name)) - browser.assert.equal(JSON.stringify(parsed.transactions[1].record.type), JSON.stringify(scenario.transactions[1].record.type)) - browser.assert.equal(JSON.stringify(parsed.transactions[1].record.from), JSON.stringify(scenario.transactions[1].record.from)) - }) + browser.assert.equal(JSON.stringify(parsed.transactions[1].record.parameters), JSON.stringify(scenario.transactions[1].record.parameters)) + browser.assert.equal(JSON.stringify(parsed.transactions[1].record.name), JSON.stringify(scenario.transactions[1].record.name)) + browser.assert.equal(JSON.stringify(parsed.transactions[1].record.type), JSON.stringify(scenario.transactions[1].record.type)) + browser.assert.equal(JSON.stringify(parsed.transactions[1].record.from), JSON.stringify(scenario.transactions[1].record.from)) + }) }, 'Record more than one contract': function (browser: NightwatchBrowser) { // deploy 2 contracts (2 different ABIs), save the record, reexecute and test one of the function. - let addressRef browser - .click('*[data-id="deployAndRunClearInstances"]') - .testContracts('multipleContracts.sol', sources[1]['browser/multipleContracts.sol'], ['t1est', 't2est']) - .clickLaunchIcon('udapp') - .selectContract('t1est') - .pause(1000) - .createContract('') - .clickInstance(0) - .selectContract('t2est') - .pause(1000) - .createContract('') - .click('i.savetransaction') - .modalFooterOKClick() - .click('*[data-id="deployAndRunClearInstances"]') // clear udapp - .click('*[data-id="terminalClearConsole"]') // clear terminal - .click('#runTabView .runtransaction') - .clickInstance(1) - .pause(1000) - .clickFunction('set2 - transact (not payable)', {types: 'uint256 _po', values: '10'}) - .testFunction('0xa88bf726e706480f61f04a066452929030c0a0216cc6923106f863963339bdb7', - { - status: 'true Transaction mined and execution succeed', - 'transaction hash': '0xa88bf726e706480f61f04a066452929030c0a0216cc6923106f863963339bdb7', - 'decoded input': {"uint256 _po":{"type":"BigNumber","hex":"0x0a"}} - }) - .end() + .click('*[data-id="deployAndRunClearInstances"]') + .testContracts('multipleContracts.sol', sources[1]['browser/multipleContracts.sol'], ['t1est', 't2est']) + .clickLaunchIcon('udapp') + .selectContract('t1est') + .pause(1000) + .createContract('') + .clickInstance(0) + .selectContract('t2est') + .pause(1000) + .createContract('') + .click('i.savetransaction') + .modalFooterOKClick() + .click('*[data-id="deployAndRunClearInstances"]') // clear udapp + .click('*[data-id="terminalClearConsole"]') // clear terminal + .click('#runTabView .runtransaction') + .clickInstance(1) + .pause(1000) + .clickFunction('set2 - transact (not payable)', { types: 'uint256 _po', values: '10' }) + .testFunction('0xa88bf726e706480f61f04a066452929030c0a0216cc6923106f863963339bdb7', + { + status: 'true Transaction mined and execution succeed', + 'transaction hash': '0xa88bf726e706480f61f04a066452929030c0a0216cc6923106f863963339bdb7', + 'decoded input': { 'uint256 _po': { type: 'BigNumber', hex: '0x0a' } } + }) + .end() }, tearDown: sauce } -const sources = [{'browser/testRecorder.sol': {content: `contract testRecorder { +const sources = [{ + 'browser/testRecorder.sol': { + content: `contract testRecorder { constructor(uint p) public { } function set (uint _p) public { } -}`}}, -{'browser/multipleContracts.sol': {content: `contract t1est { +}` + } +}, +{ + 'browser/multipleContracts.sol': { + content: `contract t1est { uint p; t2est t; constructor () public { @@ -120,7 +125,9 @@ contract t2est { function set2(uint _po) public { p = _po; } -}`}} +}` + } +} ] const records = `{ @@ -282,70 +289,70 @@ const records = `{ }` const scenario = { - 'accounts': { + accounts: { 'account{10}': '0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c' }, - 'linkReferences': {}, - 'transactions': [ + linkReferences: {}, + transactions: [ { - 'timestamp': 1512912691086, - 'record': { - 'value': '0', - 'parameters': [ + timestamp: 1512912691086, + record: { + value: '0', + parameters: [ "12" // eslint-disable-line ], - 'abi': '0x54a8c0ab653c15bfb48b47fd011ba2b9617af01cb45cab344acd57c924d56798', - 'contractName': 'testRecorder', - 'bytecode': '6060604052341561000f57600080fd5b6040516020806100cd833981016040528080519060200190919050505060938061003a6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506064565b005b505600a165627a7a723058204839660366b94f5f3c8c6da233a2c5fe95ad5635b5c8a2bb630a8b845d68ecdd0029', - 'linkReferences': {}, - 'name': '', - 'type': 'constructor', - 'inputs': '(uint256)', - 'from': 'account{10}' + abi: '0x54a8c0ab653c15bfb48b47fd011ba2b9617af01cb45cab344acd57c924d56798', + contractName: 'testRecorder', + bytecode: '6060604052341561000f57600080fd5b6040516020806100cd833981016040528080519060200190919050505060938061003a6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506064565b005b505600a165627a7a723058204839660366b94f5f3c8c6da233a2c5fe95ad5635b5c8a2bb630a8b845d68ecdd0029', + linkReferences: {}, + name: '', + type: 'constructor', + inputs: '(uint256)', + from: 'account{10}' } }, { - 'timestamp': 1512912696128, - 'record': { - 'value': '0', - 'parameters': [ + timestamp: 1512912696128, + record: { + value: '0', + parameters: [ "34" // eslint-disable-line ], - 'to': 'created{1512912691086}', - 'abi': '0x54a8c0ab653c15bfb48b47fd011ba2b9617af01cb45cab344acd57c924d56798', - 'name': 'set', - 'inputs': '(uint256)', - 'type': 'function', - 'from': 'account{10}' + to: 'created{1512912691086}', + abi: '0x54a8c0ab653c15bfb48b47fd011ba2b9617af01cb45cab344acd57c924d56798', + name: 'set', + inputs: '(uint256)', + type: 'function', + from: 'account{10}' } } ], - 'abis': { + abis: { '0x54a8c0ab653c15bfb48b47fd011ba2b9617af01cb45cab344acd57c924d56798': [ { - 'constant': false, - 'inputs': [ + constant: false, + inputs: [ { - 'name': '_p', - 'type': 'uint256' + name: '_p', + type: 'uint256' } ], - 'name': 'set', - 'outputs': [], - 'payable': false, - 'stateMutability': 'nonpayable', - 'type': 'function' + name: 'set', + outputs: [], + payable: false, + stateMutability: 'nonpayable', + type: 'function' }, { - 'inputs': [ + inputs: [ { - 'name': 'p', - 'type': 'uint256' + name: 'p', + type: 'uint256' } ], - 'payable': false, - 'stateMutability': 'nonpayable', - 'type': 'constructor' + payable: false, + stateMutability: 'nonpayable', + type: 'constructor' } ] } diff --git a/apps/remix-ide-e2e/src/tests/remixd.test.ts b/apps/remix-ide-e2e/src/tests/remixd.test.ts index 11a007c069..a5dc1a7a4c 100644 --- a/apps/remix-ide-e2e/src/tests/remixd.test.ts +++ b/apps/remix-ide-e2e/src/tests/remixd.test.ts @@ -1,5 +1,5 @@ 'use strict' -import { NightwatchBrowser } from "nightwatch" +import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' import sauce from './sauce' @@ -21,20 +21,20 @@ const gmbhTestContract = `contract gmbh { ` const sources = [ { - 'localhost/folder1/contract2.sol': {content: 'contract test2 { function get () public returns (uint) { return 11; }}'} + 'localhost/folder1/contract2.sol': { content: 'contract test2 { function get () public returns (uint) { return 11; }}' } }, { - 'localhost/src/gmbh/company.sol': {content: assetsTestContract} + 'localhost/src/gmbh/company.sol': { content: assetsTestContract } }, { - 'localhost/src/gmbh/company.sol': {content: assetsTestContract}, - 'localhost/src/gmbh/contract.sol': {content: gmbhTestContract} + 'localhost/src/gmbh/company.sol': { content: assetsTestContract }, + 'localhost/src/gmbh/contract.sol': { content: gmbhTestContract } }, { - 'browser/test_import_node_modules.sol': {content: 'import "openzeppelin-solidity/contracts/math/SafeMath.sol";'} + 'browser/test_import_node_modules.sol': { content: 'import "openzeppelin-solidity/contracts/math/SafeMath.sol";' } }, { - 'browser/test_import_node_modules_with_github_import.sol': {content: 'import "openzeppelin-solidity/contracts/sample.sol";'} + 'browser/test_import_node_modules_with_github_import.sol': { content: 'import "openzeppelin-solidity/contracts/sample.sol";' } } ] @@ -47,7 +47,7 @@ module.exports = { return sources }, - 'Remixd': function (browser) { + Remixd: function (browser) { runTests(browser) }, 'Import from node_modules ': function (browser) { @@ -57,32 +57,32 @@ module.exports = { */ browser.waitForElementVisible('#icon-panel', 2000) - .clickLaunchIcon('fileExplorers') - .addFile('test_import_node_modules.sol', sources[3]['browser/test_import_node_modules.sol']) - .clickLaunchIcon('solidity') - .testContracts('test_import_node_modules.sol', sources[3]['browser/test_import_node_modules.sol'], ['SafeMath']) + .clickLaunchIcon('fileExplorers') + .addFile('test_import_node_modules.sol', sources[3]['browser/test_import_node_modules.sol']) + .clickLaunchIcon('solidity') + .testContracts('test_import_node_modules.sol', sources[3]['browser/test_import_node_modules.sol'], ['SafeMath']) }, 'Import from node_modules and reference a github import': function (browser) { browser.waitForElementVisible('#icon-panel', 2000) - .clickLaunchIcon('fileExplorers') - .addFile('test_import_node_modules_with_github_import.sol', sources[4]['browser/test_import_node_modules_with_github_import.sol']) - .clickLaunchIcon('solidity') - .setSolidityCompilerVersion('soljson-v0.8.0+commit.c7dfd78e.js') // open-zeppelin moved to pragma ^0.8.0 - .testContracts('test_import_node_modules_with_github_import.sol', sources[4]['browser/test_import_node_modules_with_github_import.sol'], ['ERC20', 'test11']) - }, + .clickLaunchIcon('fileExplorers') + .addFile('test_import_node_modules_with_github_import.sol', sources[4]['browser/test_import_node_modules_with_github_import.sol']) + .clickLaunchIcon('solidity') + .setSolidityCompilerVersion('soljson-v0.8.0+commit.c7dfd78e.js') // open-zeppelin moved to pragma ^0.8.0 + .testContracts('test_import_node_modules_with_github_import.sol', sources[4]['browser/test_import_node_modules_with_github_import.sol'], ['ERC20', 'test11']) + }, 'Run git status': function (browser) { browser - .executeScript('git status') - .pause(3000) - .journalLastChildIncludes('On branch ') + .executeScript('git status') + .pause(3000) + .journalLastChildIncludes('On branch ') }, 'Close Remixd': function (browser) { browser - .clickLaunchIcon('pluginManager') - .scrollAndClick('#pluginManager article[id="remixPluginManagerListItem_remixd"] button') - .end() + .clickLaunchIcon('pluginManager') + .scrollAndClick('#pluginManager article[id="remixPluginManagerListItem_remixd"] button') + .end() }, tearDown: sauce } diff --git a/apps/remix-ide-e2e/src/tests/runAndDeploy.ts b/apps/remix-ide-e2e/src/tests/runAndDeploy.ts index 5d7218bd2c..cf94e72a46 100644 --- a/apps/remix-ide-e2e/src/tests/runAndDeploy.ts +++ b/apps/remix-ide-e2e/src/tests/runAndDeploy.ts @@ -1,6 +1,5 @@ 'use strict' -import { doesNotThrow } from 'assert' -import { NightwatchBrowser } from "nightwatch" +import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' import sauce from './sauce' @@ -19,147 +18,147 @@ module.exports = { 'Should load run and deploy tab': function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="remixIdeSidePanel"]') - .clickLaunchIcon('udapp') - .waitForElementPresent('*[data-id="sidePanelSwapitTitle"]') - .assert.containsText('*[data-id="sidePanelSwapitTitle"]', 'DEPLOY & RUN TRANSACTIONS') + .clickLaunchIcon('udapp') + .waitForElementPresent('*[data-id="sidePanelSwapitTitle"]') + .assert.containsText('*[data-id="sidePanelSwapitTitle"]', 'DEPLOY & RUN TRANSACTIONS') }, 'Should load run and deploy tab and check value validation': function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="remixIdeSidePanel"]') - .assert.containsText('*[data-id="sidePanelSwapitTitle"]', 'DEPLOY & RUN TRANSACTIONS') - .validateValueInput('#value', '0000', '0') - .validateValueInput('#value', '', '0') - .validateValueInput('#value', 'dragon', '0') + .assert.containsText('*[data-id="sidePanelSwapitTitle"]', 'DEPLOY & RUN TRANSACTIONS') + .validateValueInput('#value', '0000', '0') + .validateValueInput('#value', '', '0') + .validateValueInput('#value', 'dragon', '0') }, 'Should sign message using account key': function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="settingsRemixRunSignMsg"]') - .click('*[data-id="settingsRemixRunSignMsg"]') - .pause(2000) - .waitForElementPresent('*[data-id="modalDialogCustomPromptText"]') - .setValue('*[data-id="modalDialogCustomPromptText"]', 'Remix is cool!') - .assert.elementNotPresent('*[data-id="settingsRemixRunSignMsgHash"]') - .assert.elementNotPresent('*[data-id="settingsRemixRunSignMsgSignature"]') - .modalFooterOKClick() - .waitForElementPresent('*[data-id="modalDialogContainer"]', 12000) - .assert.elementPresent('*[data-id="settingsRemixRunSignMsgHash"]') - .assert.elementPresent('*[data-id="settingsRemixRunSignMsgSignature"]') - .modalFooterOKClick() + .click('*[data-id="settingsRemixRunSignMsg"]') + .pause(2000) + .waitForElementPresent('*[data-id="modalDialogCustomPromptText"]') + .setValue('*[data-id="modalDialogCustomPromptText"]', 'Remix is cool!') + .assert.elementNotPresent('*[data-id="settingsRemixRunSignMsgHash"]') + .assert.elementNotPresent('*[data-id="settingsRemixRunSignMsgSignature"]') + .modalFooterOKClick() + .waitForElementPresent('*[data-id="modalDialogContainer"]', 12000) + .assert.elementPresent('*[data-id="settingsRemixRunSignMsgHash"]') + .assert.elementPresent('*[data-id="settingsRemixRunSignMsgSignature"]') + .modalFooterOKClick() }, 'Should deploy contract on JavascriptVM': function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="remixIdeSidePanel"]') - .clickLaunchIcon('fileExplorers') - .addFile('Greet.sol', sources[0]['browser/Greet.sol']) - .clickLaunchIcon('udapp') - .selectAccount('0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c') - .waitForElementPresent('*[data-id="Deploy - transact (not payable)"]', 45000) - .click('*[data-id="Deploy - transact (not payable)"]') - .pause(5000) - .testFunction('0x82f6c88a909b49d6cc003fb302a6e0184c3f08e942b62e1c95dec326d4c6020b', { - status: 'true Transaction mined and execution succeed', - 'transaction hash': '0x82f6c88a909b49d6cc003fb302a6e0184c3f08e942b62e1c95dec326d4c6020b' - }) + .clickLaunchIcon('fileExplorers') + .addFile('Greet.sol', sources[0]['browser/Greet.sol']) + .clickLaunchIcon('udapp') + .selectAccount('0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c') + .waitForElementPresent('*[data-id="Deploy - transact (not payable)"]', 45000) + .click('*[data-id="Deploy - transact (not payable)"]') + .pause(5000) + .testFunction('0x82f6c88a909b49d6cc003fb302a6e0184c3f08e942b62e1c95dec326d4c6020b', { + status: 'true Transaction mined and execution succeed', + 'transaction hash': '0x82f6c88a909b49d6cc003fb302a6e0184c3f08e942b62e1c95dec326d4c6020b' + }) }, 'Should run low level interaction (fallback function)': function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="remixIdeSidePanel"]') - .waitForElementPresent('*[data-id="universalDappUiTitleExpander"]') - .click('*[data-id="universalDappUiTitleExpander"]') - .waitForElementPresent('*[data-id="pluginManagerSettingsDeployAndRunLLTxSendTransaction"]') - .click('*[data-id="pluginManagerSettingsDeployAndRunLLTxSendTransaction"]') - .pause(5000) - .testFunction('0xfe718871ee0b4d03cdcac0e12e5b164efaf7e23ba952c07db76e62692867019b', { - status: 'true Transaction mined and execution succeed', - 'transaction hash': '0xfe718871ee0b4d03cdcac0e12e5b164efaf7e23ba952c07db76e62692867019b' - }) - .end() + .waitForElementPresent('*[data-id="universalDappUiTitleExpander"]') + .click('*[data-id="universalDappUiTitleExpander"]') + .waitForElementPresent('*[data-id="pluginManagerSettingsDeployAndRunLLTxSendTransaction"]') + .click('*[data-id="pluginManagerSettingsDeployAndRunLLTxSendTransaction"]') + .pause(5000) + .testFunction('0xfe718871ee0b4d03cdcac0e12e5b164efaf7e23ba952c07db76e62692867019b', { + status: 'true Transaction mined and execution succeed', + 'transaction hash': '0xfe718871ee0b4d03cdcac0e12e5b164efaf7e23ba952c07db76e62692867019b' + }) + .end() }, 'Should connect to Goerli Test Network using MetaMask': '' + function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="remixIdeSidePanel"]') - .setupMetamask(passphrase, password) - .click('.network-indicator__down-arrow') - .useXpath().click("//span[text()='Goerli Test Network']") - .useCss().switchBrowserTab(0) - .refresh() - .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) - .click('*[data-id="landingPageStartSolidity"]') - .pause(5000) - .clickLaunchIcon('udapp') - .waitForElementPresent('*[data-id="settingsSelectEnvOptions"]') - .click('*[data-id="settingsSelectEnvOptions"] option[id="injected-mode"]') - .waitForElementPresent('*[data-id="settingsNetworkEnv"]') - .assert.containsText('*[data-id="settingsNetworkEnv"]', 'Goerli (5) network') - .switchBrowserTab(2) - .waitForElementPresent('.page-container__footer-button:nth-of-type(2)') - .click('.page-container__footer-button:nth-of-type(2)') - .switchBrowserTab(0) + .setupMetamask(passphrase, password) + .click('.network-indicator__down-arrow') + .useXpath().click("//span[text()='Goerli Test Network']") + .useCss().switchBrowserTab(0) + .refresh() + .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) + .click('*[data-id="landingPageStartSolidity"]') + .pause(5000) + .clickLaunchIcon('udapp') + .waitForElementPresent('*[data-id="settingsSelectEnvOptions"]') + .click('*[data-id="settingsSelectEnvOptions"] option[id="injected-mode"]') + .waitForElementPresent('*[data-id="settingsNetworkEnv"]') + .assert.containsText('*[data-id="settingsNetworkEnv"]', 'Goerli (5) network') + .switchBrowserTab(2) + .waitForElementPresent('.page-container__footer-button:nth-of-type(2)') + .click('.page-container__footer-button:nth-of-type(2)') + .switchBrowserTab(0) }, 'Should deploy contract on Goerli Test Network using MetaMask': '' + function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="runTabSelectAccount"] option') - .clickLaunchIcon('fileExplorers') - .openFile('browser/Greet.sol') - .clickLaunchIcon('udapp') - .waitForElementPresent('*[data-id="Deploy - transact (not payable)"]') - .click('*[data-id="Deploy - transact (not payable)"]') - .switchBrowserTab(2) - .waitForElementPresent('.transaction-status--unapproved') - .click('.transaction-status--unapproved') - .waitForElementPresent('.page-container__footer-button:nth-of-type(2)') - .click('.page-container__footer-button:nth-of-type(2)') - .waitForElementPresent('.transaction-status--submitted') - .pause(25000) - .switchBrowserTab(0) + .clickLaunchIcon('fileExplorers') + .openFile('browser/Greet.sol') + .clickLaunchIcon('udapp') + .waitForElementPresent('*[data-id="Deploy - transact (not payable)"]') + .click('*[data-id="Deploy - transact (not payable)"]') + .switchBrowserTab(2) + .waitForElementPresent('.transaction-status--unapproved') + .click('.transaction-status--unapproved') + .waitForElementPresent('.page-container__footer-button:nth-of-type(2)') + .click('.page-container__footer-button:nth-of-type(2)') + .waitForElementPresent('.transaction-status--submitted') + .pause(25000) + .switchBrowserTab(0) }, 'Should run low level interaction (fallback function) on Goerli Test Network using MetaMask': '' + function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="remixIdeSidePanel"]') - .waitForElementPresent('*[data-id="universalDappUiTitleExpander"]') - .click('*[data-id="universalDappUiTitleExpander"]') - .waitForElementPresent('*[data-id="pluginManagerSettingsDeployAndRunLLTxSendTransaction"]') - .click('*[data-id="pluginManagerSettingsDeployAndRunLLTxSendTransaction"]') - .switchBrowserTab(2) - .waitForElementPresent('.transaction-status--unapproved') - .click('.transaction-status--unapproved') - .waitForElementPresent('.page-container__footer-button:nth-of-type(2)') - .click('.page-container__footer-button:nth-of-type(2)') - .waitForElementPresent('.transaction-status--submitted') - .pause(25000) - .switchBrowserTab(0) - .end() + .waitForElementPresent('*[data-id="universalDappUiTitleExpander"]') + .click('*[data-id="universalDappUiTitleExpander"]') + .waitForElementPresent('*[data-id="pluginManagerSettingsDeployAndRunLLTxSendTransaction"]') + .click('*[data-id="pluginManagerSettingsDeployAndRunLLTxSendTransaction"]') + .switchBrowserTab(2) + .waitForElementPresent('.transaction-status--unapproved') + .click('.transaction-status--unapproved') + .waitForElementPresent('.page-container__footer-button:nth-of-type(2)') + .click('.page-container__footer-button:nth-of-type(2)') + .waitForElementPresent('.transaction-status--submitted') + .pause(25000) + .switchBrowserTab(0) + .end() }, 'Should connect to Ethereum Main Network using MetaMask': '' + function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="remixIdeSidePanel"]') - .switchBrowserTab(2) - .waitForElementPresent('.network-indicator__down-arrow') - .click('.network-indicator__down-arrow') - .useXpath().click("//span[text()='Main Ethereum Network']") - .useCss().switchBrowserTab(0) - .refresh() - .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) - .click('*[data-id="landingPageStartSolidity"]') - .pause(5000) - .clickLaunchIcon('udapp') - .waitForElementPresent('*[data-id="settingsSelectEnvOptions"]') - .click('*[data-id="settingsSelectEnvOptions"] option[id="injected-mode"]') - .waitForElementPresent('*[data-id="settingsNetworkEnv"]') - .assert.containsText('*[data-id="settingsNetworkEnv"]', 'Main (1) network') + .switchBrowserTab(2) + .waitForElementPresent('.network-indicator__down-arrow') + .click('.network-indicator__down-arrow') + .useXpath().click("//span[text()='Main Ethereum Network']") + .useCss().switchBrowserTab(0) + .refresh() + .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) + .click('*[data-id="landingPageStartSolidity"]') + .pause(5000) + .clickLaunchIcon('udapp') + .waitForElementPresent('*[data-id="settingsSelectEnvOptions"]') + .click('*[data-id="settingsSelectEnvOptions"] option[id="injected-mode"]') + .waitForElementPresent('*[data-id="settingsNetworkEnv"]') + .assert.containsText('*[data-id="settingsNetworkEnv"]', 'Main (1) network') }, 'Should deploy contract on Ethereum Main Network using MetaMask': '' + function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="runTabSelectAccount"] option') - .clickLaunchIcon('fileExplorers') - .openFile('browser/Greet.sol') - .clickLaunchIcon('udapp') - .waitForElementPresent('*[data-id="Deploy - transact (not payable)"]') - .click('*[data-id="Deploy - transact (not payable)"]') - .waitForElementPresent('*[data-id="modalDialogContainer"]', 15000) - .pause(10000) - .assert.containsText('*[data-id="modalDialogModalBody"]', 'You are creating a transaction on the main network. Click confirm if you are sure to continue.') - .modalFooterCancelClick() + .clickLaunchIcon('fileExplorers') + .openFile('browser/Greet.sol') + .clickLaunchIcon('udapp') + .waitForElementPresent('*[data-id="Deploy - transact (not payable)"]') + .click('*[data-id="Deploy - transact (not payable)"]') + .waitForElementPresent('*[data-id="modalDialogContainer"]', 15000) + .pause(10000) + .assert.containsText('*[data-id="modalDialogModalBody"]', 'You are creating a transaction on the main network. Click confirm if you are sure to continue.') + .modalFooterCancelClick() }, /* @@ -171,35 +170,35 @@ module.exports = { */ 'Should debug Ropsten transaction with source highlighting using the source verifier service and MetaMask': '' + function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="remixIdeSidePanel"]') - .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) - .switchBrowserTab(2) - .waitForElementPresent('.network-indicator__down-arrow') - .click('.network-indicator__down-arrow') - .useXpath().click("//span[text()='Ropsten Test Network']") // switch to Ropsten - .useCss().switchBrowserTab(0) - .refresh() - .clickLaunchIcon('pluginManager') // load debugger and source verification + .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) + .switchBrowserTab(2) + .waitForElementPresent('.network-indicator__down-arrow') + .click('.network-indicator__down-arrow') + .useXpath().click("//span[text()='Ropsten Test Network']") // switch to Ropsten + .useCss().switchBrowserTab(0) + .refresh() + .clickLaunchIcon('pluginManager') // load debugger and source verification // .scrollAndClick('#pluginManager article[id="remixPluginManagerListItem_source-verification"] button') // debugger already activated .scrollAndClick('#pluginManager article[id="remixPluginManagerListItem_debugger"] button') - .clickLaunchIcon('udapp') - .waitForElementPresent('*[data-id="settingsSelectEnvOptions"]') - .click('*[data-id="settingsSelectEnvOptions"] option[id="injected-mode"]') // switch to Ropsten in udapp - .waitForElementPresent('*[data-id="settingsNetworkEnv"]') - .assert.containsText('*[data-id="settingsNetworkEnv"]', 'Ropsten (3) network') - .clickLaunchIcon('debugger') - .setValue('*[data-id="debuggerTransactionInput"]', '0x959371506b8f6223d71c709ac2eb2d0158104dca2d76ca949f1662712cf0e6db') // debug tx - .click('*[data-id="debuggerTransactionStartButton"]') - .waitForElementVisible('*[data-id="treeViewDivto"]', 30000) - .assert.containsText('*[data-id="stepdetail"]', 'loaded address:\n0x3c943Fb816694d7D1f4C738e3e7823818a88DD6C') - .assert.containsText('*[data-id="solidityLocals"]', 'to: 0x6C3CCC7FBA111707D5A1AAF2758E9D4F4AC5E7B1') + .clickLaunchIcon('udapp') + .waitForElementPresent('*[data-id="settingsSelectEnvOptions"]') + .click('*[data-id="settingsSelectEnvOptions"] option[id="injected-mode"]') // switch to Ropsten in udapp + .waitForElementPresent('*[data-id="settingsNetworkEnv"]') + .assert.containsText('*[data-id="settingsNetworkEnv"]', 'Ropsten (3) network') + .clickLaunchIcon('debugger') + .setValue('*[data-id="debuggerTransactionInput"]', '0x959371506b8f6223d71c709ac2eb2d0158104dca2d76ca949f1662712cf0e6db') // debug tx + .click('*[data-id="debuggerTransactionStartButton"]') + .waitForElementVisible('*[data-id="treeViewDivto"]', 30000) + .assert.containsText('*[data-id="stepdetail"]', 'loaded address:\n0x3c943Fb816694d7D1f4C738e3e7823818a88DD6C') + .assert.containsText('*[data-id="solidityLocals"]', 'to: 0x6C3CCC7FBA111707D5A1AAF2758E9D4F4AC5E7B1') }, 'Call web3.eth.getAccounts() using Injected web3 (Metamask)': '' + function (browser: NightwatchBrowser) { browser - .executeScript(`web3.eth.getAccounts()`) - .pause(2000) - .journalLastChildIncludes(`[ "0x76a3ABb5a12dcd603B52Ed22195dED17ee82708f" ]`) - .end() + .executeScript('web3.eth.getAccounts()') + .pause(2000) + .journalLastChildIncludes('[ "0x76a3ABb5a12dcd603B52Ed22195dED17ee82708f" ]') + .end() }, tearDown: sauce } diff --git a/apps/remix-ide-e2e/src/tests/signingMessage.test.ts b/apps/remix-ide-e2e/src/tests/signingMessage.test.ts index 88679b5ce6..41e834352a 100644 --- a/apps/remix-ide-e2e/src/tests/signingMessage.test.ts +++ b/apps/remix-ide-e2e/src/tests/signingMessage.test.ts @@ -1,5 +1,5 @@ 'use strict' -import { NightwatchBrowser } from "nightwatch" +import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' import sauce from './sauce' @@ -15,16 +15,16 @@ module.exports = { 'Test Signature': function (browser: NightwatchBrowser) { let hash, signature browser - .clickLaunchIcon('udapp') - .selectAccount('0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c') // this account will be used for this test suite - .signMessage('test message', (h, s) => { - hash = h - signature = s - console.log('hash', hash) - console.log('signature', signature) - browser.assert.ok(typeof hash.value === 'string', 'type of hash.value must be String') - browser.assert.ok(typeof signature.value === 'string', 'type of signature.value must be String') - }) + .clickLaunchIcon('udapp') + .selectAccount('0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c') // this account will be used for this test suite + .signMessage('test message', (h, s) => { + hash = h + signature = s + console.log('hash', hash) + console.log('signature', signature) + browser.assert.ok(typeof hash.value === 'string', 'type of hash.value must be String') + browser.assert.ok(typeof signature.value === 'string', 'type of signature.value must be String') + }) .addFile('signMassage.sol', sources[0]['browser/signMassage.sol']) .openFile('browser/signMassage.sol') .clickLaunchIcon('solidity') @@ -41,13 +41,13 @@ module.exports = { const inputs = `"${hash.value}","${signature.value}"` console.log('Test Signature Input', inputs) browser.clickFunction('ecrecovery - call', { types: 'bytes32 hash, bytes sig', values: inputs }) - .pause(5000) - .verifyCallReturnValue( - address, - ['0:address: 0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c']) - .perform(() => { - done() - }) + .pause(5000) + .verifyCallReturnValue( + address, + ['0:address: 0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c']) + .perform(() => { + done() + }) }) }) .end() @@ -57,7 +57,8 @@ module.exports = { const sources = [ { - 'browser/signMassage.sol': {content: ` + 'browser/signMassage.sol': { + content: ` pragma solidity >=0.4.22 <0.8.0; contract SignMassageTest { function testRecovery(bytes32 h, uint8 v, bytes32 r, bytes32 s) public pure returns (address) { @@ -95,6 +96,7 @@ const sources = [ function ecverify(bytes32 hash, bytes memory sig, address signer) public pure returns (bool) { return signer == ecrecovery(hash, sig); } - }`} + }` + } } ] diff --git a/apps/remix-ide-e2e/src/tests/solidityImport.test.ts b/apps/remix-ide-e2e/src/tests/solidityImport.test.ts index 2edd2ad6f0..665c47379a 100644 --- a/apps/remix-ide-e2e/src/tests/solidityImport.test.ts +++ b/apps/remix-ide-e2e/src/tests/solidityImport.test.ts @@ -1,5 +1,5 @@ 'use strict' -import { NightwatchBrowser } from "nightwatch" +import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' import sauce from './sauce' @@ -34,80 +34,80 @@ module.exports = { .setSolidityCompilerVersion('soljson-v0.8.0+commit.c7dfd78e.js') // open-zeppelin moved to pragma ^0.8.0 (master branch) .addFile('Untitled4.sol', sources[3]['browser/Untitled4.sol']) .clickLaunchIcon('fileExplorers') - .verifyContracts(['test7', 'ERC20'], {wait: 10000}) + .verifyContracts(['test7', 'ERC20'], { wait: 10000 }) }, 'Test Github Import - from other branch': function (browser: NightwatchBrowser) { browser - .setSolidityCompilerVersion('soljson-v0.5.0+commit.1d4f565a.js') // switch back to 0.5.0 : release-v2.3.0 branch is not solidity 0.6 compliant - .addFile('Untitled5.sol', sources[4]['browser/Untitled5.sol']) - .clickLaunchIcon('fileExplorers') - .verifyContracts(['test8', 'ERC20', 'SafeMath'], {wait: 10000}) + .setSolidityCompilerVersion('soljson-v0.5.0+commit.1d4f565a.js') // switch back to 0.5.0 : release-v2.3.0 branch is not solidity 0.6 compliant + .addFile('Untitled5.sol', sources[4]['browser/Untitled5.sol']) + .clickLaunchIcon('fileExplorers') + .verifyContracts(['test8', 'ERC20', 'SafeMath'], { wait: 10000 }) }, 'Test Github Import - no branch specified': function (browser: NightwatchBrowser) { browser - .setSolidityCompilerVersion('soljson-v0.8.0+commit.c7dfd78e.js') // open-zeppelin moved to pragma ^0.8.0 (master branch) - .clickLaunchIcon('fileExplorers') - .click('li[data-id="treeViewLitreeViewItembrowser/README.txt"') - .addFile('Untitled6.sol', sources[5]['browser/Untitled6.sol']) - .clickLaunchIcon('fileExplorers') - .verifyContracts(['test10', 'ERC20'], {wait: 10000}) + .setSolidityCompilerVersion('soljson-v0.8.0+commit.c7dfd78e.js') // open-zeppelin moved to pragma ^0.8.0 (master branch) + .clickLaunchIcon('fileExplorers') + .click('li[data-id="treeViewLitreeViewItembrowser/README.txt"') + .addFile('Untitled6.sol', sources[5]['browser/Untitled6.sol']) + .clickLaunchIcon('fileExplorers') + .verifyContracts(['test10', 'ERC20'], { wait: 10000 }) }, 'Test Github Import - raw URL': function (browser: NightwatchBrowser) { browser - .clickLaunchIcon('fileExplorers') - .click('li[data-id="treeViewLitreeViewItembrowser/README.txt"') - .addFile('Untitled7.sol', sources[6]['browser/Untitled7.sol']) - .clickLaunchIcon('fileExplorers') - .verifyContracts(['test11', 'ERC20'], {wait: 10000}) + .clickLaunchIcon('fileExplorers') + .click('li[data-id="treeViewLitreeViewItembrowser/README.txt"') + .addFile('Untitled7.sol', sources[6]['browser/Untitled7.sol']) + .clickLaunchIcon('fileExplorers') + .verifyContracts(['test11', 'ERC20'], { wait: 10000 }) }, - + 'Test switch to a github import from a solidity warning': function (browser: NightwatchBrowser) { browser - .setSolidityCompilerVersion('soljson-v0.7.4+commit.3f05b770.js') - .clickLaunchIcon('fileExplorers') - .click('li[data-id="treeViewLitreeViewItembrowser/README.txt"') - .addFile('Untitled8.sol', sources[7]['browser/Untitled8.sol']) - .clickLaunchIcon('fileExplorers') - .clickLaunchIcon('solidity') - .waitForElementPresent('[data-id="compiledErrors"] div:nth-child(3)', 45000) - .scrollAndClick('[data-id="compiledErrors"] div:nth-child(3)') // click on error which point to ERC20 code - .pause(5000) - .getEditorValue((content) => { - browser.assert.ok(content.indexOf(`contract ERC20 is Context, IERC20`) != -1, + .setSolidityCompilerVersion('soljson-v0.7.4+commit.3f05b770.js') + .clickLaunchIcon('fileExplorers') + .click('li[data-id="treeViewLitreeViewItembrowser/README.txt"') + .addFile('Untitled8.sol', sources[7]['browser/Untitled8.sol']) + .clickLaunchIcon('fileExplorers') + .clickLaunchIcon('solidity') + .waitForElementPresent('[data-id="compiledErrors"] div:nth-child(3)', 45000) + .scrollAndClick('[data-id="compiledErrors"] div:nth-child(3)') // click on error which point to ERC20 code + .pause(5000) + .getEditorValue((content) => { + browser.assert.ok(content.indexOf('contract ERC20 is Context, IERC20') !== -1, 'current displayed content should be from the ERC20 source code') - }) - .end() + }) + .end() }, tearDown: sauce } const sources = [ { - 'browser/Untitled.sol': {content: 'contract test1 {} contract test2 {}'} + 'browser/Untitled.sol': { content: 'contract test1 {} contract test2 {}' } }, { - 'browser/Untitled1.sol': {content: 'import "./Untitled2.sol"; contract test6 {}'}, - 'browser/Untitled2.sol': {content: 'contract test4 {} contract test5 {}'} + 'browser/Untitled1.sol': { content: 'import "./Untitled2.sol"; contract test6 {}' }, + 'browser/Untitled2.sol': { content: 'contract test4 {} contract test5 {}' } }, { - 'browser/Untitled3.sol': {content: 'import "./Untitled11.sol"; contract test6 {}'} + 'browser/Untitled3.sol': { content: 'import "./Untitled11.sol"; contract test6 {}' } }, { - 'browser/Untitled4.sol': {content: 'import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol"; contract test7 {}'} + 'browser/Untitled4.sol': { content: 'import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol"; contract test7 {}' } }, { - 'browser/Untitled5.sol': {content: 'import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v2.3.0/contracts/token/ERC20/ERC20.sol"; contract test8 {}'} + 'browser/Untitled5.sol': { content: 'import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v2.3.0/contracts/token/ERC20/ERC20.sol"; contract test8 {}' } }, { - 'browser/Untitled6.sol': {content: 'import "https://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol"; contract test10 {}'} + 'browser/Untitled6.sol': { content: 'import "https://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol"; contract test10 {}' } }, { - 'browser/Untitled7.sol': {content: 'import "https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-contracts/master/contracts/token/ERC20/ERC20.sol"; contract test11 {}'} + 'browser/Untitled7.sol': { content: 'import "https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-contracts/master/contracts/token/ERC20/ERC20.sol"; contract test11 {}' } }, { - 'browser/Untitled8.sol': {content: 'import "https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-contracts/master/contracts/token/ERC20/ERC20.sol"; contract test12 {}'} + 'browser/Untitled8.sol': { content: 'import "https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-contracts/master/contracts/token/ERC20/ERC20.sol"; contract test12 {}' } } ] diff --git a/apps/remix-ide-e2e/src/tests/solidityUnittests.test.ts b/apps/remix-ide-e2e/src/tests/solidityUnittests.test.ts index 83a1071633..d75408dd03 100644 --- a/apps/remix-ide-e2e/src/tests/solidityUnittests.test.ts +++ b/apps/remix-ide-e2e/src/tests/solidityUnittests.test.ts @@ -1,6 +1,6 @@ 'use strict' -import { NightwatchBrowser } from "nightwatch" +import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' import sauce from './sauce' @@ -16,145 +16,145 @@ module.exports = { 'Should launch solidity unit test plugin': function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="verticalIconsKindfileExplorers"]') - .clickLaunchIcon('fileExplorers') - .addFile('simple_storage.sol', sources[0]['browser/simple_storage.sol']) - .addFile('ks2a.sol', sources[0]['browser/ks2a.sol']) - .clickLaunchIcon('pluginManager') - .scrollAndClick('*[data-id="pluginManagerComponentActivateButtonsolidityUnitTesting"]') - .click('*[data-id="verticalIconsKindsolidityUnitTesting"]') - .waitForElementPresent('*[data-id="sidePanelSwapitTitle"]') - .assert.containsText('*[data-id="sidePanelSwapitTitle"]', 'SOLIDITY UNIT TESTING') + .clickLaunchIcon('fileExplorers') + .addFile('simple_storage.sol', sources[0]['browser/simple_storage.sol']) + .addFile('ks2a.sol', sources[0]['browser/ks2a.sol']) + .clickLaunchIcon('pluginManager') + .scrollAndClick('*[data-id="pluginManagerComponentActivateButtonsolidityUnitTesting"]') + .click('*[data-id="verticalIconsKindsolidityUnitTesting"]') + .waitForElementPresent('*[data-id="sidePanelSwapitTitle"]') + .assert.containsText('*[data-id="sidePanelSwapitTitle"]', 'SOLIDITY UNIT TESTING') }, 'Should generate test file': function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="verticalIconsKindfileExplorers"]') - .clickLaunchIcon('fileExplorers') - .openFile('browser/simple_storage.sol') - .click('*[data-id="verticalIconsKindsolidityUnitTesting"]') - .waitForElementPresent('*[data-id="testTabGenerateTestFile"]') - .click('*[data-id="testTabGenerateTestFile"]') - .waitForElementPresent('*[title="browser/tests/simple_storage_test.sol"]') - .clickLaunchIcon('fileExplorers') - .pause(10000) - .openFile('browser/tests/simple_storage_test.sol') - .removeFile('browser/tests/simple_storage_test.sol') + .clickLaunchIcon('fileExplorers') + .openFile('browser/simple_storage.sol') + .click('*[data-id="verticalIconsKindsolidityUnitTesting"]') + .waitForElementPresent('*[data-id="testTabGenerateTestFile"]') + .click('*[data-id="testTabGenerateTestFile"]') + .waitForElementPresent('*[title="browser/tests/simple_storage_test.sol"]') + .clickLaunchIcon('fileExplorers') + .pause(10000) + .openFile('browser/tests/simple_storage_test.sol') + .removeFile('browser/tests/simple_storage_test.sol') }, 'Should run simple unit test `simple_storage_test.sol` ': function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="verticalIconsKindfileExplorers"]') - .addFile('tests/simple_storage_test.sol', sources[0]['browser/tests/simple_storage_test.sol']) - .click('*[data-id="verticalIconsKindsolidityUnitTesting"]') - .waitForElementPresent('*[data-id="testTabCheckAllTests"]') - .click('*[data-id="testTabCheckAllTests"]') - .clickElementAtPosition('.singleTestLabel', 1) - .scrollAndClick('*[data-id="testTabRunTestsTabRunAction"]') - .waitForElementPresent('*[data-id="testTabSolidityUnitTestsOutputheader"]', 80000) - .pause(5000) - .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'MyTest (browser/tests/simple_storage_test.sol)') - .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', '✓ Initial value should be100') - .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', '✓ Value is set200') - .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', '✘ Should fail for wrong value200') - .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'Passing: 2') - .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'Failing: 1') - .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'FAIL MyTest (browser/tests/simple_storage_test.sol)') + .addFile('tests/simple_storage_test.sol', sources[0]['browser/tests/simple_storage_test.sol']) + .click('*[data-id="verticalIconsKindsolidityUnitTesting"]') + .waitForElementPresent('*[data-id="testTabCheckAllTests"]') + .click('*[data-id="testTabCheckAllTests"]') + .clickElementAtPosition('.singleTestLabel', 1) + .scrollAndClick('*[data-id="testTabRunTestsTabRunAction"]') + .waitForElementPresent('*[data-id="testTabSolidityUnitTestsOutputheader"]', 80000) + .pause(5000) + .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'MyTest (browser/tests/simple_storage_test.sol)') + .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', '✓ Initial value should be100') + .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', '✓ Value is set200') + .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', '✘ Should fail for wrong value200') + .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'Passing: 2') + .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'Failing: 1') + .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'FAIL MyTest (browser/tests/simple_storage_test.sol)') }, 'Should run advance unit test using natspec and experimental ABIEncoderV2 `ks2b_test.sol` ': function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="verticalIconsKindfileExplorers"]') - .clickLaunchIcon('fileExplorers') - .addFile('tests/ks2b_test.sol', sources[0]['browser/tests/ks2b_test.sol']) - .click('*[data-id="verticalIconsKindsolidityUnitTesting"]') - .waitForElementPresent('*[data-id="testTabCheckAllTests"]') - .click('*[data-id="testTabCheckAllTests"]') - .clickElementAtPosition('.singleTestLabel', 2) - .scrollAndClick('*[data-id="testTabRunTestsTabRunAction"]') - .waitForElementPresent('*[data-id="testTabSolidityUnitTestsOutputheader"]', 40000) - .pause(5000) - .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'browser/tests/ks2b_test.sol') - .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', '✓ Check project exists') - .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', '✘ Check wrong project owner') - .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', '✘ Check wrong sender') - .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', '✘ Check wrong value') - .pause(5000) - .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', '✓ Check project is fundable') - .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'owner is incorrect') - .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'wrong sender') - .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'wrong value') + .clickLaunchIcon('fileExplorers') + .addFile('tests/ks2b_test.sol', sources[0]['browser/tests/ks2b_test.sol']) + .click('*[data-id="verticalIconsKindsolidityUnitTesting"]') + .waitForElementPresent('*[data-id="testTabCheckAllTests"]') + .click('*[data-id="testTabCheckAllTests"]') + .clickElementAtPosition('.singleTestLabel', 2) + .scrollAndClick('*[data-id="testTabRunTestsTabRunAction"]') + .waitForElementPresent('*[data-id="testTabSolidityUnitTestsOutputheader"]', 40000) + .pause(5000) + .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'browser/tests/ks2b_test.sol') + .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', '✓ Check project exists') + .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', '✘ Check wrong project owner') + .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', '✘ Check wrong sender') + .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', '✘ Check wrong value') + .pause(5000) + .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', '✓ Check project is fundable') + .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'owner is incorrect') + .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'wrong sender') + .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'wrong value') }, 'Should stop unit tests during test execution` ': function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="verticalIconsKindfileExplorers"]') - .waitForElementPresent('*[data-id="testTabRunTestsTabRunAction"]') - .clickElementAtPosition('.singleTestLabel', 0) - .clickElementAtPosition('.singleTestLabel', 1) - .scrollAndClick('*[data-id="testTabRunTestsTabRunAction"]') - .pause(5000) - .click('*[data-id="testTabRunTestsTabStopAction"]') + .waitForElementPresent('*[data-id="testTabRunTestsTabRunAction"]') + .clickElementAtPosition('.singleTestLabel', 0) + .clickElementAtPosition('.singleTestLabel', 1) + .scrollAndClick('*[data-id="testTabRunTestsTabRunAction"]') + .pause(5000) + .click('*[data-id="testTabRunTestsTabStopAction"]') // .pause(1000) - .assert.containsText('*[data-id="testTabRunTestsTabStopAction"]', 'Stopping') - .waitForElementPresent('*[data-id="testTabSolidityUnitTestsOutputheader"]', 40000) - .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'browser/tests/ks2b_test.sol') - .notContainsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'browser/tests/4_Ballot_test.sol') - .notContainsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'browser/tests/simple_storage_test.sol') - .pause(7000) - .assert.containsText('*[data-id="testTabTestsExecutionStopped"]', 'The test execution has been stopped') + .assert.containsText('*[data-id="testTabRunTestsTabStopAction"]', 'Stopping') + .waitForElementPresent('*[data-id="testTabSolidityUnitTestsOutputheader"]', 40000) + .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'browser/tests/ks2b_test.sol') + .notContainsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'browser/tests/4_Ballot_test.sol') + .notContainsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'browser/tests/simple_storage_test.sol') + .pause(7000) + .assert.containsText('*[data-id="testTabTestsExecutionStopped"]', 'The test execution has been stopped') }, 'Should fail on compilation': function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="verticalIconsKindfileExplorers"]') - .addFile('tests/compilationError_test.sol', sources[0]['browser/compilationError_test.sol']) - .clickLaunchIcon('fileExplorers') - .openFile('browser/tests/compilationError_test.sol') - .clickLaunchIcon('solidityUnitTesting') - .click('*[data-id="testTabCheckAllTests"]') - .clickElementAtPosition('.singleTestLabel', 3) - .scrollAndClick('*[data-id="testTabRunTestsTabRunAction"]') - .waitForElementPresent('*[data-id="testTabSolidityUnitTestsOutputheader"]', 40000) - .waitForElementPresent('*[data-id="testTabSolidityUnitTestsOutput"]') - .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'SyntaxError: No visibility specified') - .assert.containsText('*[data-id="testTabTestsExecutionStoppedError"]', 'The test execution has been stopped because of error(s) in your test file') + .addFile('tests/compilationError_test.sol', sources[0]['browser/compilationError_test.sol']) + .clickLaunchIcon('fileExplorers') + .openFile('browser/tests/compilationError_test.sol') + .clickLaunchIcon('solidityUnitTesting') + .click('*[data-id="testTabCheckAllTests"]') + .clickElementAtPosition('.singleTestLabel', 3) + .scrollAndClick('*[data-id="testTabRunTestsTabRunAction"]') + .waitForElementPresent('*[data-id="testTabSolidityUnitTestsOutputheader"]', 40000) + .waitForElementPresent('*[data-id="testTabSolidityUnitTestsOutput"]') + .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'SyntaxError: No visibility specified') + .assert.containsText('*[data-id="testTabTestsExecutionStoppedError"]', 'The test execution has been stopped because of error(s) in your test file') }, 'Should fail on deploy': function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="verticalIconsKindfileExplorers"]') - .addFile('tests/deployError_test.sol', sources[0]['browser/tests/deployError_test.sol']) - .clickLaunchIcon('fileExplorers') - .openFile('browser/tests/deployError_test.sol') - .clickLaunchIcon('solidityUnitTesting') - .click('*[data-id="testTabCheckAllTests"]') - .clickElementAtPosition('.singleTestLabel', 4) - .scrollAndClick('*[data-id="testTabRunTestsTabRunAction"]') - .waitForElementPresent('*[data-id="testTabSolidityUnitTestsOutputheader"]', 40000) - .waitForElementPresent('*[data-id="testTabSolidityUnitTestsOutput"]') - .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'contract deployment failed after trying twice') + .addFile('tests/deployError_test.sol', sources[0]['browser/tests/deployError_test.sol']) + .clickLaunchIcon('fileExplorers') + .openFile('browser/tests/deployError_test.sol') + .clickLaunchIcon('solidityUnitTesting') + .click('*[data-id="testTabCheckAllTests"]') + .clickElementAtPosition('.singleTestLabel', 4) + .scrollAndClick('*[data-id="testTabRunTestsTabRunAction"]') + .waitForElementPresent('*[data-id="testTabSolidityUnitTestsOutputheader"]', 40000) + .waitForElementPresent('*[data-id="testTabSolidityUnitTestsOutput"]') + .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'contract deployment failed after trying twice') }, 'Should fail when parameters are to method in test contract': function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="verticalIconsKindfileExplorers"]') - .addFile('tests/methodFailure_test.sol', sources[0]['browser/tests/methodFailure_test.sol']) - .clickLaunchIcon('fileExplorers') - .openFile('browser/tests/methodFailure_test.sol') - .clickLaunchIcon('solidityUnitTesting') - .click('*[data-id="testTabCheckAllTests"]') - .clickElementAtPosition('.singleTestLabel', 5) - .scrollAndClick('*[data-id="testTabRunTestsTabRunAction"]') - .waitForElementPresent('*[data-id="testTabSolidityUnitTestsOutputheader"]', 40000) - .waitForElementPresent('*[data-id="testTabSolidityUnitTestsOutput"]') - .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', `Method 'add' can not have parameters inside a test contract`) + .addFile('tests/methodFailure_test.sol', sources[0]['browser/tests/methodFailure_test.sol']) + .clickLaunchIcon('fileExplorers') + .openFile('browser/tests/methodFailure_test.sol') + .clickLaunchIcon('solidityUnitTesting') + .click('*[data-id="testTabCheckAllTests"]') + .clickElementAtPosition('.singleTestLabel', 5) + .scrollAndClick('*[data-id="testTabRunTestsTabRunAction"]') + .waitForElementPresent('*[data-id="testTabSolidityUnitTestsOutputheader"]', 40000) + .waitForElementPresent('*[data-id="testTabSolidityUnitTestsOutput"]') + .assert.containsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'Method \'add\' can not have parameters inside a test contract') }, 'Changing current path': function (browser: NightwatchBrowser) { browser - .waitForElementPresent('*[data-id="verticalIconsKindfileExplorers"]') - .addFile('myTests/simple_storage_test.sol', sources[0]['browser/tests/simple_storage_test.sol']) - .clickLaunchIcon('solidityUnitTesting') - .setValue('*[data-id="uiPathInput"]', 'browser/myTests') - .clickElementAtPosition('.singleTestLabel', 0) - .scrollAndClick('*[data-id="testTabRunTestsTabRunAction"]') - .waitForElementPresent('*[data-id="testTabSolidityUnitTestsOutputheader"]', 40000) - .waitForElementPresent('*[data-id="testTabSolidityUnitTestsOutput"]') - .clearValue('*[data-id="uiPathInput"]') - .setValue('*[data-id="uiPathInput"]', 'browser/tests') + .waitForElementPresent('*[data-id="verticalIconsKindfileExplorers"]') + .addFile('myTests/simple_storage_test.sol', sources[0]['browser/tests/simple_storage_test.sol']) + .clickLaunchIcon('solidityUnitTesting') + .setValue('*[data-id="uiPathInput"]', 'browser/myTests') + .clickElementAtPosition('.singleTestLabel', 0) + .scrollAndClick('*[data-id="testTabRunTestsTabRunAction"]') + .waitForElementPresent('*[data-id="testTabSolidityUnitTestsOutputheader"]', 40000) + .waitForElementPresent('*[data-id="testTabSolidityUnitTestsOutput"]') + .clearValue('*[data-id="uiPathInput"]') + .setValue('*[data-id="uiPathInput"]', 'browser/tests') }, 'Solidity Unittests': function (browser: NightwatchBrowser) { diff --git a/apps/remix-ide-e2e/src/tests/specialFunctions.test.ts b/apps/remix-ide-e2e/src/tests/specialFunctions.test.ts index 2b6e1a2ecd..6afbda4fad 100644 --- a/apps/remix-ide-e2e/src/tests/specialFunctions.test.ts +++ b/apps/remix-ide-e2e/src/tests/specialFunctions.test.ts @@ -1,5 +1,5 @@ 'use strict' -import { NightwatchBrowser } from "nightwatch" +import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' import sauce from './sauce' @@ -20,22 +20,22 @@ module.exports = { 'Use special functions receive/fallback - both are declared, sending data': function (browser: NightwatchBrowser) { browser.waitForElementVisible('#icon-panel', 10000) - .testContracts('receiveAndFallback.sol', sources[0]['browser/receiveAndFallback.sol'], ['CheckSpecials']) // compile - .clickLaunchIcon('udapp') - .selectAccount('0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c') // this account will be used for this test suite - .selectContract('CheckSpecials') - .createContract('') // deploy - .clickInstance(0) - .perform((done) => { - browser.getAddressAtPosition(0, (address) => { - browser.sendLowLevelTx(address, '0', '0xaa') - .pause(1000) - .journalLastChildIncludes('to: CheckSpecials.(fallback)') - .journalLastChildIncludes('value: 0 wei') - .journalLastChildIncludes('data: 0xaa') - .perform(done) + .testContracts('receiveAndFallback.sol', sources[0]['browser/receiveAndFallback.sol'], ['CheckSpecials']) // compile + .clickLaunchIcon('udapp') + .selectAccount('0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c') // this account will be used for this test suite + .selectContract('CheckSpecials') + .createContract('') // deploy + .clickInstance(0) + .perform((done) => { + browser.getAddressAtPosition(0, (address) => { + browser.sendLowLevelTx(address, '0', '0xaa') + .pause(1000) + .journalLastChildIncludes('to: CheckSpecials.(fallback)') + .journalLastChildIncludes('value: 0 wei') + .journalLastChildIncludes('data: 0xaa') + .perform(done) + }) }) - }) }, 'Use special functions receive/fallback - both are declared, failing sending data < 1 byte': function (browser: NightwatchBrowser) { @@ -43,10 +43,10 @@ module.exports = { browser.perform((done) => { browser.getAddressAtPosition(0, (address) => { browser.sendLowLevelTx(address, '0', '0xa') - .pause(1000) - .waitForElementVisible(`#instance${address} label[id="deployAndRunLLTxError"]`) - .assert.containsText(`#instance${address} label[id="deployAndRunLLTxError"]`, `The calldata should be a valid hexadecimal value with size of at least one byte.`) - .perform(done) + .pause(1000) + .waitForElementVisible(`#instance${address} label[id="deployAndRunLLTxError"]`) + .assert.containsText(`#instance${address} label[id="deployAndRunLLTxError"]`, 'The calldata should be a valid hexadecimal value with size of at least one byte.') + .perform(done) }) }) }, @@ -55,10 +55,10 @@ module.exports = { browser.perform((done) => { browser.getAddressAtPosition(0, (address) => { browser.sendLowLevelTx(address, '0', '0x1aa') - .pause(1000) - .waitForElementVisible(`#instance${address} label[id="deployAndRunLLTxError"]`) - .assert.containsText(`#instance${address} label[id="deployAndRunLLTxError"]`, `The calldata should be a valid hexadecimal value.`) - .perform(done) + .pause(1000) + .waitForElementVisible(`#instance${address} label[id="deployAndRunLLTxError"]`) + .assert.containsText(`#instance${address} label[id="deployAndRunLLTxError"]`, 'The calldata should be a valid hexadecimal value.') + .perform(done) }) }) }, @@ -67,11 +67,11 @@ module.exports = { browser.perform((done) => { browser.getAddressAtPosition(0, (address) => { browser.sendLowLevelTx(address, '1', '') - .pause(1000) - .journalLastChildIncludes('to: CheckSpecials.(receive)') - .journalLastChildIncludes('value: 1 wei') - .journalLastChildIncludes('data: 0x') - .perform(done) + .pause(1000) + .journalLastChildIncludes('to: CheckSpecials.(receive)') + .journalLastChildIncludes('value: 1 wei') + .journalLastChildIncludes('data: 0x') + .perform(done) }) }) }, @@ -80,146 +80,146 @@ module.exports = { browser.perform((done) => { browser.getAddressAtPosition(0, (address) => { browser.sendLowLevelTx(address, '10', '0xaa') - .pause(1000) - .journalLastChildIncludes('to CheckSpecials.(fallback) errored:') - .journalLastChildIncludes('The called function should be payable if you send value') - .perform(done) + .pause(1000) + .journalLastChildIncludes('to CheckSpecials.(fallback) errored:') + .journalLastChildIncludes('The called function should be payable if you send value') + .perform(done) }) }) }, 'Use special functions receive/fallback - only receive is declared, sending wei': function (browser: NightwatchBrowser) { browser.waitForElementVisible('#icon-panel', 10000) - .testContracts('receiveOnly.sol', sources[1]['browser/receiveOnly.sol'], ['CheckSpecials']) - .clickLaunchIcon('udapp') - .selectContract('CheckSpecials') - .createContract('') - .clickInstance(1) - .perform((done) => { - browser.getAddressAtPosition(1, (address) => { - browser.sendLowLevelTx(address, '1', '') - .pause(1000) - .journalLastChildIncludes('to: CheckSpecials.(receive)') - .journalLastChildIncludes('value: 1 wei') - .journalLastChildIncludes('data: 0x') - .perform(done) + .testContracts('receiveOnly.sol', sources[1]['browser/receiveOnly.sol'], ['CheckSpecials']) + .clickLaunchIcon('udapp') + .selectContract('CheckSpecials') + .createContract('') + .clickInstance(1) + .perform((done) => { + browser.getAddressAtPosition(1, (address) => { + browser.sendLowLevelTx(address, '1', '') + .pause(1000) + .journalLastChildIncludes('to: CheckSpecials.(receive)') + .journalLastChildIncludes('value: 1 wei') + .journalLastChildIncludes('data: 0x') + .perform(done) + }) }) - }) }, 'Use special functions receive/fallback - only receive is declared, failing, fallback is not declared, sending data': function (browser: NightwatchBrowser) { // don't need to redeploy it, same contract browser.perform((done) => { browser.getAddressAtPosition(1, (address) => { browser.sendLowLevelTx(address, '0', '0xaa') - .pause(1000) - .waitForElementVisible(`#instance${address} label[id="deployAndRunLLTxError"]`) - .assert.containsText(`#instance${address} label[id="deployAndRunLLTxError"]`, `'Fallback' function is not defined`) - .perform(done) + .pause(1000) + .waitForElementVisible(`#instance${address} label[id="deployAndRunLLTxError"]`) + .assert.containsText(`#instance${address} label[id="deployAndRunLLTxError"]`, '\'Fallback\' function is not defined') + .perform(done) }) }) }, 'Use special functions receive/fallback - only fallback declared and is payable, sending wei': function (browser: NightwatchBrowser) { browser.waitForElementVisible('#icon-panel', 10000) - .testContracts('fallbackOnlyPayable.sol', sources[2]['browser/fallbackOnlyPayable.sol'], ['CheckSpecials']) - .clickLaunchIcon('udapp') - .selectContract('CheckSpecials') - .createContract('') - .clickInstance(2) - .perform((done) => { - browser.getAddressAtPosition(2, (address) => { - browser.sendLowLevelTx(address, '1', '') - .pause(1000) - .journalLastChildIncludes('to: CheckSpecials.(fallback)') - .journalLastChildIncludes('value: 1 wei') - .journalLastChildIncludes('data: 0x') - .perform(done) + .testContracts('fallbackOnlyPayable.sol', sources[2]['browser/fallbackOnlyPayable.sol'], ['CheckSpecials']) + .clickLaunchIcon('udapp') + .selectContract('CheckSpecials') + .createContract('') + .clickInstance(2) + .perform((done) => { + browser.getAddressAtPosition(2, (address) => { + browser.sendLowLevelTx(address, '1', '') + .pause(1000) + .journalLastChildIncludes('to: CheckSpecials.(fallback)') + .journalLastChildIncludes('value: 1 wei') + .journalLastChildIncludes('data: 0x') + .perform(done) + }) }) - }) }, 'Use special functions receive/fallback - only fallback is diclared and is payable, sending data and wei': function (browser: NightwatchBrowser) { // don't need to redeploy it, same contract browser.perform((done) => { browser.getAddressAtPosition(2, (address) => { browser.sendLowLevelTx(address, '1', '0xaa') - .pause(1000) - .journalLastChildIncludes('to: CheckSpecials.(fallback)') - .journalLastChildIncludes('value: 1 wei') - .journalLastChildIncludes('data: 0xaa') - .perform(done) + .pause(1000) + .journalLastChildIncludes('to: CheckSpecials.(fallback)') + .journalLastChildIncludes('value: 1 wei') + .journalLastChildIncludes('data: 0xaa') + .perform(done) }) }) }, 'Use special functions receive/fallback - only fallback is declared, fallback should fail cause not payable, sending wei': function (browser: NightwatchBrowser) { browser.waitForElementVisible('#icon-panel', 10000) - .testContracts('fallbackOnlyNotPayable.sol', sources[3]['browser/fallbackOnlyNotPayable.sol'], ['CheckSpecials']) - .clickLaunchIcon('udapp') - .selectContract('CheckSpecials') - .createContract('') - .clickInstance(3) - .perform((done) => { - browser.getAddressAtPosition(3, (address) => { - browser.sendLowLevelTx(address, '1', '') - .pause(1000) - .waitForElementVisible(`#instance${address} label[id="deployAndRunLLTxError"]`) - .assert.containsText(`#instance${address} label[id="deployAndRunLLTxError"]`, `should have either 'receive' or payable 'fallback'`) - .perform(done) + .testContracts('fallbackOnlyNotPayable.sol', sources[3]['browser/fallbackOnlyNotPayable.sol'], ['CheckSpecials']) + .clickLaunchIcon('udapp') + .selectContract('CheckSpecials') + .createContract('') + .clickInstance(3) + .perform((done) => { + browser.getAddressAtPosition(3, (address) => { + browser.sendLowLevelTx(address, '1', '') + .pause(1000) + .waitForElementVisible(`#instance${address} label[id="deployAndRunLLTxError"]`) + .assert.containsText(`#instance${address} label[id="deployAndRunLLTxError"]`, 'should have either \'receive\' or payable \'fallback\'') + .perform(done) + }) }) - }) }, 'Use special functions receive/fallback - receive and fallback are declared, sending data and wei': function (browser: NightwatchBrowser) { browser.waitForElementVisible('#icon-panel', 10000) - .testContracts('receiveAndFallbackBothPayable.sol', sources[4]['browser/receiveAndFallbackBothPayable.sol'], ['CheckSpecials']) - .clickLaunchIcon('udapp') - .selectContract('CheckSpecials') - .waitForElementVisible('#value') - .clearValue('#value') - .setValue('#value', '0') - .createContract('') - .clickInstance(4) - .pause(1000) - .perform((done) => { - browser.getAddressAtPosition(4, (address) => { - browser.sendLowLevelTx(address, '1', '0xaa') - .pause(1000) - .journalLastChildIncludes('to: CheckSpecials.(fallback)') - .journalLastChildIncludes('value: 1 wei') - .journalLastChildIncludes('data: 0xaa') - .perform(done) + .testContracts('receiveAndFallbackBothPayable.sol', sources[4]['browser/receiveAndFallbackBothPayable.sol'], ['CheckSpecials']) + .clickLaunchIcon('udapp') + .selectContract('CheckSpecials') + .waitForElementVisible('#value') + .clearValue('#value') + .setValue('#value', '0') + .createContract('') + .clickInstance(4) + .pause(1000) + .perform((done) => { + browser.getAddressAtPosition(4, (address) => { + browser.sendLowLevelTx(address, '1', '0xaa') + .pause(1000) + .journalLastChildIncludes('to: CheckSpecials.(fallback)') + .journalLastChildIncludes('value: 1 wei') + .journalLastChildIncludes('data: 0xaa') + .perform(done) + }) }) - }) }, 'Use special functions receive/fallback - receive and fallback are declared and payable, sending wei': function (browser: NightwatchBrowser) { browser.perform((done) => { browser.getAddressAtPosition(4, (address) => { browser.sendLowLevelTx(address, '1', '') - .pause(1000) - .journalLastChildIncludes('to: CheckSpecials.(receive)') - .journalLastChildIncludes('value: 1 wei') - .journalLastChildIncludes('data: 0x') - .perform(done) + .pause(1000) + .journalLastChildIncludes('to: CheckSpecials.(receive)') + .journalLastChildIncludes('value: 1 wei') + .journalLastChildIncludes('data: 0x') + .perform(done) }) }) }, 'Use special functions receive/fallback - receive and fallback are not declared, sending nothing': function (browser: NightwatchBrowser) { browser.waitForElementVisible('#icon-panel', 10000) - .testContracts('notSpecial.sol', sources[5]['browser/notSpecial.sol'], ['CheckSpecials']) - .clickLaunchIcon('udapp') - .selectContract('CheckSpecials') - .waitForElementVisible('#value') - .clearValue('#value') - .setValue('#value', '0') - .createContract('') - .clickInstance(5) - .pause(1000) - .perform((done) => { - browser.getAddressAtPosition(5, (address) => { - browser.sendLowLevelTx(address, '0', '') - .pause(1000) - .waitForElementVisible(`#instance${address} label[id="deployAndRunLLTxError"]`) - .assert.containsText(`#instance${address} label[id="deployAndRunLLTxError"]`, `Both 'receive' and 'fallback' functions are not defined`) - .perform(done) + .testContracts('notSpecial.sol', sources[5]['browser/notSpecial.sol'], ['CheckSpecials']) + .clickLaunchIcon('udapp') + .selectContract('CheckSpecials') + .waitForElementVisible('#value') + .clearValue('#value') + .setValue('#value', '0') + .createContract('') + .clickInstance(5) + .pause(1000) + .perform((done) => { + browser.getAddressAtPosition(5, (address) => { + browser.sendLowLevelTx(address, '0', '') + .pause(1000) + .waitForElementVisible(`#instance${address} label[id="deployAndRunLLTxError"]`) + .assert.containsText(`#instance${address} label[id="deployAndRunLLTxError"]`, 'Both \'receive\' and \'fallback\' functions are not defined') + .perform(done) + }) }) - }) - .end() + .end() }, tearDown: sauce } diff --git a/apps/remix-ide-e2e/src/tests/staticAnalysis.test.ts b/apps/remix-ide-e2e/src/tests/staticAnalysis.test.ts index 3f18eaa00e..c916d02074 100644 --- a/apps/remix-ide-e2e/src/tests/staticAnalysis.test.ts +++ b/apps/remix-ide-e2e/src/tests/staticAnalysis.test.ts @@ -1,11 +1,12 @@ 'use strict' -import { NightwatchBrowser } from "nightwatch" +import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' import sauce from './sauce' const sources = [ { - 'browser/Untitled.sol': {content: ` + 'browser/Untitled.sol': { + content: ` pragma solidity >=0.6.0 <0.8.0; contract test1 { address test = tx.origin; } contract test2 {} @@ -16,7 +17,9 @@ contract TooMuchGas { uint test; uint test1; } -}`}} +}` + } + } ] module.exports = { @@ -44,11 +47,11 @@ function runTests (browser: NightwatchBrowser) { listSelectorContains(['Use of tx.origin', 'Fallback function of contract TooMuchGas requires too much gas', 'TooMuchGas.() : Variables have very similar names "test" and "test1".', - 'TooMuchGas.() : Variables have very similar names "test" and "test1".' ], - '#staticanalysisresult .warning', - browser, function () { - browser.end() - } + 'TooMuchGas.() : Variables have very similar names "test" and "test1".'], + '#staticanalysisresult .warning', + browser, function () { + browser.end() + } ) }) } diff --git a/apps/remix-ide-e2e/src/tests/terminal.test.ts b/apps/remix-ide-e2e/src/tests/terminal.test.ts index 57edb3c1cd..09fcd3cb33 100644 --- a/apps/remix-ide-e2e/src/tests/terminal.test.ts +++ b/apps/remix-ide-e2e/src/tests/terminal.test.ts @@ -1,5 +1,5 @@ 'use strict' -import { NightwatchBrowser } from "nightwatch" +import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' import sauce from './sauce' @@ -10,115 +10,114 @@ module.exports = { 'Should execution a simple console command': function (browser: NightwatchBrowser) { browser - .waitForElementVisible('*[data-id="terminalCli"]', 10000) - .executeScript('console.log(1 + 1)') - .journalLastChild('2') + .waitForElementVisible('*[data-id="terminalCli"]', 10000) + .executeScript('console.log(1 + 1)') + .journalLastChild('2') }, 'Should clear console': function (browser: NightwatchBrowser) { browser - .waitForElementVisible('*[data-id="terminalCli"]') - .journalChildIncludes('Welcome to Remix') - .click('#clearConsole') - .assert.containsText('*[data-id="terminalJournal"]', '') + .waitForElementVisible('*[data-id="terminalCli"]') + .journalChildIncludes('Welcome to Remix') + .click('#clearConsole') + .assert.containsText('*[data-id="terminalJournal"]', '') }, 'Should display auto-complete menu': function (browser: NightwatchBrowser) { browser - .waitForElementVisible('*[data-id="terminalCli"]') - .click('*[data-id="terminalCli"]') - .sendKeys('*[data-id="terminalCliInput"]', 'remix.') - .assert.visible('*[data-id="autoCompletePopUpAutoCompleteItem"]') + .waitForElementVisible('*[data-id="terminalCli"]') + .click('*[data-id="terminalCli"]') + .sendKeys('*[data-id="terminalCliInput"]', 'remix.') + .assert.visible('*[data-id="autoCompletePopUpAutoCompleteItem"]') }, 'Should execute remix.help() command': function (browser: NightwatchBrowser) { browser - .waitForElementVisible('*[data-id="terminalCli"]') - .executeScript('remix.help()') - .journalChildIncludes('remix.loadgist(id)') - .journalChildIncludes('remix.loadurl(url)') - .journalChildIncludes('remix.execute(filepath)') - .journalChildIncludes('remix.exeCurrent()') - .journalChildIncludes('remix.help()') + .waitForElementVisible('*[data-id="terminalCli"]') + .executeScript('remix.help()') + .journalChildIncludes('remix.loadgist(id)') + .journalChildIncludes('remix.loadurl(url)') + .journalChildIncludes('remix.execute(filepath)') + .journalChildIncludes('remix.exeCurrent()') + .journalChildIncludes('remix.help()') }, 'Async/Await Script': function (browser: NightwatchBrowser) { browser - .addFile('asyncAwait.js', { content: asyncAwait }) - .openFile('browser/asyncAwait.js') - .executeScript(`remix.execute('browser/asyncAwait.js')`) - .journalLastChild('Waiting Promise') - .pause(5500) - .journalLastChild('result - Promise Resolved') + .addFile('asyncAwait.js', { content: asyncAwait }) + .openFile('browser/asyncAwait.js') + .executeScript('remix.execute(\'browser/asyncAwait.js\')') + .journalLastChild('Waiting Promise') + .pause(5500) + .journalLastChild('result - Promise Resolved') }, 'Call Remix File Manager from a script': function (browser: NightwatchBrowser) { browser - .addFile('asyncAwaitWithFileManagerAccess.js', { content: asyncAwaitWithFileManagerAccess }) - .openFile('browser/asyncAwaitWithFileManagerAccess.js') - .pause(5000) - .executeScript(`remix.execute('browser/asyncAwaitWithFileManagerAccess.js')`) - .pause(6000) - .journalLastChildIncludes('contract Ballot {') + .addFile('asyncAwaitWithFileManagerAccess.js', { content: asyncAwaitWithFileManagerAccess }) + .openFile('browser/asyncAwaitWithFileManagerAccess.js') + .pause(5000) + .executeScript('remix.execute(\'browser/asyncAwaitWithFileManagerAccess.js\')') + .pause(6000) + .journalLastChildIncludes('contract Ballot {') }, 'Call web3.eth.getAccounts() using JavaScript VM': function (browser: NightwatchBrowser) { browser - .executeScript(`web3.eth.getAccounts()`) - .pause(2000) - .journalLastChildIncludes(`[ "0x5B38Da6a701c568545dCfcB03FcB875f56beddC4", "0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2", "0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db", "0x78731D3Ca6b7E34aC0F824c42a7cC18A495cabaB", "0x617F2E2fD72FD9D5503197092aC168c91465E7f2", "0x17F6AD8Ef982297579C203069C1DbfFE4348c372", "0x5c6B0f7Bf3E7ce046039Bd8FABdfD3f9F5021678", "0x03C6FcED478cBbC9a4FAB34eF9f40767739D1Ff7", "0x1aE0EA34a72D944a8C7603FfB3eC30a6669E454C", "0x0A098Eda01Ce92ff4A4CCb7A4fFFb5A43EBC70DC", "0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c", "0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C", "0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB", "0x583031D1113aD414F02576BD6afaBfb302140225", "0xdD870fA1b7C4700F2BD7f44238821C26f7392148" ]`) + .executeScript('web3.eth.getAccounts()') + .pause(2000) + .journalLastChildIncludes('[ "0x5B38Da6a701c568545dCfcB03FcB875f56beddC4", "0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2", "0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db", "0x78731D3Ca6b7E34aC0F824c42a7cC18A495cabaB", "0x617F2E2fD72FD9D5503197092aC168c91465E7f2", "0x17F6AD8Ef982297579C203069C1DbfFE4348c372", "0x5c6B0f7Bf3E7ce046039Bd8FABdfD3f9F5021678", "0x03C6FcED478cBbC9a4FAB34eF9f40767739D1Ff7", "0x1aE0EA34a72D944a8C7603FfB3eC30a6669E454C", "0x0A098Eda01Ce92ff4A4CCb7A4fFFb5A43EBC70DC", "0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c", "0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C", "0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB", "0x583031D1113aD414F02576BD6afaBfb302140225", "0xdD870fA1b7C4700F2BD7f44238821C26f7392148" ]') }, 'Call web3.eth.getAccounts() using Web3 Provider': function (browser: NightwatchBrowser) { browser - .click('*[data-id="terminalClearConsole"]') // clear the terminal - .clickLaunchIcon('udapp') - .click('*[data-id="settingsWeb3Mode"]') - .modalFooterOKClick() - .executeScript(`web3.eth.getAccounts()`) - .pause(2000) - .journalLastChildIncludes(`[ "`) // we check if an array is present, don't need to check for the content - .journalLastChildIncludes('" ]') - .journalLastChildIncludes('", "') + .click('*[data-id="terminalClearConsole"]') // clear the terminal + .clickLaunchIcon('udapp') + .click('*[data-id="settingsWeb3Mode"]') + .modalFooterOKClick() + .executeScript('web3.eth.getAccounts()') + .pause(2000) + .journalLastChildIncludes('[ "') // we check if an array is present, don't need to check for the content + .journalLastChildIncludes('" ]') + .journalLastChildIncludes('", "') }, 'Call Remix File Resolver (external URL) from a script': function (browser: NightwatchBrowser) { browser - .click('*[data-id="terminalClearConsole"]') // clear the terminal - .addFile('resolveExternalUrlAndSave.js', { content: resolveExternalUrlAndSave }) - .openFile('browser/resolveExternalUrlAndSave.js') - .pause(1000) - .executeScript(`remix.execute('browser/resolveExternalUrlAndSave.js')`) - .pause(6000) - .journalLastChildIncludes('Implementation of the {IERC20} interface.') - .openFile('browser/github/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol') + .click('*[data-id="terminalClearConsole"]') // clear the terminal + .addFile('resolveExternalUrlAndSave.js', { content: resolveExternalUrlAndSave }) + .openFile('browser/resolveExternalUrlAndSave.js') + .pause(1000) + .executeScript('remix.execute(\'browser/resolveExternalUrlAndSave.js\')') + .pause(6000) + .journalLastChildIncludes('Implementation of the {IERC20} interface.') + .openFile('browser/github/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol') }, 'Call Remix File Resolver (internal URL) from a script': function (browser: NightwatchBrowser) { browser - .click('*[data-id="terminalClearConsole"]') // clear the terminal - .addFile('resolveUrl.js', { content: resolveUrl }) - .openFile('browser/resolveUrl.js') - .pause(1000) - .executeScript(`remix.execute('browser/resolveUrl.js')`) - .pause(6000) - .journalLastChildIncludes('contract Ballot {') + .click('*[data-id="terminalClearConsole"]') // clear the terminal + .addFile('resolveUrl.js', { content: resolveUrl }) + .openFile('browser/resolveUrl.js') + .pause(1000) + .executeScript('remix.execute(\'browser/resolveUrl.js\')') + .pause(6000) + .journalLastChildIncludes('contract Ballot {') }, 'Call Remix File Resolver (internal URL) from a script and specify a path': function (browser: NightwatchBrowser) { browser - .click('*[data-id="terminalClearConsole"]') // clear the terminal - .addFile('resolveExternalUrlAndSaveToaPath.js', { content: resolveExternalUrlAndSaveToaPath }) - .openFile('browser/resolveExternalUrlAndSaveToaPath.js') - .pause(1000) - .executeScript(`remix.execute('browser/resolveExternalUrlAndSaveToaPath.js')`) - .pause(6000) - .journalLastChildIncludes('abstract contract ERC20Burnable') - .openFile('browser/github/newFile.sol') - .end() + .click('*[data-id="terminalClearConsole"]') // clear the terminal + .addFile('resolveExternalUrlAndSaveToaPath.js', { content: resolveExternalUrlAndSaveToaPath }) + .openFile('browser/resolveExternalUrlAndSaveToaPath.js') + .pause(1000) + .executeScript('remix.execute(\'browser/resolveExternalUrlAndSaveToaPath.js\')') + .pause(6000) + .journalLastChildIncludes('abstract contract ERC20Burnable') + .openFile('browser/github/newFile.sol') + .end() }, - tearDown: sauce } diff --git a/apps/remix-ide-e2e/src/tests/transactionExecution.test.ts b/apps/remix-ide-e2e/src/tests/transactionExecution.test.ts index 3fc21b266d..9e3cd64d8f 100644 --- a/apps/remix-ide-e2e/src/tests/transactionExecution.test.ts +++ b/apps/remix-ide-e2e/src/tests/transactionExecution.test.ts @@ -1,5 +1,5 @@ 'use strict' -import { NightwatchBrowser } from "nightwatch" +import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' import sauce from './sauce' @@ -13,35 +13,35 @@ module.exports = { 'Execute Simple Contract and Test Terminal': function (browser: NightwatchBrowser) { browser.testContracts('Untitled.sol', sources[0]['browser/Untitled.sol'], ['TestContract']) - .clickLaunchIcon('udapp') - .selectAccount('0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c') // this account will be used for this test suite - .click('#runTabView button[class^="instanceButton"]') - .waitForElementPresent('.instance:nth-of-type(2)') - .click('.instance:nth-of-type(2) > div > button') - .click('#runTabView .instance div[class^="title"]') - .click('#runTabView .instance div[class^="title"]') - .clickFunction('f - transact (not payable)') - .testFunction('0x38bb944fa4709ed9e163d6c670259f97284b4defd916d512a2fcc3f35bb53e03', - { - status: 'true Transaction mined and execution succeed', - 'transaction hash': '0x38bb944fa4709ed9e163d6c670259f97284b4defd916d512a2fcc3f35bb53e03', - 'decoded output': { '0': 'uint256: 8' } - }) - .pause(500) - .checkTerminalFilter('0x12332162e2e31397dc1e07ed0a1cf08f728e9b4487c6f9ed79d2f39410c92782', '') - .clickFunction('g - transact (not payable)') - .testFunction('0xab4f794ca0b531f27fc6eace623666b440facbf20e77615a057d728c67b500f0', - { - status: 'true Transaction mined and execution succeed', - 'transaction hash': '0xab4f794ca0b531f27fc6eace623666b440facbf20e77615a057d728c67b500f0', - 'decoded output': { - '0': 'uint256: 345', - '1': 'string: comment_comment_', - '2': 'bool: true', - '3': 'uint256: 4' - } - }) - .click('*[data-id="deployAndRunClearInstances"]') + .clickLaunchIcon('udapp') + .selectAccount('0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c') // this account will be used for this test suite + .click('#runTabView button[class^="instanceButton"]') + .waitForElementPresent('.instance:nth-of-type(2)') + .click('.instance:nth-of-type(2) > div > button') + .click('#runTabView .instance div[class^="title"]') + .click('#runTabView .instance div[class^="title"]') + .clickFunction('f - transact (not payable)') + .testFunction('0x38bb944fa4709ed9e163d6c670259f97284b4defd916d512a2fcc3f35bb53e03', + { + status: 'true Transaction mined and execution succeed', + 'transaction hash': '0x38bb944fa4709ed9e163d6c670259f97284b4defd916d512a2fcc3f35bb53e03', + 'decoded output': { 0: 'uint256: 8' } + }) + .pause(500) + .checkTerminalFilter('0x12332162e2e31397dc1e07ed0a1cf08f728e9b4487c6f9ed79d2f39410c92782', '') + .clickFunction('g - transact (not payable)') + .testFunction('0xab4f794ca0b531f27fc6eace623666b440facbf20e77615a057d728c67b500f0', + { + status: 'true Transaction mined and execution succeed', + 'transaction hash': '0xab4f794ca0b531f27fc6eace623666b440facbf20e77615a057d728c67b500f0', + 'decoded output': { + 0: 'uint256: 345', + 1: 'string: comment_comment_', + 2: 'bool: true', + 3: 'uint256: 4' + } + }) + .click('*[data-id="deployAndRunClearInstances"]') }, 'Test Complex Return Values': function (browser: NightwatchBrowser) { @@ -52,100 +52,100 @@ module.exports = { .click('.instance:nth-of-type(2) > div > button') .clickFunction('retunValues1 - transact (not payable)') .testFunction('0x09c6716a67f0f8c7a0ca2b3ddf59c25982da856a95aefd640b767f9b9feee39d', - { - status: 'true Transaction mined and execution succeed', - 'transaction hash': '0x09c6716a67f0f8c7a0ca2b3ddf59c25982da856a95aefd640b767f9b9feee39d', - 'decoded output': { - '0': 'bool: _b true', - '1': 'uint256: _u 345', - '2': 'int256: _i -345', - '3': 'address: _a 0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c' - } - }) + { + status: 'true Transaction mined and execution succeed', + 'transaction hash': '0x09c6716a67f0f8c7a0ca2b3ddf59c25982da856a95aefd640b767f9b9feee39d', + 'decoded output': { + 0: 'bool: _b true', + 1: 'uint256: _u 345', + 2: 'int256: _i -345', + 3: 'address: _a 0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c' + } + }) .clickFunction('retunValues2 - transact (not payable)') .testFunction('0xe884953e0695399d60914af3e1ea2dad59fe41f3c0c20665c130fa40dd0fb6bf', - { - status: 'true Transaction mined and execution succeed', - 'transaction hash': '0xe884953e0695399d60914af3e1ea2dad59fe41f3c0c20665c130fa40dd0fb6bf', - 'decoded output': { - '0': 'bytes1: _b 0x12', - '1': 'bytes2: _b2 0x1223', - '2': 'bytes3: _b3 0x000000', - '3': 'bytes: _blit 0x123498', - '4': 'bytes5: _b5 0x0432450000', - '5': 'bytes6: _b6 0x234553253200', - '6': 'string: _str this is a long string _ this is a long string _ this is a long string _ this is a long string _ this is a long string _ this is a long string _ this is a long string _ this is a long string _ this is a long string _ this is a long string _ this is a long string _ this is a long string _ this is a long string _ this is a long string _ this is a long string', - '7': 'bytes7: _b7 0x03252353253253', - '8': 'bytes22: _b22 0x32523523532532532523532500000000000000000000', - '9': 'bytes32: _b32 0x0325235325325235325235325235320000000000000000000000000000000000' - } - }).pause(500) + { + status: 'true Transaction mined and execution succeed', + 'transaction hash': '0xe884953e0695399d60914af3e1ea2dad59fe41f3c0c20665c130fa40dd0fb6bf', + 'decoded output': { + 0: 'bytes1: _b 0x12', + 1: 'bytes2: _b2 0x1223', + 2: 'bytes3: _b3 0x000000', + 3: 'bytes: _blit 0x123498', + 4: 'bytes5: _b5 0x0432450000', + 5: 'bytes6: _b6 0x234553253200', + 6: 'string: _str this is a long string _ this is a long string _ this is a long string _ this is a long string _ this is a long string _ this is a long string _ this is a long string _ this is a long string _ this is a long string _ this is a long string _ this is a long string _ this is a long string _ this is a long string _ this is a long string _ this is a long string', + 7: 'bytes7: _b7 0x03252353253253', + 8: 'bytes22: _b22 0x32523523532532532523532500000000000000000000', + 9: 'bytes32: _b32 0x0325235325325235325235325235320000000000000000000000000000000000' + } + }).pause(500) .clickFunction('retunValues3 - transact (not payable)') .testFunction('0xb4108649d5e65a4a0776d6ac98c2c356540a7e99d641705a82352a845d467eb5', - { - status: 'true Transaction mined and execution succeed', - 'transaction hash': '0xb4108649d5e65a4a0776d6ac98c2c356540a7e99d641705a82352a845d467eb5', - 'decoded output': { - '0': 'uint8: _en 2', - '1': 'int256[5][]: _a1 1,-45,-78,56,60,-1,42,334,-45455,-446,1,10,-5435,45,-7' - } - }).click('*[data-id="deployAndRunClearInstances"]') + { + status: 'true Transaction mined and execution succeed', + 'transaction hash': '0xb4108649d5e65a4a0776d6ac98c2c356540a7e99d641705a82352a845d467eb5', + 'decoded output': { + 0: 'uint8: _en 2', + 1: 'int256[5][]: _a1 1,-45,-78,56,60,-1,42,334,-45455,-446,1,10,-5435,45,-7' + } + }).click('*[data-id="deployAndRunClearInstances"]') }, 'Test Complex Input Values': function (browser: NightwatchBrowser) { browser.testContracts('inputValues.sol', sources[2]['browser/inputValues.sol'], ['test']) - .clickLaunchIcon('udapp') - .click('#runTabView button[class^="instanceButton"]') - .waitForElementPresent('.instance:nth-of-type(2)') - .click('.instance:nth-of-type(2) > div > button') - .clickFunction('inputValue1 - transact (not payable)', {types: 'uint256 _u, int256 _i, string _str', values: '"2343242", "-4324324", "string _ string _ string _ string _ string _ string _ string _ string _ string _ string _"'}) - .testFunction('0xe9678b5486674a0425301a1d7e925c22cfb9f7f7ec6242697d742009f7ef5b97', - { - status: 'true Transaction mined and execution succeed', - 'transaction hash': '0xe9678b5486674a0425301a1d7e925c22cfb9f7f7ec6242697d742009f7ef5b97', - 'decoded output': { - '0': 'uint256: _uret 2343242', - '1': 'int256: _iret -4324324', - '2': 'string: _strret string _ string _ string _ string _ string _ string _ string _ string _ string _ string _' - } - }) - .pause(500) - .clickFunction('inputValue2 - transact (not payable)', {types: 'uint256[3] _n, bytes8[4] _b8', values: '[1,2,3], ["0x1234000000000000", "0x1234000000000000","0x1234000000000000","0x1234000000000000"]'}) - .testFunction('0x21724b08c3699bda8375803f8dc842194aea370f2aac284e55144b452dca321f', { + .clickLaunchIcon('udapp') + .click('#runTabView button[class^="instanceButton"]') + .waitForElementPresent('.instance:nth-of-type(2)') + .click('.instance:nth-of-type(2) > div > button') + .clickFunction('inputValue1 - transact (not payable)', { types: 'uint256 _u, int256 _i, string _str', values: '"2343242", "-4324324", "string _ string _ string _ string _ string _ string _ string _ string _ string _ string _"' }) + .testFunction('0xe9678b5486674a0425301a1d7e925c22cfb9f7f7ec6242697d742009f7ef5b97', + { status: 'true Transaction mined and execution succeed', - 'transaction hash': '0x21724b08c3699bda8375803f8dc842194aea370f2aac284e55144b452dca321f', + 'transaction hash': '0xe9678b5486674a0425301a1d7e925c22cfb9f7f7ec6242697d742009f7ef5b97', 'decoded output': { - '0': 'uint256[3]: _nret 1,2,3', - '1': 'bytes8[4]: _b8ret 0x1234000000000000,0x1234000000000000,0x1234000000000000,0x1234000000000000' - }, - logs: [ - { - 'from': '0x8c1eD7e19abAa9f23c476dA86Dc1577F1Ef401f5', - 'topic': '0xd30981760edbf605bda8689e945f622877f230c9a77cbfbd448aa4b7d8ac6e7f', - 'event': 'event1', - 'args': { - '0': '-123', - '1': '123', - '2': { - "_isIndexed":true, - 'hash': '0x9c22ff5f21f0b81b113e63f7db6da94fedef11b2119b4088b89664fb9a3cb658' - }, - '3': '0x12340000', - '4': 'test _ test _ test _ test test _ test test _ test test _ test test _ test test _ test test _ test ' - } - } - ] + 0: 'uint256: _uret 2343242', + 1: 'int256: _iret -4324324', + 2: 'string: _strret string _ string _ string _ string _ string _ string _ string _ string _ string _ string _' + } }) + .pause(500) + .clickFunction('inputValue2 - transact (not payable)', { types: 'uint256[3] _n, bytes8[4] _b8', values: '[1,2,3], ["0x1234000000000000", "0x1234000000000000","0x1234000000000000","0x1234000000000000"]' }) + .testFunction('0x21724b08c3699bda8375803f8dc842194aea370f2aac284e55144b452dca321f', { + status: 'true Transaction mined and execution succeed', + 'transaction hash': '0x21724b08c3699bda8375803f8dc842194aea370f2aac284e55144b452dca321f', + 'decoded output': { + 0: 'uint256[3]: _nret 1,2,3', + 1: 'bytes8[4]: _b8ret 0x1234000000000000,0x1234000000000000,0x1234000000000000,0x1234000000000000' + }, + logs: [ + { + from: '0x8c1eD7e19abAa9f23c476dA86Dc1577F1Ef401f5', + topic: '0xd30981760edbf605bda8689e945f622877f230c9a77cbfbd448aa4b7d8ac6e7f', + event: 'event1', + args: { + 0: '-123', + 1: '123', + 2: { + _isIndexed: true, + hash: '0x9c22ff5f21f0b81b113e63f7db6da94fedef11b2119b4088b89664fb9a3cb658' + }, + 3: '0x12340000', + 4: 'test _ test _ test _ test test _ test test _ test test _ test test _ test test _ test test _ test ' + } + } + ] + }) .click('*[data-id="deployAndRunClearInstances"]') }, 'Should Compile and Deploy a contract which has an event declaring a function as parameter': function (browser: NightwatchBrowser) { browser.testContracts('eventFunctionInput.sol', sources[3]['browser/eventFunctionInput.sol'], ['C']) - .clickLaunchIcon('udapp') - .selectAccount('0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c') // this account will be used for this test suite - .click('#runTabView button[class^="instanceButton"]') - .waitForElementPresent('.instance:nth-of-type(2)') - .end() + .clickLaunchIcon('udapp') + .selectAccount('0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c') // this account will be used for this test suite + .click('#runTabView button[class^="instanceButton"]') + .waitForElementPresent('.instance:nth-of-type(2)') + .end() }, tearDown: sauce @@ -154,15 +154,21 @@ module.exports = { // @TODO test: bytes8[3][] type as input const sources = [ - {'browser/Untitled.sol': {content: ` + { + 'browser/Untitled.sol': { + content: ` contract TestContract { function f() public returns (uint) { return 8; } function g() public returns (uint, string memory, bool, uint) { uint payment = 345; bool payed = true; string memory comment = "comment_comment_"; uint month = 4; - return (payment, comment, payed, month); } }`}}, - {'browser/returnValues.sol': {content: ` + return (payment, comment, payed, month); } }` + } + }, + { + 'browser/returnValues.sol': { + content: ` contract testReturnValues { enum ActionChoices { GoLeft, GoRight, GoStraight, SitStill } function retunValues1 () public returns (bool _b, uint _u, int _i, address _a) { @@ -192,8 +198,12 @@ const sources = [ a[2] = [int(1),10,-5435,45,-7]; _a1 = a; } - }`}}, - {'browser/inputValues.sol': {content: ` + }` + } + }, + { + 'browser/inputValues.sol': { + content: ` contract test { event event1(int _i, uint indexed _u, string indexed _str, bytes4 _b, string _notIndexed); function inputValue1 (uint _u, int _i, string memory _str) public returns (uint _uret, int _iret, string memory _strret) { @@ -206,11 +216,17 @@ const sources = [ _b8ret = _b8; emit event1(-123, 123, "test", hex"1234", "test _ test _ test _ test test _ test test _ test test _ test test _ test test _ test test _ test "); } -}`}}, -// https://github.com/ethereum/remix-project/issues/404 -{'browser/eventFunctionInput.sol': {content: ` +}` + } + }, + // https://github.com/ethereum/remix-project/issues/404 + { + 'browser/eventFunctionInput.sol': { + content: ` pragma solidity >= 0.7.0; contract C { event Test(function() external); -}`}} +}` + } + } ] diff --git a/apps/remix-ide-e2e/src/tests/txListener.test.ts b/apps/remix-ide-e2e/src/tests/txListener.test.ts index 9e2e10a4b5..aac88c4fda 100644 --- a/apps/remix-ide-e2e/src/tests/txListener.test.ts +++ b/apps/remix-ide-e2e/src/tests/txListener.test.ts @@ -5,8 +5,8 @@ import sauce from './sauce' import examples from '../examples/example-contracts' const sources = [ - {'browser/Untitled.sol': {content: examples.ballot.content}}, - {'browser/Untitled1.sol': {content: `contract test {}`}} + { 'browser/Untitled.sol': { content: examples.ballot.content } }, + { 'browser/Untitled1.sol': { content: 'contract test {}' } } ] module.exports = { @@ -19,34 +19,34 @@ module.exports = { 'The sequence: Compiling / Deploying / Compiling another contract / calling the first contract - should display in the log the transaction with all the decoded information': function (browser: NightwatchBrowser) { // https://github.com/ethereum/remix-ide/issues/2864 browser - .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) - .clickLaunchIcon('solidity') - .testContracts('Untitled.sol', sources[0]['browser/Untitled.sol'], ['Ballot']) - .clickLaunchIcon('udapp') - .selectAccount('0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c') - .setValue('input[placeholder="bytes32[] proposalNames"]', '["0x48656c6c6f20576f726c64210000000000000000000000000000000000000000"]') - .click('*[data-id="Deploy - transact (not payable)"]') - .waitForElementPresent('*[data-id="universalDappUiContractActionWrapper"]') - .click('*[data-id="universalDappUiTitleExpander"]') - .clickFunction('delegate - transact (not payable)', {types: 'address to', values: '"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"'}) - .testFunction('0x41fab8ea5b1d9fba5e0a6545ca1a2d62fff518578802c033c2b9a031a01c31b3', - { - status: 'true Transaction mined and execution succeed', - 'transaction hash': '0x41fab8ea5b1d9fba5e0a6545ca1a2d62fff518578802c033c2b9a031a01c31b3', - 'decoded input': { 'address to': '0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB' } - }) - .clickLaunchIcon('solidity') - .testContracts('Untitled1.sol', sources[1]['browser/Untitled1.sol'], ['test']) - .clickLaunchIcon('udapp') - .clickFunction('delegate - transact (not payable)', {types: 'address to', values: ''}) - .pause(5000) - .testFunction('0xca58080c8099429caeeffe43b8104df919c2c543dceb9edf9242fa55f045c803', - { - status: 'false Transaction mined but execution failed', - 'transaction hash': '0xca58080c8099429caeeffe43b8104df919c2c543dceb9edf9242fa55f045c803', - 'decoded input': { 'address to': '0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB' } - }) - .end() + .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) + .clickLaunchIcon('solidity') + .testContracts('Untitled.sol', sources[0]['browser/Untitled.sol'], ['Ballot']) + .clickLaunchIcon('udapp') + .selectAccount('0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c') + .setValue('input[placeholder="bytes32[] proposalNames"]', '["0x48656c6c6f20576f726c64210000000000000000000000000000000000000000"]') + .click('*[data-id="Deploy - transact (not payable)"]') + .waitForElementPresent('*[data-id="universalDappUiContractActionWrapper"]') + .click('*[data-id="universalDappUiTitleExpander"]') + .clickFunction('delegate - transact (not payable)', { types: 'address to', values: '"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"' }) + .testFunction('0x41fab8ea5b1d9fba5e0a6545ca1a2d62fff518578802c033c2b9a031a01c31b3', + { + status: 'true Transaction mined and execution succeed', + 'transaction hash': '0x41fab8ea5b1d9fba5e0a6545ca1a2d62fff518578802c033c2b9a031a01c31b3', + 'decoded input': { 'address to': '0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB' } + }) + .clickLaunchIcon('solidity') + .testContracts('Untitled1.sol', sources[1]['browser/Untitled1.sol'], ['test']) + .clickLaunchIcon('udapp') + .clickFunction('delegate - transact (not payable)', { types: 'address to', values: '' }) + .pause(5000) + .testFunction('0xca58080c8099429caeeffe43b8104df919c2c543dceb9edf9242fa55f045c803', + { + status: 'false Transaction mined but execution failed', + 'transaction hash': '0xca58080c8099429caeeffe43b8104df919c2c543dceb9edf9242fa55f045c803', + 'decoded input': { 'address to': '0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB' } + }) + .end() }, tearDown: sauce diff --git a/apps/remix-ide-e2e/src/tests/url.test.ts b/apps/remix-ide-e2e/src/tests/url.test.ts index 1757c86f19..638916521a 100644 --- a/apps/remix-ide-e2e/src/tests/url.test.ts +++ b/apps/remix-ide-e2e/src/tests/url.test.ts @@ -6,14 +6,14 @@ import sauce from './sauce' import examples from '../examples/example-contracts' const sources = [ - {'browser/Untitled.sol': { content: examples.ballot.content }} + { 'browser/Untitled.sol': { content: examples.ballot.content } } ] module.exports = { before: function (browser: NightwatchBrowser, done: VoidFunction) { init(browser, done, 'http://127.0.0.1:8080/#optimize=true&runs=300&evmVersion=istanbul&version=soljson-v0.7.4+commit.3f05b770.js&code=cHJhZ21hIHNvbGlkaXR5ID49MC42LjAgPDAuNy4wOwoKaW1wb3J0ICJodHRwczovL2dpdGh1Yi5jb20vT3BlblplcHBlbGluL29wZW56ZXBwZWxpbi1jb250cmFjdHMvYmxvYi9tYXN0ZXIvY29udHJhY3RzL2FjY2Vzcy9Pd25hYmxlLnNvbCI7Cgpjb250cmFjdCBHZXRQYWlkIGlzIE93bmFibGUgewogIGZ1bmN0aW9uIHdpdGhkcmF3KCkgZXh0ZXJuYWwgb25seU93bmVyIHsKICB9Cn0') }, - + '@sources': function () { return sources }, @@ -22,36 +22,36 @@ module.exports = { browser .getEditorValue((content) => { browser.assert.ok(content.indexOf( - 'https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol') != -1, - 'code has not been loaded') + 'https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol') !== -1, + 'code has not been loaded') }) }, 'Should load using URL compiler params': function (browser: NightwatchBrowser) { browser - .assert.containsText('#versionSelector option[selected="selected"]', '0.7.4+commit.3f05b770') - .assert.containsText('#evmVersionSelector option[selected="selected"]', 'istanbul') - .verify.elementPresent('#optimize:checked') - .verify.attributeEquals('#runs', 'value', '300') + .assert.containsText('#versionSelector option[selected="selected"]', '0.7.4+commit.3f05b770') + .assert.containsText('#evmVersionSelector option[selected="selected"]', 'istanbul') + .verify.elementPresent('#optimize:checked') + .verify.attributeEquals('#runs', 'value', '300') }, 'Should load using compiler from link passed in remix URL': function (browser: NightwatchBrowser) { browser - .url('http://127.0.0.1:8080/#version=https://solidity-blog.s3.eu-central-1.amazonaws.com/data/08preview/soljson.js') - .refresh() - .pause(5000) - .clickLaunchIcon('solidity') - .pause(5000) - .assert.containsText('#versionSelector option[selected="selected"]', 'custom') + .url('http://127.0.0.1:8080/#version=https://solidity-blog.s3.eu-central-1.amazonaws.com/data/08preview/soljson.js') + .refresh() + .pause(5000) + .clickLaunchIcon('solidity') + .pause(5000) + .assert.containsText('#versionSelector option[selected="selected"]', 'custom') // default values - .assert.containsText('#evmVersionSelector option[selected="selected"]', 'default') - .verify.elementPresent('#optimize') - .assert.elementNotPresent('#optimize:checked') - .verify.elementPresent('#runs:disabled') - .click('[for="optimize"') - .verify.attributeEquals('#runs', 'value', '200') - .end() + .assert.containsText('#evmVersionSelector option[selected="selected"]', 'default') + .verify.elementPresent('#optimize') + .assert.elementNotPresent('#optimize:checked') + .verify.elementPresent('#runs:disabled') + .click('[for="optimize"') + .verify.attributeEquals('#runs', 'value', '200') + .end() }, tearDown: sauce -} \ No newline at end of file +} diff --git a/apps/remix-ide-e2e/src/tests/usingWebWorker.test.ts b/apps/remix-ide-e2e/src/tests/usingWebWorker.test.ts index d987357954..5b3e504063 100644 --- a/apps/remix-ide-e2e/src/tests/usingWebWorker.test.ts +++ b/apps/remix-ide-e2e/src/tests/usingWebWorker.test.ts @@ -4,7 +4,9 @@ import init from '../helpers/init' import sauce from './sauce' const sources = [ - {'browser/basic.sol': { content: + { + 'browser/basic.sol': { + content: `pragma solidity >=0.2.0 <0.7.0; /** @@ -14,7 +16,8 @@ const sources = [ uint someVar; constructor() public {} }` - }} + } + } ] module.exports = { @@ -26,26 +29,26 @@ module.exports = { }, 'Using Web Worker': function (browser: NightwatchBrowser) { browser - .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) - .clickLaunchIcon('fileExplorers') - .addFile('basic.sol', sources[0]['browser/basic.sol']) - .clickLaunchIcon('solidity') - .execute(function() { - const elem = document.getElementById('nightlies') as HTMLInputElement - - elem.checked = true - }) - .noWorkerErrorFor('soljson-v0.3.4+commit.7dab8902.js') - .noWorkerErrorFor('soljson-v0.6.5+commit.f956cc89.js') - .noWorkerErrorFor('soljson-v0.6.8-nightly.2020.5.14+commit.a6d0067b.js') - .noWorkerErrorFor('soljson-v0.6.0-nightly.2019.12.17+commit.d13438ee.js') - .noWorkerErrorFor('soljson-v0.4.26+commit.4563c3fc.js') - .execute(function() { - const elem = document.getElementById('nightlies') as HTMLInputElement - - elem.checked = false - }) - .end() + .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) + .clickLaunchIcon('fileExplorers') + .addFile('basic.sol', sources[0]['browser/basic.sol']) + .clickLaunchIcon('solidity') + .execute(function () { + const elem = document.getElementById('nightlies') as HTMLInputElement + + elem.checked = true + }) + .noWorkerErrorFor('soljson-v0.3.4+commit.7dab8902.js') + .noWorkerErrorFor('soljson-v0.6.5+commit.f956cc89.js') + .noWorkerErrorFor('soljson-v0.6.8-nightly.2020.5.14+commit.a6d0067b.js') + .noWorkerErrorFor('soljson-v0.6.0-nightly.2019.12.17+commit.d13438ee.js') + .noWorkerErrorFor('soljson-v0.4.26+commit.4563c3fc.js') + .execute(function () { + const elem = document.getElementById('nightlies') as HTMLInputElement + + elem.checked = false + }) + .end() }, tearDown: sauce diff --git a/apps/remix-ide-e2e/src/tests/verticalIconsPanel.test.ts b/apps/remix-ide-e2e/src/tests/verticalIconsPanel.test.ts index c094e2b3c8..a4bbc0dab7 100644 --- a/apps/remix-ide-e2e/src/tests/verticalIconsPanel.test.ts +++ b/apps/remix-ide-e2e/src/tests/verticalIconsPanel.test.ts @@ -10,25 +10,25 @@ module.exports = { 'Checks vertical icons panelcontex menu': function (browser: NightwatchBrowser) { browser.waitForElementVisible('div[data-id="remixIdeIconPanel"]', 10000) - .waitForElementVisible('*[data-id="verticalIconsKindpluginManager"]') - .click('*[data-id="verticalIconsKindpluginManager"]') - .scrollAndClick('*[data-id="pluginManagerComponentActivateButtondebugger"]') - .waitForElementVisible('*[data-id="pluginManagerComponentDeactivateButtondebugger"]', 7000) - .rightClick('[data-id="verticalIconsKinddebugger"]') - .waitForElementVisible('*[id="menuitemdeactivate"]') - .waitForElementVisible('*[id="menuitemdocumentation"]') - .click('*[data-id="remixIdeIconPanel"]') + .waitForElementVisible('*[data-id="verticalIconsKindpluginManager"]') + .click('*[data-id="verticalIconsKindpluginManager"]') + .scrollAndClick('*[data-id="pluginManagerComponentActivateButtondebugger"]') + .waitForElementVisible('*[data-id="pluginManagerComponentDeactivateButtondebugger"]', 7000) + .rightClick('[data-id="verticalIconsKinddebugger"]') + .waitForElementVisible('*[id="menuitemdeactivate"]') + .waitForElementVisible('*[id="menuitemdocumentation"]') + .click('*[data-id="remixIdeIconPanel"]') }, 'Checks vertical icons panel contex menu deactivate': function (browser: NightwatchBrowser) { browser.waitForElementVisible('div[data-id="remixIdeIconPanel"]', 10000) - .waitForElementVisible('*[data-id="verticalIconsKinddebugger"]', 7000) - .rightClick('[data-id="verticalIconsKinddebugger"]') - .click('*[id="menuitemdeactivate"]') - .click('*[data-id="verticalIconsKindsettings"]') - .click('*[data-id="verticalIconsKindpluginManager"]') - .scrollInto('*[data-id="pluginManagerComponentActivateButtondebugger"]') - .waitForElementVisible('*[data-id="pluginManagerComponentActivateButtondebugger"]') + .waitForElementVisible('*[data-id="verticalIconsKinddebugger"]', 7000) + .rightClick('[data-id="verticalIconsKinddebugger"]') + .click('*[id="menuitemdeactivate"]') + .click('*[data-id="verticalIconsKindsettings"]') + .click('*[data-id="verticalIconsKindpluginManager"]') + .scrollInto('*[data-id="pluginManagerComponentActivateButtondebugger"]') + .waitForElementVisible('*[data-id="pluginManagerComponentActivateButtondebugger"]') }, tearDown: sauce diff --git a/apps/remix-ide-e2e/src/tests/workspace.test.ts b/apps/remix-ide-e2e/src/tests/workspace.test.ts index e69663bcce..cc94fc5bda 100644 --- a/apps/remix-ide-e2e/src/tests/workspace.test.ts +++ b/apps/remix-ide-e2e/src/tests/workspace.test.ts @@ -8,26 +8,26 @@ module.exports = { init(browser, done, 'http://127.0.0.1:8080?activate=solidity,udapp&call=fileManager//open//contracts/3_Ballot.sol&deactivate=home', false) }, - 'CheckSolidityActivatedAndUDapp': function (browser: NightwatchBrowser) { + CheckSolidityActivatedAndUDapp: function (browser: NightwatchBrowser) { browser - .waitForElementVisible('#icon-panel', 10000) - .clickLaunchIcon('solidity') - .clickLaunchIcon('udapp') + .waitForElementVisible('#icon-panel', 10000) + .clickLaunchIcon('solidity') + .clickLaunchIcon('udapp') }, 'Editor should be focused on the 3_Ballot.sol': function (browser: NightwatchBrowser) { browser - .pause(5000) - .getEditorValue((content) => { - browser.assert.ok(content.indexOf('contract Ballot {') != -1, 'content doesn\'t include Ballot contract') - }) + .pause(5000) + .getEditorValue((content) => { + browser.assert.ok(content.indexOf('contract Ballot {') !== -1, 'content doesn\'t include Ballot contract') + }) }, 'Home page should be deactivated': function (browser: NightwatchBrowser) { browser - .waitForElementNotPresent('[data-id="landingPageHomeContainer"]') - .end() + .waitForElementNotPresent('[data-id="landingPageHomeContainer"]') + .end() }, - + tearDown: sauce }