diff --git a/.circleci/config.yml b/.circleci/config.yml index 1b5b24c9a4..d99e01caab 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,12 +2,14 @@ # # Check https://circleci.com/docs/2.0/language-javascript/ for more details # -version: 2 +version: 2.1 +orbs: + browser-tools: circleci/browser-tools@1.2.3 jobs: - lint: + build: docker: # specify the version you desire here - - image: circleci/node:14.17.6-browsers + - image: cimg/node:14.17.6-browsers # Specify service dependencies here if necessary # CircleCI maintains a library of pre-built images @@ -21,76 +23,29 @@ jobs: steps: - checkout - - run: npm install - - run: - name: Remix Libs Linting - command: npm run lint:libs - - run: - name: Remix IDE Linting - command: npm run lint - - run: - name: Remix IDE e2e Linting - command: npm run lint remix-ide-e2e - - remix-libs: - docker: - # specify the version you desire here - - image: circleci/node:14.17.6-browsers - - # Specify service dependencies here if necessary - # CircleCI maintains a library of pre-built images - # documented at https://circleci.com/docs/2.0/circleci-images/ - resource_class: xlarge - # - image: circleci/mongo:3.4.4 - environment: - - COMMIT_AUTHOR_EMAIL: "yann@ethereum.org" - - COMMIT_AUTHOR: "Circle CI" - working_directory: ~/remix-project - - steps: - - checkout - - run: npm install - - run: npm run build:libs - - run: cd dist/libs/remix-tests && npm install - - run: npm run test:libs - remix-ide-chrome-1: - docker: - # specify the version you desire here - - image: circleci/node:14.17.6-browsers - - # Specify service dependencies here if necessary - # CircleCI maintains a library of pre-built images - # documented at https://circleci.com/docs/2.0/circleci-images/ - resource_class: xlarge - # - image: circleci/mongo:3.4.4 - environment: - - COMMIT_AUTHOR_EMAIL: "yann@ethereum.org" - - COMMIT_AUTHOR: "Circle CI" - working_directory: ~/remix-project - - parallelism: 12 - steps: - - checkout + - restore_cache: + keys: + - v1-deps-{{ checksum "package-lock.json" }} - run: npm install - - run: npx nx build remix-ide --with-deps - - run: - name: Download Selenium - command: ./node_modules/.bin/selenium-standalone install --drivers.chrome.version=2.39 --drivers.chrome.baseURL=https://chromedriver.storage.googleapis.com - - run: - name: Start Selenium - command: ./node_modules/.bin/selenium-standalone start --drivers.chrome.version=2.39 --drivers.chrome.baseURL=https://chromedriver.storage.googleapis.com - background: true - - run: ./apps/remix-ide/ci/browser_tests_chrome_1.sh - - store_test_results: - path: ./reports/tests - - store_artifacts: - path: ./reports/screenshots + - save_cache: + key: v1-deps-{{ checksum "package-lock.json" }} + paths: + - node_modules + - run: npm run downloadsolc_assets + - run: npx nx build remix-ide + - run: npx nx build remix-ide-e2e-src-local-plugin - remix-ide-chrome-2: + - run: npm run build:libs + - run: mkdir persist && zip -r persist/dist.zip dist + - persist_to_workspace: + root: . + paths: + - 'persist' + lint: docker: # specify the version you desire here - - image: circleci/node:14.17.6-browsers + - image: cimg/node:14.17.6-browsers # Specify service dependencies here if necessary # CircleCI maintains a library of pre-built images @@ -101,30 +56,20 @@ jobs: - COMMIT_AUTHOR_EMAIL: "yann@ethereum.org" - COMMIT_AUTHOR: "Circle CI" working_directory: ~/remix-project - - parallelism: 12 + parallelism: 35 steps: - checkout + - restore_cache: + keys: + - v1-deps-{{ checksum "package-lock.json" }} - run: npm install - - run: npm run downloadsolc_assets - - run: npx nx build remix-ide --with-deps - - run: - name: Download Selenium - command: ./node_modules/.bin/selenium-standalone install --drivers.chrome.version=2.39 --drivers.chrome.baseURL=https://chromedriver.storage.googleapis.com - run: - name: Start Selenium - command: ./node_modules/.bin/selenium-standalone start --drivers.chrome.version=2.39 --drivers.chrome.baseURL=https://chromedriver.storage.googleapis.com - background: true - - run: ./apps/remix-ide/ci/browser_tests_chrome_2.sh - - store_test_results: - path: ./reports/tests - - store_artifacts: - path: ./reports/screenshots - - remix-ide-firefox-1: + name: Remix Libs Linting + command: ./apps/remix-ide/ci/lint.sh + remix-libs: docker: # specify the version you desire here - - image: circleci/node:14.17.6-browsers + - image: cimg/node:14.17.6-browsers # Specify service dependencies here if necessary # CircleCI maintains a library of pre-built images @@ -136,28 +81,22 @@ jobs: - COMMIT_AUTHOR: "Circle CI" working_directory: ~/remix-project - parallelism: 12 steps: - checkout - - run: npm install - - run: npx nx build remix-ide --with-deps - - run: - name: Download Selenium - command: ./node_modules/.bin/selenium-standalone install --config=../remix-project/apps/remix-ide-e2e/seleniumConfig.js - - run: - name: Start Selenium - command: ./node_modules/.bin/selenium-standalone start --config=../remix-project/apps/remix-ide-e2e/seleniumConfig.js - background: true - - run: ./apps/remix-ide/ci/browser_tests_firefox_1.sh - - store_test_results: - path: ./reports/tests - - store_artifacts: - path: ./reports/screenshots + - attach_workspace: + at: . + - run: unzip ./persist/dist.zip + - restore_cache: + keys: + - v1-deps-{{ checksum "package-lock.json" }} + - run: npm i + - run: cd dist/libs/remix-tests && npm install + - run: npm run test:libs - remix-ide-firefox-2: + remix-ide-chrome: docker: # specify the version you desire here - - image: circleci/node:14.17.6-browsers + - image: cimg/node:14.17.6-browsers # Specify service dependencies here if necessary # CircleCI maintains a library of pre-built images @@ -169,29 +108,33 @@ jobs: - COMMIT_AUTHOR: "Circle CI" working_directory: ~/remix-project - parallelism: 12 + parallelism: 70 steps: + - browser-tools/install-chrome + - browser-tools/install-chromedriver - checkout + - attach_workspace: + at: . + - run: unzip ./persist/dist.zip + - restore_cache: + keys: + - v1-deps-{{ checksum "package-lock.json" }} - run: npm install - - run: npm run downloadsolc_assets - - run: npx nx build remix-ide --with-deps - - run: - name: Download Selenium - command: ./node_modules/.bin/selenium-standalone install --config=../remix-project/apps/remix-ide-e2e/seleniumConfig.js + - run: npm run selenium-install - run: name: Start Selenium - command: ./node_modules/.bin/selenium-standalone start --config=../remix-project/apps/remix-ide-e2e/seleniumConfig.js + command: npx selenium-standalone start background: true - - run: ./apps/remix-ide/ci/browser_tests_firefox_2.sh + - run: ./apps/remix-ide/ci/browser_test.sh chrome - store_test_results: path: ./reports/tests - store_artifacts: path: ./reports/screenshots - remix-ide-run-deploy: + remix-ide-firefox: docker: # specify the version you desire here - - image: circleci/node:14.17.6-browsers + - image: cimg/node:14.17.6-browsers # Specify service dependencies here if necessary # CircleCI maintains a library of pre-built images @@ -201,21 +144,26 @@ jobs: environment: - COMMIT_AUTHOR_EMAIL: "yann@ethereum.org" - COMMIT_AUTHOR: "Circle CI" - - FILES_TO_PACKAGE: "dist/apps/remix-ide/assets dist/apps/remix-ide/index.html dist/apps/remix-ide/main.js dist/apps/remix-ide/polyfills.js dist/apps/remix-ide/runtime.js dist/apps/remix-ide/vendor.js dist/apps/remix-ide/favicon.ico" working_directory: ~/remix-project + parallelism: 70 steps: + - browser-tools/install-firefox + - browser-tools/install-geckodriver - checkout + - attach_workspace: + at: . + - run: unzip ./persist/dist.zip + - restore_cache: + keys: + - v1-deps-{{ checksum "package-lock.json" }} - run: npm install - - run: npx nx build remix-ide --with-deps - - run: - name: Download Selenium - command: ./node_modules/.bin/selenium-standalone install --drivers.chrome.version=2.39 --drivers.chrome.baseURL=https://chromedriver.storage.googleapis.com + - run: npm run selenium-install - run: name: Start Selenium - command: ./node_modules/.bin/selenium-standalone start --drivers.chrome.version=2.39 --drivers.chrome.baseURL=https://chromedriver.storage.googleapis.com + command: npx selenium-standalone start background: true - - run: ./apps/remix-ide/ci/browser_tests_run_deploy.sh + - run: ./apps/remix-ide/ci/browser_test.sh firefox - store_test_results: path: ./reports/tests - store_artifacts: @@ -224,7 +172,7 @@ jobs: remix-ide-plugin-api: docker: # specify the version you desire here - - image: circleci/node:14.17.6-browsers + - image: cimg/node:14.17.6-browsers # Specify service dependencies here if necessary # CircleCI maintains a library of pre-built images @@ -236,18 +184,22 @@ jobs: - COMMIT_AUTHOR: "Circle CI" - FILES_TO_PACKAGE: "dist/apps/remix-ide/assets dist/apps/remix-ide/index.html dist/apps/remix-ide/main.js dist/apps/remix-ide/polyfills.js dist/apps/remix-ide/runtime.js dist/apps/remix-ide/vendor.js dist/apps/remix-ide/favicon.ico" working_directory: ~/remix-project - + parallelism: 7 steps: + - browser-tools/install-chrome + - browser-tools/install-chromedriver - checkout + - attach_workspace: + at: . + - run: unzip ./persist/dist.zip + - restore_cache: + keys: + - v1-deps-{{ checksum "package-lock.json" }} - run: npm install - - run: npx nx build remix-ide --with-deps - - run: npx nx build remix-ide-e2e-src-local-plugin - - run: - name: Download Selenium - command: ./node_modules/.bin/selenium-standalone install --drivers.chrome.version=2.39 --drivers.chrome.baseURL=https://chromedriver.storage.googleapis.com + - run: npm run selenium-install - run: name: Start Selenium - command: ./node_modules/.bin/selenium-standalone start --drivers.chrome.version=2.39 --drivers.chrome.baseURL=https://chromedriver.storage.googleapis.com + command: npx selenium-standalone start background: true - run: ./apps/remix-ide/ci/browser_tests_plugin_api.sh - store_test_results: @@ -258,7 +210,7 @@ jobs: deploy-remix-live: docker: # specify the version you desire here - - image: circleci/node:14.17.6-browsers + - image: cimg/node:14.17.6-browsers # Specify service dependencies here if necessary # CircleCI maintains a library of pre-built images @@ -286,7 +238,7 @@ jobs: publish: docker: # specify the version you desire here - - image: circleci/node:14.17.6-browsers + - image: cimg/node:14.17.6-browsers # Specify service dependencies here if necessary # CircleCI maintains a library of pre-built images @@ -312,7 +264,7 @@ jobs: deploy-remix-alpha: docker: # specify the version you desire here - - image: circleci/node:14.17.6-browsers + - image: cimg/node:14.17.6-browsers # Specify service dependencies here if necessary # CircleCI maintains a library of pre-built images @@ -340,7 +292,7 @@ jobs: deploy-remix-beta: docker: # specify the version you desire here - - image: circleci/node:14.17.6-browsers + - image: cimg/node:14.17.6-browsers # Specify service dependencies here if necessary # CircleCI maintains a library of pre-built images @@ -370,60 +322,48 @@ workflows: version: 2 build_all: jobs: - - lint + - build + - lint: + requires: + - build - remix-libs: requires: - - lint + - build - remix-ide-plugin-api: requires: - - lint - - remix-ide-chrome-1: - requires: - - lint - - remix-ide-chrome-2: - requires: - - lint - - remix-ide-firefox-1: - requires: - - lint - - remix-ide-firefox-2: - requires: - - lint - - remix-ide-run-deploy: + - build + - remix-ide-chrome: requires: - - lint - - publish: + - build + - remix-ide-firefox: requires: - - lint + - build - deploy-remix-live: requires: - - remix-ide-chrome-1 - - remix-ide-chrome-2 - - remix-ide-firefox-1 - - remix-ide-firefox-2 - - remix-ide-run-deploy + - lint + - remix-libs + - remix-ide-chrome + - remix-ide-firefox - remix-ide-plugin-api filters: branches: only: remix_live - deploy-remix-alpha: requires: - - remix-ide-chrome-1 - - remix-ide-chrome-2 - - remix-ide-firefox-1 - - remix-ide-firefox-2 - - remix-ide-run-deploy + - lint + - remix-libs + - remix-ide-chrome + - remix-ide-firefox - remix-ide-plugin-api filters: branches: only: master - deploy-remix-beta: requires: - - remix-ide-chrome-1 - - remix-ide-chrome-2 - - remix-ide-firefox-1 - - remix-ide-firefox-2 - - remix-ide-run-deploy + - lint + - remix-libs + - remix-ide-chrome + - remix-ide-firefox - remix-ide-plugin-api filters: branches: diff --git a/.gitignore b/.gitignore index a79e0a0920..6d77db80c5 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,8 @@ docs/_build TODO soljson.js *~ +*_group*.*.ts +*_group*.ts # compiled output diff --git a/apps/remix-ide-e2e/nightwatch.ts b/apps/remix-ide-e2e/nightwatch.ts index cab596db23..2bc20e8274 100644 --- a/apps/remix-ide-e2e/nightwatch.ts +++ b/apps/remix-ide-e2e/nightwatch.ts @@ -1,8 +1,3 @@ -import * as fs from 'fs' - -const crxFile = fs.readFileSync('apps/remix-ide-e2e/src/extensions/chrome/metamask.crx') -const metamaskExtension = Buffer.from(crxFile).toString('base64') - module.exports = { src_folders: ['dist/apps/remix-ide-e2e/src/tests'], output_folder: './reports/tests', @@ -28,7 +23,10 @@ module.exports = { desiredCapabilities: { browserName: 'firefox', javascriptEnabled: true, - acceptSslCerts: true + acceptSslCerts: true, + 'moz:firefoxOptions': { + args: ['-headless'] + } }, exclude: ['dist/apps/remix-ide-e2e/src/tests/runAndDeploy.js', 'dist/apps/remix-ide-e2e/src/tests/pluginManager.spec.ts'] }, @@ -39,34 +37,36 @@ module.exports = { javascriptEnabled: true, acceptSslCerts: true, 'goog:chromeOptions': { - args: ['window-size=2560,1440', 'start-fullscreen'] + args: ['window-size=2560,1440', 'start-fullscreen', '--no-sandbox', '--headless', '--verbose'] } } }, - 'chrome-runAndDeploy': { + chromeDesktop: { 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', '--no-sandbox'] } } }, - safari: { + 'chrome-runAndDeploy': { desiredCapabilities: { - browserName: 'safari', + browserName: 'chrome', javascriptEnabled: true, - acceptSslCerts: true + acceptSslCerts: true, + 'goog:chromeOptions': { + args: ['window-size=2560,1440', 'start-fullscreen', '--no-sandbox', '--headless', '--verbose'] + } } }, - ie: { + firefoxDesktop: { desiredCapabilities: { - browserName: 'internet explorer', + browserName: 'firefox', javascriptEnabled: true, acceptSslCerts: true } @@ -76,7 +76,10 @@ module.exports = { desiredCapabilities: { browserName: 'firefox', javascriptEnabled: true, - acceptSslCerts: true + acceptSslCerts: true, + 'moz:firefoxOptions': { + args: ['-headless'] + } } } } diff --git a/apps/remix-ide-e2e/seleniumConfig.js b/apps/remix-ide-e2e/seleniumConfig.js index eaece8bc7b..c1f1eb2a16 100644 --- a/apps/remix-ide-e2e/seleniumConfig.js +++ b/apps/remix-ide-e2e/seleniumConfig.js @@ -1,10 +1,10 @@ /* eslint-disable */ module.exports = { - version: '3.8.1', + version: '4.0.0', baseURL: 'https://selenium-release.storage.googleapis.com', drivers: { chrome: { - version: '2.39', + version: '96.0.4664.35', arch: process.arch, baseURL: 'https://chromedriver.storage.googleapis.com' } diff --git a/apps/remix-ide-e2e/src/buildGroupTests.js b/apps/remix-ide-e2e/src/buildGroupTests.js new file mode 100644 index 0000000000..6afd20c107 --- /dev/null +++ b/apps/remix-ide-e2e/src/buildGroupTests.js @@ -0,0 +1,33 @@ +const testFolder = './apps/remix-ide-e2e/src/tests/' +const fs = require('fs') + +// build group tests + +const source = `'use strict' +import * as test from './#file' +import buildGroupTest from '../helpers/buildgrouptest' +const group = '#groupname' + +module.exports = buildGroupTest(group, test) +` + +fs.readdirSync(testFolder).forEach(file => { + if (!file.includes('group')) { + const content = fs.readFileSync(testFolder + file, 'utf8') + const matches = content.match(/group\d+/g) + if (matches) { + const unique = matches.filter(onlyUnique) + unique.map((group) => { + const rewrite = source.replace('#groupname', group).replace('#file', file.replace('.ts', '')) + const extension = file.split('.') + extension.shift() + const filename = `${testFolder}${file.split('.').shift()}_${group}.${extension.join('.')}` + fs.writeFileSync(filename, rewrite) + }) + } + } +}) + +function onlyUnique (value, index, self) { + return self.indexOf(value) === index +} diff --git a/apps/remix-ide-e2e/src/checkGroupTests.js b/apps/remix-ide-e2e/src/checkGroupTests.js new file mode 100644 index 0000000000..dba67a920e --- /dev/null +++ b/apps/remix-ide-e2e/src/checkGroupTests.js @@ -0,0 +1,15 @@ +const testFolder = './apps/remix-ide-e2e/src/tests/' +const fs = require('fs') + +fs.readdirSync(testFolder).forEach(file => { + if (!file.includes('group')) { + const content = fs.readFileSync(testFolder + file, 'utf8') + const matches = content.match(/group\d+/g) + if (matches) { + const disabled = content.includes('@disabled') + if (!disabled) { + console.log(`WARNING ${file} has group tests but is not disabled`) + } + } + } +}) diff --git a/apps/remix-ide-e2e/src/commands/clearConsole.ts b/apps/remix-ide-e2e/src/commands/clearConsole.ts new file mode 100644 index 0000000000..0b7abec0fa --- /dev/null +++ b/apps/remix-ide-e2e/src/commands/clearConsole.ts @@ -0,0 +1,14 @@ +import { NightwatchBrowser } from 'nightwatch' +import EventEmitter from 'events' + +class clearConsole extends EventEmitter { + command (this: NightwatchBrowser): NightwatchBrowser { + this.api.waitForElementVisible('*[data-id="terminalCli"]').click('#clearConsole').perform((done) => { + done() + this.emit('complete') + }) + return this + } +} + +module.exports = clearConsole diff --git a/apps/remix-ide-e2e/src/commands/clearTransactions.ts b/apps/remix-ide-e2e/src/commands/clearTransactions.ts new file mode 100644 index 0000000000..b43fa377ed --- /dev/null +++ b/apps/remix-ide-e2e/src/commands/clearTransactions.ts @@ -0,0 +1,24 @@ +import { NightwatchBrowser } from 'nightwatch' +import EventEmitter from 'events' + +class clearTransactions extends EventEmitter { + command (this: NightwatchBrowser): NightwatchBrowser { + const browser = this + this.api.clickLaunchIcon('udapp').element('css selector', '*[data-id="universalDappUiUdappClose"]', function (visible: any) { + if (visible.status && visible.status === -1) { + browser.api.perform((done) => { + done() + browser.emit('complete') + }) + } else { + browser.api.pause(500).click('*[data-id="universalDappUiUdappClose"]').perform((done) => { + done() + browser.emit('complete') + }) + } + }) + return this + } +} + +module.exports = clearTransactions diff --git a/apps/remix-ide-e2e/src/helpers/buildgrouptest.ts b/apps/remix-ide-e2e/src/helpers/buildgrouptest.ts new file mode 100644 index 0000000000..f1ebfe9cb0 --- /dev/null +++ b/apps/remix-ide-e2e/src/helpers/buildgrouptest.ts @@ -0,0 +1,12 @@ +export default function buildGroupTest (group: string, test: any) { + const ob = {} + // eslint-disable-next-line dot-notation + const defaults = test['default'] + for (const key of Object.keys(defaults)) { + if (typeof defaults[key] === 'function' && (key.indexOf(`#${group}`) > -1 || key.indexOf('#group') === -1)) { + ob[key.replace(`#${group}`, '')] = defaults[key] + } + } + console.log(ob) + return ob +} diff --git a/apps/remix-ide-e2e/src/select_tests.sh b/apps/remix-ide-e2e/src/select_tests.sh new file mode 100644 index 0000000000..bded4e84fe --- /dev/null +++ b/apps/remix-ide-e2e/src/select_tests.sh @@ -0,0 +1,47 @@ + +#!/bin/bash +# Bash Menu Script Example + +PS3='Select a browser: ' +BROWSERS=( "chrome" "firefox" "exit" ) +select opt in "${BROWSERS[@]}" +do + case $opt in + "chrome") + echo "Chrome selected" + BROWSER="chromeDesktop" + break + ;; + "firefox") + echo "Firefox selected" + BROWSER="firefoxDesktop" + break + ;; + "exit") + echo "Exiting" + exit 0 + ;; + *) echo "invalid option $REPLY";; + esac +done +npm run build:e2e +PS3='Select a test or command: ' +TESTFILES=( $(grep -IRiL "disabled" "dist/apps/remix-ide-e2e/src/tests" | grep "\.spec\|\.test" | sort ) ) + +# declare -p TESTFILES +TESTFILES+=("list") +TESTFILES+=("exit") +select opt in "${TESTFILES[@]}" +do + if [ "$opt" = "exit" ]; then + break + fi + if [ "$opt" = "list" ]; then + for i in "${!TESTFILES[@]}"; do + printf "%s) %s\n" "$((i+1))" "${TESTFILES[$i]}" + done + else + # run the selected test + npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js $opt --env=$BROWSER + fi +done diff --git a/apps/remix-ide-e2e/src/tests/ballot_0_4_11.spec.ts b/apps/remix-ide-e2e/src/tests/ballot_0_4_11.test.ts similarity index 100% rename from apps/remix-ide-e2e/src/tests/ballot_0_4_11.spec.ts rename to apps/remix-ide-e2e/src/tests/ballot_0_4_11.test.ts 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 cc81e5ace4..8a6ca27cd3 100644 --- a/apps/remix-ide-e2e/src/tests/compiler_api.test.ts +++ b/apps/remix-ide-e2e/src/tests/compiler_api.test.ts @@ -9,6 +9,7 @@ const sources = [ ] module.exports = { + '@disabled': true, before: function (browser: NightwatchBrowser, done: VoidFunction) { init(browser, done) }, @@ -17,7 +18,7 @@ module.exports = { return sources }, - 'Should compile using "compileWithParamaters" API': function (browser: NightwatchBrowser) { + 'Should compile using "compileWithParamaters" API #group1': function (browser: NightwatchBrowser) { browser .addFile('test_jsCompile.js', { content: jsCompile }) .executeScript('remix.exeCurrent()') @@ -25,7 +26,7 @@ module.exports = { .click('*[data-id="terminalClearConsole"]') }, - 'Should compile using "compileWithParamaters" API with optimization On': function (browser: NightwatchBrowser) { + 'Should compile using "compileWithParamaters" API with optimization On #group2': function (browser: NightwatchBrowser) { browser .addFile('test_jsCompileWithOptimization.js', { content: jsCompileWithOptimization }) .executeScript('remix.exeCurrent()') @@ -33,7 +34,7 @@ module.exports = { .click('*[data-id="terminalClearConsole"]') }, - 'Should compile using "compileWithParamaters" API with optimization off check default runs': function (browser: NightwatchBrowser) { + 'Should compile using "compileWithParamaters" API with optimization off check default runs #group3': function (browser: NightwatchBrowser) { browser .addFile('test_jsCompileWithOptimizationDefault.js', { content: jsCompileWithOptimizationDefault }) .executeScript('remix.exeCurrent()') @@ -41,7 +42,7 @@ module.exports = { .click('*[data-id="terminalClearConsole"]') }, - 'Should update the compiler configuration with "setCompilerConfig" API': function (browser: NightwatchBrowser) { + 'Should update the compiler configuration with "setCompilerConfig" API #group4': function (browser: NightwatchBrowser) { browser .addFile('test_updateConfiguration.js', { content: updateConfiguration }) .executeScript('remix.exeCurrent()') @@ -50,7 +51,7 @@ module.exports = { .verifyContracts(['StorageTestUpdateConfiguration'], { wait: 5000, version: '0.6.8+commit.0bbfe453' }) }, - 'Should produce a stack too deep error': function (browser: NightwatchBrowser) { + 'Should produce a stack too deep error #group5': function (browser: NightwatchBrowser) { browser .setSolidityCompilerVersion('soljson-v0.8.1+commit.df193b15.js') .addFile('ContractStackLimit.sol', { content: contractStackLimit }) diff --git a/apps/remix-ide-e2e/src/tests/debugger.spec.ts b/apps/remix-ide-e2e/src/tests/debugger.test.ts similarity index 89% rename from apps/remix-ide-e2e/src/tests/debugger.spec.ts rename to apps/remix-ide-e2e/src/tests/debugger.test.ts index 81df25d21b..f6d72362c1 100644 --- a/apps/remix-ide-e2e/src/tests/debugger.spec.ts +++ b/apps/remix-ide-e2e/src/tests/debugger.test.ts @@ -3,7 +3,7 @@ import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' module.exports = { - + '@disabled': true, before: function (browser: NightwatchBrowser, done: VoidFunction) { init(browser, done) }, @@ -12,16 +12,17 @@ module.exports = { return sources }, - 'Should launch debugger': function (browser: NightwatchBrowser) { + 'Should launch debugger #group1': function (browser: NightwatchBrowser) { browser.addFile('blah.sol', sources[0]['blah.sol']) .clickLaunchIcon('udapp') .waitForElementPresent('*[title="Deploy - transact (not payable)"]', 65000) .click('*[title="Deploy - transact (not payable)"]') .debugTransaction(0) .waitForElementContainsText('*[data-id="sidePanelSwapitTitle"]', 'DEBUGGER', 60000) + .clearConsole() }, - 'Should debug failing transaction': function (browser: NightwatchBrowser) { + 'Should debug failing transaction #group1': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="verticalIconsKindudapp"]') .clickLaunchIcon('udapp') .waitForElementPresent('*[data-id="universalDappUiTitleExpander"]') @@ -29,14 +30,14 @@ module.exports = { .scrollAndClick('*[title="string name, uint256 goal"]') .setValue('*[title="string name, uint256 goal"]', '"toast", 999') .click('*[data-id="createProject - transact (not payable)"]') - .debugTransaction(1) + .debugTransaction(0) .pause(2000) .scrollAndClick('*[data-id="solidityLocals"]') .waitForElementContainsText('*[data-id="solidityLocals"]', 'toast', 60000) .waitForElementContainsText('*[data-id="solidityLocals"]', '999', 60000) }, - 'Should debug transaction using slider': function (browser: NightwatchBrowser) { + 'Should debug transaction using slider #group1': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="verticalIconsKindudapp"]') .waitForElementVisible('*[data-id="slider"]') // eslint-disable-next-line dot-notation @@ -48,7 +49,7 @@ module.exports = { .waitForElementContainsText('*[data-id="stepdetail"]', 'vm trace step:\n51', 60000) }, - 'Should step back and forward transaction': function (browser: NightwatchBrowser) { + 'Should step back and forward transaction #group1': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="verticalIconsKindudapp"]') .waitForElementPresent('*[data-id="buttonNavigatorIntoBack"]') .scrollAndClick('*[data-id="buttonNavigatorIntoBack"]') @@ -61,7 +62,7 @@ module.exports = { .waitForElementContainsText('*[data-id="stepdetail"]', 'execution step:\n51', 60000) }, - 'Should jump through breakpoints': function (browser: NightwatchBrowser) { + 'Should jump through breakpoints #group1': function (browser: NightwatchBrowser) { browser.waitForElementVisible('#editorView') .execute(() => { (window as any).addRemixBreakpoint(11) @@ -80,15 +81,17 @@ module.exports = { .waitForElementContainsText('*[data-id="stepdetail"]', 'execution step:\n352', 60000) }, - 'Should display solidity imported code while debugging github import': function (browser: NightwatchBrowser) { + 'Should display solidity imported code while debugging github import #group2': function (browser: NightwatchBrowser) { browser + .clearConsole() + .clearTransactions() .clickLaunchIcon('solidity') .testContracts('externalImport.sol', sources[1]['externalImport.sol'], ['ERC20']) .clickLaunchIcon('udapp') .waitForElementPresent('*[title="Deploy - transact (not payable)"]', 35000) .selectContract('ERC20') .createContract('"tokenName", "symbol"') - .debugTransaction(2) + .debugTransaction(0) .pause(2000) .waitForElementVisible('#stepdetail') .goToVMTraceStep(10) @@ -101,13 +104,14 @@ module.exports = { }) }, - 'Should display correct source highlighting while debugging a contract which has ABIEncoderV2': function (browser: NightwatchBrowser) { + 'Should display correct source highlighting while debugging a contract which has ABIEncoderV2 #group2': function (browser: NightwatchBrowser) { /* localVariable_step266_ABIEncoder and localVariable_step717_ABIEncoder still contains unwanted values (related to decoding calldata types) 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 + .clearConsole().clearTransactions() .clickLaunchIcon('solidity') .setSolidityCompilerVersion('soljson-v0.6.12+commit.27d51765.js') .clickLaunchIcon('filePanel') @@ -116,9 +120,10 @@ module.exports = { .clickLaunchIcon('udapp') .selectContract('test') .createContract('') - .clickInstance(2) + .clearConsole() + .clickInstance(0) .clickFunction('test1 - transact (not payable)', { types: 'bytes userData', values: '0x000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000015b38da6a701c568545dcfcb03fcb875f56beddc4' }) - .debugTransaction(4) + .debugTransaction(0) .pause(2000) .waitForElementVisible('#stepdetail') .goToVMTraceStep(261) @@ -138,11 +143,10 @@ module.exports = { .goToVMTraceStep(717) .pause(5000) .checkVariableDebug('soliditylocals', localVariable_step717_ABIEncoder) // all locals should be initiaed - .clickLaunchIcon('udapp') - .clickInstance(2) + .clearTransactions() }, - 'Should load more solidity locals array': function (browser: NightwatchBrowser) { + 'Should load more solidity locals array #group3': function (browser: NightwatchBrowser) { browser .clickLaunchIcon('solidity') .testContracts('locals.sol', sources[3]['locals.sol'], ['testLocals']) @@ -150,32 +154,37 @@ module.exports = { .waitForElementPresent('*[title="Deploy - transact (not payable)"]', 40000) .createContract('') .pause(2000) - .clickInstance(3) + .clearConsole() + .clickInstance(0) .clickFunction('t - transact (not payable)') .pause(2000) - .debugTransaction(6) - .waitForElementVisible('*[data-id="slider"]') + .debugTransaction(0) + .waitForElementVisible('*[data-id="slider"]').pause(2000) // .setValue('*[data-id="slider"]', '5000') // Like this, setValue doesn't work properly for input type = range // eslint-disable-next-line dot-notation - .execute(function () { document.getElementById('slider')['value'] = '7450' }) // It only moves slider to 7450 but vm traces are not updated + .execute(function () { document.getElementById('slider')['value'] = '7450' }).pause(10000) // It only moves slider to 7450 but vm traces are not updated .setValue('*[data-id="slider"]', new Array(3).fill(browser.Keys.RIGHT_ARROW)) // This will press NEXT 3 times and will update the trace details .waitForElementPresent('*[data-id="treeViewDivtreeViewItemarray"]') .click('*[data-id="treeViewDivtreeViewItemarray"]') .waitForElementPresent('*[data-id="treeViewDivtreeViewLoadMore"]') + .waitForElementVisible('*[data-id="solidityLocals"]') .waitForElementContainsText('*[data-id="solidityLocals"]', '9: 9 uint256', 60000) .notContainsText('*[data-id="solidityLocals"]', '10: 10 uint256') + .clearTransactions() + .clearConsole().pause(2000) }, - 'Should debug using generated sources': function (browser: NightwatchBrowser) { + 'Should debug using generated sources #group4': function (browser: NightwatchBrowser) { browser .clickLaunchIcon('solidity') .pause(2000) .testContracts('withGeneratedSources.sol', sources[4]['withGeneratedSources.sol'], ['A']) .clickLaunchIcon('udapp') .createContract('') - .clickInstance(4) + .clearConsole() + .clickInstance(0) .clickFunction('f - transact (not payable)', { types: 'uint256[] ', values: '[]' }) - .debugTransaction(8) + .debugTransaction(0) .pause(2000) .click('*[data-id="debuggerTransactionStartButton"]') // stop debugging .click('*[data-id="debugGeneratedSourcesLabel"]') // select debug with generated sources @@ -186,16 +195,16 @@ module.exports = { }) .click('*[data-id="debuggerTransactionStartButton"]') }, - - 'Should call the debugger api: getTrace': function (browser: NightwatchBrowser) { + // depends on Should debug using generated sources + 'Should call the debugger api: getTrace #group4': function (browser: NightwatchBrowser) { browser .addFile('test_jsGetTrace.js', { content: jsGetTrace }) .executeScript('remix.exeCurrent()') .pause(1000) .waitForElementContainsText('*[data-id="terminalJournal"]', '{"gas":"0x575f","return":"0x0000000000000000000000000000000000000000000000000000000000000000","structLogs":', 60000) }, - - 'Should call the debugger api: debug': function (browser: NightwatchBrowser) { + // depends on Should debug using generated sources + 'Should call the debugger api: debug #group4': function (browser: NightwatchBrowser) { browser .addFile('test_jsDebug.js', { content: jsDebug }) .executeScript('remix.exeCurrent()') @@ -214,7 +223,7 @@ module.exports = { .waitForElementContainsText('*[data-id="stepdetail"]', 'vm trace step:\n154', 60000) }, - 'Should start debugging using remix debug nodes (rinkeby)': '' + function (browser: NightwatchBrowser) { + 'Should start debugging using remix debug nodes (rinkeby) #group4': '' + function (browser: NightwatchBrowser) { browser .clickLaunchIcon('solidity') .setSolidityCompilerVersion('soljson-v0.8.7+commit.e28d00a7.js') @@ -428,7 +437,7 @@ const localVariable_step717_ABIEncoder = { // eslint-disable-line const jsGetTrace = `(async () => { try { - const result = await remix.call('debugger', 'getTrace', '0x9341be49e911afe99bf1abc67cbcf36739d2e6470a08a69511c205a0737d7332') + const result = await remix.call('debugger', 'getTrace', '0x16be5c31014a7e1552d136f7ed7bc7788f3bb9e45e31b059df253173f2df31e7') console.log('result ', result) } catch (e) { console.log(e.message) @@ -437,7 +446,7 @@ const jsGetTrace = `(async () => { const jsDebug = `(async () => { try { - const result = await remix.call('debugger', 'debug', '0x9341be49e911afe99bf1abc67cbcf36739d2e6470a08a69511c205a0737d7332') + const result = await remix.call('debugger', 'debug', '0x16be5c31014a7e1552d136f7ed7bc7788f3bb9e45e31b059df253173f2df31e7') console.log('result ', result) } catch (e) { console.log(e.message) diff --git a/apps/remix-ide-e2e/src/tests/editor.spec.ts b/apps/remix-ide-e2e/src/tests/editor.spec.ts index 43b77525e2..f0e88fe5cc 100644 --- a/apps/remix-ide-e2e/src/tests/editor.spec.ts +++ b/apps/remix-ide-e2e/src/tests/editor.spec.ts @@ -9,7 +9,7 @@ module.exports = { init(browser, done) }, - 'Should zoom in editor': function (browser: NightwatchBrowser) { + 'Should zoom in editor ': function (browser: NightwatchBrowser) { browser.waitForElementVisible('div[data-id="mainPanelPluginsContainer"]') .clickLaunchIcon('filePanel') .waitForElementVisible('div[data-id="filePanelFileExplorerTree"]') @@ -22,7 +22,7 @@ module.exports = { .checkElementStyle('.view-lines', 'font-size', '16px') }, - 'Should zoom out editor': function (browser: NightwatchBrowser) { + 'Should zoom out editor ': function (browser: NightwatchBrowser) { browser.waitForElementVisible('#editorView') .checkElementStyle('.view-lines', 'font-size', '16px') .click('*[data-id="tabProxyZoomOut"]') @@ -30,7 +30,7 @@ module.exports = { .checkElementStyle('.view-lines', 'font-size', '14px') }, - 'Should display compile error in editor': function (browser: NightwatchBrowser) { + 'Should display compile error in editor ': function (browser: NightwatchBrowser) { browser.waitForElementVisible('#editorView') .setEditorValue(storageContractWithError + 'error') .pause(2000) @@ -42,7 +42,7 @@ module.exports = { .checkAnnotations('fa-exclamation-square', 29) // error }, - 'Should minimize and maximize codeblock in editor': '' + function (browser: NightwatchBrowser) { + 'Should minimize and maximize codeblock in editor ': '' + function (browser: NightwatchBrowser) { browser.waitForElementVisible('#editorView') .waitForElementVisible('.ace_open') .click('.ace_start:nth-of-type(1)') @@ -51,7 +51,7 @@ module.exports = { .waitForElementVisible('.ace_open') }, - 'Should add breakpoint to editor': function (browser: NightwatchBrowser) { + 'Should add breakpoint to editor ': function (browser: NightwatchBrowser) { browser.waitForElementVisible('#editorView') .waitForElementNotPresent('.margin-view-overlays .fa-circle') .execute(() => { @@ -83,7 +83,7 @@ module.exports = { */ }, - 'Should highlight source code': function (browser: NightwatchBrowser) { + '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) @@ -115,7 +115,7 @@ module.exports = { .checkElementStyle('.highlightLine51', 'background-color', 'rgb(52, 152, 219)') }, - 'Should remove all highlights from source code': function (browser: NightwatchBrowser) { + 'Should remove all highlights from source code ': function (browser: NightwatchBrowser) { browser.waitForElementVisible('li[data-id="treeViewLitreeViewItemremoveAllSourcehighlightScript.js"]') .click('li[data-id="treeViewLitreeViewItemremoveAllSourcehighlightScript.js"]') .pause(2000) diff --git a/apps/remix-ide-e2e/src/tests/fileManager_api.spec.ts b/apps/remix-ide-e2e/src/tests/fileManager_api.test.ts similarity index 79% rename from apps/remix-ide-e2e/src/tests/fileManager_api.spec.ts rename to apps/remix-ide-e2e/src/tests/fileManager_api.test.ts index 3494cd019b..78e4ee8f1a 100644 --- a/apps/remix-ide-e2e/src/tests/fileManager_api.spec.ts +++ b/apps/remix-ide-e2e/src/tests/fileManager_api.test.ts @@ -3,11 +3,12 @@ import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' module.exports = { + '@disabled': true, before: function (browser: NightwatchBrowser, done: VoidFunction) { init(browser, done) }, - 'Should execute `file` api from file manager external api': function (browser: NightwatchBrowser) { + 'Should execute `file` api from file manager external api #group1': function (browser: NightwatchBrowser) { browser .addFile('file.js', { content: executeFile }) .executeScript('remix.exeCurrent()') @@ -15,7 +16,7 @@ module.exports = { .waitForElementContainsText('*[data-id="terminalJournal"]', 'file.js', 60000) }, - 'Should execute `exists` api from file manager external api': function (browser: NightwatchBrowser) { + 'Should execute `exists` api from file manager external api #group1': function (browser: NightwatchBrowser) { browser .addFile('exists.js', { content: executeExists }) .executeScript('remix.exeCurrent()') @@ -23,14 +24,14 @@ module.exports = { .waitForElementContainsText('*[data-id="terminalJournal"]', 'non-exists.js false', 60000) }, - 'Should execute `open` api from file manager external api': function (browser: NightwatchBrowser) { + 'Should execute `open` api from file manager external api #group1': function (browser: NightwatchBrowser) { browser .addFile('open.js', { content: executeOpen }) .executeScript('remix.exeCurrent()') .waitForElementContainsText('*[data-id="terminalJournal"]', 'contracts/3_Ballot.sol', 60000) }, - 'Should execute `writeFile` api from file manager external api': function (browser: NightwatchBrowser) { + 'Should execute `writeFile` api from file manager external api #group1': function (browser: NightwatchBrowser) { browser .addFile('writeFile.js', { content: executeWriteFile }) .executeScript('remix.exeCurrent()') @@ -41,21 +42,23 @@ module.exports = { }) }, - 'Should execute `readFile` api from file manager external api': function (browser: NightwatchBrowser) { + 'Should execute `readFile` api from file manager external api #group2': function (browser: NightwatchBrowser) { browser + .addFile('writeFile.js', { content: executeWriteFile }) + .executeScript('remix.exeCurrent()') .addFile('readFile.js', { content: executeReadFile }) .executeScript('remix.exeCurrent()') .waitForElementContainsText('*[data-id="terminalJournal"]', 'pragma solidity ^0.6.0', 60000) }, - 'Should execute `copyFile` api from file manager external api': function (browser: NightwatchBrowser) { + 'Should execute `copyFile` api from file manager external api #group2': function (browser: NightwatchBrowser) { browser .addFile('copyFile.js', { content: executeCopyFile }) .executeScript('remix.exeCurrent()') .waitForElementContainsText('*[data-id="terminalJournal"]', 'pragma solidity >=0.7.0 <0.9.0;', 60000) }, - 'Should execute `rename` api from file manager external api': function (browser: NightwatchBrowser) { + 'Should execute `rename` api from file manager external api #group2': function (browser: NightwatchBrowser) { browser .addFile('renameFile.js', { content: executeRename }) .executeScript('remix.exeCurrent()') @@ -63,7 +66,7 @@ module.exports = { .waitForElementPresent('[data-id="treeViewLitreeViewItemold_contract.sol"]', 60000) }, - 'Should execute `mkdir` api from file manager external api': function (browser: NightwatchBrowser) { + 'Should execute `mkdir` api from file manager external api #group3': function (browser: NightwatchBrowser) { browser .addFile('mkdirFile.js', { content: executeMkdir }) .executeScript('remix.exeCurrent()') @@ -71,7 +74,7 @@ module.exports = { .waitForElementPresent('[data-id="treeViewLitreeViewItemTest_Folder"]', 60000) }, - 'Should execute `readdir` api from file manager external api': function (browser: NightwatchBrowser) { + 'Should execute `readdir` api from file manager external api #group3': function (browser: NightwatchBrowser) { browser .addFile('readdirFile.js', { content: executeReaddir }) .executeScript('remix.exeCurrent()') @@ -79,8 +82,9 @@ module.exports = { .waitForElementContainsText('*[data-id="terminalJournal"]', 'true', 5000) }, - 'Should execute `remove` api from file manager external api': function (browser: NightwatchBrowser) { + 'Should execute `remove` api from file manager external api #group4': function (browser: NightwatchBrowser) { browser + .addFile('old_contract.sol', { content: 'test' }) .addFile('removeFile.js', { content: executeRemove }) .executeScript('remix.exeCurrent()') .pause(2000) @@ -88,12 +92,12 @@ module.exports = { }, // 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) { + 'Should execute `remove` api from file manager external api on a folder #group4': function (browser: NightwatchBrowser) { browser .addFile('test_jsRemoveFolder.js', { content: executeRemoveOnFolder }) .executeScript('remix.exeCurrent()') .pause(2000) - .waitForElementNotPresent('[data-id="treeViewLitreeViewItemTest_Folder"]', 60000) + .waitForElementNotPresent('[data-id="treeViewLitreeViewItemcontracts"]', 60000) .end() } } @@ -196,7 +200,7 @@ const executeRemove = ` const executeRemoveOnFolder = `(async () => { try { - await remix.call('fileManager', 'remove', 'Test_Folder') + await remix.call('fileManager', 'remove', 'contracts') } catch (e) { console.log(e.message) } diff --git a/apps/remix-ide-e2e/src/tests/generalSettings.test.ts b/apps/remix-ide-e2e/src/tests/generalSettings.test.ts index 92f8e42876..30346994bc 100644 --- a/apps/remix-ide-e2e/src/tests/generalSettings.test.ts +++ b/apps/remix-ide-e2e/src/tests/generalSettings.test.ts @@ -7,7 +7,7 @@ module.exports = { init(browser, done, 'http://127.0.0.1:8080', false) }, - 'Should display settings menu': function (browser: NightwatchBrowser) { + 'Should display settings menu ': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) .click('*[data-id="landingPageStartSolidity"]') .waitForElementVisible('*[data-id="verticalIconsKindsettings"]', 5000) @@ -15,7 +15,7 @@ module.exports = { .waitForElementContainsText('h6[data-id="sidePanelSwapitTitle"]', 'SETTINGS') }, - 'Should activate `generate contract metadata`': function (browser) { + 'Should activate `generate contract metadata` ': function (browser) { browser.waitForElementVisible('*[data-id="remixIdeSidePanel"]', 5000) .waitForElementVisible('*[data-id="settingsTabGenerateContractMetadataLabel"]', 5000) .verify.elementPresent('[data-id="settingsTabGenerateContractMetadata"]:checked') @@ -35,7 +35,7 @@ module.exports = { }) }, - 'Should add new github access token': function (browser: NightwatchBrowser) { + 'Should add new github access token ': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="verticalIconsKindsettings"]', 5000) .click('*[data-id="verticalIconsKindsettings"]') .setValue('*[data-id="settingsTabGistAccessToken"]', '**********') @@ -45,7 +45,7 @@ module.exports = { .pause(3000) }, - 'Should copy github access token to clipboard': function (browser: NightwatchBrowser) { + 'Should copy github access token to clipboard ': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="verticalIconsKindsettings"]', 5000) .click('*[data-id="copyToClipboardCopyIcon"]') .waitForElementVisible('*[data-shared="tooltipPopup"]', 5000) @@ -54,7 +54,7 @@ module.exports = { // .assert.containsText('*[data-shared="tooltipPopup"]:nth-last-of-type(1)', 'Copied value to clipboard.') }, - 'Should remove github access token': function (browser: NightwatchBrowser) { + 'Should remove github access token ': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="verticalIconsKindsettings"]', 5000) .pause(1000) .click('*[data-id="settingsTabRemoveGistToken"]') @@ -63,7 +63,7 @@ module.exports = { .assert.containsText('*[data-id="settingsTabGistAccessToken"]', '') }, - 'Should load dark theme': function (browser: NightwatchBrowser) { + 'Should load dark theme ': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="verticalIconsKindsettings"]', 5000) .click('*[data-id="settingsTabThemeLabelDark"]') .pause(2000) @@ -75,7 +75,7 @@ module.exports = { .checkElementStyle(':root', '--danger', remixIdeThemes.dark.danger) }, - 'Should load light theme': function (browser: NightwatchBrowser) { + 'Should load light theme ': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="verticalIconsKindsettings"]', 5000) .click('*[data-id="settingsTabThemeLabelLight"]') .pause(2000) @@ -87,7 +87,7 @@ module.exports = { .checkElementStyle(':root', '--danger', remixIdeThemes.light.danger) }, - 'Should load Cerulean theme': function (browser: NightwatchBrowser) { + 'Should load Cerulean theme ': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="verticalIconsKindsettings"]', 5000) .click('*[data-id="settingsTabThemeLabelCerulean"]') .pause(5000) @@ -99,7 +99,7 @@ module.exports = { .checkElementStyle(':root', '--danger', remixIdeThemes.curelean.danger) }, - 'Should load Flatly theme': function (browser: NightwatchBrowser) { + 'Should load Flatly theme ': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="verticalIconsKindsettings"]', 5000) .click('*[data-id="settingsTabThemeLabelFlatly"]') .pause(2000) @@ -111,7 +111,7 @@ module.exports = { .checkElementStyle(':root', '--danger', remixIdeThemes.flatly.danger) }, - 'Should load Spacelab theme': function (browser) { + 'Should load Spacelab theme ': function (browser) { browser.waitForElementVisible('*[data-id="verticalIconsKindsettings"]', 5000) .click('*[data-id="settingsTabThemeLabelSpacelab"]') .pause(2000) @@ -123,7 +123,7 @@ module.exports = { .checkElementStyle(':root', '--danger', remixIdeThemes.spacelab.danger) }, - 'Should load Cyborg theme': function (browser) { + 'Should load Cyborg theme ': function (browser) { browser.waitForElementVisible('*[data-id="verticalIconsKindsettings"]', 5000) .click('*[data-id="settingsTabThemeLabelCyborg"]') .pause(2000) diff --git a/apps/remix-ide-e2e/src/tests/gist.spec.ts b/apps/remix-ide-e2e/src/tests/gist.test.ts similarity index 100% rename from apps/remix-ide-e2e/src/tests/gist.spec.ts rename to apps/remix-ide-e2e/src/tests/gist.test.ts diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index 9eae1f8c4f..2ad4d82144 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -10,7 +10,7 @@ declare global { const localPluginData: Profile & LocationProfile & ExternalProfile = { name: 'localPlugin', displayName: 'Local Plugin', - canActivate: ['dGitProvider', 'flattener', 'solidityUnitTesting'], + canActivate: ['dGitProvider', 'flattener', 'solidityUnitTesting', 'udapp'], url: 'http://localhost:2020', location: 'sidePanel' } @@ -127,8 +127,9 @@ const assertPluginIsActive = function (browser: NightwatchBrowser, id: string, s } module.exports = { + '@disabled': true, before: function (browser: NightwatchBrowser, done: VoidFunction) { - init(browser, done, 'http://127.0.0.1:8080', false) + init(browser, done) // , 'http://localhost:8080', false) }, afterEach: function (browser: NightwatchBrowser) { @@ -144,13 +145,13 @@ module.exports = { }, // UDAPP - 'Should get accounts': async function (browser: NightwatchBrowser) { + 'Should get accounts #group1': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'udapp:getAccounts', '0x5B38Da6a701c568545dCfcB03FcB875f56beddC4', null, null) }, // context menu item - 'Should create context menu item': async function (browser: NightwatchBrowser) { + 'Should create context menu item #group1': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'filePanel:registerContextMenuItem', null, null, { id: 'localPlugin', name: 'testCommand', @@ -179,118 +180,118 @@ module.exports = { // FILESYSTEM - 'Should get current workspace': async function (browser: NightwatchBrowser) { + 'Should get current workspace #group7': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'filePanel:getCurrentWorkspace', { name: 'default_workspace', isLocalhost: false, absolutePath: '.workspaces/default_workspace' }, null, null) }, - 'Should get current files': async function (browser: NightwatchBrowser) { + 'Should get current files #group7': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'fileManager:readdir', { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null, '/') }, - 'Should throw error on current file': async function (browser: NightwatchBrowser) { + 'Should throw error on current file #group7': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'Error from IDE : Error: No such file or directory No file selected', null, null) }, - 'Should open readme.txt': async function (browser: NightwatchBrowser) { + 'Should open readme.txt #group7': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'fileManager:open', null, { event: 'currentFileChanged', args: ['README.txt'] }, 'README.txt') }, - 'Should have current file': async function (browser: NightwatchBrowser) { + 'Should have current file #group7': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'README.txt', null, null) }, - 'Should create dir': async function (browser: NightwatchBrowser) { + 'Should create dir #group7': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'fileManager:mkdir', null, null, 'testdir') await clickAndCheckLog(browser, 'fileManager:readdir', 'testdir', null, '/') }, - 'Should get file': async function (browser: NightwatchBrowser) { + 'Should get file #group7': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'fileManager:getFile', 'REMIX EXAMPLE PROJECT', null, 'README.txt') }, - 'Should close all files': async function (browser: NightwatchBrowser) { + 'Should close all files #group7': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'fileManager:closeAllFiles', null, { event: 'noFileSelected', args: [] }, null) }, - 'Should switch to file': async function (browser: NightwatchBrowser) { + 'Should switch to file #group2': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'fileManager:switchFile', null, { event: 'currentFileChanged', args: ['contracts/1_Storage.sol'] }, 'contracts/1_Storage.sol') await clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'contracts/1_Storage.sol', null, null) await clickAndCheckLog(browser, 'fileManager:switchFile', null, { event: 'currentFileChanged', args: ['README.txt'] }, 'README.txt') await clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'README.txt', null, null) }, - 'Should write to file': async function (browser: NightwatchBrowser) { + 'Should write to file #group2': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'fileManager:writeFile', null, { event: 'fileSaved', args: ['README.txt'] }, ['README.txt', 'test']) await clickAndCheckLog(browser, 'fileManager:readFile', 'test', null, 'README.txt') }, - 'Should set file': async function (browser: NightwatchBrowser) { + 'Should set file #group2': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'fileManager:setFile', null, { event: 'fileAdded', args: ['new.sol'] }, ['new.sol', 'test']) await clickAndCheckLog(browser, 'fileManager:readFile', 'test', null, 'new.sol') }, - 'Should write to new file': async function (browser: NightwatchBrowser) { + 'Should write to new file #group2': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'fileManager:writeFile', null, { event: 'fileAdded', args: ['testing.txt'] }, ['testing.txt', 'test']) await clickAndCheckLog(browser, 'fileManager:readFile', 'test', null, 'testing.txt') }, - 'Should rename file': async function (browser: NightwatchBrowser) { + 'Should rename file #group2': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'fileManager:rename', null, null, ['testing.txt', 'testrename.txt']) await clickAndCheckLog(browser, 'fileManager:readFile', 'test', null, 'testrename.txt') }, - 'Should create empty workspace': async function (browser: NightwatchBrowser) { + 'Should create empty workspace #group2': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'filePanel:createWorkspace', null, null, ['emptyworkspace', true]) await clickAndCheckLog(browser, 'filePanel:getCurrentWorkspace', { name: 'emptyworkspace', isLocalhost: false, absolutePath: '.workspaces/emptyworkspace' }, null, null) await clickAndCheckLog(browser, 'fileManager:readdir', {}, null, '/') }, - 'Should create workspace': async function (browser: NightwatchBrowser) { + 'Should create workspace #group2': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'filePanel:createWorkspace', null, null, 'testspace') await clickAndCheckLog(browser, 'filePanel:getCurrentWorkspace', { name: 'testspace', isLocalhost: false, absolutePath: '.workspaces/testspace' }, null, null) await clickAndCheckLog(browser, 'fileManager:readdir', { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null, null) }, - 'Should get all workspaces': async function (browser: NightwatchBrowser) { + 'Should get all workspaces #group2': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'filePanel:getWorkspaces', ['default_workspace', 'emptyworkspace', 'testspace'], null, null) }, - 'Should have set workspace event': async function (browser: NightwatchBrowser) { + 'Should have set workspace event #group2': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'filePanel:createWorkspace', null, { event: 'setWorkspace', args: [{ name: 'newspace', isLocalhost: false }] }, 'newspace') }, - 'Should have event when switching workspace': async function (browser: NightwatchBrowser) { + 'Should have event when switching workspace #group2': async function (browser: NightwatchBrowser) { // @ts-ignore browser.frameParent().useCss().clickLaunchIcon('filePanel').click('*[data-id="workspacesSelect"] option[value="default_workspace"]').useXpath().click('//*[@data-id="verticalIconsKindlocalPlugin"]').frame(0, async () => { await clickAndCheckLog(browser, null, null, { event: 'setWorkspace', args: [{ name: 'default_workspace', isLocalhost: false }] }, null) }) }, - 'Should rename workspace': async function (browser: NightwatchBrowser) { + 'Should rename workspace #group2': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'filePanel:renameWorkspace', null, null, ['default_workspace', 'renamed']) await clickAndCheckLog(browser, 'filePanel:getWorkspaces', ['emptyworkspace', 'testspace', 'newspace', 'renamed'], null, null) }, - 'Should delete workspace': async function (browser: NightwatchBrowser) { + 'Should delete workspace #group2': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'filePanel:deleteWorkspace', null, null, ['testspace']) await clickAndCheckLog(browser, 'filePanel:getWorkspaces', ['emptyworkspace', 'newspace', 'renamed'], null, null) }, // DGIT - 'Should have changes on new workspace': async function (browser: NightwatchBrowser) { + 'Should have changes on new workspace #group3': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'filePanel:createWorkspace', null, null, 'dgit') await clickAndCheckLog(browser, 'dGitProvider:status', [['README.txt', 0, 2, 0], ['contracts/1_Storage.sol', 0, 2, 0], ['contracts/2_Owner.sol', 0, 2, 0], ['contracts/3_Ballot.sol', 0, 2, 0], ['scripts/deploy_ethers.js', 0, 2, 0], ['scripts/deploy_web3.js', 0, 2, 0], ['tests/4_Ballot_test.sol', 0, 2, 0]], null, null) }, - 'Should stage contract': async function (browser: NightwatchBrowser) { + 'Should stage contract #group3': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'dGitProvider:add', null, null, { filepath: 'contracts/1_Storage.sol' }) await clickAndCheckLog(browser, 'dGitProvider:status', [['README.txt', 0, 2, 0], ['contracts/1_Storage.sol', 0, 2, 2], ['contracts/2_Owner.sol', 0, 2, 0], ['contracts/3_Ballot.sol', 0, 2, 0], ['scripts/deploy_ethers.js', 0, 2, 0], ['scripts/deploy_web3.js', 0, 2, 0], ['tests/4_Ballot_test.sol', 0, 2, 0]], null, null) }, - 'Should commit changes': async function (browser: NightwatchBrowser) { + 'Should commit changes #group3': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'dGitProvider:commit', null, null, { author: { name: 'Remix', email: 'Remix' }, message: 'commit-message' }) await clickAndCheckLog(browser, 'dGitProvider:log', 'commit-message', null, null) }, - 'Should have git log': async function (browser: NightwatchBrowser) { + 'Should have git log #group3': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'dGitProvider:log', 'commit-message', null, null) }, - 'Should have branches': async function (browser: NightwatchBrowser) { + 'Should have branches #group3': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'dGitProvider:branches', [{ name: 'main' }], null, null) }, // resolver - 'Should resolve url': async function (browser: NightwatchBrowser) { + 'Should resolve url #group4': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'contentImport:resolve', '# Remix Project', null, 'https://github.com/ethereum/remix-project/blob/master/README.md') }, - 'Should resolve and save url': async function (browser: NightwatchBrowser) { + 'Should resolve and save url #group4': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'contentImport:resolveAndSave', '# Remix Project', { event: 'fileAdded', args: ['.deps/github/ethereum/remix-project/README.md'] }, 'https://github.com/ethereum/remix-project/blob/master/README.md') }, // UNIT TESTING - 'Should activate solidityUnitTesting': async function (browser: NightwatchBrowser) { + 'Should activate solidityUnitTesting #group5': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'manager:activatePlugin', null, null, 'solidityUnitTesting') browser.frameParent() assertPluginIsActive(browser, 'solidityUnitTesting', true) @@ -299,11 +300,11 @@ module.exports = { await clickAndCheckLog(browser, 'manager:isActive', true, null, 'solidityUnitTesting') }, - 'Should test from path with solidityUnitTesting': async function (browser: NightwatchBrowser) { + 'Should test from path with solidityUnitTesting #group5': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'solidityUnitTesting:testFromPath', '"totalPassing":2,"totalFailing":0', null, 'tests/4_Ballot_test.sol') }, - 'Should deactivate solidityUnitTesting': async function (browser: NightwatchBrowser) { + 'Should deactivate solidityUnitTesting #group5': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'manager:deactivatePlugin', null, null, 'solidityUnitTesting') browser.frameParent() assertPluginIsActive(browser, 'solidityUnitTesting', false) @@ -314,14 +315,14 @@ module.exports = { // COMPILER - 'Should compile a file': async function (browser: NightwatchBrowser) { + 'Should compile a file #group6': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'solidity:compile', null, null, 'contracts/1_Storage.sol') browser.pause(5000, async () => { await clickAndCheckLog(browser, 'solidity:compile', null, 'compilationFinished', null) }) }, - 'Should get compilationresults': async function (browser: NightwatchBrowser) { + 'Should get compilationresults #group6': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'solidity:getCompilationResult', 'contracts/1_Storage.sol', null, null) } } diff --git a/apps/remix-ide-e2e/src/tests/recorder.spec.ts b/apps/remix-ide-e2e/src/tests/recorder.test.ts similarity index 100% rename from apps/remix-ide-e2e/src/tests/recorder.spec.ts rename to apps/remix-ide-e2e/src/tests/recorder.test.ts diff --git a/apps/remix-ide-e2e/src/tests/remixd.test.ts b/apps/remix-ide-e2e/src/tests/remixd.test.ts index 970a4f556a..38f66665c0 100644 --- a/apps/remix-ide-e2e/src/tests/remixd.test.ts +++ b/apps/remix-ide-e2e/src/tests/remixd.test.ts @@ -45,6 +45,7 @@ const sources = [ ] module.exports = { + '@disabled': true, before: function (browser, done) { init(browser, done) }, @@ -52,25 +53,27 @@ module.exports = { '@sources': function () { return sources }, - - Remixd: function (browser) { + 'start Remixd': function (browser) { + startRemixd(browser) + }, + 'run Remixd tests #group4': function (browser) { runTests(browser) }, - 'Import from node_modules ': function (browser) { + 'Import from node_modules #group1': function (browser) { /* when a relative import is used (i.e import "openzeppelin-solidity/contracts/math/SafeMath.sol") remix (as well as truffle) try to resolve it against the node_modules and installed_contracts folder. */ browser.waitForElementVisible('#icon-panel', 2000) - // .clickLaunchIcon('filePanel') + .clickLaunchIcon('filePanel') .click('[data-path="ballot.sol"]') .addFile('test_import_node_modules.sol', sources[3]['test_import_node_modules.sol']) .clickLaunchIcon('solidity') .setSolidityCompilerVersion('soljson-v0.5.0+commit.1d4f565a.js') .testContracts('test_import_node_modules.sol', sources[3]['test_import_node_modules.sol'], ['SafeMath']) }, - 'Import from node_modules and reference a github import': function (browser) { + 'Import from node_modules and reference a github import #group2': function (browser) { browser.waitForElementVisible('#icon-panel', 2000) .clickLaunchIcon('filePanel') .addFile('test_import_node_modules_with_github_import.sol', sources[4]['test_import_node_modules_with_github_import.sol']) @@ -78,7 +81,7 @@ module.exports = { .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]['test_import_node_modules_with_github_import.sol'], ['ERC20', 'test11']) }, - 'Static Analysis run with remixd': function (browser) { + 'Static Analysis run with remixd #group3': function (browser) { browser.testContracts('test_static_analysis_with_remixd_and_hardhat.sol', sources[5]['test_static_analysis_with_remixd_and_hardhat.sol'], ['test5']) .clickLaunchIcon('solidityStaticAnalysis') .click('#staticanalysisButton button') @@ -101,7 +104,7 @@ module.exports = { .journalLastChildIncludes('On branch ') }, - 'Close Remixd': function (browser) { + 'Close Remixd #group3': function (browser) { browser .clickLaunchIcon('pluginManager') .scrollAndClick('#pluginManager *[data-id="pluginManagerComponentDeactivateButtonremixd"]') @@ -109,7 +112,7 @@ module.exports = { } } -function runTests (browser: NightwatchBrowser) { +function startRemixd (browser: NightwatchBrowser) { const browserName = browser.options.desiredCapabilities.browserName if (browserName === 'safari' || browserName === 'internet explorer') { console.log('do not run remixd test for ' + browserName + ': sauce labs doesn\'t seems to handle websocket') @@ -126,7 +129,11 @@ function runTests (browser: NightwatchBrowser) { .pause(2000) .click('#modal-footer-ok') // .click('*[data-id="workspacesModalDialog-modal-footer-ok-react"]') - .clickLaunchIcon('filePanel') +} + +function runTests (browser: NightwatchBrowser) { + const browserName = browser.options.desiredCapabilities.browserName + browser.clickLaunchIcon('filePanel') .waitForElementVisible('[data-path="folder1"]') .click('[data-path="folder1"]') .waitForElementVisible('[data-path="contract1.sol"]') @@ -156,7 +163,7 @@ function runTests (browser: NightwatchBrowser) { .waitForElementVisible('[data-path="folder1/renamed_contract_' + browserName + '.sol"]') // check if renamed file is preset .waitForElementNotPresent('[data-path="folder1/contract_' + browserName + '.sol"]') // check if renamed (old) file is not present .waitForElementNotPresent('[data-path="folder1/contract_' + browserName + '_toremove.sol"]') // check if removed (old) file is not present - // .click('[data-path="folder1/renamed_contract_' + browserName + '.sol"]') + // .click('[data-path="folder1/renamed_contract_' + browserName + '.sol"]') } function testImportFromRemixd (browser: NightwatchBrowser, callback: VoidFunction) { diff --git a/apps/remix-ide-e2e/src/tests/runAndDeploy.ts b/apps/remix-ide-e2e/src/tests/runAndDeploy.test.ts similarity index 92% rename from apps/remix-ide-e2e/src/tests/runAndDeploy.ts rename to apps/remix-ide-e2e/src/tests/runAndDeploy.test.ts index a138bc77d1..e700b2d27a 100644 --- a/apps/remix-ide-e2e/src/tests/runAndDeploy.ts +++ b/apps/remix-ide-e2e/src/tests/runAndDeploy.test.ts @@ -6,7 +6,7 @@ const passphrase = process.env.account_passphrase const password = process.env.account_password module.exports = { - + '@disabled': true, before: function (browser: NightwatchBrowser, done: VoidFunction) { init(browser, done) }, @@ -15,14 +15,14 @@ module.exports = { return sources }, - 'Should load run and deploy tab': function (browser: NightwatchBrowser) { + 'Should load run and deploy tab #group1 #group2': function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="remixIdeSidePanel"]') .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) { + 'Should load run and deploy tab and check value validation #group1': function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="remixIdeSidePanel"]') .assert.containsText('*[data-id="sidePanelSwapitTitle"]', 'DEPLOY & RUN TRANSACTIONS') .validateValueInput('#value', '0000', '0') @@ -30,30 +30,30 @@ module.exports = { .validateValueInput('#value', 'dragon', '0') }, - 'Should sign message using account key': function (browser: NightwatchBrowser) { - browser.waitForElementPresent('*[data-id="settingsRemixRunSignMsg"]') + 'Should sign message using account key #group2': function (browser: NightwatchBrowser) { + browser.waitForElementVisible('*[data-id="settingsRemixRunSignMsg"]') .click('select[id="selectExEnvOptions"] option[value="vm-berlin"]') .pause(2000) .click('*[data-id="settingsRemixRunSignMsg"]') .pause(2000) - .waitForElementPresent('*[data-id="modalDialogCustomPromptText"]') + .waitForElementVisible('*[data-id="modalDialogCustomPromptText"]', 120000) .setValue('*[data-id="modalDialogCustomPromptText"]', 'Remix is cool!') .assert.elementNotPresent('*[data-id="settingsRemixRunSignMsgHash"]') .assert.elementNotPresent('*[data-id="settingsRemixRunSignMsgSignature"]') .modalFooterOKClick() - .waitForElementPresent('*[data-id="modalDialogContainer"]', 12000) + .waitForElementVisible('*[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"]') + 'Should deploy contract on JavascriptVM #group3': function (browser: NightwatchBrowser) { + browser.waitForElementVisible('*[data-id="remixIdeSidePanel"]') .clickLaunchIcon('filePanel') .addFile('Greet.sol', sources[0]['Greet.sol']) .clickLaunchIcon('udapp') .selectAccount('0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c') - .waitForElementPresent('*[data-id="Deploy - transact (not payable)"]', 45000) + .waitForElementVisible('*[data-id="Deploy - transact (not payable)"]', 45000) .click('*[data-id="Deploy - transact (not payable)"]') .pause(5000) .testFunction('last', { @@ -61,7 +61,7 @@ module.exports = { }) }, - 'Should run low level interaction (fallback function)': function (browser: NightwatchBrowser) { + 'Should run low level interaction (fallback function) #group3': function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="remixIdeSidePanel"]') .waitForElementPresent('*[data-id="universalDappUiTitleExpander"]') .click('*[data-id="universalDappUiTitleExpander"]') diff --git a/apps/remix-ide-e2e/src/tests/solidityImport.spec.ts b/apps/remix-ide-e2e/src/tests/solidityImport.test.ts similarity index 86% rename from apps/remix-ide-e2e/src/tests/solidityImport.spec.ts rename to apps/remix-ide-e2e/src/tests/solidityImport.test.ts index c6aa51474c..c67265f9c1 100644 --- a/apps/remix-ide-e2e/src/tests/solidityImport.spec.ts +++ b/apps/remix-ide-e2e/src/tests/solidityImport.test.ts @@ -3,6 +3,7 @@ import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' module.exports = { + '@disabled': true, before: function (browser: NightwatchBrowser, done: VoidFunction) { init(browser, done) }, @@ -11,11 +12,11 @@ module.exports = { return sources }, - 'Test Simple Contract': function (browser: NightwatchBrowser) { + 'Test Simple Contract #group1': function (browser: NightwatchBrowser) { browser.testContracts('Untitled.sol', sources[0]['Untitled.sol'], ['test1', 'test2']) }, - 'Test Success Import': function (browser: NightwatchBrowser) { + 'Test Success Import #group1': function (browser: NightwatchBrowser) { browser.addFile('Untitled1.sol', sources[1]['Untitled1.sol']) .addFile('Untitled2.sol', sources[1]['Untitled2.sol']) .openFile('Untitled1.sol') @@ -23,13 +24,13 @@ module.exports = { .pause(1000) }, - 'Test Failed Import': function (browser: NightwatchBrowser) { + 'Test Failed Import #group1': function (browser: NightwatchBrowser) { browser.addFile('Untitled3.sol', sources[2]['Untitled3.sol']) .clickLaunchIcon('solidity') .assert.containsText('#compileTabView .error pre', 'not found Untitled11.sol') }, - 'Test Github Import - from master branch': function (browser: NightwatchBrowser) { + 'Test Github Import - from master branch #group1': function (browser: NightwatchBrowser) { browser .setSolidityCompilerVersion('soljson-v0.8.0+commit.c7dfd78e.js') // open-zeppelin moved to pragma ^0.8.0 (master branch) .addFile('Untitled4.sol', sources[3]['Untitled4.sol']) @@ -37,7 +38,7 @@ module.exports = { .verifyContracts(['test7', 'ERC20'], { wait: 10000 }) }, - 'Test Github Import - from other branch': function (browser: NightwatchBrowser) { + 'Test Github Import - from other branch #group2': 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]['Untitled5.sol']) @@ -45,7 +46,7 @@ module.exports = { .verifyContracts(['test8', 'ERC20', 'SafeMath'], { wait: 10000 }) }, - 'Test Github Import - no branch specified': function (browser: NightwatchBrowser) { + 'Test Github Import - no branch specified #group2': function (browser: NightwatchBrowser) { browser .setSolidityCompilerVersion('soljson-v0.8.0+commit.c7dfd78e.js') // open-zeppelin moved to pragma ^0.8.0 (master branch) .clickLaunchIcon('filePanel') @@ -55,7 +56,7 @@ module.exports = { .verifyContracts(['test10', 'ERC20'], { wait: 10000 }) }, - 'Test Github Import - raw URL': function (browser: NightwatchBrowser) { + 'Test Github Import - raw URL #group4': function (browser: NightwatchBrowser) { browser .clickLaunchIcon('filePanel') .click('li[data-id="treeViewLitreeViewItemREADME.txt"') @@ -64,7 +65,7 @@ module.exports = { .verifyContracts(['test11', 'ERC20'], { wait: 10000 }) }, - 'Test switch to a github import from a solidity warning': function (browser: NightwatchBrowser) { + 'Test switch to a github import from a solidity warning #group3': function (browser: NightwatchBrowser) { browser .setSolidityCompilerVersion('soljson-v0.7.4+commit.3f05b770.js') .clickLaunchIcon('filePanel') @@ -80,7 +81,7 @@ module.exports = { }) }, - 'Test NPM Import (with unpkg.com)': function (browser: NightwatchBrowser) { + 'Test NPM Import (with unpkg.com) #group3': function (browser: NightwatchBrowser) { browser .setSolidityCompilerVersion('soljson-v0.8.7+commit.e28d00a7.js') .clickLaunchIcon('filePanel') diff --git a/apps/remix-ide-e2e/src/tests/solidityImport_group1.spec.ts b/apps/remix-ide-e2e/src/tests/solidityImport_group1.spec.ts new file mode 100644 index 0000000000..eda1e433aa --- /dev/null +++ b/apps/remix-ide-e2e/src/tests/solidityImport_group1.spec.ts @@ -0,0 +1,6 @@ +'use strict' +import * as test from './solidityImport.test' +import buildGroupTest from '../helpers/buildgrouptest' +const group = 'group1' + +module.exports = buildGroupTest(group, test) diff --git a/apps/remix-ide-e2e/src/tests/solidityUnittests.spec.ts b/apps/remix-ide-e2e/src/tests/solidityUnittests.test.ts similarity index 93% rename from apps/remix-ide-e2e/src/tests/solidityUnittests.spec.ts rename to apps/remix-ide-e2e/src/tests/solidityUnittests.test.ts index e5a4136eb5..f6ccce0509 100644 --- a/apps/remix-ide-e2e/src/tests/solidityUnittests.spec.ts +++ b/apps/remix-ide-e2e/src/tests/solidityUnittests.test.ts @@ -4,7 +4,7 @@ import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' module.exports = { - + '@disabled': true, before: function (browser: NightwatchBrowser, done) { init(browser, done) }, @@ -12,18 +12,24 @@ module.exports = { '@sources': function () { return sources }, - - 'Should launch solidity unit test plugin and create test files in FE': function (browser: NightwatchBrowser) { + 'open SUT plugin': function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="verticalIconsKindfilePanel"]') - .clickLaunchIcon('filePanel') - .addFile('simple_storage.sol', sources[0]['simple_storage.sol']) - .addFile('ks2a.sol', sources[0]['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('filePanel') + .waitForElementPresent('[data-id="treeViewDivtreeViewItemtests"]') + .click('[data-id="treeViewDivtreeViewItemtests"]') + .clickLaunchIcon('pluginManager') + }, + + 'Should launch solidity unit test plugin and create test files in FE #group1 #group2': function (browser: NightwatchBrowser) { + browser.waitForElementPresent('*[data-id="verticalIconsKindfilePanel"]') + .clickLaunchIcon('filePanel') + .addFile('simple_storage.sol', sources[0]['simple_storage.sol']) + .addFile('ks2a.sol', sources[0]['ks2a.sol']) .waitForElementVisible('li[data-id="treeViewLitreeViewItem.deps/remix-tests/remix_tests.sol"]') .waitForElementVisible('li[data-id="treeViewLitreeViewItem.deps/remix-tests/remix_accounts.sol"]') .openFile('.deps/remix-tests/remix_tests.sol') @@ -34,22 +40,19 @@ module.exports = { .getEditorValue((content) => browser.assert.ok(content.indexOf('library TestsAccounts {') !== -1)) }, - 'Should generate test file': function (browser: NightwatchBrowser) { + 'Should generate test file #group1': function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="verticalIconsKindfilePanel"]') .clickLaunchIcon('filePanel') .openFile('simple_storage.sol') .click('*[data-id="verticalIconsKindsolidityUnitTesting"]') .waitForElementPresent('*[data-id="testTabGenerateTestFile"]') .click('*[data-id="testTabGenerateTestFile"]') - .waitForElementPresent('*[title="default_workspace/tests/simple_storage_test.sol"]') .clickLaunchIcon('filePanel') - .waitForElementPresent('[data-id="treeViewDivtreeViewItemtests"]') - .click('[data-id="treeViewDivtreeViewItemtests"]') - .openFile('tests/simple_storage_test.sol') + .waitForElementPresent('*[title="default_workspace/tests/simple_storage_test.sol"]') .removeFile('tests/simple_storage_test.sol', 'default_workspace') }, - 'Should run simple unit test `simple_storage_test.sol` ': function (browser: NightwatchBrowser) { + 'Should run simple unit test `simple_storage_test.sol` #group1': function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="verticalIconsKindfilePanel"]') .addFile('tests/simple_storage_test.sol', sources[0]['tests/simple_storage_test.sol']) .click('*[data-id="verticalIconsKindsolidityUnitTesting"]') @@ -66,14 +69,14 @@ module.exports = { .waitForElementContainsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'FAIL MyTest (tests/simple_storage_test.sol)', 120000) }, - 'Should run advance unit test using natspec and experimental ABIEncoderV2 `ks2b_test.sol` ': function (browser: NightwatchBrowser) { + 'Should run advance unit test using natspec and experimental ABIEncoderV2 `ks2b_test.sol` #group2': function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="verticalIconsKindfilePanel"]') .clickLaunchIcon('filePanel') .addFile('tests/ks2b_test.sol', sources[0]['tests/ks2b_test.sol']) .click('*[data-id="verticalIconsKindsolidityUnitTesting"]') .waitForElementPresent('*[data-id="testTabCheckAllTests"]') .click('*[data-id="testTabCheckAllTests"]') - .clickElementAtPosition('.singleTestLabel', 2) + .clickElementAtPosition('.singleTestLabel', 1) .scrollAndClick('*[data-id="testTabRunTestsTabRunAction"]') .waitForElementContainsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'tests/ks2b_test.sol', 120000) .waitForElementContainsText('*[data-id="testTabSolidityUnitTestsOutput"]', '✓ Check project exists', 120000) @@ -86,11 +89,10 @@ module.exports = { .waitForElementContainsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'wrong value', 120000) }, - 'Should stop unit tests during test execution` ': function (browser: NightwatchBrowser) { + 'Should stop unit tests during test execution` #group2': function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="verticalIconsKindfilePanel"]') .waitForElementPresent('*[data-id="testTabRunTestsTabRunAction"]') .clickElementAtPosition('.singleTestLabel', 0) - .clickElementAtPosition('.singleTestLabel', 1) .scrollAndClick('*[data-id="testTabRunTestsTabRunAction"]') .pause(2000) .click('*[data-id="testTabRunTestsTabStopAction"]') @@ -100,14 +102,15 @@ module.exports = { .waitForElementContainsText('*[data-id="testTabTestsExecutionStopped"]', 'The test execution has been stopped', 60000) }, - 'Should fail on compilation, open file on error click, not disappear error': function (browser: NightwatchBrowser) { + 'Should fail on compilation, open file on error click, not disappear error #group2': function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="verticalIconsKindfilePanel"]') .addFile('tests/compilationError_test.sol', sources[0]['compilationError_test.sol']) .click('div[title="default_workspace/tests/compilationError_test.sol"] span[class="close-tabs"]') .clickLaunchIcon('solidityUnitTesting') .pause(2000) .click('*[data-id="testTabCheckAllTests"]') - .clickElementAtPosition('.singleTestLabel', 3) + // .click('#singleTesttests/compilationError_test.sol') + .clickElementAtPosition('.singleTestLabel', 2) .scrollAndClick('*[data-id="testTabRunTestsTabRunAction"]') .waitForElementContainsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'SyntaxError: No visibility specified', 120000) .waitForElementContainsText('*[data-id="testTabTestsExecutionStoppedError"]', 'The test execution has been stopped because of error(s) in your test file', 120000) @@ -119,31 +122,31 @@ module.exports = { .verify.elementPresent('#solidityUnittestsOutput *[data-id="tests/compilationError_test.sol"]') }, - 'Should fail on deploy': function (browser: NightwatchBrowser) { + 'Should fail on deploy #group3': function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="verticalIconsKindfilePanel"]') .addFile('tests/deployError_test.sol', sources[0]['tests/deployError_test.sol']) .clickLaunchIcon('filePanel') .openFile('tests/deployError_test.sol') .clickLaunchIcon('solidityUnitTesting') .click('*[data-id="testTabCheckAllTests"]') - .clickElementAtPosition('.singleTestLabel', 4) + .clickElementAtPosition('.singleTestLabel', 1) .scrollAndClick('*[data-id="testTabRunTestsTabRunAction"]') .waitForElementContainsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'contract deployment failed after trying twice', 120000) }, - 'Should fail when parameters are passed to method in test contract': function (browser: NightwatchBrowser) { + 'Should fail when parameters are passed to method in test contract #group3': function (browser: NightwatchBrowser) { browser.waitForElementPresent('*[data-id="verticalIconsKindfilePanel"]') .addFile('tests/methodFailure_test.sol', sources[0]['tests/methodFailure_test.sol']) .clickLaunchIcon('filePanel') .openFile('tests/methodFailure_test.sol') .clickLaunchIcon('solidityUnitTesting') .click('*[data-id="testTabCheckAllTests"]') - .clickElementAtPosition('.singleTestLabel', 5) + .clickElementAtPosition('.singleTestLabel', 2) .scrollAndClick('*[data-id="testTabRunTestsTabRunAction"]') .waitForElementContainsText('*[data-id="testTabSolidityUnitTestsOutput"]', 'Method \'add\' can not have parameters inside a test contract', 120000) }, - 'Changing current path': function (browser: NightwatchBrowser) { + 'Changing current path #group3': function (browser: NightwatchBrowser) { browser .waitForElementPresent('*[data-id="verticalIconsKindfilePanel"]') .addFile('myTests/simple_storage_test.sol', sources[0]['tests/simple_storage_test.sol']) @@ -159,7 +162,7 @@ module.exports = { .click('*[data-id="testTabGenerateTestFolder"]') }, - 'Changing current path when workspace changed and checking test files creation': function (browser: NightwatchBrowser) { + 'Changing current path when workspace changed and checking test files creation #group4': function (browser: NightwatchBrowser) { browser .waitForElementPresent('*[data-id="verticalIconsKindfilePanel"]') .clickLaunchIcon('settings') @@ -191,7 +194,7 @@ module.exports = { .verify.attributeEquals('*[data-id="uiPathInput"]', 'value', 'tests') }, - 'Solidity Unit tests Basic': function (browser: NightwatchBrowser) { + 'Solidity Unit tests Basic #group4': function (browser: NightwatchBrowser) { browser .waitForElementPresent('*[data-id="verticalIconsKindfilePanel"]') .clickLaunchIcon('filePanel') @@ -209,7 +212,7 @@ module.exports = { .waitForElementContainsText('#solidityUnittestsOutput', '✓ Check winnin proposal with return value', 60000) }, - 'Solidity Unit tests with hardhat console log': function (browser: NightwatchBrowser) { + 'Solidity Unit tests with hardhat console log #group4': function (browser: NightwatchBrowser) { const runtimeBrowser = browser.options.desiredCapabilities.browserName browser @@ -241,7 +244,7 @@ module.exports = { .removeFile('tests/hhLogs_test.sol', 'workspace_new') }, - 'Solidity Unit tests with hardhat console log for EVM revert': function (browser: NightwatchBrowser) { + 'Solidity Unit tests with hardhat console log for EVM revert #group5': function (browser: NightwatchBrowser) { browser .waitForElementPresent('*[data-id="verticalIconsKindfilePanel"]') .addFile('tests/ballotFailedLog_test.sol', sources[0]['tests/ballotFailedLog_test.sol']) @@ -252,13 +255,13 @@ module.exports = { .pause(2000) .waitForElementVisible('*[data-id="testTabSolidityUnitTestsOutputheader"]', 120000) .waitForElementContainsText('#solidityUnittestsOutput', 'tests/ballotFailedLog_test.sol', 60000) - .assert.containsText('#journal > div:nth-child(5) > span', 'Check winning proposal:') - .assert.containsText('#journal > div:nth-child(5) > span', 'Inside checkWinningProposal') + .assert.containsText('#journal', 'Check winning proposal:') + .assert.containsText('#journal', 'Inside checkWinningProposal') .openFile('tests/ballotFailedLog_test.sol') .removeFile('tests/ballotFailedLog_test.sol', 'workspace_new') }, - 'Debug tests using debugger': function (browser: NightwatchBrowser) { + 'Debug tests using debugger #group5': function (browser: NightwatchBrowser) { browser .waitForElementPresent('*[data-id="verticalIconsKindfilePanel"]') .addFile('tests/ballotFailedDebug_test.sol', sources[0]['tests/ballotFailedDebug_test.sol']) @@ -275,6 +278,7 @@ module.exports = { .click('#Check_winning_proposal_failed') .waitForElementContainsText('*[data-id="sidePanelSwapitTitle"]', 'DEBUGGER', 60000) .waitForElementContainsText('*[data-id="functionPanel"]', 'checkWinningProposalFailed()', 60000) + .waitForElementVisible('*[data-id="dropdownPanelSolidityLocals"]').pause(1000) .click('*[data-id="dropdownPanelSolidityLocals"]') .waitForElementContainsText('*[data-id="solidityLocals"]', 'no locals', 60000) // eslint-disable-next-line dot-notation @@ -320,10 +324,12 @@ module.exports = { .removeFile('tests/ballotFailedDebug_test.sol', 'workspace_new') }, - 'Basic Solidity Unit tests with local compiler': function (browser: NightwatchBrowser) { + 'Basic Solidity Unit tests with local compiler #group6': function (browser: NightwatchBrowser) { browser .clickLaunchIcon('solidity') .setSolidityCompilerVersion('builtin') + .clickLaunchIcon('filePanel') + .click('*[data-id="treeViewLitreeViewItemcontracts"]') .openFile('contracts/3_Ballot.sol') .clickLaunchIcon('pluginManager') .scrollAndClick('[data-id="pluginManagerComponentDeactivateButtonsolidityUnitTesting"]') diff --git a/apps/remix-ide-e2e/src/tests/specialFunctions.test.ts b/apps/remix-ide-e2e/src/tests/specialFunctions.test.ts index 279679bb60..dd405cc243 100644 --- a/apps/remix-ide-e2e/src/tests/specialFunctions.test.ts +++ b/apps/remix-ide-e2e/src/tests/specialFunctions.test.ts @@ -3,6 +3,7 @@ import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' module.exports = { + '@disabled': true, before: function (browser: NightwatchBrowser, done: VoidFunction) { // this test suite also contribute testing https://github.com/ethereum/remix/pull/1497 and https://github.com/ethereum/remix-ide/pull/2898 // quick explanation: @@ -17,7 +18,7 @@ module.exports = { return sources }, - 'Use special functions receive/fallback - both are declared, sending data': function (browser: NightwatchBrowser) { + 'Use special functions receive/fallback - both are declared, sending data #group1': function (browser: NightwatchBrowser) { browser.waitForElementVisible('#icon-panel', 10000) .testContracts('receiveAndFallback.sol', sources[0]['receiveAndFallback.sol'], ['CheckSpecials']) // compile .clickLaunchIcon('udapp') @@ -37,7 +38,7 @@ module.exports = { }) }, - 'Use special functions receive/fallback - both are declared, failing sending data < 1 byte': function (browser: NightwatchBrowser) { + 'Use special functions receive/fallback - both are declared, failing sending data < 1 byte #group1': function (browser: NightwatchBrowser) { // don't need to redeploy it, same contract browser.perform((done) => { browser.getAddressAtPosition(0, (address) => { @@ -49,7 +50,7 @@ module.exports = { }) }) }, - 'Use special functions receive/fallback - both are declared, failing sending data with odd number of digits': function (browser: NightwatchBrowser) { + 'Use special functions receive/fallback - both are declared, failing sending data with odd number of digits #group1': function (browser: NightwatchBrowser) { // don't need to redeploy it, same contract browser.perform((done) => { browser.getAddressAtPosition(0, (address) => { @@ -61,7 +62,7 @@ module.exports = { }) }) }, - 'Use special functions receive/fallback - both are declared - receive called, sending wei': function (browser: NightwatchBrowser) { + 'Use special functions receive/fallback - both are declared - receive called, sending wei #group1': function (browser: NightwatchBrowser) { // don't need to redeploy it, same contract browser.perform((done) => { browser.getAddressAtPosition(0, (address) => { @@ -74,7 +75,7 @@ module.exports = { }) }) }, - 'Use special functions receive/fallback - both are declared - fallback should fail cause not payable, sending data and wei': function (browser: NightwatchBrowser) { + 'Use special functions receive/fallback - both are declared - fallback should fail cause not payable, sending data and wei #group1': function (browser: NightwatchBrowser) { // don't need to redeploy it, same contract browser.perform((done) => { browser.getAddressAtPosition(0, (address) => { @@ -86,15 +87,15 @@ module.exports = { }) }) }, - 'Use special functions receive/fallback - only receive is declared, sending wei': function (browser: NightwatchBrowser) { + 'Use special functions receive/fallback - only receive is declared, sending wei #group2': function (browser: NightwatchBrowser) { browser.waitForElementVisible('#icon-panel', 10000) .testContracts('receiveOnly.sol', sources[1]['receiveOnly.sol'], ['CheckSpecials']) .clickLaunchIcon('udapp') .selectContract('CheckSpecials') .createContract('') - .clickInstance(1) + .clickInstance(0) .perform((done) => { - browser.getAddressAtPosition(1, (address) => { + browser.getAddressAtPosition(0, (address) => { browser.sendLowLevelTx(address, '1', '') .pause(1000) .journalLastChildIncludes('to: CheckSpecials.(receive)') @@ -104,10 +105,10 @@ module.exports = { }) }) }, - 'Use special functions receive/fallback - only receive is declared, failing, fallback is not declared, sending data': function (browser: NightwatchBrowser) { + 'Use special functions receive/fallback - only receive is declared, failing, fallback is not declared, sending data #group2': function (browser: NightwatchBrowser) { // don't need to redeploy it, same contract browser.perform((done) => { - browser.getAddressAtPosition(1, (address) => { + browser.getAddressAtPosition(0, (address) => { browser.sendLowLevelTx(address, '0', '0xaa') .pause(1000) .waitForElementVisible(`#instance${address} label[id="deployAndRunLLTxError"]`) @@ -116,15 +117,15 @@ module.exports = { }) }) }, - 'Use special functions receive/fallback - only fallback declared and is payable, sending wei': function (browser: NightwatchBrowser) { + 'Use special functions receive/fallback - only fallback declared and is payable, sending wei #group3': function (browser: NightwatchBrowser) { browser.waitForElementVisible('#icon-panel', 10000) .testContracts('fallbackOnlyPayable.sol', sources[2]['fallbackOnlyPayable.sol'], ['CheckSpecials']) .clickLaunchIcon('udapp') .selectContract('CheckSpecials') .createContract('') - .clickInstance(2) + .clickInstance(0) .perform((done) => { - browser.getAddressAtPosition(2, (address) => { + browser.getAddressAtPosition(0, (address) => { browser.sendLowLevelTx(address, '1', '') .pause(1000) .journalLastChildIncludes('to: CheckSpecials.(fallback)') @@ -134,10 +135,10 @@ module.exports = { }) }) }, - 'Use special functions receive/fallback - only fallback is diclared and is payable, sending data and wei': function (browser: NightwatchBrowser) { + 'Use special functions receive/fallback - only fallback is diclared and is payable, sending data and wei #group3': function (browser: NightwatchBrowser) { // don't need to redeploy it, same contract browser.perform((done) => { - browser.getAddressAtPosition(2, (address) => { + browser.getAddressAtPosition(0, (address) => { browser.sendLowLevelTx(address, '1', '0xaa') .pause(1000) .journalLastChildIncludes('to: CheckSpecials.(fallback)') @@ -147,15 +148,15 @@ module.exports = { }) }) }, - 'Use special functions receive/fallback - only fallback is declared, fallback should fail cause not payable, sending wei': function (browser: NightwatchBrowser) { + 'Use special functions receive/fallback - only fallback is declared, fallback should fail cause not payable, sending wei #group4': function (browser: NightwatchBrowser) { browser.waitForElementVisible('#icon-panel', 10000) .testContracts('fallbackOnlyNotPayable.sol', sources[3]['fallbackOnlyNotPayable.sol'], ['CheckSpecials']) .clickLaunchIcon('udapp') .selectContract('CheckSpecials') .createContract('') - .clickInstance(3) + .clickInstance(0) .perform((done) => { - browser.getAddressAtPosition(3, (address) => { + browser.getAddressAtPosition(0, (address) => { browser.sendLowLevelTx(address, '1', '') .pause(1000) .waitForElementVisible(`#instance${address} label[id="deployAndRunLLTxError"]`) @@ -164,7 +165,7 @@ module.exports = { }) }) }, - 'Use special functions receive/fallback - receive and fallback are declared, sending data and wei': function (browser: NightwatchBrowser) { + 'Use special functions receive/fallback - receive and fallback are declared, sending data and wei #group4': function (browser: NightwatchBrowser) { browser.waitForElementVisible('#icon-panel', 10000) .testContracts('receiveAndFallbackBothPayable.sol', sources[4]['receiveAndFallbackBothPayable.sol'], ['CheckSpecials']) .clickLaunchIcon('udapp') @@ -173,10 +174,10 @@ module.exports = { .clearValue('#value') .setValue('#value', '0') .createContract('') - .clickInstance(4) + .clickInstance(1) .pause(1000) .perform((done) => { - browser.getAddressAtPosition(4, (address) => { + browser.getAddressAtPosition(1, (address) => { browser.sendLowLevelTx(address, '999999998765257135', '0xaa') .pause(1000) .journalLastChildIncludes('to: CheckSpecials.(fallback)') @@ -186,9 +187,9 @@ module.exports = { }) }) }, - 'Use special functions receive/fallback - receive and fallback are declared and payable, sending wei': function (browser: NightwatchBrowser) { + 'Use special functions receive/fallback - receive and fallback are declared and payable, sending wei #group4': function (browser: NightwatchBrowser) { browser.perform((done) => { - browser.getAddressAtPosition(4, (address) => { + browser.getAddressAtPosition(1, (address) => { browser.sendLowLevelTx(address, '1', '') .pause(1000) .journalLastChildIncludes('to: CheckSpecials.(receive)') @@ -198,7 +199,7 @@ module.exports = { }) }) }, - 'Use special functions receive/fallback - receive and fallback are not declared, sending nothing': function (browser: NightwatchBrowser) { + 'Use special functions receive/fallback - receive and fallback are not declared, sending nothing #group5': function (browser: NightwatchBrowser) { browser.waitForElementVisible('#icon-panel', 10000) .testContracts('notSpecial.sol', sources[5]['notSpecial.sol'], ['CheckSpecials']) .clickLaunchIcon('udapp') @@ -207,10 +208,10 @@ module.exports = { .clearValue('#value') .setValue('#value', '0') .createContract('') - .clickInstance(5) + .clickInstance(0) .pause(1000) .perform((done) => { - browser.getAddressAtPosition(5, (address) => { + browser.getAddressAtPosition(0, (address) => { browser.sendLowLevelTx(address, '0', '') .pause(1000) .waitForElementVisible(`#instance${address} label[id="deployAndRunLLTxError"]`) diff --git a/apps/remix-ide-e2e/src/tests/staticAnalysis.spec.ts b/apps/remix-ide-e2e/src/tests/staticAnalysis.test.ts similarity index 100% rename from apps/remix-ide-e2e/src/tests/staticAnalysis.spec.ts rename to apps/remix-ide-e2e/src/tests/staticAnalysis.test.ts diff --git a/apps/remix-ide-e2e/src/tests/terminal.test.ts b/apps/remix-ide-e2e/src/tests/terminal.test.ts index 54bfae0cf7..0bcfbcb3d7 100644 --- a/apps/remix-ide-e2e/src/tests/terminal.test.ts +++ b/apps/remix-ide-e2e/src/tests/terminal.test.ts @@ -3,11 +3,12 @@ import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' module.exports = { + '@disabled': true, before: function (browser: NightwatchBrowser, done: VoidFunction) { init(browser, done, 'http://127.0.0.1:8080?plugins=solidity,udapp', false) }, - 'Should execution a simple console command': function (browser: NightwatchBrowser) { + 'Should execution a simple console command #group1 #group999': function (browser: NightwatchBrowser) { browser .waitForElementVisible('*[data-id="terminalCli"]', 10000) .executeScript('console.log(1 + 1)') @@ -15,7 +16,7 @@ module.exports = { .waitForElementContainsText('*[data-id="terminalJournal"]', '2', 60000) }, - 'Should clear console': function (browser: NightwatchBrowser) { + 'Should clear console #group1': function (browser: NightwatchBrowser) { browser .waitForElementVisible('*[data-id="terminalCli"]') .journalChildIncludes('Welcome to Remix') @@ -23,40 +24,29 @@ module.exports = { .waitForElementContainsText('*[data-id="terminalJournal"]', '', 60000) }, - '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"]') - }, - - 'Async/Await Script': function (browser: NightwatchBrowser) { + 'Async/Await Script #group1': function (browser: NightwatchBrowser) { browser .addFile('asyncAwait.js', { content: asyncAwait }) - .openFile('asyncAwait.js') .executeScript('remix.execute("asyncAwait.js")') .waitForElementContainsText('*[data-id="terminalJournal"]', 'Waiting Promise', 60000) .waitForElementContainsText('*[data-id="terminalJournal"]', 'result - ', 60000) .waitForElementContainsText('*[data-id="terminalJournal"]', 'Promise Resolved', 60000) }, - 'Call Remix File Manager from a script': function (browser: NightwatchBrowser) { + 'Call Remix File Manager from a script #group2': function (browser: NightwatchBrowser) { browser .addFile('asyncAwaitWithFileManagerAccess.js', { content: asyncAwaitWithFileManagerAccess }) - .openFile('asyncAwaitWithFileManagerAccess.js') - .pause(5000) .executeScript('remix.execute(\'asyncAwaitWithFileManagerAccess.js\')') .waitForElementContainsText('*[data-id="terminalJournal"]', 'contract Ballot {', 60000) }, - 'Call web3.eth.getAccounts() using JavaScript VM': function (browser: NightwatchBrowser) { + 'Call web3.eth.getAccounts() using JavaScript VM #group2': function (browser: NightwatchBrowser) { browser .executeScript('web3.eth.getAccounts()') .waitForElementContainsText('*[data-id="terminalJournal"]', '["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) { + 'Call web3.eth.getAccounts() using Web3 Provider #group5': function (browser: NightwatchBrowser) { browser .click('*[data-id="terminalClearConsole"]') // clear the terminal .clickLaunchIcon('udapp') @@ -68,7 +58,7 @@ module.exports = { .waitForElementContainsText('*[data-id="terminalJournal"]', '","', 60000) }, - 'Call Remix File Resolver (external URL) from a script': function (browser: NightwatchBrowser) { + 'Call Remix File Resolver (external URL) from a script #group3': function (browser: NightwatchBrowser) { browser .click('*[data-id="terminalClearConsole"]') // clear the terminal .addFile('resolveExternalUrlAndSave.js', { content: resolveExternalUrlAndSave }) @@ -79,7 +69,7 @@ module.exports = { .openFile('.deps/github/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol') }, - 'Call Remix File Resolver (internal URL) from a script': function (browser: NightwatchBrowser) { + 'Call Remix File Resolver (internal URL) from a script #group3': function (browser: NightwatchBrowser) { browser .click('*[data-id="terminalClearConsole"]') // clear the terminal .addFile('resolveUrl.js', { content: resolveUrl }) @@ -89,7 +79,7 @@ module.exports = { .waitForElementContainsText('*[data-id="terminalJournal"]', 'contract Ballot {', 60000) }, - 'Call Remix File Resolver (internal URL) from a script and specify a path': function (browser: NightwatchBrowser) { + 'Call Remix File Resolver (internal URL) from a script and specify a path #group3': function (browser: NightwatchBrowser) { browser .click('*[data-id="terminalClearConsole"]') // clear the terminal .addFile('resolveExternalUrlAndSaveToaPath.js', { content: resolveExternalUrlAndSaveToaPath }) @@ -100,7 +90,7 @@ module.exports = { .openFile('.deps/github/newFile.sol') }, - 'Deploy "Owner" using an ether.js script, listen to event and check event are logged in the terminal': function (browser: NightwatchBrowser) { + 'Deploy "Owner" using an ether.js script, listen to event and check event are logged in the terminal #group4': function (browser: NightwatchBrowser) { browser .clickLaunchIcon('settings') .clickLaunchIcon('udapp') @@ -109,12 +99,12 @@ module.exports = { .clickLaunchIcon('filePanel') .click('*[data-id="treeViewDivtreeViewItem"]') // make sure we create the file at the root folder .addFile('deployWithEthersJs.js', { content: deployWithEthersJs }) - .openFile('deployWithEthersJs.js') + // .openFile('deployWithEthersJs.js') .pause(1000) .click('[data-id="treeViewDivtreeViewItemcontracts"]') .openFile('contracts/2_Owner.sol') .clickLaunchIcon('solidity') - .click('*[data-id="compilerContainerCompileBtn"]') // compile Owner + .click('*[data-id="compilerContainerCompileBtn"]').pause(5000) // compile Owner .executeScript('remix.execute(\'deployWithEthersJs.js\')') .waitForElementContainsText('*[data-id="terminalJournal"]', 'Contract Address:', 60000) .waitForElementContainsText('*[data-id="terminalJournal"]', '0xd9145CCE52D386f254917e481eB44e9943F39138', 60000) @@ -130,7 +120,7 @@ module.exports = { .waitForElementContainsText('*[data-id="terminalJournal"]', '0xd9145CCE52D386f254917e481eB44e9943F39138', 60000) }, - 'Should print hardhat logs': function (browser: NightwatchBrowser) { + 'Should print hardhat logs #group4': function (browser: NightwatchBrowser) { browser .click('*[data-id="terminalClearConsole"]') // clear the terminal .addFile('printHardhatlog.sol', { content: hardhatLog }) @@ -153,7 +143,14 @@ module.exports = { .clickFunction('getOwner - call') .pause(1000) .journalChildIncludes('inside getOwner', { shouldHaveOnlyOneOccurence: true }) - .end() + }, + + 'Should display auto-complete menu #group4': function (browser: NightwatchBrowser) { + browser + .waitForElementVisible('*[data-id="terminalCli"]') + .click('*[data-id="terminalCli"]') + .sendKeys('*[data-id="terminalCliInput"]', 'remix.') + .assert.visible('*[data-id="autoCompletePopUpAutoCompleteItem"]').end() } } diff --git a/apps/remix-ide-e2e/src/tests/transactionExecution.spec.ts b/apps/remix-ide-e2e/src/tests/transactionExecution.test.ts similarity index 94% rename from apps/remix-ide-e2e/src/tests/transactionExecution.spec.ts rename to apps/remix-ide-e2e/src/tests/transactionExecution.test.ts index 7f6124ccc4..cfb2c7a323 100644 --- a/apps/remix-ide-e2e/src/tests/transactionExecution.spec.ts +++ b/apps/remix-ide-e2e/src/tests/transactionExecution.test.ts @@ -3,6 +3,7 @@ import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' module.exports = { + '@disabled': true, before: function (browser: NightwatchBrowser, done: VoidFunction) { init(browser, done) }, @@ -10,7 +11,7 @@ module.exports = { return sources }, - 'Execute Simple Contract and Test Terminal': function (browser: NightwatchBrowser) { + 'Execute Simple Contract and Test Terminal #group1': function (browser: NightwatchBrowser) { browser.testContracts('Untitled.sol', sources[0]['Untitled.sol'], ['TestContract']) .clickLaunchIcon('udapp') .selectAccount('0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c') // this account will be used for this test suite @@ -41,7 +42,7 @@ module.exports = { .click('*[data-id="deployAndRunClearInstances"]') }, - 'Test Complex Return Values': function (browser: NightwatchBrowser) { + 'Test Complex Return Values #group1': function (browser: NightwatchBrowser) { browser.testContracts('returnValues.sol', sources[1]['returnValues.sol'], ['testReturnValues']) .clickLaunchIcon('udapp') .click('#runTabView button[class^="instanceButton"]') @@ -86,7 +87,7 @@ module.exports = { }).click('*[data-id="deployAndRunClearInstances"]') }, - 'Test Complex Input Values': function (browser: NightwatchBrowser) { + 'Test Complex Input Values #group2': function (browser: NightwatchBrowser) { browser.testContracts('inputValues.sol', sources[2]['inputValues.sol'], ['test']) .clickLaunchIcon('udapp') .click('#runTabView button[class^="instanceButton"]') @@ -112,7 +113,7 @@ module.exports = { }, logs: [ { - from: '0x8c1eD7e19abAa9f23c476dA86Dc1577F1Ef401f5', + from: '0xd9145CCE52D386f254917e481eB44e9943F39138', topic: '0xd30981760edbf605bda8689e945f622877f230c9a77cbfbd448aa4b7d8ac6e7f', event: 'event1', args: { @@ -131,7 +132,7 @@ module.exports = { .click('*[data-id="deployAndRunClearInstances"]') }, - 'Should Compile and Deploy a contract which has an event declaring a function as parameter': function (browser: NightwatchBrowser) { + 'Should Compile and Deploy a contract which has an event declaring a function as parameter #group2': function (browser: NightwatchBrowser) { browser.testContracts('eventFunctionInput.sol', sources[3]['eventFunctionInput.sol'], ['C']) .clickLaunchIcon('udapp') .selectAccount('0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c') // this account will be used for this test suite @@ -140,7 +141,7 @@ module.exports = { .click('*[data-id="deployAndRunClearInstances"]') }, - 'Should Compile and Deploy a contract which define a custom error, the error should be logged in the terminal': function (browser: NightwatchBrowser) { + 'Should Compile and Deploy a contract which define a custom error, the error should be logged in the terminal #group3': function (browser: NightwatchBrowser) { browser.testContracts('customError.sol', sources[4]['customError.sol'], ['C']) .clickLaunchIcon('udapp') .selectAccount('0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c') // this account will be used for this test suite @@ -161,8 +162,10 @@ module.exports = { .click('*[data-id="deployAndRunClearInstances"]') }, - 'Should Compile and Deploy a contract which define a custom error, the error should be logged in the terminal , using London VM Fork': function (browser: NightwatchBrowser) { + 'Should Compile and Deploy a contract which define a custom error, the error should be logged in the terminal , using London VM Fork #group3': function (browser: NightwatchBrowser) { browser + .clickLaunchIcon('udapp') + .clearTransactions() .click('*[data-id="settingsVMLondonMode"]') // switch to London fork .selectAccount('0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c') // this account will be used for this test suite .click('#runTabView button[class^="instanceButton"]') @@ -180,7 +183,7 @@ module.exports = { .journalLastChildIncludes('Debug the transaction to get more information.') }, - 'Should Compile and Deploy a contract which define a custom error in a library, the error should be logged in the terminal': function (browser: NightwatchBrowser) { + 'Should Compile and Deploy a contract which define a custom error in a library, the error should be logged in the terminal #group3': function (browser: NightwatchBrowser) { browser.testContracts('customErrorLib.sol', sources[5]['customErrorLib.sol'], ['D']) .clickLaunchIcon('udapp') .click('#runTabView button[class^="instanceButton"]') diff --git a/apps/remix-ide-e2e/src/tests/verticalIconsPanel.spec.ts b/apps/remix-ide-e2e/src/tests/verticalIconsPanel.test.ts similarity index 100% rename from apps/remix-ide-e2e/src/tests/verticalIconsPanel.spec.ts rename to apps/remix-ide-e2e/src/tests/verticalIconsPanel.test.ts diff --git a/apps/remix-ide-e2e/src/types/index.d.ts b/apps/remix-ide-e2e/src/types/index.d.ts index f5f9287065..373139fbf4 100644 --- a/apps/remix-ide-e2e/src/types/index.d.ts +++ b/apps/remix-ide-e2e/src/types/index.d.ts @@ -59,6 +59,8 @@ declare module 'nightwatch' { currentWorkspaceIs(name: string): NightwatchBrowser addLocalPlugin(this: NightwatchBrowser, profile: Profile & LocationProfile & ExternalProfile): NightwatchBrowser acceptAndRemember (this: NightwatchBrowser, remember: boolean, accept: boolean): NightwatchBrowser + clearConsole (this: NightwatchBrowser): NightwatchBrowser + clearTransactions (this: NightwatchBrowser): NightwatchBrowser } export interface NightwatchBrowser { diff --git a/apps/remix-ide/ci/browser_tests_chrome_1.sh b/apps/remix-ide/ci/browser_test.sh similarity index 67% rename from apps/remix-ide/ci/browser_tests_chrome_1.sh rename to apps/remix-ide/ci/browser_test.sh index 50fd4eb256..00a4158c86 100755 --- a/apps/remix-ide/ci/browser_tests_chrome_1.sh +++ b/apps/remix-ide/ci/browser_test.sh @@ -7,7 +7,7 @@ echo "$BUILD_ID" TEST_EXITCODE=0 npm run ganache-cli & -npm run serve & +npm run serve:production & echo 'sharing folder: ' $PWD '/apps/remix-ide/contracts' & npm run remixd & @@ -15,9 +15,9 @@ sleep 5 npm run build:e2e -TESTFILES=$(circleci tests glob "dist/apps/remix-ide-e2e/src/tests/**/*.test.js" | circleci tests split --split-by=timings) +TESTFILES=$(grep -IRiL "disabled" "dist/apps/remix-ide-e2e/src/tests" | grep "\.spec\|\.test" | sort | circleci tests split ) for TESTFILE in $TESTFILES; do - npx nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js $TESTFILE --env=chrome || TEST_EXITCODE=1 + npx nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js $TESTFILE --env=$1 || TEST_EXITCODE=1 done echo "$TEST_EXITCODE" diff --git a/apps/remix-ide/ci/browser_tests.sh b/apps/remix-ide/ci/browser_tests.sh index 1e3012feb4..4a093f6b5d 100755 --- a/apps/remix-ide/ci/browser_tests.sh +++ b/apps/remix-ide/ci/browser_tests.sh @@ -22,7 +22,7 @@ setupRemixd sleep 5 npm run nightwatch_parallel || TEST_EXITCODE=1 -TESTFILES=$(circleci tests glob "./apps/remix-ide/test-browser/tests/**/*.test.js" | circleci tests split --split-by=timings) +TESTFILES=$(circleci tests glob "./apps/remix-ide/test-browser/tests/**/*.test.js" | circleci tests split ) for TESTFILE in $TESTFILES; do ./node_modules/.bin/nightwatch --config ./apps/remix-ide/nightwatch.js --env chrome $TESTFILE || TEST_EXITCODE=1 done diff --git a/apps/remix-ide/ci/browser_tests_chrome_2.sh b/apps/remix-ide/ci/browser_tests_chrome_2.sh deleted file mode 100755 index 003578e173..0000000000 --- a/apps/remix-ide/ci/browser_tests_chrome_2.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env bash - -set -e - -BUILD_ID=${CIRCLE_BUILD_NUM:-${TRAVIS_JOB_NUMBER}} -echo "$BUILD_ID" -TEST_EXITCODE=0 - -npm run ganache-cli & -npm run serve & -echo 'sharing folder: ' $PWD '/apps/remix-ide/contracts' & -npm run remixd & - -sleep 5 - -npm run build:e2e - -TESTFILES=$(circleci tests glob "dist/apps/remix-ide-e2e/src/tests/**/*.spec.js" | circleci tests split --split-by=timings) -for TESTFILE in $TESTFILES; do - npx nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js $TESTFILE --env=chrome || TEST_EXITCODE=1 -done - -echo "$TEST_EXITCODE" -if [ "$TEST_EXITCODE" -eq 1 ] -then - exit 1 -fi diff --git a/apps/remix-ide/ci/browser_tests_firefox_1.sh b/apps/remix-ide/ci/browser_tests_firefox_1.sh deleted file mode 100755 index 37c795994e..0000000000 --- a/apps/remix-ide/ci/browser_tests_firefox_1.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env bash - -set -e - -BUILD_ID=${CIRCLE_BUILD_NUM:-${TRAVIS_JOB_NUMBER}} -echo "$BUILD_ID" -TEST_EXITCODE=0 - -npm run ganache-cli & -npm run serve & -echo 'sharing folder: ' $PWD '/apps/remix-ide/contracts' & -npm run remixd & - -sleep 5 - -npm run build:e2e - -TESTFILES=$(circleci tests glob "dist/apps/remix-ide-e2e/src/tests/**/*.test.js" | circleci tests split --split-by=timings) -for TESTFILE in $TESTFILES; do - npx nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js $TESTFILE --env=firefox || TEST_EXITCODE=1 -done - -echo "$TEST_EXITCODE" -if [ "$TEST_EXITCODE" -eq 1 ] -then - exit 1 -fi diff --git a/apps/remix-ide/ci/browser_tests_firefox_2.sh b/apps/remix-ide/ci/browser_tests_firefox_2.sh deleted file mode 100755 index 45d6553db3..0000000000 --- a/apps/remix-ide/ci/browser_tests_firefox_2.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env bash - -set -e - -BUILD_ID=${CIRCLE_BUILD_NUM:-${TRAVIS_JOB_NUMBER}} -echo "$BUILD_ID" -TEST_EXITCODE=0 - -npm run ganache-cli & -npm run serve & -echo 'sharing folder: ' $PWD '/apps/remix-ide/contracts' & -npm run remixd & - -sleep 5 - -npm run build:e2e - -TESTFILES=$(circleci tests glob "dist/apps/remix-ide-e2e/src/tests/**/*.spec.js" | circleci tests split --split-by=timings) -for TESTFILE in $TESTFILES; do - npx nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js $TESTFILE --env=firefox || TEST_EXITCODE=1 -done - -echo "$TEST_EXITCODE" -if [ "$TEST_EXITCODE" -eq 1 ] -then - exit 1 -fi diff --git a/apps/remix-ide/ci/browser_tests_plugin_api.sh b/apps/remix-ide/ci/browser_tests_plugin_api.sh index 8b3ef4eeb3..eae0d5b389 100755 --- a/apps/remix-ide/ci/browser_tests_plugin_api.sh +++ b/apps/remix-ide/ci/browser_tests_plugin_api.sh @@ -6,13 +6,17 @@ BUILD_ID=${CIRCLE_BUILD_NUM:-${TRAVIS_JOB_NUMBER}} echo "$BUILD_ID" TEST_EXITCODE=0 -npm run serve & +npm run serve:production & npx nx serve remix-ide-e2e-src-local-plugin & sleep 5 npm run build:e2e -npm run nightwatch_local_pluginApi || TEST_EXITCODE=1 + +TESTFILES=$(grep -IRiL "disabled" "dist/apps/remix-ide-e2e/src/tests" | grep "plugin_api" | sort | circleci tests split ) +for TESTFILE in $TESTFILES; do + npx nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js $TESTFILE --env=chrome || TEST_EXITCODE=1 +done echo "$TEST_EXITCODE" if [ "$TEST_EXITCODE" -eq 1 ] diff --git a/apps/remix-ide/ci/browser_tests_run_deploy.sh b/apps/remix-ide/ci/browser_tests_run_deploy.sh deleted file mode 100755 index ce72e10dfc..0000000000 --- a/apps/remix-ide/ci/browser_tests_run_deploy.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash - -set -e - -BUILD_ID=${CIRCLE_BUILD_NUM:-${TRAVIS_JOB_NUMBER}} -echo "$BUILD_ID" -TEST_EXITCODE=0 - -npm run ganache-cli & -npm run serve & - -sleep 5 - -npm run build:e2e -npm run nightwatch_local_runAndDeploy || TEST_EXITCODE=1 - -echo "$TEST_EXITCODE" -if [ "$TEST_EXITCODE" -eq 1 ] -then - exit 1 -fi diff --git a/apps/remix-ide/ci/lint.sh b/apps/remix-ide/ci/lint.sh new file mode 100755 index 0000000000..f0d0345391 --- /dev/null +++ b/apps/remix-ide/ci/lint.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +set -e + +BUILD_ID=${CIRCLE_BUILD_NUM:-${TRAVIS_JOB_NUMBER}} +echo "$BUILD_ID" +TEST_EXITCODE=0 + +KEYS=$(jq -r '.projects | keys' workspace.json | tr -d '[],"') + +(for row in $KEYS; do + if [ "$row" != "debugger" ] + then + echo ${row} + fi +done) | circleci tests split | { while read i;do npm run lint $i; done } + +echo "$TEST_EXITCODE" +if [ "$TEST_EXITCODE" -eq 1 ] +then + exit 1 +fi diff --git a/apps/solidity-compiler/src/app/app.tsx b/apps/solidity-compiler/src/app/app.tsx index 85e67924b8..7115b1509a 100644 --- a/apps/solidity-compiler/src/app/app.tsx +++ b/apps/solidity-compiler/src/app/app.tsx @@ -1,4 +1,5 @@ -import React, { useState, useEffect } from 'react'; +/* eslint-disable no-use-before-define */ +import React from 'react' import { SolidityCompiler } from '@remix-ui/solidity-compiler' // eslint-disable-line @@ -11,7 +12,7 @@ export const App = () => {
- ); -}; + ) +} -export default App; +export default App diff --git a/apps/solidity-compiler/src/app/compiler-api.ts b/apps/solidity-compiler/src/app/compiler-api.ts index 733ee0026f..9725edaf9a 100644 --- a/apps/solidity-compiler/src/app/compiler-api.ts +++ b/apps/solidity-compiler/src/app/compiler-api.ts @@ -7,6 +7,7 @@ export const CompilerApiMixin = (Base) => class extends Base { contractMap: { file: string } | Record + compileErrors: any compileTabLogic: CompileTabLogic contractsDetails: Record @@ -29,7 +30,7 @@ export const CompilerApiMixin = (Base) => class extends Base { errorContainer: null, contractEl: null } - + this.contractsDetails = {} this.data = { eventHandlers: {}, @@ -54,7 +55,7 @@ export const CompilerApiMixin = (Base) => class extends Base { if (this.data.eventHandlers.onLoadingCompiler) { this.compiler.event.unregister('loadingCompiler', this.data.eventHandlers.onLoadingCompiler) } - + if (this.data.eventHandlers.onCompilerLoaded) { this.compiler.event.unregister('compilerLoaded', this.data.eventHandlers.onCompilerLoaded) } @@ -62,7 +63,7 @@ export const CompilerApiMixin = (Base) => class extends Base { if (this.data.eventHandlers.onCompilationFinished) { this.compiler.event.unregister('compilationFinished', this.data.eventHandlers.onCompilationFinished) } - + this.off('filePanel', 'setWorkspace') this.off('remixd', 'rootFolderChanged') @@ -72,19 +73,19 @@ export const CompilerApiMixin = (Base) => class extends Base { if (this.data.eventHandlers.onStartingCompilation) { this.compileTabLogic.event.off('startingCompilation', this.data.eventHandlers.onStartingCompilation) } - + if (this.data.eventHandlers.onRemoveAnnotations) { this.compileTabLogic.event.off('removeAnnotations', this.data.eventHandlers.onRemoveAnnotations) - } + } this.off('fileManager', 'currentFileChanged') - - this.off('fileManager', 'noFileSelected') - + + this.off('fileManager', 'noFileSelected') + this.off('themeModule', 'themeChanged') - + if (this.data.eventHandlers.onKeyDown) { - window.document.removeEventListener('keydown', this.data.eventHandlers.onKeyDown) + window.document.removeEventListener('keydown', this.data.eventHandlers.onKeyDown) } } @@ -99,7 +100,7 @@ export const CompilerApiMixin = (Base) => class extends Base { logToTerminal (content) { return this.call('terminal', 'log', content) } - + getCompilationResult () { return this.compileTabLogic.compiler.state.lastCompilationResult } @@ -143,7 +144,7 @@ export const CompilerApiMixin = (Base) => class extends Base { // This function is used for passing the compiler configuration to 'remix-tests' getCurrentCompilerConfig () { const compilerState = this.getCompilerState() - let compilerDetails: any = { + const compilerDetails: any = { currentVersion: compilerState.currentVersion, evmVersion: compilerState.evmVersion, optimize: compilerState.optimize, @@ -162,8 +163,8 @@ export const CompilerApiMixin = (Base) => class extends Base { * @param {object} settings {evmVersion, optimize, runs, version, language} */ setCompilerConfig (settings) { - this.configurationSettings = settings - } + this.configurationSettings = settings + } fileExists (fileName) { return this.call('fileManager', 'exists', fileName) @@ -231,7 +232,7 @@ export const CompilerApiMixin = (Base) => class extends Base { this.on('editor', 'sessionSwitched', () => { if (this.onSessionSwitched) this.onSessionSwitched() - }) + }) this.compileTabLogic.event.on('startingCompilation', this.data.eventHandlers.onStartingCompilation) this.compileTabLogic.event.on('removeAnnotations', this.data.eventHandlers.onRemoveAnnotations) @@ -241,13 +242,13 @@ export const CompilerApiMixin = (Base) => class extends Base { if (this.onCurrentFileChanged) this.onCurrentFileChanged(name) } this.on('fileManager', 'currentFileChanged', this.data.eventHandlers.onCurrentFileChanged) - + this.data.eventHandlers.onNoFileSelected = () => { this.currentFile = '' if (this.onNoFileSelected) this.onNoFileSelected() } this.on('fileManager', 'noFileSelected', this.data.eventHandlers.onNoFileSelected) - + this.data.eventHandlers.onCompilationFinished = (success, data, source) => { this.compileErrors = data if (success) { @@ -288,7 +289,7 @@ export const CompilerApiMixin = (Base) => class extends Base { } } this.on('themeModule', 'themeChanged', this.data.eventHandlers.onThemeChanged) - + // Run the compiler instead of trying to save the website this.data.eventHandlers.onKeyDown = (e) => { // ctrl+s or command+s diff --git a/apps/solidity-compiler/src/app/compiler.ts b/apps/solidity-compiler/src/app/compiler.ts index 4f90fa4bd3..8e4b34b703 100644 --- a/apps/solidity-compiler/src/app/compiler.ts +++ b/apps/solidity-compiler/src/app/compiler.ts @@ -1,5 +1,7 @@ -import { PluginClient } from "@remixproject/plugin"; -import { createClient } from "@remixproject/plugin-webview"; +/* eslint-disable no-undef */ +/* eslint-disable no-unused-vars */ +import { PluginClient } from '@remixproject/plugin' +import { createClient } from '@remixproject/plugin-webview' import { CompilerApiMixin } from './compiler-api' import { ICompilerApi } from '@remix-project/remix-lib-ts' import { CompileTabLogic } from '@remix-ui/solidity-compiler' @@ -14,7 +16,7 @@ const profile = { location: 'sidePanel', documentation: 'https://remix-ide.readthedocs.io/en/latest/solidity_editor.html', version: '0.0.1', - methods: ['getCompilationResult', 'compile', 'compileWithParameters', 'setCompilerConfig', 'compileFile' ,'getCompilerState'] + methods: ['getCompilationResult', 'compile', 'compileWithParameters', 'setCompilerConfig', 'compileFile', 'getCompilerState'] } const defaultAppParameters = { @@ -30,7 +32,7 @@ const defaultCompilerParameters = { evmVersion: null, // compiler default language: 'Solidity' } -export class CompilerClientApi extends CompilerApiMixin(PluginClient) implements ICompilerApi { +export class CompilerClientApi extends CompilerApiMixin(PluginClient) implements ICompilerApi { constructor () { super() createClient(this as any) @@ -42,11 +44,11 @@ export class CompilerClientApi extends CompilerApiMixin(PluginClient) implements getCompilerParameters () { const params = { - runs: localStorage.getItem('runs') || defaultCompilerParameters['runs'], - optimize: localStorage.getItem('optimize') === 'true' ? true : false, - version: localStorage.getItem('version') || defaultCompilerParameters['version'], - evmVersion: localStorage.getItem('evmVersion') || defaultCompilerParameters['evmVersion'], // default - language: localStorage.getItem('language') || defaultCompilerParameters['language'] + runs: localStorage.getItem('runs') || defaultCompilerParameters.runs, + optimize: localStorage.getItem('optimize') === 'true', + version: localStorage.getItem('version') || defaultCompilerParameters.version, + evmVersion: localStorage.getItem('evmVersion') || defaultCompilerParameters.evmVersion, // default + language: localStorage.getItem('language') || defaultCompilerParameters.language } return params } diff --git a/apps/solidity-compiler/src/environments/environment.prod.ts b/apps/solidity-compiler/src/environments/environment.prod.ts index 3612073bc3..bc0327dbeb 100644 --- a/apps/solidity-compiler/src/environments/environment.prod.ts +++ b/apps/solidity-compiler/src/environments/environment.prod.ts @@ -1,3 +1,3 @@ export const environment = { production: true -}; +} diff --git a/apps/solidity-compiler/src/environments/environment.ts b/apps/solidity-compiler/src/environments/environment.ts index d9370e924b..9ae66f8b70 100644 --- a/apps/solidity-compiler/src/environments/environment.ts +++ b/apps/solidity-compiler/src/environments/environment.ts @@ -3,4 +3,4 @@ export const environment = { production: false -}; +} diff --git a/apps/solidity-compiler/src/index.ts b/apps/solidity-compiler/src/index.ts index 776e9a33df..f92deb7aa4 100644 --- a/apps/solidity-compiler/src/index.ts +++ b/apps/solidity-compiler/src/index.ts @@ -1 +1 @@ -export * from './app/compiler-api'; +export * from './app/compiler-api' diff --git a/apps/solidity-compiler/src/main.tsx b/apps/solidity-compiler/src/main.tsx index 89c91fbb14..96d7e3743b 100644 --- a/apps/solidity-compiler/src/main.tsx +++ b/apps/solidity-compiler/src/main.tsx @@ -1,11 +1,12 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; +// eslint-disable-next-line no-use-before-define +import React from 'react' +import ReactDOM from 'react-dom' -import App from './app/app'; +import App from './app/app' ReactDOM.render( , document.getElementById('root') -); +) diff --git a/apps/solidity-compiler/src/polyfills.ts b/apps/solidity-compiler/src/polyfills.ts index 2adf3d05b6..53c485753e 100644 --- a/apps/solidity-compiler/src/polyfills.ts +++ b/apps/solidity-compiler/src/polyfills.ts @@ -3,5 +3,5 @@ * * See: https://github.com/zloirock/core-js#babel */ -import 'core-js/stable'; -import 'regenerator-runtime/runtime'; +import 'core-js/stable' +import 'regenerator-runtime/runtime' diff --git a/libs/remix-ui/clipboard/jest.config.js b/libs/remix-ui/clipboard/jest.config.js index 29c72555b1..c84748197a 100644 --- a/libs/remix-ui/clipboard/jest.config.js +++ b/libs/remix-ui/clipboard/jest.config.js @@ -9,4 +9,4 @@ module.exports = { }, moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'html'], coverageDirectory: '../../../coverage/libs/remix-ui/clipboard' -}; +} diff --git a/libs/remix-ui/clipboard/src/index.ts b/libs/remix-ui/clipboard/src/index.ts index 2d45544963..4f3a26d2c8 100644 --- a/libs/remix-ui/clipboard/src/index.ts +++ b/libs/remix-ui/clipboard/src/index.ts @@ -1 +1 @@ -export * from './lib/copy-to-clipboard/copy-to-clipboard'; +export * from './lib/copy-to-clipboard/copy-to-clipboard' diff --git a/libs/remix-ui/utils/jest.config.js b/libs/remix-ui/utils/jest.config.js index 73ce6f9c5c..af21030c63 100644 --- a/libs/remix-ui/utils/jest.config.js +++ b/libs/remix-ui/utils/jest.config.js @@ -9,4 +9,4 @@ module.exports = { }, moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'html'], coverageDirectory: '../../../coverage/libs/remix-ui/utils' -}; +} diff --git a/package-lock.json b/package-lock.json index b1f44c8f6e..c2d8572ea6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, "requires": { "@babel/highlight": "^7.16.0" } @@ -45,6 +46,7 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "dev": true, "requires": { "@babel/types": "^7.16.0", "jsesc": "^2.5.1", @@ -55,6 +57,7 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", + "dev": true, "requires": { "@babel/types": "^7.16.0" } @@ -231,6 +234,7 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz", "integrity": "sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==", + "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.0", "@babel/helper-function-name": "^7.16.0", @@ -367,6 +371,7 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.16.0", "@babel/template": "^7.16.0", @@ -377,6 +382,7 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, "requires": { "@babel/types": "^7.16.0" } @@ -385,6 +391,7 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "dev": true, "requires": { "@babel/types": "^7.16.0" } @@ -393,6 +400,7 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", + "dev": true, "requires": { "@babel/types": "^7.16.0" } @@ -426,6 +434,7 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "dev": true, "requires": { "@babel/types": "^7.16.0" } @@ -459,6 +468,7 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", + "dev": true, "requires": { "@babel/helper-member-expression-to-functions": "^7.16.0", "@babel/helper-optimise-call-expression": "^7.16.0", @@ -488,6 +498,7 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, "requires": { "@babel/types": "^7.16.0" } @@ -530,6 +541,7 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.15.7", "chalk": "^2.0.0", @@ -539,7 +551,8 @@ "@babel/parser": { "version": "7.16.3", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.3.tgz", - "integrity": "sha512-dcNwU1O4sx57ClvLBVFbEgx0UZWfd0JQX5X6fxFRCLHelFBGXFfSz6Y0FAq2PEwUqlqLkdVjVr4VASEOuUnLJw==" + "integrity": "sha512-dcNwU1O4sx57ClvLBVFbEgx0UZWfd0JQX5X6fxFRCLHelFBGXFfSz6Y0FAq2PEwUqlqLkdVjVr4VASEOuUnLJw==", + "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.16.2", @@ -2348,6 +2361,7 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, "requires": { "@babel/code-frame": "^7.16.0", "@babel/parser": "^7.16.0", @@ -2358,6 +2372,7 @@ "version": "7.16.3", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", + "dev": true, "requires": { "@babel/code-frame": "^7.16.0", "@babel/generator": "^7.16.0", @@ -2374,6 +2389,7 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.15.7", "to-fast-properties": "^2.0.0" @@ -2395,122 +2411,6 @@ "minimist": "^1.2.0" } }, - "@cypress/listr-verbose-renderer": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", - "integrity": "sha1-p3SS9LEdzHxEajSz4ochr9M8ZCo=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "cli-cursor": "^1.0.2", - "date-fns": "^1.27.2", - "figures": "^1.7.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "@cypress/request": { - "version": "2.88.7", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.7.tgz", - "integrity": "sha512-FTULIP2rnDJvZDT9t6B4nSfYR40ue19tVmv3wUcY05R9/FPCoMl1nAPJkzWzBCo7ltVn5ThQTbxiMoGBN7k0ig==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^8.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - } - } - }, "@cypress/webpack-preprocessor": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@cypress/webpack-preprocessor/-/webpack-preprocessor-4.1.5.tgz", @@ -2541,27 +2441,6 @@ } } }, - "@cypress/xvfb": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", - "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "lodash.once": "^4.1.1" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, "@dabh/diagnostics": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", @@ -9441,15 +9320,6 @@ "picomatch": "^2.2.2" } }, - "@samverschueren/stream-to-observable": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz", - "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==", - "dev": true, - "requires": { - "any-observable": "^0.3.0" - } - }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -10438,18 +10308,6 @@ } } }, - "@types/sinonjs__fake-timers": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.4.tgz", - "integrity": "sha512-IFQTJARgMUBF+xVd2b+hIgXWrZEjND3vJtRCvIelcFB5SIXfjV4bOHbHJ0eXKh+0COrBRc8MqteKAz/j88rE0A==", - "dev": true - }, - "@types/sizzle": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", - "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", - "dev": true - }, "@types/source-list-map": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", @@ -11161,12 +11019,6 @@ "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", "dev": true }, - "any-observable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", - "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", - "dev": true - }, "any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", @@ -11216,12 +11068,6 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, - "arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "dev": true - }, "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", @@ -14134,12 +13980,6 @@ "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", "dev": true }, - "cachedir": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", - "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", - "dev": true - }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -14334,12 +14174,6 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "check-more-types": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", - "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=", - "dev": true - }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -14491,15 +14325,6 @@ "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", "dev": true }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "^1.0.1" - } - }, "cli-spinners": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", @@ -14515,104 +14340,6 @@ "colors": "1.0.3" } }, - "cli-table3": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", - "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", - "dev": true, - "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "cli-truncate": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", - "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", - "dev": true, - "requires": { - "slice-ansi": "0.0.4", - "string-width": "^1.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, "cli-usage": { "version": "0.1.10", "resolved": "https://registry.npmjs.org/cli-usage/-/cli-usage-0.1.10.tgz", @@ -14926,12 +14653,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, - "common-tags": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.1.tgz", - "integrity": "sha512-uOZd85rJqrdEIE/JjhW5YAeatX8iqjjvVzIyfx7JL7G5r9Tep6YpYT9gEJWhWpVyDQEyzukWd6p2qULpJ8tmBw==", - "dev": true - }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -16124,103 +15845,6 @@ "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, - "cypress": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-4.12.1.tgz", - "integrity": "sha512-9SGIPEmqU8vuRA6xst2CMTYd9sCFCxKSzrHt0wr+w2iAQMCIIsXsQ5Gplns1sT6LDbZcmLv6uehabAOl3fhc9Q==", - "dev": true, - "requires": { - "@cypress/listr-verbose-renderer": "^0.4.1", - "@cypress/request": "^2.88.5", - "@cypress/xvfb": "^1.2.4", - "@types/sinonjs__fake-timers": "^6.0.1", - "@types/sizzle": "^2.3.2", - "arch": "^2.1.2", - "bluebird": "^3.7.2", - "cachedir": "^2.3.0", - "chalk": "^2.4.2", - "check-more-types": "^2.24.0", - "cli-table3": "~0.5.1", - "commander": "^4.1.1", - "common-tags": "^1.8.0", - "debug": "^4.1.1", - "eventemitter2": "^6.4.2", - "execa": "^1.0.0", - "executable": "^4.1.1", - "extract-zip": "^1.7.0", - "fs-extra": "^8.1.0", - "getos": "^3.2.1", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.2", - "lazy-ass": "^1.6.0", - "listr": "^0.14.3", - "lodash": "^4.17.19", - "log-symbols": "^3.0.0", - "minimist": "^1.2.5", - "moment": "^2.27.0", - "ospath": "^1.2.2", - "pretty-bytes": "^5.3.0", - "ramda": "~0.26.1", - "request-progress": "^3.0.0", - "supports-color": "^7.1.0", - "tmp": "~0.1.0", - "untildify": "^4.0.0", - "url": "^0.11.0", - "yauzl": "^2.10.0" - }, - "dependencies": { - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "tmp": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", - "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", - "dev": true, - "requires": { - "rimraf": "^2.6.3" - } - } - } - }, "d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -16304,12 +15928,6 @@ } } }, - "date-fns": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", - "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", - "dev": true - }, "dateformat": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", @@ -16336,6 +15954,7 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, "requires": { "ms": "2.1.2" } @@ -17169,12 +16788,6 @@ "integrity": "sha512-NcGkBVXePiuUrPLV8IxP43n1EOtdg+dudVjrfVEUd/bOqpQUFZ2diL5PPYzbgEhZFEltdXV3AcyKwGnEQ5lhMA==", "dev": true }, - "elegant-spinner": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", - "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", - "dev": true - }, "elliptic": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", @@ -18197,12 +17810,6 @@ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "dev": true }, - "eventemitter2": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.5.tgz", - "integrity": "sha512-bXE7Dyc1i6oQElDG0jMRZJrRAn9QR2xyyFGmBdZleNmyQX0FqGYmhZIrIrpPfm/w//LTo4tVQGOGQcGCb5q9uw==", - "dev": true - }, "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -18261,35 +17868,12 @@ "node-getopt": "^0.2.3" } }, - "executable": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", - "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", - "dev": true, - "requires": { - "pify": "^2.2.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, "exit-on-epipe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", @@ -18750,35 +18334,6 @@ } } }, - "extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "dev": true, - "requires": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -20823,23 +20378,6 @@ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" }, - "getos": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", - "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", - "dev": true, - "requires": { - "async": "^3.2.0" - }, - "dependencies": { - "async": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", - "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==", - "dev": true - } - } - }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -21360,23 +20898,6 @@ "process": "^0.11.10" } }, - "global-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", - "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", - "dev": true, - "requires": { - "ini": "1.3.7" - }, - "dependencies": { - "ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", - "dev": true - } - } - }, "global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", @@ -23704,24 +23225,6 @@ "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" }, - "is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", - "dev": true, - "requires": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" - }, - "dependencies": { - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - } - } - }, "is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -23811,15 +23314,6 @@ "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==" }, - "is-observable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", - "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", - "dev": true, - "requires": { - "symbol-observable": "^1.1.0" - } - }, "is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", @@ -23881,12 +23375,6 @@ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, - "is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true - }, "is-reference": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", @@ -28621,12 +28109,6 @@ "package-json": "^6.3.0" } }, - "lazy-ass": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", - "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=", - "dev": true - }, "lazy-cache": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", @@ -28935,162 +28417,6 @@ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, - "listr": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", - "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", - "dev": true, - "requires": { - "@samverschueren/stream-to-observable": "^0.3.0", - "is-observable": "^1.1.0", - "is-promise": "^2.1.0", - "is-stream": "^1.1.0", - "listr-silent-renderer": "^1.1.1", - "listr-update-renderer": "^0.5.0", - "listr-verbose-renderer": "^0.5.0", - "p-map": "^2.0.0", - "rxjs": "^6.3.3" - }, - "dependencies": { - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - } - } - }, - "listr-silent-renderer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", - "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", - "dev": true - }, - "listr-update-renderer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", - "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "cli-truncate": "^0.2.1", - "elegant-spinner": "^1.0.1", - "figures": "^1.7.0", - "indent-string": "^3.0.0", - "log-symbols": "^1.0.2", - "log-update": "^2.3.0", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, - "requires": { - "chalk": "^1.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "listr-verbose-renderer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", - "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "cli-cursor": "^2.1.0", - "date-fns": "^1.27.2", - "figures": "^2.0.0" - }, - "dependencies": { - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - } - } - }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -29300,12 +28626,6 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=", - "dev": true - }, "lodash.set": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", @@ -29352,88 +28672,6 @@ "chalk": "^2.4.2" } }, - "log-update": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", - "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "cli-cursor": "^2.0.0", - "wrap-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", - "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0" - } - } - } - }, "logform": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/logform/-/logform-2.3.0.tgz", @@ -31091,12 +30329,6 @@ } } }, - "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", - "dev": true - }, "morphdom": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/morphdom/-/morphdom-2.6.1.tgz", @@ -37008,12 +36240,6 @@ "fn.name": "1.x.x" } }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, "open": { "version": "7.4.2", "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", @@ -37280,12 +36506,6 @@ "os-tmpdir": "^1.0.0" } }, - "ospath": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", - "integrity": "sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=", - "dev": true - }, "outpipe": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz", @@ -38765,12 +37985,6 @@ "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", "dev": true }, - "pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true - }, "pretty-format": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", @@ -39160,12 +38374,6 @@ "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==" }, - "ramda": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz", - "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==", - "dev": true - }, "randomatic": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", @@ -39935,15 +39143,6 @@ } } }, - "request-progress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", - "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", - "dev": true, - "requires": { - "throttleit": "^1.0.0" - } - }, "request-promise": { "version": "4.2.6", "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz", @@ -40076,16 +39275,6 @@ "lowercase-keys": "^1.0.0" } }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" - } - }, "resumer": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", @@ -40849,9 +40038,9 @@ "integrity": "sha1-9RWxoWLek8LM7y/AyjPztVQ+OMg=" }, "selenium-standalone": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-7.1.0.tgz", - "integrity": "sha512-Pc7U48qwB4LVy/XczBrPPXwUhEPl3XQSik8SjLfj2qzBEtZqrjyzOlnnXq4aVCdr5wH9FiFJm8LwheJbK2+/oQ==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-8.0.4.tgz", + "integrity": "sha512-WK94SCjofq/V4uFxeT9yJjyVTpzqpiqhv7UR4Q98n1il9yxNAWsKRtfgT+2DA3Kwv8CZCk9zPWU7kBW5i2oaxw==", "dev": true, "requires": { "commander": "^7.2.0", @@ -40953,9 +40142,9 @@ } }, "got": { - "version": "11.8.2", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.2.tgz", - "integrity": "sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==", + "version": "11.8.3", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.3.tgz", + "integrity": "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==", "dev": true, "requires": { "@sindresorhus/is": "^4.0.0", @@ -40963,7 +40152,7 @@ "@types/cacheable-request": "^6.0.1", "@types/responselike": "^1.0.0", "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.1", + "cacheable-request": "^7.0.2", "decompress-response": "^6.0.0", "http2-wrapper": "^1.0.0-beta.5.2", "lowercase-keys": "^2.0.0", @@ -41466,12 +40655,6 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true - }, "slide": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", @@ -42935,12 +42118,6 @@ "safe-buffer": "^5.1.2" } }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true - }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -43531,12 +42708,6 @@ "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", "dev": true }, - "throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", - "dev": true - }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -44558,12 +43729,6 @@ } } }, - "untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true - }, "upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", diff --git a/package.json b/package.json index e3fdd751bb..6e4837b1fa 100644 --- a/package.json +++ b/package.json @@ -49,48 +49,51 @@ "build:libs": "nx run-many --target=build --parallel=false --with-deps=true --projects=remix-analyzer,remix-astwalker,remix-debug,remix-lib,remix-simulator,remix-solidity,remix-tests,remix-url-resolver,remixd", "test:libs": "nx run-many --target=test --projects=remix-analyzer,remix-astwalker,remix-debug,remix-lib,remix-simulator,remix-solidity,remix-tests,remix-url-resolver,remixd", "publish:libs": "npm run build:libs && lerna publish --skip-git && npm run bumpVersion:libs", - "build:e2e": "tsc -p apps/remix-ide-e2e/tsconfig.e2e.json", + "build:e2e": "node apps/remix-ide-e2e/src/buildGroupTests.js && tsc -p apps/remix-ide-e2e/tsconfig.e2e.json", "watch:e2e": "nodemon", "bumpVersion:libs": "gulp & gulp syncLibVersions;", "browsertest": "sleep 5 && npm run nightwatch_local", "csslint": "csslint --ignore=order-alphabetical --errors='errors,duplicate-properties,empty-rules' --exclude-list='apps/remix-ide/src/assets/css/font-awesome.min.css' apps/remix-ide/src/assets/css/", "downloadsolc_assets": "wget --no-check-certificate https://binaries.soliditylang.org/wasm/soljson-v0.8.7+commit.e28d00a7.js -O ./apps/remix-ide/src/assets/js/soljson.js && wget --no-check-certificate https://binaries.soliditylang.org/wasm/soljson-v0.8.7+commit.e28d00a7.js -O ./apps/solidity-compiler/src/assets/js/soljson.js", + "downloadsolc_assets_dist": "wget --no-check-certificate https://binaries.soliditylang.org/wasm/soljson-v0.8.7+commit.e28d00a7.js -O ./dist/apps/remix-ide/assets/js/soljson.js && wget --no-check-certificate https://binaries.soliditylang.org/wasm/soljson-v0.8.7+commit.e28d00a7.js -O ./dist/apps/solidity-compiler/assets/js/soljson.js", "make-mock-compiler": "node apps/remix-ide/ci/makeMockCompiler.js", "minify": "uglifyjs --in-source-map inline --source-map-inline -c warnings=false", "build:production": "NODE_ENV=production nx build remix-ide --skip-nx-cache", "serve:production": "npx http-server ./dist/apps/remix-ide", + "select_test": "sh apps/remix-ide-e2e/src/select_tests.sh", + "group_test": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/${npm_config_test}_group${npm_config_group}.test.js --env=${npm_config_env}", "nightwatch_parallel": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js --env=chrome,firefox", "nightwatch_local_firefox": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js --env=firefox", "nightwatch_local_chrome": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js --env=chrome", "nightwatch_local_ballot": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/ballot.test.js --env=chrome", - "nightwatch_local_ballot_0_4_11": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/ballot_0_4_11.spec.js --env=chrome", + "nightwatch_local_ballot_0_4_11": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/ballot_0_4_11.test.js --env=chrome", "nightwatch_local_usingWorker": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/usingWebWorker.test.js --env=chrome", "nightwatch_local_libraryDeployment": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/libraryDeployment.test.js --env=chrome", - "nightwatch_local_solidityImport": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/solidityImport.spec.js --env=chrome", - "nightwatch_local_recorder": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/recorder.spec.js --env=chrome", - "nightwatch_local_transactionExecution": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/transactionExecution.spec.js --env=chrome", - "nightwatch_local_staticAnalysis": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/staticAnalysis.spec.js --env=chrome", + "nightwatch_local_solidityImport": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/solidityImport_*.test.js --env=chrome", + "nightwatch_local_recorder": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/recorder.test.js --env=chrome", + "nightwatch_local_transactionExecution": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/transactionExecution_*.test.js --env=chrome", + "nightwatch_local_staticAnalysis": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/staticAnalysis.test.js --env=chrome", "nightwatch_local_signingMessage": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/signingMessage.test.js --env=chrome", - "nightwatch_local_specialFunctions": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/specialFunctions.test.js --env=chrome", - "nightwatch_local_solidityUnitTests": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/solidityUnittests.spec.js --env=chrome", + "nightwatch_local_specialFunctions": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/specialFunctions_*.test.js --env=chrome", + "nightwatch_local_solidityUnitTests": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/solidityUnittests_*.test.js --env=chrome", "nightwatch_local_remixd": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/remixd.test.js --env=chrome", - "nightwatch_local_terminal": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/terminal.test.js --env=chrome", - "nightwatch_local_gist": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/gist.spec.js --env=chrome", + "nightwatch_local_terminal": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/terminal_*.test.js --env=chrome", + "nightwatch_local_gist": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/gist.test.js --env=chrome", "nightwatch_local_workspace": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/workspace.test.js --env=chrome", "nightwatch_local_defaultLayout": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/defaultLayout.test.js --env=chrome", "nightwatch_local_pluginManager": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/pluginManager.test.js --env=chrome", "nightwatch_local_publishContract": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/publishContract.test.js --env=chrome", "nightwatch_local_generalSettings": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/generalSettings.test.js --env=chrome", "nightwatch_local_fileExplorer": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/fileExplorer.test.js --env=chrome", - "nightwatch_local_debugger": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/debugger.spec.js --env=chrome", - "nightwatch_local_editor": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/editor.spec.js --env=chrome", + "nightwatch_local_debugger": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/debugger_*.test.js --env=chrome", + "nightwatch_local_editor": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/editor.test.js --env=chrome", "nightwatch_local_compiler": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/compiler_api.test.js --env=chrome", "nightwatch_local_txListener": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/txListener.test.js --env=chrome", - "nightwatch_local_fileManager": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/fileManager_api.spec.js --env=chrome", + "nightwatch_local_fileManager": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/fileManager_api.test.js --env=chrome", "nightwatch_local_runAndDeploy": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/runAndDeploy.js --env=chrome-runAndDeploy", - "nightwatch_local_url": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/url.spec.js --env=chrome", - "nightwatch_local_verticalIconscontextmenu": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/verticalIconsPanel.spec.js --env=chrome", - "nightwatch_local_pluginApi": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/plugin_api.js --env=chrome", + "nightwatch_local_url": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/url.test.js --env=chrome", + "nightwatch_local_verticalIconscontextmenu": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/verticalIconsPanel.test.js --env=chrome", + "nightwatch_local_pluginApi": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/plugin_api_*.js --env=chrome", "onchange": "onchange apps/remix-ide/build/app.js -- npm-run-all lint", "remixd": "nx build remixd && nx serve remixd --folder=./apps/remix-ide/contracts --remixide=http://127.0.0.1:8080", "selenium": "selenium-standalone start", @@ -252,7 +255,6 @@ "copy-to-clipboard": "^3.3.1", "csjs-inject": "^1.0.1", "csslint": "^1.0.2", - "cypress": "^4.1.0", "dotenv": "^8.2.0", "eslint": "6.8.0", "eslint-config-prettier": "^6.11.0", @@ -293,7 +295,7 @@ "prettier": "1.19.1", "request": "^2.83.0", "rimraf": "^2.6.1", - "selenium-standalone": "^7.1.0", + "selenium-standalone": "^8.0.4", "semver": "^6.3.0", "solc": "0.7.4", "swarmgw": "^0.3.1",