mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
Merge pull request #3805 from MetaMask/ci-screens
CI - capture screenshots
This commit is contained in:
commit
40c3edb754
@ -17,8 +17,17 @@ workflows:
|
|||||||
- prep-deps-npm
|
- prep-deps-npm
|
||||||
- test-e2e:
|
- test-e2e:
|
||||||
requires:
|
requires:
|
||||||
- prep-build
|
|
||||||
- prep-deps-npm
|
- prep-deps-npm
|
||||||
|
- prep-build
|
||||||
|
- job-screens:
|
||||||
|
requires:
|
||||||
|
- prep-deps-npm
|
||||||
|
- prep-build
|
||||||
|
- job-announce:
|
||||||
|
requires:
|
||||||
|
- prep-deps-npm
|
||||||
|
- prep-build
|
||||||
|
- job-screens
|
||||||
- test-unit:
|
- test-unit:
|
||||||
requires:
|
requires:
|
||||||
- prep-deps-npm
|
- prep-deps-npm
|
||||||
@ -45,6 +54,7 @@ workflows:
|
|||||||
- test-lint
|
- test-lint
|
||||||
- test-unit
|
- test-unit
|
||||||
- test-e2e
|
- test-e2e
|
||||||
|
- job-screens
|
||||||
- test-integration-mascara-chrome
|
- test-integration-mascara-chrome
|
||||||
- test-integration-mascara-firefox
|
- test-integration-mascara-firefox
|
||||||
- test-integration-flat-chrome
|
- test-integration-flat-chrome
|
||||||
@ -98,32 +108,7 @@ jobs:
|
|||||||
key: build-cache-{{ .Revision }}
|
key: build-cache-{{ .Revision }}
|
||||||
paths:
|
paths:
|
||||||
- dist
|
- dist
|
||||||
- store_artifacts:
|
- builds
|
||||||
path: dist/mascara
|
|
||||||
destination: builds/mascara
|
|
||||||
- store_artifacts:
|
|
||||||
path: builds
|
|
||||||
destination: builds
|
|
||||||
- run:
|
|
||||||
name: build:announce
|
|
||||||
command: |
|
|
||||||
CIRCLE_PR_NUMBER="${CIRCLE_PR_NUMBER:-${CIRCLE_PULL_REQUEST##*/}}"
|
|
||||||
SHORT_SHA1=$(echo $CIRCLE_SHA1 | cut -c 1-7)
|
|
||||||
BUILD_LINK_BASE="https://$CIRCLE_BUILD_NUM-42009758-gh.circle-artifacts.com/0/builds"
|
|
||||||
VERSION=$(node -p 'require("./dist/chrome/manifest.json").version')
|
|
||||||
MASCARA="$BUILD_LINK_BASE/mascara/home.html"
|
|
||||||
CHROME="$BUILD_LINK_BASE/metamask-chrome-$VERSION.zip"
|
|
||||||
FIREFOX="$BUILD_LINK_BASE/metamask-firefox-$VERSION.zip"
|
|
||||||
OPERA="$BUILD_LINK_BASE/metamask-opera-$VERSION.zip"
|
|
||||||
EDGE="$BUILD_LINK_BASE/metamask-edge-$VERSION.zip"
|
|
||||||
COMMENT_MAIN="Builds ready [$SHORT_SHA1]: [mascara][mascara], [chrome][chrome], [firefox][firefox], [edge][edge], [opera][opera]"
|
|
||||||
COMMENT_LINKS="[mascara]:$MASCARA\n[chrome]:$CHROME\n[firefox]:$FIREFOX\n[opera]:$OPERA\n[edge]:$EDGE\n"
|
|
||||||
COMMENT_BODY="$COMMENT_MAIN\n\n$COMMENT_LINKS"
|
|
||||||
JSON_PAYLOAD="{\"body\":\"$COMMENT_BODY\"}"
|
|
||||||
POST_COMMENT_URI="https://api.github.com/repos/metamask/metamask-extension/issues/$CIRCLE_PR_NUMBER/comments"
|
|
||||||
echo "Announcement:\n$COMMENT_BODY"
|
|
||||||
echo "Posting to $POST_COMMENT_URI"
|
|
||||||
curl -d "$JSON_PAYLOAD" -H "Authorization: token $GITHUB_COMMENT_TOKEN" $POST_COMMENT_URI
|
|
||||||
|
|
||||||
prep-scss:
|
prep-scss:
|
||||||
docker:
|
docker:
|
||||||
@ -171,6 +156,47 @@ jobs:
|
|||||||
path: test-artifacts
|
path: test-artifacts
|
||||||
destination: test-artifacts
|
destination: test-artifacts
|
||||||
|
|
||||||
|
job-screens:
|
||||||
|
docker:
|
||||||
|
- image: circleci/node:8-browsers
|
||||||
|
steps:
|
||||||
|
- checkout
|
||||||
|
- restore_cache:
|
||||||
|
key: dependency-cache-{{ checksum "package-lock.json" }}
|
||||||
|
- restore_cache:
|
||||||
|
key: build-cache-{{ .Revision }}
|
||||||
|
- run:
|
||||||
|
name: Test
|
||||||
|
command: npm run test:screens
|
||||||
|
- save_cache:
|
||||||
|
key: job-screens-{{ .Revision }}
|
||||||
|
paths:
|
||||||
|
- test-artifacts
|
||||||
|
|
||||||
|
job-announce:
|
||||||
|
docker:
|
||||||
|
- image: circleci/node:8-browsers
|
||||||
|
steps:
|
||||||
|
- checkout
|
||||||
|
- restore_cache:
|
||||||
|
key: dependency-cache-{{ checksum "package-lock.json" }}
|
||||||
|
- restore_cache:
|
||||||
|
key: build-cache-{{ .Revision }}
|
||||||
|
- restore_cache:
|
||||||
|
key: job-screens-{{ .Revision }}
|
||||||
|
- store_artifacts:
|
||||||
|
path: dist/mascara
|
||||||
|
destination: builds/mascara
|
||||||
|
- store_artifacts:
|
||||||
|
path: builds
|
||||||
|
destination: builds
|
||||||
|
- store_artifacts:
|
||||||
|
path: test-artifacts
|
||||||
|
destination: test-artifacts
|
||||||
|
- run:
|
||||||
|
name: build:announce
|
||||||
|
command: ./development/metamaskbot-build-announce.js
|
||||||
|
|
||||||
test-unit:
|
test-unit:
|
||||||
docker:
|
docker:
|
||||||
- image: circleci/node:8-browsers
|
- image: circleci/node:8-browsers
|
||||||
|
52
development/metamaskbot-build-announce.js
Executable file
52
development/metamaskbot-build-announce.js
Executable file
@ -0,0 +1,52 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
const request = require('request-promise')
|
||||||
|
const { version } = require('../dist/chrome/manifest.json')
|
||||||
|
|
||||||
|
const GITHUB_COMMENT_TOKEN = process.env.GITHUB_COMMENT_TOKEN
|
||||||
|
console.log('GITHUB_COMMENT_TOKEN', GITHUB_COMMENT_TOKEN)
|
||||||
|
const CIRCLE_PULL_REQUEST = process.env.CIRCLE_PULL_REQUEST
|
||||||
|
console.log('CIRCLE_PULL_REQUEST', CIRCLE_PULL_REQUEST)
|
||||||
|
const CIRCLE_SHA1 = process.env.CIRCLE_SHA1
|
||||||
|
console.log('CIRCLE_SHA1', CIRCLE_SHA1)
|
||||||
|
const CIRCLE_BUILD_NUM = process.env.CIRCLE_BUILD_NUM
|
||||||
|
console.log('CIRCLE_BUILD_NUM', CIRCLE_BUILD_NUM)
|
||||||
|
|
||||||
|
const CIRCLE_PR_NUMBER = CIRCLE_PULL_REQUEST.split('/').pop()
|
||||||
|
const SHORT_SHA1 = CIRCLE_SHA1.slice(0,7)
|
||||||
|
const BUILD_LINK_BASE = `https://${CIRCLE_BUILD_NUM}-42009758-gh.circle-artifacts.com/0`
|
||||||
|
|
||||||
|
const MASCARA = `${BUILD_LINK_BASE}/builds/mascara/home.html`
|
||||||
|
const CHROME = `${BUILD_LINK_BASE}/builds/metamask-chrome-${version}.zip`
|
||||||
|
const FIREFOX = `${BUILD_LINK_BASE}/builds/metamask-firefox-${version}.zip`
|
||||||
|
const EDGE = `${BUILD_LINK_BASE}/builds/metamask-edge-${version}.zip`
|
||||||
|
const OPERA = `${BUILD_LINK_BASE}/builds/metamask-opera-${version}.zip`
|
||||||
|
const WALKTHROUGH = `${BUILD_LINK_BASE}/test-artifacts/screens/walkthrough%20%28en%29.gif`
|
||||||
|
|
||||||
|
const commentBody = `
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
Builds ready [${SHORT_SHA1}]:
|
||||||
|
<a href="${MASCARA}">mascara</a>,
|
||||||
|
<a href="${CHROME}">chrome</a>,
|
||||||
|
<a href="${FIREFOX}">firefox</a>,
|
||||||
|
<a href="${EDGE}">edge</a>,
|
||||||
|
<a href="${OPERA}">opera</a>
|
||||||
|
</summary>
|
||||||
|
<image src="${WALKTHROUGH}">
|
||||||
|
</details>
|
||||||
|
`
|
||||||
|
|
||||||
|
const JSON_PAYLOAD = JSON.stringify({ body: commentBody })
|
||||||
|
const POST_COMMENT_URI = `https://api.github.com/repos/metamask/metamask-extension/issues/${CIRCLE_PR_NUMBER}/comments`
|
||||||
|
console.log(`Announcement:\n${commentBody}`)
|
||||||
|
console.log(`Posting to: ${POST_COMMENT_URI}`)
|
||||||
|
|
||||||
|
request({
|
||||||
|
method: 'POST',
|
||||||
|
uri: POST_COMMENT_URI,
|
||||||
|
body: JSON_PAYLOAD,
|
||||||
|
headers: {
|
||||||
|
'User-Agent': 'metamaskbot',
|
||||||
|
'Authorization': `token ${GITHUB_COMMENT_TOKEN}`,
|
||||||
|
},
|
||||||
|
})
|
3091
package-lock.json
generated
3091
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
13
package.json
13
package.json
@ -12,7 +12,10 @@
|
|||||||
"test:single": "cross-env METAMASK_ENV=test mocha --require test/helper.js",
|
"test:single": "cross-env METAMASK_ENV=test mocha --require test/helper.js",
|
||||||
"test:integration": "npm run test:integration:build && npm run test:flat && npm run test:mascara",
|
"test:integration": "npm run test:integration:build && npm run test:flat && npm run test:mascara",
|
||||||
"test:integration:build": "gulp build:scss",
|
"test:integration:build": "gulp build:scss",
|
||||||
"test:e2e": "METAMASK_ENV=test mocha test/e2e/metamask.spec --recursive",
|
"test:e2e": "shell-parallel -s 'npm run ganache:start' -x 'sleep 3 && npm run test:e2e:run'",
|
||||||
|
"test:e2e:run": "mocha test/e2e/metamask.spec --recursive",
|
||||||
|
"test:screens": "shell-parallel -s 'npm run ganache:start' -x 'sleep 3 && npm run test:screens:run'",
|
||||||
|
"test:screens:run": "node test/screens/new-ui.js",
|
||||||
"test:coverage": "nyc npm run test:unit && npm run test:coveralls-upload",
|
"test:coverage": "nyc npm run test:unit && npm run test:coveralls-upload",
|
||||||
"test:coveralls-upload": "if [ $COVERALLS_REPO_TOKEN ]; then nyc report --reporter=text-lcov | coveralls; fi",
|
"test:coveralls-upload": "if [ $COVERALLS_REPO_TOKEN ]; then nyc report --reporter=text-lcov | coveralls; fi",
|
||||||
"test:flat": "npm run test:flat:build && karma start test/flat.conf.js",
|
"test:flat": "npm run test:flat:build && karma start test/flat.conf.js",
|
||||||
@ -27,6 +30,7 @@
|
|||||||
"test:mascara:build:locales": "mkdirp dist/chrome && cp -R app/_locales dist/chrome/_locales",
|
"test:mascara:build:locales": "mkdirp dist/chrome && cp -R app/_locales dist/chrome/_locales",
|
||||||
"test:mascara:build:background": "browserify mascara/src/background.js -o dist/mascara/background.js",
|
"test:mascara:build:background": "browserify mascara/src/background.js -o dist/mascara/background.js",
|
||||||
"test:mascara:build:tests": "browserify test/integration/lib/first-time.js -o dist/mascara/tests.js",
|
"test:mascara:build:tests": "browserify test/integration/lib/first-time.js -o dist/mascara/tests.js",
|
||||||
|
"ganache:start": "ganache-cli -m 'phrase upgrade clock rough situate wedding elder clever doctor stamp excess tent'",
|
||||||
"sentry": "export RELEASE=`cat app/manifest.json| jq -r .version` && npm run sentry:release && npm run sentry:upload",
|
"sentry": "export RELEASE=`cat app/manifest.json| jq -r .version` && npm run sentry:release && npm run sentry:upload",
|
||||||
"sentry:release": "npm run sentry:release:new && npm run sentry:release:clean",
|
"sentry:release": "npm run sentry:release:new && npm run sentry:release:clean",
|
||||||
"sentry:release:new": "sentry-cli releases --org 'metamask' --project 'metamask' new $RELEASE",
|
"sentry:release:new": "sentry-cli releases --org 'metamask' --project 'metamask' new $RELEASE",
|
||||||
@ -140,7 +144,6 @@
|
|||||||
"number-to-bn": "^1.7.0",
|
"number-to-bn": "^1.7.0",
|
||||||
"obj-multiplex": "^1.0.0",
|
"obj-multiplex": "^1.0.0",
|
||||||
"obs-store": "^3.0.0",
|
"obs-store": "^3.0.0",
|
||||||
"once": "^1.3.3",
|
|
||||||
"percentile": "^1.2.0",
|
"percentile": "^1.2.0",
|
||||||
"pify": "^3.0.0",
|
"pify": "^3.0.0",
|
||||||
"ping-pong-stream": "^1.0.0",
|
"ping-pong-stream": "^1.0.0",
|
||||||
@ -219,6 +222,8 @@
|
|||||||
"eslint-plugin-react": "^7.4.0",
|
"eslint-plugin-react": "^7.4.0",
|
||||||
"eth-json-rpc-middleware": "^1.2.7",
|
"eth-json-rpc-middleware": "^1.2.7",
|
||||||
"fs-promise": "^2.0.3",
|
"fs-promise": "^2.0.3",
|
||||||
|
"ganache-cli": "^6.1.0",
|
||||||
|
"gifencoder": "^1.1.0",
|
||||||
"gulp": "github:gulpjs/gulp#6d71a658c61edb3090221579d8f97dbe086ba2ed",
|
"gulp": "github:gulpjs/gulp#6d71a658c61edb3090221579d8f97dbe086ba2ed",
|
||||||
"gulp-babel": "^7.0.0",
|
"gulp-babel": "^7.0.0",
|
||||||
"gulp-eslint": "^4.0.0",
|
"gulp-eslint": "^4.0.0",
|
||||||
@ -233,6 +238,7 @@
|
|||||||
"gulp-util": "^3.0.7",
|
"gulp-util": "^3.0.7",
|
||||||
"gulp-watch": "^5.0.0",
|
"gulp-watch": "^5.0.0",
|
||||||
"gulp-zip": "^4.0.0",
|
"gulp-zip": "^4.0.0",
|
||||||
|
"image-size": "^0.6.2",
|
||||||
"isomorphic-fetch": "^2.2.1",
|
"isomorphic-fetch": "^2.2.1",
|
||||||
"jsdom": "^11.2.0",
|
"jsdom": "^11.2.0",
|
||||||
"jsdom-global": "^3.0.2",
|
"jsdom-global": "^3.0.2",
|
||||||
@ -251,6 +257,7 @@
|
|||||||
"node-sass": "^4.7.2",
|
"node-sass": "^4.7.2",
|
||||||
"nyc": "^11.0.3",
|
"nyc": "^11.0.3",
|
||||||
"open": "0.0.5",
|
"open": "0.0.5",
|
||||||
|
"png-file-stream": "^1.0.0",
|
||||||
"prompt": "^1.0.0",
|
"prompt": "^1.0.0",
|
||||||
"qs": "^6.2.0",
|
"qs": "^6.2.0",
|
||||||
"qunitjs": "^2.4.1",
|
"qunitjs": "^2.4.1",
|
||||||
@ -258,7 +265,9 @@
|
|||||||
"react-test-renderer": "^15.6.2",
|
"react-test-renderer": "^15.6.2",
|
||||||
"react-testutils-additions": "^15.2.0",
|
"react-testutils-additions": "^15.2.0",
|
||||||
"redux-test-utils": "^0.2.2",
|
"redux-test-utils": "^0.2.2",
|
||||||
|
"rimraf": "^2.6.2",
|
||||||
"selenium-webdriver": "^3.5.0",
|
"selenium-webdriver": "^3.5.0",
|
||||||
|
"shell-parallel": "^1.0.3",
|
||||||
"sinon": "^5.0.0",
|
"sinon": "^5.0.0",
|
||||||
"stylelint-config-standard": "^18.2.0",
|
"stylelint-config-standard": "^18.2.0",
|
||||||
"tape": "^4.5.1",
|
"tape": "^4.5.1",
|
||||||
|
@ -38,6 +38,8 @@ describe('Metamask popup page', function () {
|
|||||||
const tabs = await driver.getAllWindowHandles()
|
const tabs = await driver.getAllWindowHandles()
|
||||||
await driver.switchTo().window(tabs[0])
|
await driver.switchTo().window(tabs[0])
|
||||||
await delay(300)
|
await delay(300)
|
||||||
|
await setProviderType('localhost')
|
||||||
|
await delay(300)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should match title', async () => {
|
it('should match title', async () => {
|
||||||
@ -124,6 +126,10 @@ describe('Metamask popup page', function () {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
async function setProviderType(type) {
|
||||||
|
await driver.executeScript('window.metamask.setProviderType(arguments[0])', type)
|
||||||
|
}
|
||||||
|
|
||||||
async function verboseReportOnFailure(test) {
|
async function verboseReportOnFailure(test) {
|
||||||
const artifactDir = `./test-artifacts/${test.title}`
|
const artifactDir = `./test-artifacts/${test.title}`
|
||||||
const filepathBase = `${artifactDir}/test-failure`
|
const filepathBase = `${artifactDir}/test-failure`
|
||||||
|
18
test/screens/func.js
Normal file
18
test/screens/func.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
require('chromedriver')
|
||||||
|
const webdriver = require('selenium-webdriver')
|
||||||
|
|
||||||
|
exports.delay = function delay (time) {
|
||||||
|
return new Promise(resolve => setTimeout(resolve, time))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
exports.buildWebDriver = function buildWebDriver (extPath) {
|
||||||
|
return new webdriver.Builder()
|
||||||
|
.withCapabilities({
|
||||||
|
chromeOptions: {
|
||||||
|
args: [`load-extension=${extPath}`],
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.forBrowser('chrome')
|
||||||
|
.build()
|
||||||
|
}
|
230
test/screens/new-ui.js
Normal file
230
test/screens/new-ui.js
Normal file
@ -0,0 +1,230 @@
|
|||||||
|
const path = require('path')
|
||||||
|
const fs = require('fs')
|
||||||
|
const pify = require('pify')
|
||||||
|
const mkdirp = require('mkdirp')
|
||||||
|
const rimraf = require('rimraf')
|
||||||
|
const webdriver = require('selenium-webdriver')
|
||||||
|
const endOfStream = require('end-of-stream')
|
||||||
|
const GIFEncoder = require('gifencoder')
|
||||||
|
const pngFileStream = require('png-file-stream')
|
||||||
|
const sizeOfPng = require('image-size/lib/types/png')
|
||||||
|
const By = webdriver.By
|
||||||
|
const { delay, buildWebDriver } = require('./func')
|
||||||
|
const localesIndex = require('../../app/_locales/index.json')
|
||||||
|
|
||||||
|
let driver
|
||||||
|
|
||||||
|
captureAllScreens().catch((err) => {
|
||||||
|
try {
|
||||||
|
console.error(err)
|
||||||
|
verboseReportOnFailure()
|
||||||
|
driver.quit()
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err)
|
||||||
|
}
|
||||||
|
process.exit(1)
|
||||||
|
})
|
||||||
|
|
||||||
|
async function captureAllScreens() {
|
||||||
|
let screenshotCount = 0
|
||||||
|
|
||||||
|
// common names
|
||||||
|
let button
|
||||||
|
let tabs
|
||||||
|
let element
|
||||||
|
|
||||||
|
await cleanScreenShotDir()
|
||||||
|
|
||||||
|
// setup selenium and install extension
|
||||||
|
const extPath = path.resolve('dist/chrome')
|
||||||
|
driver = buildWebDriver(extPath)
|
||||||
|
await driver.get('chrome://extensions-frame')
|
||||||
|
const elems = await driver.findElements(By.css('.extension-list-item-wrapper'))
|
||||||
|
const extensionId = await elems[1].getAttribute('id')
|
||||||
|
await driver.get(`chrome-extension://${extensionId}/home.html`)
|
||||||
|
await delay(500)
|
||||||
|
tabs = await driver.getAllWindowHandles()
|
||||||
|
await driver.switchTo().window(tabs[0])
|
||||||
|
await delay(1000)
|
||||||
|
await setProviderType('localhost')
|
||||||
|
await delay(300)
|
||||||
|
|
||||||
|
// click try new ui
|
||||||
|
await driver.findElement(By.css('#app-content > div > div.app-primary.from-right > div > div.flex-row.flex-center.flex-grow > p')).click()
|
||||||
|
await delay(300)
|
||||||
|
|
||||||
|
// close metamask homepage and extra home.html
|
||||||
|
tabs = await driver.getAllWindowHandles()
|
||||||
|
// metamask homepage is opened on prod, not dev
|
||||||
|
if (tabs.length > 2) {
|
||||||
|
await driver.switchTo().window(tabs[2])
|
||||||
|
driver.close()
|
||||||
|
}
|
||||||
|
await driver.switchTo().window(tabs[1])
|
||||||
|
driver.close()
|
||||||
|
await driver.switchTo().window(tabs[0])
|
||||||
|
await delay(300)
|
||||||
|
await captureLanguageScreenShots('welcome-new-ui')
|
||||||
|
|
||||||
|
// setup account
|
||||||
|
await delay(1000)
|
||||||
|
await driver.findElement(By.css('body')).click()
|
||||||
|
await delay(300)
|
||||||
|
await captureLanguageScreenShots('welcome')
|
||||||
|
|
||||||
|
await driver.findElement(By.css('button')).click()
|
||||||
|
await captureLanguageScreenShots('create password')
|
||||||
|
|
||||||
|
const passwordBox = await driver.findElement(By.css('input[type=password]:nth-of-type(1)'))
|
||||||
|
const passwordBoxConfirm = await driver.findElement(By.css('input[type=password]:nth-of-type(2)'))
|
||||||
|
passwordBox.sendKeys('123456789')
|
||||||
|
passwordBoxConfirm.sendKeys('123456789')
|
||||||
|
await delay(500)
|
||||||
|
await captureLanguageScreenShots('choose-password-filled')
|
||||||
|
|
||||||
|
await driver.findElement(By.css('button')).click()
|
||||||
|
await delay(500)
|
||||||
|
await captureLanguageScreenShots('unique account image')
|
||||||
|
|
||||||
|
await driver.findElement(By.css('button')).click()
|
||||||
|
await delay(500)
|
||||||
|
await captureLanguageScreenShots('privacy note')
|
||||||
|
|
||||||
|
await driver.findElement(By.css('button')).click()
|
||||||
|
await delay(300)
|
||||||
|
await captureLanguageScreenShots('terms')
|
||||||
|
|
||||||
|
await delay(300)
|
||||||
|
element = driver.findElement(By.linkText('Attributions'))
|
||||||
|
await driver.executeScript('arguments[0].scrollIntoView(true)', element)
|
||||||
|
await delay(300)
|
||||||
|
await captureLanguageScreenShots('terms-scrolled')
|
||||||
|
|
||||||
|
await driver.findElement(By.css('button')).click()
|
||||||
|
await delay(300)
|
||||||
|
await captureLanguageScreenShots('secret backup phrase')
|
||||||
|
|
||||||
|
await driver.findElement(By.css('button')).click()
|
||||||
|
await delay(300)
|
||||||
|
await captureLanguageScreenShots('secret backup phrase')
|
||||||
|
|
||||||
|
await driver.findElement(By.css('.backup-phrase__reveal-button')).click()
|
||||||
|
await delay(300)
|
||||||
|
await captureLanguageScreenShots('secret backup phrase - reveal')
|
||||||
|
|
||||||
|
await driver.findElement(By.css('button')).click()
|
||||||
|
await delay(300)
|
||||||
|
await captureLanguageScreenShots('confirm secret backup phrase')
|
||||||
|
|
||||||
|
// finish up
|
||||||
|
console.log('building gif...')
|
||||||
|
await generateGif()
|
||||||
|
await driver.quit()
|
||||||
|
return
|
||||||
|
|
||||||
|
//
|
||||||
|
// await button.click()
|
||||||
|
// await delay(700)
|
||||||
|
// this.seedPhase = await driver.findElement(By.css('.twelve-word-phrase')).getText()
|
||||||
|
// await captureScreenShot('seed phrase')
|
||||||
|
//
|
||||||
|
// const continueAfterSeedPhrase = await driver.findElement(By.css('button'))
|
||||||
|
// await continueAfterSeedPhrase.click()
|
||||||
|
// await delay(300)
|
||||||
|
// await captureScreenShot('main screen')
|
||||||
|
//
|
||||||
|
// await driver.findElement(By.css('.sandwich-expando')).click()
|
||||||
|
// await delay(500)
|
||||||
|
// await captureScreenShot('menu')
|
||||||
|
|
||||||
|
// await driver.findElement(By.css('#app-content > div > div:nth-child(3) > span > div > li:nth-child(3)')).click()
|
||||||
|
// await captureScreenShot('main screen')
|
||||||
|
// it('should accept account password after lock', async () => {
|
||||||
|
// await delay(500)
|
||||||
|
// await driver.findElement(By.id('password-box')).sendKeys('123456789')
|
||||||
|
// await driver.findElement(By.css('button')).click()
|
||||||
|
// await delay(500)
|
||||||
|
// })
|
||||||
|
//
|
||||||
|
// it('should show QR code option', async () => {
|
||||||
|
// await delay(300)
|
||||||
|
// await driver.findElement(By.css('.fa-ellipsis-h')).click()
|
||||||
|
// await driver.findElement(By.css('#app-content > div > div.app-primary.from-right > div > div > div:nth-child(1) > flex-column > div.name-label > div > span > i > div > div > li:nth-child(3)')).click()
|
||||||
|
// await delay(300)
|
||||||
|
// })
|
||||||
|
//
|
||||||
|
// it('should show the account address', async () => {
|
||||||
|
// this.accountAddress = await driver.findElement(By.css('.ellip-address')).getText()
|
||||||
|
// await driver.findElement(By.css('.fa-arrow-left')).click()
|
||||||
|
// await delay(500)
|
||||||
|
// })
|
||||||
|
|
||||||
|
async function captureLanguageScreenShots(label) {
|
||||||
|
const nonEnglishLocales = localesIndex.filter(localeMeta => localeMeta.code !== 'en')
|
||||||
|
// take english shot
|
||||||
|
await captureScreenShot(`${label} (en)`)
|
||||||
|
for (let localeMeta of nonEnglishLocales) {
|
||||||
|
// set locale and take shot
|
||||||
|
await setLocale(localeMeta.code)
|
||||||
|
await delay(300)
|
||||||
|
await captureScreenShot(`${label} (${localeMeta.code})`)
|
||||||
|
}
|
||||||
|
// return locale to english
|
||||||
|
await setLocale('en')
|
||||||
|
await delay(300)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function setLocale(code) {
|
||||||
|
await driver.executeScript('window.metamask.updateCurrentLocale(arguments[0])', code)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function setProviderType(type) {
|
||||||
|
await driver.executeScript('window.metamask.setProviderType(arguments[0])', type)
|
||||||
|
}
|
||||||
|
|
||||||
|
// cleanup
|
||||||
|
await driver.quit()
|
||||||
|
|
||||||
|
async function cleanScreenShotDir() {
|
||||||
|
await pify(rimraf)(`./test-artifacts/screens/`)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function captureScreenShot(label) {
|
||||||
|
const shotIndex = screenshotCount.toString().padStart(4, '0')
|
||||||
|
screenshotCount++
|
||||||
|
const artifactDir = `./test-artifacts/screens/`
|
||||||
|
await pify(mkdirp)(artifactDir)
|
||||||
|
// capture screenshot
|
||||||
|
const screenshot = await driver.takeScreenshot()
|
||||||
|
await pify(fs.writeFile)(`${artifactDir}/${shotIndex} - ${label}.png`, screenshot, { encoding: 'base64' })
|
||||||
|
}
|
||||||
|
|
||||||
|
async function generateGif(){
|
||||||
|
// calculate screenshot size
|
||||||
|
const screenshot = await driver.takeScreenshot()
|
||||||
|
const pngBuffer = Buffer.from(screenshot, 'base64')
|
||||||
|
const size = sizeOfPng.calculate(pngBuffer)
|
||||||
|
|
||||||
|
// read only the english pngs into gif
|
||||||
|
const encoder = new GIFEncoder(size.width, size.height)
|
||||||
|
const stream = pngFileStream('./test-artifacts/screens/* (en).png')
|
||||||
|
.pipe(encoder.createWriteStream({ repeat: 0, delay: 1000, quality: 10 }))
|
||||||
|
.pipe(fs.createWriteStream('./test-artifacts/screens/walkthrough (en).gif'))
|
||||||
|
|
||||||
|
// wait for end
|
||||||
|
await pify(endOfStream)(stream)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async function verboseReportOnFailure(test) {
|
||||||
|
const artifactDir = `./test-artifacts/${test.title}`
|
||||||
|
const filepathBase = `${artifactDir}/test-failure`
|
||||||
|
await pify(mkdirp)(artifactDir)
|
||||||
|
// capture screenshot
|
||||||
|
const screenshot = await driver.takeScreenshot()
|
||||||
|
await pify(fs.writeFile)(`${filepathBase}-screenshot.png`, screenshot, { encoding: 'base64' })
|
||||||
|
// capture dom source
|
||||||
|
const htmlSource = await driver.getPageSource()
|
||||||
|
await pify(fs.writeFile)(`${filepathBase}-dom.html`, htmlSource)
|
||||||
|
}
|
@ -1300,7 +1300,7 @@ function retryTransaction (txId) {
|
|||||||
|
|
||||||
function setProviderType (type) {
|
function setProviderType (type) {
|
||||||
return (dispatch) => {
|
return (dispatch) => {
|
||||||
log.debug(`background.setProviderType`)
|
log.debug(`background.setProviderType`, type)
|
||||||
background.setProviderType(type, (err, result) => {
|
background.setProviderType(type, (err, result) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
log.error(err)
|
log.error(err)
|
||||||
@ -1321,13 +1321,14 @@ function updateProviderType (type) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function setRpcTarget (newRpc) {
|
function setRpcTarget (newRpc) {
|
||||||
log.debug(`background.setRpcTarget: ${newRpc}`)
|
|
||||||
return (dispatch) => {
|
return (dispatch) => {
|
||||||
|
log.debug(`background.setRpcTarget: ${newRpc}`)
|
||||||
background.setCustomRpc(newRpc, (err, result) => {
|
background.setCustomRpc(newRpc, (err, result) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
log.error(err)
|
log.error(err)
|
||||||
return dispatch(self.displayWarning('Had a problem changing networks!'))
|
return dispatch(self.displayWarning('Had a problem changing networks!'))
|
||||||
}
|
}
|
||||||
|
dispatch(actions.setSelectedToken())
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -203,18 +203,18 @@ NetworkDropdown.prototype.render = function () {
|
|||||||
{
|
{
|
||||||
key: 'default',
|
key: 'default',
|
||||||
closeMenu: () => this.props.hideNetworkDropdown(),
|
closeMenu: () => this.props.hideNetworkDropdown(),
|
||||||
onClick: () => props.setRpcTarget('http://localhost:8545'),
|
onClick: () => props.setProviderType('localhost'),
|
||||||
style: dropdownMenuItemStyle,
|
style: dropdownMenuItemStyle,
|
||||||
},
|
},
|
||||||
[
|
[
|
||||||
activeNetwork === 'http://localhost:8545' ? h('i.fa.fa-check') : h('.network-check__transparent', '✓'),
|
providerType === 'localhost' ? h('i.fa.fa-check') : h('.network-check__transparent', '✓'),
|
||||||
h(NetworkDropdownIcon, {
|
h(NetworkDropdownIcon, {
|
||||||
isSelected: activeNetwork === 'http://localhost:8545',
|
isSelected: providerType === 'localhost',
|
||||||
innerBorder: '1px solid #9b9b9b',
|
innerBorder: '1px solid #9b9b9b',
|
||||||
}),
|
}),
|
||||||
h('span.network-name-item', {
|
h('span.network-name-item', {
|
||||||
style: {
|
style: {
|
||||||
color: activeNetwork === 'http://localhost:8545' ? '#ffffff' : '#9b9b9b',
|
color: providerType === 'localhost' ? '#ffffff' : '#9b9b9b',
|
||||||
},
|
},
|
||||||
}, this.context.t('localhost')),
|
}, this.context.t('localhost')),
|
||||||
]
|
]
|
||||||
|
10
ui/index.js
10
ui/index.js
@ -69,6 +69,16 @@ async function startApp (metamaskState, accountManager, opts) {
|
|||||||
store.dispatch(actions.updateMetamaskState(metamaskState))
|
store.dispatch(actions.updateMetamaskState(metamaskState))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// global metamask api - used by tooling
|
||||||
|
global.metamask = {
|
||||||
|
updateCurrentLocale: (code) => {
|
||||||
|
store.dispatch(actions.updateCurrentLocale(code))
|
||||||
|
},
|
||||||
|
setProviderType: (type) => {
|
||||||
|
store.dispatch(actions.setProviderType(type))
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
// start app
|
// start app
|
||||||
render(
|
render(
|
||||||
h(Root, {
|
h(Root, {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user