Merge pull request #904 from MetaMask/BetterIntegrationTest

Made integration test suite better, added a step to story
feature/default_network_editable
kumavis 8 years ago committed by GitHub
commit eb7cf2bf31
  1. 13
      app/scripts/keyring-controller.js
  2. 5
      app/scripts/lib/config-manager.js
  3. 31
      development/test.html
  4. 4
      test/integration/helpers.js
  5. 2
      test/integration/index.html
  6. 4
      test/integration/lib/encryptor-test.js
  7. 75
      test/integration/lib/first-time.js
  8. 31
      ui/app/actions.js
  9. 14
      ui/app/reducers/app.js

@ -167,7 +167,7 @@ module.exports = class KeyringController extends EventEmitter {
this.configManager.setSelectedAccount(hexAccount) this.configManager.setSelectedAccount(hexAccount)
return this.setupAccounts(accounts) return this.setupAccounts(accounts)
}) })
.then(this.persistAllKeyrings.bind(this)) .then(this.persistAllKeyrings.bind(this, password))
.then(this.fullUpdate.bind(this)) .then(this.fullUpdate.bind(this))
} }
@ -226,9 +226,8 @@ module.exports = class KeyringController extends EventEmitter {
}) })
.then((keyrings) => { .then((keyrings) => {
this.keyrings = keyrings this.keyrings = keyrings
return this.setupAccounts() return this.fullUpdate()
}) })
.then(this.fullUpdate.bind(this))
} }
// Add New Keyring // Add New Keyring
@ -250,6 +249,7 @@ module.exports = class KeyringController extends EventEmitter {
this.keyrings.push(keyring) this.keyrings.push(keyring)
return this.setupAccounts(accounts) return this.setupAccounts(accounts)
}) })
.then(() => { return this.password })
.then(this.persistAllKeyrings.bind(this)) .then(this.persistAllKeyrings.bind(this))
.then(() => { .then(() => {
return keyring return keyring
@ -692,6 +692,9 @@ module.exports = class KeyringController extends EventEmitter {
// Takes an account address and an iterator representing // Takes an account address and an iterator representing
// the current number of named accounts. // the current number of named accounts.
getBalanceAndNickname (account) { getBalanceAndNickname (account) {
if (!account) {
throw new Error('Problem loading account.')
}
const address = normalize(account) const address = normalize(account)
this.ethStore.addAccount(address) this.ethStore.addAccount(address)
return this.createNickname(address) return this.createNickname(address)
@ -725,7 +728,9 @@ module.exports = class KeyringController extends EventEmitter {
// encrypts that array with the provided `password`, // encrypts that array with the provided `password`,
// and persists that encrypted string to storage. // and persists that encrypted string to storage.
persistAllKeyrings (password = this.password) { persistAllKeyrings (password = this.password) {
this.password = password if (typeof password === 'string') {
this.password = password
}
return Promise.all(this.keyrings.map((keyring) => { return Promise.all(this.keyrings.map((keyring) => {
return Promise.all([keyring.type, keyring.serialize()]) return Promise.all([keyring.type, keyring.serialize()])
.then((serializedKeyringArray) => { .then((serializedKeyringArray) => {

@ -3,6 +3,7 @@ const MetamaskConfig = require('../config.js')
const migrations = require('./migrations') const migrations = require('./migrations')
const rp = require('request-promise') const rp = require('request-promise')
const ethUtil = require('ethereumjs-util') const ethUtil = require('ethereumjs-util')
const normalize = require('./sig-util').normalize
const TESTNET_RPC = MetamaskConfig.network.testnet const TESTNET_RPC = MetamaskConfig.network.testnet
const MAINNET_RPC = MetamaskConfig.network.mainnet const MAINNET_RPC = MetamaskConfig.network.mainnet
@ -273,13 +274,13 @@ ConfigManager.prototype.getWalletNicknames = function () {
} }
ConfigManager.prototype.nicknameForWallet = function (account) { ConfigManager.prototype.nicknameForWallet = function (account) {
const address = ethUtil.addHexPrefix(account.toLowerCase()) const address = normalize(account)
const nicknames = this.getWalletNicknames() const nicknames = this.getWalletNicknames()
return nicknames[address] return nicknames[address]
} }
ConfigManager.prototype.setNicknameForWallet = function (account, nickname) { ConfigManager.prototype.setNicknameForWallet = function (account, nickname) {
const address = ethUtil.addHexPrefix(account.toLowerCase()) const address = normalize(account)
const nicknames = this.getWalletNicknames() const nicknames = this.getWalletNicknames()
nicknames[address] = nickname nicknames[address] = nickname
var data = this.getData() var data = this.getData()

@ -0,0 +1,31 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>MetaMask</title>
<script>
window.METAMASK_DEBUG = true
window.TEST_MODE = true
</script>
</head>
<body>
<!-- app content -->
<div id="app-content" style="height: 100%"></div>
<script src="./bundle.js" type="text/javascript" charset="utf-8"></script>
</body>
<style>
html, body, #app-content, .super-dev-container {
height: 100%;
width: 100%;
position: relative;
background: white;
}
.mock-app-root {
background: #F7F7F7;
}
</style>
</html>

@ -1,7 +1,7 @@
function wait() { function wait(time) {
return new Promise(function(resolve, reject) { return new Promise(function(resolve, reject) {
setTimeout(function() { setTimeout(function() {
resolve() resolve()
}, 500) }, time || 500)
}) })
} }

@ -15,7 +15,7 @@
<script src="bundle.js"></script> <script src="bundle.js"></script>
<script src="/testem.js"></script> <script src="/testem.js"></script>
<iframe src="/development/index.html" height="500px" width="360px"> <iframe src="/development/test.html" height="500px" width="360px">
<p>Your browser does not support iframes</p> <p>Your browser does not support iframes</p>
</iframe> </iframe>
</body> </body>

@ -1,5 +1,7 @@
var encryptor = require('../../../app/scripts/lib/encryptor') var encryptor = require('../../../app/scripts/lib/encryptor')
QUnit.module('encryptor')
QUnit.test('encryptor:serializeBufferForStorage', function (assert) { QUnit.test('encryptor:serializeBufferForStorage', function (assert) {
assert.expect(1) assert.expect(1)
var buf = new Buffer(2) var buf = new Buffer(2)
@ -65,3 +67,5 @@ QUnit.test('encryptor:encrypt & decrypt with wrong password', function(assert) {
done() done()
}) })
}) })

@ -1,3 +1,7 @@
const PASSWORD = 'password123'
QUnit.module('first time usage')
QUnit.test('agree to terms', function (assert) { QUnit.test('agree to terms', function (assert) {
var done = assert.async() var done = assert.async()
let app let app
@ -6,10 +10,81 @@ QUnit.test('agree to terms', function (assert) {
app = $('iframe').contents().find('#app-content .mock-app-root') app = $('iframe').contents().find('#app-content .mock-app-root')
app.find('.markdown').prop('scrollTop', 100000000) app.find('.markdown').prop('scrollTop', 100000000)
return wait() return wait()
}).then(function() { }).then(function() {
var title = app.find('h1').text() var title = app.find('h1').text()
assert.equal(title, 'MetaMask', 'title screen') assert.equal(title, 'MetaMask', 'title screen')
var pwBox = app.find('#password-box')[0]
var confBox = app.find('#password-box-confirm')[0]
pwBox.value = PASSWORD
confBox.value = PASSWORD
return wait()
}).then(function() {
var createButton = app.find('button.primary')[0]
createButton.click()
return wait(1500)
}).then(function() {
var terms = app.find('h3.terms-header')[0]
assert.equal(terms.textContent, 'MetaMask Terms & Conditions', 'Showing TOS')
// Scroll through terms
var scrollable = app.find('.markdown')[0]
scrollable.scrollTop = scrollable.scrollHeight
return wait(10)
}).then(function() {
var button = app.find('button')[0] // Agree button
button.click()
return wait(1000)
}).then(function() {
var created = app.find('h3')[0]
assert.equal(created.textContent, 'Vault Created', 'Vault created screen')
var button = app.find('button')[0] // Agree button
button.click()
return wait(1000)
}).then(function() {
var detail = app.find('.account-detail-section')[0]
assert.ok(detail, 'Account detail section loaded.')
var sandwich = app.find('.sandwich-expando')[0]
sandwich.click()
return wait()
}).then(function() {
var sandwich = app.find('.menu-droppo')[0]
var lock = sandwich.children[2]
assert.ok(lock, 'Lock menu item found')
lock.click()
return wait(1000)
}).then(function() {
var pwBox = app.find('#password-box')[0]
pwBox.value = PASSWORD
var createButton = app.find('button.primary')[0]
createButton.click()
return wait(1500)
}).then(function() {
var detail = app.find('.account-detail-section')[0]
assert.ok(detail, 'Account detail section loaded again.')
done() done()
}) })
}) })

@ -5,7 +5,11 @@ var actions = {
goHome: goHome, goHome: goHome,
// menu state // menu state
getNetworkStatus: 'getNetworkStatus', getNetworkStatus: 'getNetworkStatus',
// transition state
TRANSITION_FORWARD: 'TRANSITION_FORWARD',
TRANSITION_BACKWARD: 'TRANSITION_BACKWARD',
transitionForward,
transitionBackward,
// remote state // remote state
UPDATE_METAMASK_STATE: 'UPDATE_METAMASK_STATE', UPDATE_METAMASK_STATE: 'UPDATE_METAMASK_STATE',
updateMetamaskState: updateMetamaskState, updateMetamaskState: updateMetamaskState,
@ -166,16 +170,25 @@ function tryUnlockMetamask (password) {
if (err) { if (err) {
dispatch(actions.unlockFailed(err.message)) dispatch(actions.unlockFailed(err.message))
} else { } else {
let selectedAccount dispatch(actions.transitionForward())
try { dispatch(actions.updateMetamaskState(newState))
selectedAccount = newState.metamask.selectedAccount
} catch (e) {}
dispatch(actions.unlockMetamask(selectedAccount))
} }
}) })
} }
} }
function transitionForward() {
return {
type: this.TRANSITION_FORWARD,
}
}
function transitionBackward() {
return {
type: this.TRANSITION_BACKWARD,
}
}
function confirmSeedWords () { function confirmSeedWords () {
return (dispatch) => { return (dispatch) => {
dispatch(actions.showLoadingIndication()) dispatch(actions.showLoadingIndication())
@ -204,10 +217,11 @@ function createNewVaultAndRestore (password, seed) {
function createNewVaultAndKeychain (password) { function createNewVaultAndKeychain (password) {
return (dispatch) => { return (dispatch) => {
background.createNewVaultAndKeychain(password, (err) => { background.createNewVaultAndKeychain(password, (err, newState) => {
if (err) { if (err) {
return dispatch(actions.showWarning(err.message)) return dispatch(actions.showWarning(err.message))
} }
dispatch(actions.updateMetamaskState(newState))
}) })
} }
} }
@ -446,11 +460,12 @@ function updateMetamaskState (newState) {
function lockMetamask () { function lockMetamask () {
return (dispatch) => { return (dispatch) => {
background.setLocked((err) => { background.setLocked((err, newState) => {
dispatch(actions.hideLoadingIndication()) dispatch(actions.hideLoadingIndication())
if (err) { if (err) {
return dispatch(actions.displayWarning(err.message)) return dispatch(actions.displayWarning(err.message))
} }
dispatch(actions.updateMetamaskState(newState))
}) })
} }
} }

@ -43,7 +43,19 @@ function reduceApp (state, action) {
switch (action.type) { switch (action.type) {
// intialize // transition methods
case actions.TRANSITION_FORWARD:
return extend(appState, {
transForward: true,
})
case actions.TRANSITION_BACKWARD:
return extend(appState, {
transForward: false,
})
// intialize
case actions.SHOW_CREATE_VAULT: case actions.SHOW_CREATE_VAULT:
return extend(appState, { return extend(appState, {

Loading…
Cancel
Save