From 32fffe53f5016b8fc4f2b78f4501fc271705b96d Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Mon, 15 Jul 2019 17:10:46 -0300 Subject: [PATCH] Remove Drizzle tests (#6855) The Drizzle tests have not been used for some time. They were used to ensure compatibility with newer versions of `web3` v1. If we want to re-add tests to ensure compatibility with newer `web3` versions, we should find some way of doing that more reliably than was done here - these tests were somewhat flaky and unreliable. --- .circleci/config.yml | 18 --- app/scripts/inpage.js | 2 +- package.json | 1 - test/e2e/drizzle.spec.js | 286 --------------------------------------- test/e2e/run-drizzle.sh | 31 ----- 5 files changed, 1 insertion(+), 337 deletions(-) delete mode 100644 test/e2e/drizzle.spec.js delete mode 100755 test/e2e/run-drizzle.sh diff --git a/.circleci/config.yml b/.circleci/config.yml index a3cb6cd71..0074dadf9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -26,10 +26,6 @@ workflows: - test-e2e-firefox: requires: - prep-deps-npm - # - test-e2e-beta-drizzle: - # requires: - # - prep-deps-npm - # - prep-build - test-unit: requires: - prep-deps-npm @@ -52,7 +48,6 @@ workflows: - test-mozilla-lint - test-e2e-chrome - test-e2e-firefox - # - test-e2e-beta-drizzle - test-integration-flat-chrome - test-integration-flat-firefox - job-publish-prerelease: @@ -160,19 +155,6 @@ jobs: name: npm audit command: .circleci/scripts/npm-audit - # test-e2e-beta-drizzle: - # docker: - # - image: circleci/node:8.11.3-browsers - # steps: - # - checkout - # - attach_workspace: - # at: . - # - run: - # name: test:e2e:drizzle:beta - # command: npm run test:e2e:drizzle:beta - # - store_artifacts: - # path: test-artifacts - # destination: test-artifacts test-e2e-chrome: docker: - image: circleci/node:10.16-browsers diff --git a/app/scripts/inpage.js b/app/scripts/inpage.js index 2a0a9ad18..a94787b05 100644 --- a/app/scripts/inpage.js +++ b/app/scripts/inpage.js @@ -134,7 +134,7 @@ inpageProvider._metamask = new Proxy({ }) // Work around for web3@1.0 deleting the bound `sendAsync` but not the unbound -// `sendAsync` method on the prototype, causing `this` reference issues with drizzle +// `sendAsync` method on the prototype, causing `this` reference issues const proxiedInpageProvider = new Proxy(inpageProvider, { // straight up lie that we deleted the property so that it doesnt // throw an error in strict mode diff --git a/package.json b/package.json index 28ff0264e..359f0001b 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,6 @@ "test:single": "cross-env METAMASK_ENV=test mocha --require test/helper.js", "test:integration": "npm run test:integration:build && npm run test:flat", "test:integration:build": "gulp build:scss", - "test:e2e:drizzle:beta": "SELENIUM_BROWSER=chrome test/e2e/run-drizzle.sh", "test:e2e:chrome": "SELENIUM_BROWSER=chrome test/e2e/run-all.sh", "test:web3:chrome": "SELENIUM_BROWSER=chrome test/e2e/run-web3.sh", "test:web3:firefox": "SELENIUM_BROWSER=firefox test/e2e/run-web3.sh", diff --git a/test/e2e/drizzle.spec.js b/test/e2e/drizzle.spec.js deleted file mode 100644 index cda55cf01..000000000 --- a/test/e2e/drizzle.spec.js +++ /dev/null @@ -1,286 +0,0 @@ -const path = require('path') -const assert = require('assert') -const webdriver = require('selenium-webdriver') -const { By, until } = webdriver -const { - delay, - buildChromeWebDriver, - buildFirefoxWebdriver, - installWebExt, - getExtensionIdChrome, - getExtensionIdFirefox, -} = require('./func') -const { - checkBrowserForConsoleErrors, - closeAllWindowHandlesExcept, - findElement, - findElements, - loadExtension, - openNewPage, - verboseReportOnFailure, - waitUntilXWindowHandles, - switchToWindowWithTitle, -} = require('./helpers') - -describe('MetaMask', function () { - let extensionId - let driver - - const tinyDelayMs = 200 - const regularDelayMs = tinyDelayMs * 2 - const largeDelayMs = regularDelayMs * 2 - - this.timeout(0) - this.bail(true) - - before(async function () { - switch (process.env.SELENIUM_BROWSER) { - case 'chrome': { - const extPath = path.resolve('dist/chrome') - driver = buildChromeWebDriver(extPath) - extensionId = await getExtensionIdChrome(driver) - await driver.get(`chrome-extension://${extensionId}/popup.html`) - break - } - case 'firefox': { - const extPath = path.resolve('dist/firefox') - driver = buildFirefoxWebdriver() - await installWebExt(driver, extPath) - await delay(700) - extensionId = await getExtensionIdFirefox(driver) - await driver.get(`moz-extension://${extensionId}/popup.html`) - } - } - }) - - afterEach(async function () { - if (process.env.SELENIUM_BROWSER === 'chrome') { - const errors = await checkBrowserForConsoleErrors(driver) - if (errors.length) { - const errorReports = errors.map(err => err.message) - const errorMessage = `Errors found in browser console:\n${errorReports.join('\n')}` - console.error(new Error(errorMessage)) - } - } - if (this.currentTest.state === 'failed') { - await verboseReportOnFailure(driver, this.currentTest) - } - }) - - after(async function () { - await driver.quit() - }) - - - describe('New UI setup', async function () { - it('switches to first tab', async function () { - await delay(tinyDelayMs) - const [firstTab] = await driver.getAllWindowHandles() - await driver.switchTo().window(firstTab) - await delay(regularDelayMs) - }) - - it('selects the new UI option', async () => { - // Close all other tabs - const [tab0, tab1, tab2] = await driver.getAllWindowHandles() - await driver.switchTo().window(tab0) - await delay(tinyDelayMs) - - let selectedUrl = await driver.getCurrentUrl() - await delay(tinyDelayMs) - if (tab0 && selectedUrl.match(/popup.html/)) { - await closeAllWindowHandlesExcept(driver, tab0) - } else if (tab1) { - await driver.switchTo().window(tab1) - selectedUrl = await driver.getCurrentUrl() - await delay(tinyDelayMs) - if (selectedUrl.match(/popup.html/)) { - await closeAllWindowHandlesExcept(driver, tab1) - } else if (tab2) { - await driver.switchTo().window(tab2) - selectedUrl = await driver.getCurrentUrl() - selectedUrl.match(/popup.html/) && await closeAllWindowHandlesExcept(driver, tab2) - } - } else { - throw new Error('popup.html not found') - } - await delay(regularDelayMs) - const [appTab] = await driver.getAllWindowHandles() - await driver.switchTo().window(appTab) - await delay(tinyDelayMs) - - await loadExtension(driver, extensionId) - await delay(regularDelayMs) - - const continueBtn = await findElement(driver, By.css('.first-time-flow__button')) - await continueBtn.click() - await delay(regularDelayMs) - }) - }) - - describe('Going through the first time flow', () => { - it('accepts a secure password', async () => { - const passwordBox = await findElement(driver, By.css('.first-time-flow__form #create-password')) - const passwordBoxConfirm = await findElement(driver, By.css('.first-time-flow__form #confirm-password')) - const button = await findElement(driver, By.css('.first-time-flow__form button')) - - await passwordBox.sendKeys('correct horse battery staple') - await passwordBoxConfirm.sendKeys('correct horse battery staple') - await button.click() - await delay(regularDelayMs) - }) - - it('clicks through the unique image screen', async () => { - await findElement(driver, By.css('.first-time-flow__unique-image')) - const nextScreen = await findElement(driver, By.css('button.first-time-flow__button')) - await nextScreen.click() - await delay(regularDelayMs) - }) - - it('clicks through the ToS', async () => { - // terms of use - await findElement(driver, By.css('.first-time-flow__markdown')) - const canClickThrough = await driver.findElement(By.css('button.first-time-flow__button')).isEnabled() - assert.equal(canClickThrough, false, 'disabled continue button') - const bottomOfTos = await findElement(driver, By.linkText('Attributions')) - await driver.executeScript('arguments[0].scrollIntoView(true)', bottomOfTos) - await delay(regularDelayMs) - const acceptTos = await findElement(driver, By.css('button.first-time-flow__button')) - driver.wait(until.elementIsEnabled(acceptTos)) - await acceptTos.click() - await delay(regularDelayMs) - }) - - it('clicks through the privacy notice', async () => { - // privacy notice - const nextScreen = await findElement(driver, By.css('button.first-time-flow__button')) - await nextScreen.click() - await delay(regularDelayMs) - }) - - it('clicks through the phishing notice', async () => { - // phishing notice - const noticeElement = await driver.findElement(By.css('.first-time-flow__markdown')) - await driver.executeScript('arguments[0].scrollTop = arguments[0].scrollHeight', noticeElement) - await delay(regularDelayMs) - const nextScreen = await findElement(driver, By.css('button.first-time-flow__button')) - await nextScreen.click() - await delay(regularDelayMs) - }) - - let seedPhrase - - it('reveals the seed phrase', async () => { - const byRevealButton = By.css('.reveal-seed-phrase__secret-blocker .reveal-seed-phrase__reveal-button') - await driver.wait(until.elementLocated(byRevealButton, 10000)) - const revealSeedPhraseButton = await findElement(driver, byRevealButton, 10000) - await revealSeedPhraseButton.click() - await delay(regularDelayMs) - - seedPhrase = await driver.findElement(By.css('.reveal-seed-phrase__secret-words')).getText() - assert.equal(seedPhrase.split(' ').length, 12) - await delay(regularDelayMs) - - const nextScreen = await findElement(driver, By.css('button.first-time-flow__button')) - await nextScreen.click() - await delay(regularDelayMs) - }) - - async function clickWordAndWait (word) { - const xpath = `//div[contains(@class, 'confirm-seed-phrase__seed-word--shuffled') and not(contains(@class, 'confirm-seed-phrase__seed-word--selected')) and contains(text(), '${word}')]` - const word0 = await findElement(driver, By.xpath(xpath), 10000) - - await word0.click() - await delay(tinyDelayMs) - } - - async function retypeSeedPhrase (words, wasReloaded, count = 0) { - try { - if (wasReloaded) { - const byRevealButton = By.css('.reveal-seed-phrase__secret-blocker .reveal-seed-phrase__reveal-button') - await driver.wait(until.elementLocated(byRevealButton, 10000)) - const revealSeedPhraseButton = await findElement(driver, byRevealButton, 10000) - await revealSeedPhraseButton.click() - await delay(regularDelayMs) - - const nextScreen = await findElement(driver, By.css('button.first-time-flow__button')) - await nextScreen.click() - await delay(regularDelayMs) - } - - for (let i = 0; i < 12; i++) { - await clickWordAndWait(words[i]) - } - } catch (e) { - if (count > 2) { - throw e - } else { - await loadExtension(driver, extensionId) - await retypeSeedPhrase(words, true, count + 1) - } - } - } - - it('can retype the seed phrase', async () => { - const words = seedPhrase.split(' ') - - await retypeSeedPhrase(words) - - const confirm = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`)) - await confirm.click() - await delay(regularDelayMs) - }) - - it('clicks through the deposit modal', async () => { - const byBuyModal = By.css('span .modal') - const buyModal = await driver.wait(until.elementLocated(byBuyModal)) - const closeModal = await findElement(driver, By.css('.page-container__header-close')) - await closeModal.click() - await driver.wait(until.stalenessOf(buyModal)) - await delay(regularDelayMs) - }) - - it('switches to localhost', async () => { - const networkDropdown = await findElement(driver, By.css('.network-name')) - await networkDropdown.click() - await delay(regularDelayMs) - - const [localhost] = await findElements(driver, By.xpath(`//span[contains(text(), 'Localhost')]`)) - await localhost.click() - await delay(largeDelayMs * 2) - }) - }) - - describe('Drizzle', () => { - let windowHandles - let extension - let popup - let dapp - - it('should be able to connect the account', async () => { - await openNewPage(driver, 'http://127.0.0.1:3000/') - await delay(regularDelayMs) - - await waitUntilXWindowHandles(driver, 3) - windowHandles = await driver.getAllWindowHandles() - - extension = windowHandles[0] - popup = await switchToWindowWithTitle(driver, 'MetaMask Notification', windowHandles) - dapp = windowHandles.find(handle => handle !== extension && handle !== popup) - - await delay(regularDelayMs) - const approveButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Connect')]`)) - await approveButton.click() - }) - - it('should be able to detect our eth address', async () => { - // Check if address exposed - await driver.switchTo().window(dapp) - await delay(regularDelayMs) - - const addressElement = await findElement(driver, By.css(`.pure-u-1-1 h4`)) - const addressText = await addressElement.getText() - assert(addressText.match(/^0x[a-fA-F0-9]{40}$/)) - }) - }) -}) diff --git a/test/e2e/run-drizzle.sh b/test/e2e/run-drizzle.sh deleted file mode 100755 index f3db2638a..000000000 --- a/test/e2e/run-drizzle.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -u -set -o pipefail - -npm run ganache:start -- -b 2 >> /dev/null 2>&1 & -npm_run_ganache_start_pid=$! -sleep 5 - -pushd "$(mktemp -d)" -npm install --no-package-lock truffle -truffle="$(npm bin)/truffle" -$truffle unbox drizzle -echo "Deploying contracts for Drizzle test..." -$truffle compile -$truffle migrate - -BROWSER=none npm start >> /dev/null 2>&1 & -npm_start_pid=$! - -popd -if ! mocha test/e2e/drizzle.spec -then - test_status=1 -fi - -! kill -15 $npm_run_ganache_start_pid -! kill -15 $npm_start_pid -! wait $npm_run_ganache_start_pid $npm_start_pid -exit ${test_status:-}