aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/base.conf.js2
-rw-r--r--test/e2e/beta/contract-test/contract.js66
-rw-r--r--test/e2e/beta/contract-test/index.html8
-rw-r--r--test/e2e/beta/from-import-beta-ui.spec.js244
-rw-r--r--test/e2e/beta/helpers.js25
-rw-r--r--test/e2e/beta/metamask-beta-ui.spec.js608
-rwxr-xr-xtest/e2e/beta/run-all.sh4
-rw-r--r--test/e2e/func.js2
-rw-r--r--test/e2e/metamask.spec.js38
-rw-r--r--test/flat.conf.js2
-rw-r--r--test/integration/lib/add-token.js2
-rw-r--r--test/integration/lib/confirm-sig-requests.js11
-rw-r--r--test/integration/lib/currency-localization.js2
-rw-r--r--test/integration/lib/mascara-first-time.js2
-rw-r--r--test/integration/lib/send-new-ui.js16
-rw-r--r--test/integration/lib/tx-list-items.js3
-rw-r--r--test/lib/mock-encryptor.js2
-rw-r--r--test/lib/mock-tx-gen.js6
-rw-r--r--test/lib/react-trigger-change.js112
-rw-r--r--test/lib/util.js6
-rw-r--r--test/mascara.conf.js4
-rw-r--r--test/screens/new-ui.js30
-rw-r--r--test/unit/app/account-import-strategies.spec.js63
-rw-r--r--test/unit/app/controllers/address-book-controller.js2
-rw-r--r--test/unit/app/controllers/metamask-controller-test.js34
-rw-r--r--test/unit/app/controllers/network-contoller-test.js3
-rw-r--r--test/unit/app/controllers/notice-controller-test.js50
-rw-r--r--test/unit/app/controllers/transactions/nonce-tracker-test.js14
-rw-r--r--test/unit/app/controllers/transactions/pending-tx-test.js57
-rw-r--r--test/unit/app/controllers/transactions/recipient-blacklist-checker-test.js77
-rw-r--r--test/unit/app/controllers/transactions/tx-controller-test.js25
-rw-r--r--test/unit/app/controllers/transactions/tx-gas-util-test.js1
-rw-r--r--test/unit/app/controllers/transactions/tx-state-history-helper-test.js41
-rw-r--r--test/unit/app/controllers/transactions/tx-state-manager-test.js53
-rw-r--r--test/unit/app/controllers/transactions/tx-utils-test.js4
-rw-r--r--test/unit/app/edge-encryptor-test.js10
-rw-r--r--test/unit/app/nodeify-test.js8
-rw-r--r--test/unit/app/pending-balance-test.js7
-rw-r--r--test/unit/app/seed-phrase-verifier-test.js93
-rw-r--r--test/unit/app/util-test.js2
-rw-r--r--test/unit/components/balance-component-test.js2
-rw-r--r--test/unit/components/bn-as-decimal-input-test.js4
-rw-r--r--test/unit/components/pending-tx-test.js2
-rw-r--r--test/unit/migrations/022-test.js16
-rw-r--r--test/unit/migrations/023-test.js12
-rw-r--r--test/unit/migrations/024-test.js11
-rw-r--r--test/unit/migrations/025-test.js10
-rw-r--r--test/unit/migrations/template-test.js1
-rw-r--r--test/unit/responsive/components/dropdown-test.js58
-rw-r--r--test/unit/test-utils.js17
50 files changed, 1178 insertions, 694 deletions
diff --git a/test/base.conf.js b/test/base.conf.js
index 956dce011..ccb91cc65 100644
--- a/test/base.conf.js
+++ b/test/base.conf.js
@@ -1,7 +1,7 @@
// Karma configuration
// Generated on Mon Sep 11 2017 18:45:48 GMT-0700 (PDT)
-module.exports = function(config) {
+module.exports = function (config) {
return {
// base path that will be used to resolve all patterns (eg. files, exclude)
basePath: process.cwd(),
diff --git a/test/e2e/beta/contract-test/contract.js b/test/e2e/beta/contract-test/contract.js
new file mode 100644
index 000000000..18c866f21
--- /dev/null
+++ b/test/e2e/beta/contract-test/contract.js
@@ -0,0 +1,66 @@
+/*
+The `piggybankContract` is compiled from:
+
+ pragma solidity ^0.4.0;
+ contract PiggyBank {
+
+ uint private balance;
+ address public owner;
+
+ function PiggyBank() public {
+ owner = msg.sender;
+ balance = 0;
+ }
+
+ function deposit() public payable returns (uint) {
+ balance += msg.value;
+ return balance;
+ }
+
+ function withdraw(uint withdrawAmount) public returns (uint remainingBal) {
+ require(msg.sender == owner);
+ balance -= withdrawAmount;
+
+ msg.sender.transfer(withdrawAmount);
+
+ return balance;
+ }
+ }
+*/
+
+var piggybankContract = web3.eth.contract([{'constant': false, 'inputs': [{'name': 'withdrawAmount', 'type': 'uint256'}], 'name': 'withdraw', 'outputs': [{'name': 'remainingBal', 'type': 'uint256'}], 'payable': false, 'stateMutability': 'nonpayable', 'type': 'function'}, {'constant': true, 'inputs': [], 'name': 'owner', 'outputs': [{'name': '', 'type': 'address'}], 'payable': false, 'stateMutability': 'view', 'type': 'function'}, {'constant': false, 'inputs': [], 'name': 'deposit', 'outputs': [{'name': '', 'type': 'uint256'}], 'payable': true, 'stateMutability': 'payable', 'type': 'function'}, {'inputs': [], 'payable': false, 'stateMutability': 'nonpayable', 'type': 'constructor'}])
+const deployButton = document.getElementById('deployButton')
+const depositButton = document.getElementById('depositButton')
+const withdrawButton = document.getElementById('withdrawButton')
+
+deployButton.addEventListener('click', async function (event) {
+
+ var piggybank = await piggybankContract.new(
+ {
+ from: web3.eth.accounts[0],
+ data: '0x608060405234801561001057600080fd5b5033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000808190555061023b806100686000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632e1a7d4d1461005c5780638da5cb5b1461009d578063d0e30db0146100f4575b600080fd5b34801561006857600080fd5b5061008760048036038101908080359060200190929190505050610112565b6040518082815260200191505060405180910390f35b3480156100a957600080fd5b506100b26101d0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100fc6101f6565b6040518082815260200191505060405180910390f35b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561017057600080fd5b8160008082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156101c5573d6000803e3d6000fd5b506000549050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003460008082825401925050819055506000549050905600a165627a7a72305820f237db3ec816a52589d82512117bc85bc08d3537683ffeff9059108caf3e5d400029',
+ gas: '4700000',
+ }, function (e, contract) {
+ console.log(e, contract)
+ if (typeof contract.address !== 'undefined') {
+ console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash)
+
+ console.log(`contract`, contract)
+
+ depositButton.addEventListener('click', function (event) {
+ contract.deposit({ from: web3.eth.accounts[0], value: '0x29a2241af62c0000' }, function (result) {
+ console.log(result)
+ })
+ })
+
+ withdrawButton.addEventListener('click', function (event) {
+ contract.withdraw('0xde0b6b3a7640000', { from: web3.eth.accounts[0] }, function (result) {
+ console.log(result)
+ })
+ })
+ }
+ })
+
+ console.log(piggybank)
+
+})
diff --git a/test/e2e/beta/contract-test/index.html b/test/e2e/beta/contract-test/index.html
new file mode 100644
index 000000000..0868633f7
--- /dev/null
+++ b/test/e2e/beta/contract-test/index.html
@@ -0,0 +1,8 @@
+<html>
+<body>
+ <button id="deployButton">Deploy Contract</button>
+ <button id="depositButton">Deposit</button>
+ <button id="withdrawButton">Withdraw</button>
+</body>
+<script src="contract.js"></script>
+</html> \ No newline at end of file
diff --git a/test/e2e/beta/from-import-beta-ui.spec.js b/test/e2e/beta/from-import-beta-ui.spec.js
index e07d4a99e..b396dc5b9 100644
--- a/test/e2e/beta/from-import-beta-ui.spec.js
+++ b/test/e2e/beta/from-import-beta-ui.spec.js
@@ -1,7 +1,7 @@
const path = require('path')
const assert = require('assert')
const webdriver = require('selenium-webdriver')
-const { By, Key } = webdriver
+const { By, Key, until } = webdriver
const {
delay,
buildChromeWebDriver,
@@ -12,20 +12,21 @@ const {
} = require('../func')
const {
checkBrowserForConsoleErrors,
- loadExtension,
verboseReportOnFailure,
+ findElement,
+ findElements,
} = require('./helpers')
+
describe('Using MetaMask with an existing account', function () {
let extensionId
let driver
- let tokenAddress
const testSeedPhrase = 'phrase upgrade clock rough situate wedding elder clever doctor stamp excess tent'
const testAddress = '0xE18035BF8712672935FDB4e5e431b1a0183d2DFC'
+ const testPrivateKey2 = '14abe6f4aab7f9f626fe981c864d0adeb5685f289ac9270c27b8fd790b4235d6'
const regularDelayMs = 1000
const largeDelayMs = regularDelayMs * 2
- const waitingNewPageDelayMs = regularDelayMs * 10
this.timeout(0)
this.bail(true)
@@ -79,30 +80,34 @@ describe('Using MetaMask with an existing account', function () {
})
it('use the local network', async function () {
- const [networkSelector] = await driver.findElements(By.css('#network_component'))
+ const networkSelector = await findElement(driver, By.css('#network_component'))
await networkSelector.click()
await delay(regularDelayMs)
- const [localhost] = await driver.findElements(By.xpath(`//li[contains(text(), 'Localhost')]`))
+ const [localhost] = await findElements(driver, By.xpath(`//li[contains(text(), 'Localhost')]`))
await localhost.click()
await delay(regularDelayMs)
})
it('selects the new UI option', async () => {
- const button = await driver.findElement(By.xpath("//p[contains(text(), 'Try Beta Version')]"))
+ const button = await findElement(driver, By.xpath("//p[contains(text(), 'Try Beta Version')]"))
await button.click()
await delay(regularDelayMs)
// Close all other tabs
const [oldUi, infoPage, newUi] = await driver.getAllWindowHandles()
+
+ const newUiOrInfoPage = newUi || infoPage
await driver.switchTo().window(oldUi)
await driver.close()
- await driver.switchTo().window(infoPage)
- await driver.close()
- await driver.switchTo().window(newUi)
+ if (infoPage !== newUiOrInfoPage) {
+ await driver.switchTo().window(infoPage)
+ await driver.close()
+ }
+ await driver.switchTo().window(newUiOrInfoPage)
await delay(regularDelayMs)
- const [continueBtn] = await driver.findElements(By.css('.welcome-screen__button'))
+ const continueBtn = await findElement(driver, By.css('.welcome-screen__button'))
await continueBtn.click()
await delay(regularDelayMs)
})
@@ -110,37 +115,50 @@ describe('Using MetaMask with an existing account', function () {
describe('First time flow starting from an existing seed phrase', () => {
it('imports a seed phrase', async () => {
- const [seedPhrase] = await driver.findElements(By.xpath(`//a[contains(text(), 'Import with seed phrase')]`))
+ const [seedPhrase] = await findElements(driver, By.xpath(`//a[contains(text(), 'Import with seed phrase')]`))
await seedPhrase.click()
await delay(regularDelayMs)
- const [seedTextArea] = await driver.findElements(By.css('textarea.import-account__secret-phrase'))
+ const [seedTextArea] = await findElements(driver, By.css('textarea.import-account__secret-phrase'))
await seedTextArea.sendKeys(testSeedPhrase)
await delay(regularDelayMs)
- const [password] = await driver.findElements(By.id('password'))
+ const [password] = await findElements(driver, By.id('password'))
await password.sendKeys('correct horse battery staple')
- const [confirmPassword] = await driver.findElements(By.id('confirm-password'))
+ const [confirmPassword] = await findElements(driver, By.id('confirm-password'))
confirmPassword.sendKeys('correct horse battery staple')
- const [importButton] = await driver.findElements(By.xpath(`//button[contains(text(), 'Import')]`))
+ const [importButton] = await findElements(driver, By.xpath(`//button[contains(text(), 'Import')]`))
await importButton.click()
await delay(regularDelayMs)
})
+ it('clicks through the ToS', async () => {
+ // terms of use
+ const canClickThrough = await driver.findElement(By.css('.tou 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('.tou button'))
+ await acceptTos.click()
+ await delay(regularDelayMs)
+ })
+
it('clicks through the privacy notice', async () => {
- const [nextScreen] = await driver.findElements(By.css('.tou button'))
+ // privacy notice
+ const nextScreen = await findElement(driver, By.css('.tou button'))
await nextScreen.click()
await delay(regularDelayMs)
+ })
- const canClickThrough = await driver.findElement(By.css('.tou button')).isEnabled()
- assert.equal(canClickThrough, false, 'disabled continue button')
- const element = await driver.findElement(By.linkText('Attributions'))
- await driver.executeScript('arguments[0].scrollIntoView(true)', element)
+ it('clicks through the phishing notice', async () => {
+ // phishing notice
+ const noticeElement = await driver.findElement(By.css('.markdown'))
+ await driver.executeScript('arguments[0].scrollTop = arguments[0].scrollHeight', noticeElement)
await delay(regularDelayMs)
-
- const [acceptTos] = await driver.findElements(By.css('.tou button'))
- await acceptTos.click()
+ const nextScreen = await findElement(driver, By.css('.tou button'))
+ await nextScreen.click()
await delay(regularDelayMs)
})
})
@@ -151,7 +169,7 @@ describe('Using MetaMask with an existing account', function () {
await driver.findElement(By.css('.qr-wrapper')).isDisplayed()
await delay(regularDelayMs)
- const [address] = await driver.findElements(By.css('input.qr-ellip-address'))
+ const [address] = await findElements(driver, By.css('input.qr-ellip-address'))
assert.equal(await address.getAttribute('value'), testAddress)
await driver.executeScript("document.querySelector('.account-modal-close').click()")
@@ -161,19 +179,22 @@ describe('Using MetaMask with an existing account', function () {
it('shows a QR code for the account', async () => {
await driver.findElement(By.css('.wallet-view__details-button')).click()
await driver.findElement(By.css('.qr-wrapper')).isDisplayed()
+ const detailModal = await driver.findElement(By.css('span .modal'))
await delay(regularDelayMs)
await driver.executeScript("document.querySelector('.account-modal-close').click()")
+ await driver.wait(until.stalenessOf(detailModal))
await delay(regularDelayMs)
})
})
describe('Log out and log back in', () => {
it('logs out of the account', async () => {
- await driver.findElement(By.css('.account-menu__icon')).click()
+ const accountIdenticon = driver.findElement(By.css('.account-menu__icon .identicon'))
+ accountIdenticon.click()
await delay(regularDelayMs)
- const [logoutButton] = await driver.findElements(By.css('.account-menu__logout-button'))
+ const [logoutButton] = await findElements(driver, By.css('.account-menu__logout-button'))
assert.equal(await logoutButton.getText(), 'Log out')
await logoutButton.click()
await delay(regularDelayMs)
@@ -191,23 +212,23 @@ describe('Using MetaMask with an existing account', function () {
await driver.findElement(By.css('.account-menu__icon')).click()
await delay(regularDelayMs)
- const [createAccount] = await driver.findElements(By.xpath(`//div[contains(text(), 'Create Account')]`))
+ const [createAccount] = await findElements(driver, By.xpath(`//div[contains(text(), 'Create Account')]`))
await createAccount.click()
await delay(regularDelayMs)
})
it('set account name', async () => {
- const [accountName] = await driver.findElements(By.css('.new-account-create-form input'))
+ const [accountName] = await findElements(driver, By.css('.new-account-create-form input'))
await accountName.sendKeys('2nd account')
await delay(regularDelayMs)
- const [createButton] = await driver.findElements(By.xpath(`//button[contains(text(), 'Create')]`))
+ const [createButton] = await findElements(driver, By.xpath(`//button[contains(text(), 'Create')]`))
await createButton.click()
await delay(regularDelayMs)
})
it('should show the correct account name', async () => {
- const [accountName] = await driver.findElements(By.css('.account-name'))
+ const [accountName] = await findElements(driver, By.css('.account-name'))
assert.equal(await accountName.getText(), '2nd account')
await delay(regularDelayMs)
})
@@ -218,7 +239,7 @@ describe('Using MetaMask with an existing account', function () {
await driver.findElement(By.css('.account-menu__icon')).click()
await delay(regularDelayMs)
- const [originalAccountMenuItem] = await driver.findElements(By.css('.account-menu__name'))
+ const [originalAccountMenuItem] = await findElements(driver, By.css('.account-menu__name'))
await originalAccountMenuItem.click()
await delay(regularDelayMs)
})
@@ -226,181 +247,78 @@ describe('Using MetaMask with an existing account', function () {
describe('Send ETH from inside MetaMask', () => {
it('starts to send a transaction', async function () {
- const [sendButton] = await driver.findElements(By.xpath(`//button[contains(text(), 'Send')]`))
+ const sendButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Send')]`))
await sendButton.click()
await delay(regularDelayMs)
- const [inputAddress] = await driver.findElements(By.css('input[placeholder="Recipient Address"]'))
- const [inputAmount] = await driver.findElements(By.css('.currency-display__input'))
+ const inputAddress = await findElement(driver, By.css('input[placeholder="Recipient Address"]'))
+ const inputAmount = await findElement(driver, By.css('.currency-display__input'))
await inputAddress.sendKeys('0x2f318C334780961FB129D2a6c30D0763d9a5C970')
await inputAmount.sendKeys('1')
// Set the gas limit
- const [configureGas] = await driver.findElements(By.css('.send-v2__gas-fee-display button'))
+ const configureGas = await findElement(driver, By.css('.send-v2__gas-fee-display button'))
await configureGas.click()
await delay(regularDelayMs)
- const [save] = await driver.findElements(By.xpath(`//button[contains(text(), 'Save')]`))
+ const gasModal = await driver.findElement(By.css('span .modal'))
+ const save = await findElement(driver, By.xpath(`//button[contains(text(), 'Save')]`))
await save.click()
+ await driver.wait(until.stalenessOf(gasModal))
await delay(regularDelayMs)
// Continue to next screen
- const [nextScreen] = await driver.findElements(By.xpath(`//button[contains(text(), 'Next')]`))
+ const nextScreen = await findElement(driver, By.xpath(`//button[contains(text(), 'Next')]`))
await nextScreen.click()
await delay(regularDelayMs)
})
it('confirms the transaction', async function () {
- const [confirmButton] = await driver.findElements(By.xpath(`//button[contains(text(), 'Confirm')]`))
+ const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`))
await confirmButton.click()
await delay(regularDelayMs)
})
it('finds the transaction in the transactions list', async function () {
- const transactions = await driver.findElements(By.css('.tx-list-item'))
+ const transactions = await findElements(driver, By.css('.tx-list-item'))
assert.equal(transactions.length, 1)
- const txValues = await driver.findElements(By.css('.tx-list-value'))
+ const txValues = await findElements(driver, By.css('.tx-list-value'))
assert.equal(txValues.length, 1)
assert.equal(await txValues[0].getText(), '1 ETH')
})
})
- describe('Send ETH from Faucet', () => {
- it('starts a send transaction inside Faucet', async () => {
- await driver.executeScript('window.open("https://faucet.metamask.io")')
- await delay(waitingNewPageDelayMs)
-
- const [extension, faucet] = await driver.getAllWindowHandles()
- await driver.switchTo().window(faucet)
- await delay(regularDelayMs)
-
- const [send1eth] = await driver.findElements(By.xpath(`//button[contains(text(), '10 ether')]`))
- await send1eth.click()
- await delay(regularDelayMs)
-
- await driver.switchTo().window(extension)
- await loadExtension(driver, extensionId)
- await delay(regularDelayMs)
-
- const [confirmButton] = await driver.findElements(By.xpath(`//button[contains(text(),'Confirm')]`))
- await confirmButton.click()
- await delay(regularDelayMs)
-
- await driver.switchTo().window(faucet)
- await delay(regularDelayMs)
- await driver.close()
- await delay(regularDelayMs)
- await driver.switchTo().window(extension)
- await delay(regularDelayMs)
- await loadExtension(driver, extensionId)
- await delay(regularDelayMs)
- })
- })
-
- describe('Add existing token using search', () => {
- it('clicks on the Add Token button', async () => {
- const [addToken] = await driver.findElements(By.xpath(`//button[contains(text(), 'Add Token')]`))
- await addToken.click()
- await delay(regularDelayMs)
- })
-
- it('picks an existing token', async () => {
- const [tokenSearch] = await driver.findElements(By.css('input.add-token__input'))
- await tokenSearch.sendKeys('BAT')
- await delay(regularDelayMs)
-
- const [token] = await driver.findElements(By.xpath("//div[contains(text(), 'BAT')]"))
- await token.click()
- await delay(regularDelayMs)
-
- const [nextScreen] = await driver.findElements(By.xpath(`//button[contains(text(), 'Next')]`))
- await nextScreen.click()
+ describe('Imports an account with private key', () => {
+ it('choose Create Account from the account menu', async () => {
+ await driver.findElement(By.css('.account-menu__icon')).click()
await delay(regularDelayMs)
- const [addTokens] = await driver.findElements(By.xpath(`//button[contains(text(), 'Add Tokens')]`))
- await addTokens.click()
- await delay(largeDelayMs)
- })
-
- it('renders the balance for the new token', async () => {
- const balance = await driver.findElement(By.css('.tx-view .balance-display .token-amount'))
- const tokenAmount = await balance.getText()
- assert.equal(tokenAmount, '0BAT')
+ const [importAccount] = await findElements(driver, By.xpath(`//div[contains(text(), 'Import Account')]`))
+ await importAccount.click()
await delay(regularDelayMs)
})
- })
-
- describe('Add a custom token from TokenFactory', () => {
- it('creates a new token', async () => {
- await driver.executeScript('window.open("https://tokenfactory.surge.sh/#/factory")')
- await delay(waitingNewPageDelayMs)
-
- const [extension, tokenFactory] = await driver.getAllWindowHandles()
- await driver.switchTo().window(tokenFactory)
- const [
- totalSupply,
- tokenName,
- tokenDecimal,
- tokenSymbol,
- ] = await driver.findElements(By.css('input'))
-
- await totalSupply.sendKeys('100')
- await tokenName.sendKeys('Test')
- await tokenDecimal.sendKeys('0')
- await tokenSymbol.sendKeys('TST')
-
- const [createToken] = await driver.findElements(By.xpath(`//button[contains(text(), 'Create Token')]`))
- await createToken.click()
- await delay(regularDelayMs)
- await driver.switchTo().window(extension)
- await loadExtension(driver, extensionId)
+ it('enter private key', async () => {
+ const privateKeyInput = await findElement(driver, By.css('#private-key-box'))
+ await privateKeyInput.sendKeys(testPrivateKey2)
await delay(regularDelayMs)
-
- const [confirmButton] = await driver.findElements(By.xpath(`//button[contains(text(),'Confirm')]`))
- await confirmButton.click()
- await delay(regularDelayMs)
-
- await driver.switchTo().window(tokenFactory)
- await delay(regularDelayMs)
- const tokenContactAddress = await driver.findElement(By.css('div > div > div:nth-child(2) > span:nth-child(3)'))
- tokenAddress = await tokenContactAddress.getText()
- await driver.close()
- await driver.switchTo().window(extension)
- await loadExtension(driver, extensionId)
- await delay(regularDelayMs)
- })
-
- it('clicks on the Add Token button', async () => {
- const [addToken] = await driver.findElements(By.xpath(`//button[contains(text(), 'Add Token')]`))
- await addToken.click()
+ const importButtons = await findElements(driver, By.xpath(`//button[contains(text(), 'Import')]`))
+ await importButtons[0].click()
await delay(regularDelayMs)
})
- it('picks the new Test token', async () => {
- const [addCustomToken] = await driver.findElements(By.xpath("//div[contains(text(), 'Custom Token')]"))
- await addCustomToken.click()
- await delay(regularDelayMs)
-
- const [newTokenAddress] = await driver.findElements(By.css('.add-token__add-custom-form input'))
- await newTokenAddress.sendKeys(tokenAddress)
- await delay(regularDelayMs)
-
- const [nextScreen] = await driver.findElements(By.xpath(`//button[contains(text(), 'Next')]`))
- await nextScreen.click()
- await delay(regularDelayMs)
-
- const [addTokens] = await driver.findElements(By.xpath(`//button[contains(text(), 'Add Tokens')]`))
- await addTokens.click()
+ it('should show the correct account name', async () => {
+ const [accountName] = await findElements(driver, By.css('.account-name'))
+ assert.equal(await accountName.getText(), 'Account 3')
await delay(regularDelayMs)
})
- it('renders the balance for the new token', async () => {
- const [balance] = await driver.findElements(By.css('.tx-view .balance-display .token-amount'))
- const tokenAmount = await balance.getText()
- assert.equal(tokenAmount, '100TST')
+ it('should show the imported label', async () => {
+ const [importedLabel] = await findElements(driver, By.css('.wallet-view__keyring-label'))
+ assert.equal(await importedLabel.getText(), 'IMPORTED')
await delay(regularDelayMs)
})
})
+
})
diff --git a/test/e2e/beta/helpers.js b/test/e2e/beta/helpers.js
index 8307fdc50..fcc3e96d6 100644
--- a/test/e2e/beta/helpers.js
+++ b/test/e2e/beta/helpers.js
@@ -1,11 +1,16 @@
const fs = require('fs')
const mkdirp = require('mkdirp')
const pify = require('pify')
+const {until} = require('selenium-webdriver')
+const { delay } = require('../func')
module.exports = {
checkBrowserForConsoleErrors,
loadExtension,
verboseReportOnFailure,
+ findElement,
+ findElements,
+ openNewPage,
}
async function loadExtension (driver, extensionId) {
@@ -53,3 +58,23 @@ async function verboseReportOnFailure (driver, test) {
const htmlSource = await driver.getPageSource()
await pify(fs.writeFile)(`${filepathBase}-dom.html`, htmlSource)
}
+
+async function findElement (driver, by, timeout = 10000) {
+ return driver.wait(until.elementLocated(by), timeout)
+}
+
+async function findElements (driver, by, timeout = 10000) {
+ return driver.wait(until.elementsLocated(by), timeout)
+}
+
+async function openNewPage (driver, url) {
+ await driver.executeScript('window.open()')
+ await delay(1000)
+
+ const handles = await driver.getAllWindowHandles()
+ const secondHandle = handles[1]
+ await driver.switchTo().window(secondHandle)
+
+ await driver.get(url)
+ await delay(1000)
+}
diff --git a/test/e2e/beta/metamask-beta-ui.spec.js b/test/e2e/beta/metamask-beta-ui.spec.js
index 00863e3b3..5f270b52b 100644
--- a/test/e2e/beta/metamask-beta-ui.spec.js
+++ b/test/e2e/beta/metamask-beta-ui.spec.js
@@ -1,7 +1,7 @@
const path = require('path')
const assert = require('assert')
const webdriver = require('selenium-webdriver')
-const { By, Key } = webdriver
+const { By, Key, until } = webdriver
const {
delay,
buildChromeWebDriver,
@@ -11,9 +11,12 @@ const {
getExtensionIdFirefox,
} = require('../func')
const {
+ findElement,
+ findElements,
checkBrowserForConsoleErrors,
loadExtension,
verboseReportOnFailure,
+ openNewPage,
} = require('./helpers')
describe('MetaMask', function () {
@@ -22,10 +25,9 @@ describe('MetaMask', function () {
let tokenAddress
const testSeedPhrase = 'phrase upgrade clock rough situate wedding elder clever doctor stamp excess tent'
- const tinyDelayMs = 500
+ const tinyDelayMs = 1000
const regularDelayMs = tinyDelayMs * 2
const largeDelayMs = regularDelayMs * 2
- const waitingNewPageDelayMs = regularDelayMs * 10
this.timeout(0)
this.bail(true)
@@ -60,7 +62,7 @@ describe('MetaMask', function () {
}
}
if (this.currentTest.state === 'failed') {
- await verboseReportOnFailure(this.currentTest)
+ await verboseReportOnFailure(driver, this.currentTest)
}
})
@@ -69,37 +71,52 @@ describe('MetaMask', function () {
})
describe('New UI setup', async function () {
+ let networkSelector
it('switches to first tab', async function () {
const [firstTab] = await driver.getAllWindowHandles()
await driver.switchTo().window(firstTab)
await delay(regularDelayMs)
+ try {
+ networkSelector = await findElement(driver, By.css('#network_component'))
+ } catch (e) {
+ await loadExtension(driver, extensionId)
+ }
+ await delay(regularDelayMs)
})
it('use the local network', async function () {
- const [networkSelector] = await driver.findElements(By.css('#network_component'))
await networkSelector.click()
await delay(regularDelayMs)
- const [localhost] = await driver.findElements(By.xpath(`//li[contains(text(), 'Localhost')]`))
+ const localhost = await findElement(driver, By.xpath(`//li[contains(text(), 'Localhost')]`))
await localhost.click()
await delay(regularDelayMs)
})
it('selects the new UI option', async () => {
- const button = await driver.findElement(By.xpath("//p[contains(text(), 'Try Beta Version')]"))
+ const button = await findElement(driver, By.xpath("//p[contains(text(), 'Try Beta Version')]"))
await button.click()
await delay(regularDelayMs)
// Close all other tabs
- const [oldUi, infoPage, newUi] = await driver.getAllWindowHandles()
+ const [oldUi, tab1, tab2] = await driver.getAllWindowHandles()
await driver.switchTo().window(oldUi)
await driver.close()
- await driver.switchTo().window(infoPage)
- await driver.close()
- await driver.switchTo().window(newUi)
+
+ await driver.switchTo().window(tab1)
+ const tab1Url = await driver.getCurrentUrl()
+ if (tab1Url.match(/metamask.io/)) {
+ await driver.switchTo().window(tab1)
+ await driver.close()
+ await driver.switchTo().window(tab2)
+ } else if (tab2) {
+ await driver.switchTo().window(tab2)
+ await driver.close()
+ await driver.switchTo().window(tab1)
+ }
await delay(regularDelayMs)
- const [continueBtn] = await driver.findElements(By.css('.welcome-screen__button'))
+ const continueBtn = await findElement(driver, By.css('.welcome-screen__button'))
await continueBtn.click()
await delay(regularDelayMs)
})
@@ -107,9 +124,9 @@ describe('MetaMask', function () {
describe('Going through the first time flow', () => {
it('accepts a secure password', async () => {
- const [passwordBox] = await driver.findElements(By.css('.create-password #create-password'))
- const [passwordBoxConfirm] = await driver.findElements(By.css('.create-password #confirm-password'))
- const [button] = await driver.findElements(By.css('.create-password button'))
+ const passwordBox = await findElement(driver, By.css('.create-password #create-password'))
+ const passwordBoxConfirm = await findElement(driver, By.css('.create-password #confirm-password'))
+ const button = await findElement(driver, By.css('.create-password button'))
await passwordBox.sendKeys('correct horse battery staple')
await passwordBoxConfirm.sendKeys('correct horse battery staple')
@@ -118,102 +135,141 @@ describe('MetaMask', function () {
})
it('clicks through the unique image screen', async () => {
- const [nextScreen] = await driver.findElements(By.css('.unique-image button'))
+ const nextScreen = await findElement(driver, By.css('.unique-image button'))
await nextScreen.click()
await delay(regularDelayMs)
})
- it('clicks through the privacy notice', async () => {
- const [nextScreen] = await driver.findElements(By.css('.tou button'))
- await nextScreen.click()
- await delay(regularDelayMs)
-
+ it('clicks through the ToS', async () => {
+ // terms of use
const canClickThrough = await driver.findElement(By.css('.tou button')).isEnabled()
assert.equal(canClickThrough, false, 'disabled continue button')
- const [bottomOfTos] = await driver.findElements(By.linkText('Attributions'))
+ const bottomOfTos = await findElement(driver, By.linkText('Attributions'))
await driver.executeScript('arguments[0].scrollIntoView(true)', bottomOfTos)
await delay(regularDelayMs)
-
- const [acceptTos] = await driver.findElements(By.css('.tou button'))
+ const acceptTos = await findElement(driver, By.css('.tou 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('.tou button'))
+ await nextScreen.click()
+ await delay(regularDelayMs)
+ })
+
+ it('clicks through the phishing notice', async () => {
+ // phishing notice
+ const noticeElement = await driver.findElement(By.css('.markdown'))
+ await driver.executeScript('arguments[0].scrollTop = arguments[0].scrollHeight', noticeElement)
+ await delay(regularDelayMs)
+ const nextScreen = await findElement(driver, By.css('.tou button'))
+ await nextScreen.click()
+ await delay(regularDelayMs)
+ })
+
let seedPhrase
it('reveals the seed phrase', async () => {
- const [revealSeedPhrase] = await driver.findElements(By.css('.backup-phrase__secret-blocker'))
- await revealSeedPhrase.click()
+ const byRevealButton = By.css('.backup-phrase__secret-blocker .backup-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('.backup-phrase__secret-words')).getText()
assert.equal(seedPhrase.split(' ').length, 12)
await delay(regularDelayMs)
- const [nextScreen] = await driver.findElements(By.css('.backup-phrase button'))
+ const nextScreen = await findElement(driver, By.css('.backup-phrase button'))
await nextScreen.click()
await delay(regularDelayMs)
})
- it('can retype the seed phrase', async () => {
- const words = seedPhrase.split(' ')
+ async function retypeSeedPhrase (words) {
+ try {
+ const word0 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[0]}')]`), 10000)
- const [word0] = await driver.findElements(By.xpath(`//button[contains(text(), '${words[0]}')]`))
- await word0.click()
- await delay(tinyDelayMs)
+ await word0.click()
+ await delay(tinyDelayMs)
- const [word1] = await driver.findElements(By.xpath(`//button[contains(text(), '${words[1]}')]`))
- await word1.click()
- await delay(tinyDelayMs)
+ const word1 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[1]}')]`), 10000)
- const [word2] = await driver.findElements(By.xpath(`//button[contains(text(), '${words[2]}')]`))
- await word2.click()
- await delay(tinyDelayMs)
+ await word1.click()
+ await delay(tinyDelayMs)
- const [word3] = await driver.findElements(By.xpath(`//button[contains(text(), '${words[3]}')]`))
- await word3.click()
- await delay(tinyDelayMs)
+ const word2 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[2]}')]`), 10000)
- const [word4] = await driver.findElements(By.xpath(`//button[contains(text(), '${words[4]}')]`))
- await word4.click()
- await delay(tinyDelayMs)
+ await word2.click()
+ await delay(tinyDelayMs)
- const [word5] = await driver.findElements(By.xpath(`//button[contains(text(), '${words[5]}')]`))
- await word5.click()
- await delay(tinyDelayMs)
+ const word3 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[3]}')]`), 10000)
- const [word6] = await driver.findElements(By.xpath(`//button[contains(text(), '${words[6]}')]`))
- await word6.click()
- await delay(tinyDelayMs)
+ await word3.click()
+ await delay(tinyDelayMs)
- const [word7] = await driver.findElements(By.xpath(`//button[contains(text(), '${words[7]}')]`))
- await word7.click()
- await delay(tinyDelayMs)
+ const word4 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[4]}')]`), 10000)
- const [word8] = await driver.findElements(By.xpath(`//button[contains(text(), '${words[8]}')]`))
- await word8.click()
- await delay(tinyDelayMs)
+ await word4.click()
+ await delay(tinyDelayMs)
- const [word9] = await driver.findElements(By.xpath(`//button[contains(text(), '${words[9]}')]`))
- await word9.click()
- await delay(tinyDelayMs)
+ const word5 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[5]}')]`), 10000)
- const [word10] = await driver.findElements(By.xpath(`//button[contains(text(), '${words[10]}')]`))
- await word10.click()
- await delay(tinyDelayMs)
+ await word5.click()
+ await delay(tinyDelayMs)
- const [word11] = await driver.findElements(By.xpath(`//button[contains(text(), '${words[11]}')]`))
- await word11.click()
- await delay(tinyDelayMs)
+ const word6 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[6]}')]`), 10000)
+
+ await word6.click()
+ await delay(tinyDelayMs)
+
+ const word7 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[7]}')]`), 10000)
+
+ await word7.click()
+ await delay(tinyDelayMs)
+
+ const word8 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[8]}')]`), 10000)
- const [confirm] = await driver.findElements(By.xpath(`//button[contains(text(), 'Confirm')]`))
+ await word8.click()
+ await delay(tinyDelayMs)
+
+ const word9 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[9]}')]`), 10000)
+
+ await word9.click()
+ await delay(tinyDelayMs)
+
+ const word10 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[10]}')]`), 10000)
+
+ await word10.click()
+ await delay(tinyDelayMs)
+
+ const word11 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[11]}')]`), 10000)
+ await word11.click()
+ await delay(tinyDelayMs)
+ } catch (e) {
+ await loadExtension(driver, extensionId)
+ await retypeSeedPhrase(words)
+ }
+ }
+
+ 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 [closeModal] = await driver.findElements(By.css('.page-container__header-close'))
+ 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)
})
})
@@ -224,8 +280,12 @@ describe('MetaMask', function () {
await driver.findElement(By.css('.qr-wrapper')).isDisplayed()
await delay(regularDelayMs)
+ const accountModal = await driver.findElement(By.css('span .modal'))
+
await driver.executeScript("document.querySelector('.account-modal-close').click()")
- await delay(regularDelayMs * 4)
+
+ await driver.wait(until.stalenessOf(accountModal))
+ await delay(regularDelayMs)
})
})
@@ -234,7 +294,7 @@ describe('MetaMask', function () {
await driver.findElement(By.css('.account-menu__icon')).click()
await delay(regularDelayMs)
- const [logoutButton] = await driver.findElements(By.css('.account-menu__logout-button'))
+ const logoutButton = await findElement(driver, By.css('.account-menu__logout-button'))
assert.equal(await logoutButton.getText(), 'Log out')
await logoutButton.click()
await delay(regularDelayMs)
@@ -252,23 +312,23 @@ describe('MetaMask', function () {
await driver.findElement(By.css('.account-menu__icon')).click()
await delay(regularDelayMs)
- const [createAccount] = await driver.findElements(By.xpath(`//div[contains(text(), 'Create Account')]`))
+ const createAccount = await findElement(driver, By.xpath(`//div[contains(text(), 'Create Account')]`))
await createAccount.click()
await delay(regularDelayMs)
})
it('set account name', async () => {
- const [accountName] = await driver.findElements(By.css('.new-account-create-form input'))
+ const accountName = await findElement(driver, By.css('.new-account-create-form input'))
await accountName.sendKeys('2nd account')
await delay(regularDelayMs)
- const [create] = await driver.findElements(By.xpath(`//button[contains(text(), 'Create')]`))
+ const create = await findElement(driver, By.xpath(`//button[contains(text(), 'Create')]`))
await create.click()
await delay(regularDelayMs)
})
it('should correct account name', async () => {
- const [accountName] = await driver.findElements(By.css('.account-name'))
+ const accountName = await findElement(driver, By.css('.account-name'))
assert.equal(await accountName.getText(), '2nd account')
await delay(regularDelayMs)
})
@@ -279,19 +339,19 @@ describe('MetaMask', function () {
await driver.findElement(By.css('.account-menu__icon')).click()
await delay(regularDelayMs)
- const [logoutButton] = await driver.findElements(By.css('.account-menu__logout-button'))
+ const logoutButton = await findElement(driver, By.css('.account-menu__logout-button'))
assert.equal(await logoutButton.getText(), 'Log out')
await logoutButton.click()
await delay(regularDelayMs)
})
it('imports seed phrase', async () => {
- const [restoreSeedLink] = await driver.findElements(By.css('.unlock-page__link--import'))
+ const restoreSeedLink = await findElement(driver, By.css('.unlock-page__link--import'))
assert.equal(await restoreSeedLink.getText(), 'Import using account seed phrase')
await restoreSeedLink.click()
await delay(regularDelayMs)
- const [seedTextArea] = await driver.findElements(By.css('textarea'))
+ const seedTextArea = await findElement(driver, By.css('textarea'))
await seedTextArea.sendKeys(testSeedPhrase)
await delay(regularDelayMs)
@@ -302,7 +362,7 @@ describe('MetaMask', function () {
})
it('balance renders', async () => {
- const balance = await driver.findElement(By.css('.balance-display .token-amount'))
+ const balance = await findElement(driver, By.css('.balance-display .token-amount'))
const tokenAmount = await balance.getText()
assert.equal(tokenAmount, '100.000 ETH')
await delay(regularDelayMs)
@@ -311,56 +371,60 @@ describe('MetaMask', function () {
describe('Send ETH from inside MetaMask', () => {
it('starts to send a transaction', async function () {
- const [sendButton] = await driver.findElements(By.xpath(`//button[contains(text(), 'Send')]`))
+ const sendButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Send')]`))
await sendButton.click()
await delay(regularDelayMs)
- const [inputAddress] = await driver.findElements(By.css('input[placeholder="Recipient Address"]'))
- const [inputAmount] = await driver.findElements(By.css('.currency-display__input'))
+ const inputAddress = await findElement(driver, By.css('input[placeholder="Recipient Address"]'))
+ const inputAmount = await findElement(driver, By.css('.currency-display__input'))
await inputAddress.sendKeys('0x2f318C334780961FB129D2a6c30D0763d9a5C970')
await inputAmount.sendKeys('1')
// Set the gas limit
- const [configureGas] = await driver.findElements(By.css('.send-v2__gas-fee-display button'))
+ const configureGas = await findElement(driver, By.css('.send-v2__gas-fee-display button'))
await configureGas.click()
await delay(regularDelayMs)
- const [save] = await driver.findElements(By.xpath(`//button[contains(text(), 'Save')]`))
+ const gasModal = await driver.findElement(By.css('span .modal'))
+
+ const save = await findElement(driver, By.xpath(`//button[contains(text(), 'Save')]`))
await save.click()
+ await driver.wait(until.stalenessOf(gasModal))
await delay(regularDelayMs)
// Continue to next screen
- const [nextScreen] = await driver.findElements(By.xpath(`//button[contains(text(), 'Next')]`))
+ const nextScreen = await findElement(driver, By.xpath(`//button[contains(text(), 'Next')]`))
await nextScreen.click()
await delay(regularDelayMs)
})
it('confirms the transaction', async function () {
- const [confirmButton] = await driver.findElements(By.xpath(`//button[contains(text(), 'Confirm')]`))
+ const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`))
await confirmButton.click()
await delay(regularDelayMs)
})
it('finds the transaction in the transactions list', async function () {
- const transactions = await driver.findElements(By.css('.tx-list-item'))
+ const transactions = await findElements(driver, By.css('.tx-list-item'))
assert.equal(transactions.length, 1)
- const txValues = await driver.findElements(By.css('.tx-list-value'))
- assert.equal(txValues.length, 1)
- assert.equal(await txValues[0].getText(), '1 ETH')
+ const txValues = await findElement(driver, By.css('.tx-list-value'))
+ await driver.wait(until.elementTextMatches(txValues, /1\sETH/), 10000)
})
})
describe('Send ETH from Faucet', () => {
it('starts a send transaction inside Faucet', async () => {
- await driver.executeScript('window.open("https://faucet.metamask.io")')
- await delay(waitingNewPageDelayMs)
+ await openNewPage(driver, 'https://faucet.metamask.io')
const [extension, faucet] = await driver.getAllWindowHandles()
await driver.switchTo().window(faucet)
+
+ const faucetPageTitle = await findElement(driver, By.css('.container-fluid'))
+ await driver.wait(until.elementTextMatches(faucetPageTitle, /MetaMask/))
await delay(regularDelayMs)
- const [send1eth] = await driver.findElements(By.xpath(`//button[contains(text(), '10 ether')]`))
+ const send1eth = await findElement(driver, By.xpath(`//button[contains(text(), '10 ether')]`), 14000)
await send1eth.click()
await delay(regularDelayMs)
@@ -368,7 +432,7 @@ describe('MetaMask', function () {
await loadExtension(driver, extensionId)
await delay(regularDelayMs)
- const [confirmButton] = await driver.findElements(By.xpath(`//button[contains(text(), 'Confirm')]`))
+ const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`), 14000)
await confirmButton.click()
await delay(regularDelayMs)
@@ -383,59 +447,146 @@ describe('MetaMask', function () {
})
})
- describe('Add existing token using search', () => {
- it('clicks on the Add Token button', async () => {
- const [addToken] = await driver.findElements(By.xpath(`//button[contains(text(), 'Add Token')]`))
- await addToken.click()
+ describe('Deploy contract and call contract methods', () => {
+ let extension
+ let contractTestPage
+ it('confirms a deploy contract transaction', async () => {
+ await openNewPage(driver, 'http://127.0.0.1:8080/');
+
+ [extension, contractTestPage] = await driver.getAllWindowHandles()
+ await delay(regularDelayMs)
+
+ const deployContractButton = await findElement(driver, By.css('#deployButton'))
+ await deployContractButton.click()
await delay(regularDelayMs)
+
+ await driver.switchTo().window(extension)
+ await delay(regularDelayMs)
+
+ const txListItem = await findElement(driver, By.css('.tx-list-item'))
+ await txListItem.click()
+ await delay(regularDelayMs)
+
+ const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`))
+ await confirmButton.click()
+ await delay(regularDelayMs)
+
+ const txStatuses = await findElements(driver, By.css('.tx-list-status'))
+ await driver.wait(until.elementTextMatches(txStatuses[0], /Confirmed/))
+
+ const txAccounts = await findElements(driver, By.css('.tx-list-account'))
+ assert.equal(await txAccounts[0].getText(), 'Contract Deployment')
})
- it('can pick a token from the existing options', async () => {
- const [tokenSearch] = await driver.findElements(By.css('input.add-token__input'))
- await tokenSearch.sendKeys('BAT')
+ it('calls and confirms a contract method where ETH is sent', async () => {
+ await driver.switchTo().window(contractTestPage)
await delay(regularDelayMs)
- const [token] = await driver.findElements(By.xpath("//div[contains(text(), 'BAT')]"))
- await token.click()
+ const depositButton = await findElement(driver, By.css('#depositButton'))
+ await depositButton.click()
await delay(regularDelayMs)
- const [nextScreen] = await driver.findElements(By.xpath(`//button[contains(text(), 'Next')]`))
- await nextScreen.click()
+ await driver.switchTo().window(extension)
await delay(regularDelayMs)
- const [addTokens] = await driver.findElements(By.xpath(`//button[contains(text(), 'Add Tokens')]`))
- await addTokens.click()
- await delay(largeDelayMs)
+ const txListItem = await findElement(driver, By.css('.tx-list-item'))
+ await txListItem.click()
+ await delay(regularDelayMs)
+
+ // Set the gas limit
+ const configureGas = await findElement(driver, By.css('.sliders-icon-container'))
+ await configureGas.click()
+ await delay(regularDelayMs)
+
+ const gasModal = await driver.findElement(By.css('span .modal'))
+ await driver.wait(until.elementLocated(By.css('.send-v2__customize-gas__title')))
+
+ const [gasPriceInput, gasLimitInput] = await findElements(driver, By.css('.customize-gas-input'))
+ await gasPriceInput.clear()
+ await gasPriceInput.sendKeys('10')
+ await gasLimitInput.clear()
+ await gasLimitInput.sendKeys('60001')
+
+ const save = await findElement(driver, By.xpath(`//button[contains(text(), 'Save')]`))
+ await save.click()
+ await delay(regularDelayMs)
+
+ await driver.wait(until.stalenessOf(gasModal))
+
+ const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`))
+ await confirmButton.click()
+ await delay(regularDelayMs)
+
+ const txStatuses = await findElements(driver, By.css('.tx-list-status'))
+ await driver.wait(until.elementTextMatches(txStatuses[0], /Confirmed/))
+
+ const txValues = await findElement(driver, By.css('.tx-list-value'))
+ await driver.wait(until.elementTextMatches(txValues, /3\sETH/), 10000)
+
+ const txAccounts = await findElements(driver, By.css('.tx-list-account'))
+ const firstTxAddress = await txAccounts[0].getText()
+ assert(firstTxAddress.match(/^0x\w{8}\.{3}\w{4}$/))
})
- it('renders the balance for the chosen token', async () => {
- const balance = await driver.findElement(By.css('.tx-view .balance-display .token-amount'))
+ it('calls and confirms a contract method where ETH is received', async () => {
+ await driver.switchTo().window(contractTestPage)
+ await delay(regularDelayMs)
+
+ const withdrawButton = await findElement(driver, By.css('#withdrawButton'))
+ await withdrawButton.click()
+ await delay(regularDelayMs)
+
+ await driver.switchTo().window(extension)
+ await delay(regularDelayMs)
+
+ const txListItem = await findElement(driver, By.css('.tx-list-item'))
+ await txListItem.click()
+ await delay(regularDelayMs)
+
+ const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`))
+ await confirmButton.click()
+ await delay(regularDelayMs)
+
+ const txStatuses = await findElements(driver, By.css('.tx-list-status'))
+ await driver.wait(until.elementTextMatches(txStatuses[0], /Confirmed/))
+
+ const txValues = await findElement(driver, By.css('.tx-list-value'))
+ await driver.wait(until.elementTextMatches(txValues, /0\sETH/), 10000)
+
+ await driver.switchTo().window(contractTestPage)
+ await driver.close()
+ await driver.switchTo().window(extension)
+ })
+
+ it('renders the correct ETH balance', async () => {
+ const balance = await findElement(driver, By.css('.tx-view .balance-display .token-amount'))
+ await driver.wait(until.elementTextMatches(balance, /^86.*ETH.*$/), 10000)
const tokenAmount = await balance.getText()
- assert.equal(tokenAmount, '0BAT')
+ assert.ok(/^86.*ETH.*$/.test(tokenAmount))
await delay(regularDelayMs)
})
})
describe('Add a custom token from TokenFactory', () => {
it('creates a new token', async () => {
- await driver.executeScript('window.open("https://tokenfactory.surge.sh/#/factory")')
- await delay(waitingNewPageDelayMs)
+ openNewPage(driver, 'https://tokenfactory.surge.sh/#/factory')
+ await delay(regularDelayMs * 10)
const [extension, tokenFactory] = await driver.getAllWindowHandles()
- await driver.switchTo().window(tokenFactory)
+
const [
totalSupply,
tokenName,
tokenDecimal,
tokenSymbol,
- ] = await driver.findElements(By.css('input'))
+ ] = await findElements(driver, By.css('.form-control'))
await totalSupply.sendKeys('100')
await tokenName.sendKeys('Test')
await tokenDecimal.sendKeys('0')
await tokenSymbol.sendKeys('TST')
- const [createToken] = await driver.findElements(By.xpath(`//button[contains(text(), 'Create Token')]`))
+ const createToken = await findElement(driver, By.xpath(`//button[contains(text(), 'Create Token')]`))
await createToken.click()
await delay(regularDelayMs)
@@ -443,48 +594,261 @@ describe('MetaMask', function () {
await loadExtension(driver, extensionId)
await delay(regularDelayMs)
- const [confirmButton] = await driver.findElements(By.xpath(`//button[contains(text(), 'Confirm')]`))
+ const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`))
await confirmButton.click()
await delay(regularDelayMs)
await driver.switchTo().window(tokenFactory)
await delay(regularDelayMs)
+
const tokenContactAddress = await driver.findElement(By.css('div > div > div:nth-child(2) > span:nth-child(3)'))
tokenAddress = await tokenContactAddress.getText()
+
await driver.close()
await driver.switchTo().window(extension)
await loadExtension(driver, extensionId)
+ await driver.switchTo().window(extension)
await delay(regularDelayMs)
+
})
it('clicks on the Add Token button', async () => {
- const [addToken] = await driver.findElements(By.xpath(`//button[contains(text(), 'Add Token')]`))
+ const addToken = await findElement(driver, By.xpath(`//button[contains(text(), 'Add Token')]`))
await addToken.click()
await delay(regularDelayMs)
})
it('picks the newly created Test token', async () => {
- const [addCustomToken] = await driver.findElements(By.xpath("//div[contains(text(), 'Custom Token')]"))
+ const addCustomToken = await findElement(driver, By.xpath("//div[contains(text(), 'Custom Token')]"))
await addCustomToken.click()
await delay(regularDelayMs)
- const [newTokenAddress] = await driver.findElements(By.css('.add-token__add-custom-form input'))
+ const newTokenAddress = await findElement(driver, By.css('#custom-address'))
await newTokenAddress.sendKeys(tokenAddress)
await delay(regularDelayMs)
- const [nextScreen] = await driver.findElements(By.xpath(`//button[contains(text(), 'Next')]`))
+ const nextScreen = await findElement(driver, By.xpath(`//button[contains(text(), 'Next')]`))
await nextScreen.click()
await delay(regularDelayMs)
- const [addTokens] = await driver.findElements(By.xpath(`//button[contains(text(), 'Add Tokens')]`))
+ const addTokens = await findElement(driver, By.xpath(`//button[contains(text(), 'Add Tokens')]`))
await addTokens.click()
await delay(regularDelayMs)
})
it('renders the balance for the new token', async () => {
- const [balance] = await driver.findElements(By.css('.tx-view .balance-display .token-amount'))
+ const balance = await findElement(driver, By.css('.tx-view .balance-display .token-amount'))
+ await driver.wait(until.elementTextMatches(balance, /^100\s*TST\s*$/))
const tokenAmount = await balance.getText()
- assert.equal(tokenAmount, '100TST')
+ assert.ok(/^100\s*TST\s*$/.test(tokenAmount))
+ await delay(regularDelayMs)
+ })
+ })
+
+ describe('Send token from inside MetaMask', () => {
+ let gasModal
+ it('starts to send a transaction', async function () {
+ const sendButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Send')]`))
+ await sendButton.click()
+ await delay(regularDelayMs)
+
+ const inputAddress = await findElement(driver, By.css('input[placeholder="Recipient Address"]'))
+ const inputAmount = await findElement(driver, By.css('.currency-display__input'))
+ await inputAddress.sendKeys('0x2f318C334780961FB129D2a6c30D0763d9a5C970')
+ await inputAmount.sendKeys('50')
+
+ // Set the gas limit
+ const configureGas = await findElement(driver, By.css('.send-v2__gas-fee-display button'))
+ await configureGas.click()
+ await delay(regularDelayMs)
+
+ gasModal = await driver.findElement(By.css('span .modal'))
+ })
+
+ it('customizes gas', async () => {
+ await driver.wait(until.elementLocated(By.css('.send-v2__customize-gas__title')))
+ const save = await findElement(driver, By.xpath(`//button[contains(text(), 'Save')]`))
+ await save.click()
+ await delay(regularDelayMs)
+ })
+
+ it('transitions to the confirm screen', async () => {
+ await driver.wait(until.stalenessOf(gasModal))
+
+ // Continue to next screen
+ const nextScreen = await findElement(driver, By.xpath(`//button[contains(text(), 'Next')]`))
+ await nextScreen.click()
+ await delay(regularDelayMs)
+ })
+
+ it('submits the transaction', async function () {
+ const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`))
+ await confirmButton.click()
+ await delay(regularDelayMs)
+ })
+
+ it('finds the transaction in the transactions list', async function () {
+ const transactions = await findElements(driver, By.css('.tx-list-item'))
+ assert.equal(transactions.length, 1)
+
+ const txValues = await findElements(driver, By.css('.tx-list-value'))
+ assert.equal(txValues.length, 1)
+
+ // test cancelled on firefox until https://github.com/mozilla/geckodriver/issues/906 is resolved,
+ // or possibly until we use latest version of firefox in the tests
+ if (process.env.SELENIUM_BROWSER !== 'firefox') {
+ await driver.wait(until.elementTextMatches(txValues[0], /50\sTST/), 10000)
+ }
+
+ const txStatuses = await findElements(driver, By.css('.tx-list-status'))
+ const tx = await driver.wait(until.elementTextMatches(txStatuses[0], /Confirmed|Failed/), 10000)
+ assert.equal(await tx.getText(), 'Confirmed')
+ })
+ })
+
+ describe('Send a custom token from TokenFactory', () => {
+ let gasModal
+ it('sends an already created token', async () => {
+ openNewPage(driver, `https://tokenfactory.surge.sh/#/token/${tokenAddress}`)
+
+ const [extension] = await driver.getAllWindowHandles()
+
+ const [
+ transferToAddress,
+ transferToAmount,
+ ] = await findElements(driver, By.css('.form-control'))
+
+ await transferToAddress.sendKeys('0x2f318C334780961FB129D2a6c30D0763d9a5C970')
+ await transferToAmount.sendKeys('26')
+
+ const transferAmountButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Transfer Amount')]`))
+ await transferAmountButton.click()
+ await delay(regularDelayMs)
+
+ const [,, popup] = await driver.getAllWindowHandles()
+ await driver.switchTo().window(popup)
+ await driver.close()
+ await driver.switchTo().window(extension)
+ await delay(regularDelayMs)
+
+ const [txListItem] = await findElements(driver, By.css('.tx-list-item'))
+ await txListItem.click()
+ await delay(regularDelayMs)
+
+ // Set the gas limit
+ const configureGas = await driver.wait(until.elementLocated(By.css('.send-v2__gas-fee-display button')))
+ await configureGas.click()
+ await delay(regularDelayMs)
+
+ gasModal = await driver.findElement(By.css('span .modal'))
+ })
+
+ it('customizes gas', async () => {
+ await driver.wait(until.elementLocated(By.css('.send-v2__customize-gas__title')))
+
+ const [gasPriceInput, gasLimitInput] = await findElements(driver, By.css('.customize-gas-input'))
+ await gasPriceInput.clear()
+ await delay(tinyDelayMs)
+ await gasPriceInput.sendKeys('10')
+ await delay(tinyDelayMs)
+ await gasLimitInput.clear()
+ await delay(tinyDelayMs)
+ await gasLimitInput.sendKeys(Key.chord(Key.CONTROL, 'a'))
+ await gasLimitInput.sendKeys('60000')
+ await gasLimitInput.sendKeys(Key.chord(Key.CONTROL, 'e'))
+
+ // Needed for different behaviour of input in different versions of firefox
+ const gasLimitInputValue = await gasLimitInput.getAttribute('value')
+ if (gasLimitInputValue === '600001') {
+ await gasLimitInput.sendKeys(Key.BACK_SPACE)
+ }
+
+ const save = await findElement(driver, By.css('.send-v2__customize-gas__save'))
+ await save.click()
+ await driver.wait(until.stalenessOf(gasModal))
+
+ const gasFeeInput = await findElement(driver, By.css('.currency-display__input'))
+ assert.equal(await gasFeeInput.getAttribute('value'), 0.0006)
+ })
+
+ it('submits the transaction', async function () {
+ const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`))
+ await confirmButton.click()
+ await delay(regularDelayMs)
+ })
+
+ it('finds the transaction in the transactions list', async function () {
+ const transactions = await findElements(driver, By.css('.tx-list-item'))
+ assert.equal(transactions.length, 2)
+
+ const txValues = await findElements(driver, By.css('.tx-list-value'))
+ await driver.wait(until.elementTextMatches(txValues[0], /26\sTST/))
+ const txStatuses = await findElements(driver, By.css('.tx-list-status'))
+ await driver.wait(until.elementTextMatches(txStatuses[0], /Confirmed/))
+
+ const walletBalance = await findElement(driver, By.css('.wallet-balance'))
+ await walletBalance.click()
+
+ const tokenListItems = await findElements(driver, By.css('.token-list-item'))
+ await tokenListItems[0].click()
+
+ // test cancelled on firefox until https://github.com/mozilla/geckodriver/issues/906 is resolved,
+ // or possibly until we use latest version of firefox in the tests
+ if (process.env.SELENIUM_BROWSER !== 'firefox') {
+ const tokenBalanceAmount = await findElement(driver, By.css('.token-balance__amount'))
+ assert.equal(await tokenBalanceAmount.getText(), '24')
+ }
+ })
+ })
+
+ describe('Hide token', () => {
+ it('hides the token when clicked', async () => {
+ const [hideTokenEllipsis] = await findElements(driver, By.css('.token-list-item__ellipsis'))
+ await hideTokenEllipsis.click()
+
+ const byTokenMenuDropdownOption = By.css('.menu__item--clickable')
+ const tokenMenuDropdownOption = await driver.wait(until.elementLocated(byTokenMenuDropdownOption))
+
+ await tokenMenuDropdownOption.click()
+
+ const confirmHideModal = await findElement(driver, By.css('span .modal'))
+
+ const byHideTokenConfirmationButton = By.css('.hide-token-confirmation__button')
+ const hideTokenConfirmationButton = await driver.wait(until.elementLocated(byHideTokenConfirmationButton))
+ await hideTokenConfirmationButton.click()
+
+ await driver.wait(until.stalenessOf(confirmHideModal))
+ })
+ })
+
+ describe('Add existing token using search', () => {
+ it('clicks on the Add Token button', async () => {
+ const addToken = await findElement(driver, By.xpath(`//button[contains(text(), 'Add Token')]`))
+ await addToken.click()
+ await delay(regularDelayMs)
+ })
+
+ it('can pick a token from the existing options', async () => {
+ const tokenSearch = await findElement(driver, By.css('#search-tokens'))
+ await tokenSearch.sendKeys('BAT')
+ await delay(regularDelayMs)
+
+ const token = await findElement(driver, By.xpath("//span[contains(text(), 'BAT')]"))
+ await token.click()
+ await delay(regularDelayMs)
+
+ const nextScreen = await findElement(driver, By.xpath(`//button[contains(text(), 'Next')]`))
+ await nextScreen.click()
+ await delay(regularDelayMs)
+
+ const addTokens = await findElement(driver, By.xpath(`//button[contains(text(), 'Add Tokens')]`))
+ await addTokens.click()
+ await delay(largeDelayMs)
+ })
+
+ it('renders the balance for the chosen token', async () => {
+ const balance = await findElement(driver, By.css('.tx-view .balance-display .token-amount'))
+ await driver.wait(until.elementTextMatches(balance, /0\sBAT/))
await delay(regularDelayMs)
})
})
diff --git a/test/e2e/beta/run-all.sh b/test/e2e/beta/run-all.sh
index 5916d5614..493e1360a 100755
--- a/test/e2e/beta/run-all.sh
+++ b/test/e2e/beta/run-all.sh
@@ -6,5 +6,5 @@ set -o pipefail
export PATH="$PATH:./node_modules/.bin"
-shell-parallel -s 'npm run ganache:start' -x 'sleep 5 && mocha test/e2e/beta/metamask-beta-ui.spec'
-shell-parallel -s 'npm run ganache:start' -x 'sleep 5 && mocha test/e2e/beta/from-import-beta-ui.spec'
+shell-parallel -s 'npm run ganache:start' -x 'sleep 5 && superstatic test/e2e/beta/contract-test/ --port 8080 --host 127.0.0.1' -x 'sleep 5 && mocha test/e2e/beta/metamask-beta-ui.spec'
+shell-parallel -s 'npm run ganache:start -- -d' -x 'sleep 5 && superstatic test/e2e/beta/contract-test/ --port 8080 --host 127.0.0.1' -x 'sleep 5 && mocha test/e2e/beta/from-import-beta-ui.spec'
diff --git a/test/e2e/func.js b/test/e2e/func.js
index 9f06e7f37..7b1730959 100644
--- a/test/e2e/func.js
+++ b/test/e2e/func.js
@@ -21,7 +21,7 @@ function delay (time) {
}
function buildChromeWebDriver (extPath) {
- const tmpProfile = path.join(os.tmpdir(), fs.mkdtempSync('mm-chrome-profile'));
+ const tmpProfile = fs.mkdtempSync(path.join(os.tmpdir(), 'mm-chrome-profile'))
return new webdriver.Builder()
.withCapabilities({
chromeOptions: {
diff --git a/test/e2e/metamask.spec.js b/test/e2e/metamask.spec.js
index a08a34d96..a32b924b8 100644
--- a/test/e2e/metamask.spec.js
+++ b/test/e2e/metamask.spec.js
@@ -4,7 +4,7 @@ const path = require('path')
const assert = require('assert')
const pify = require('pify')
const webdriver = require('selenium-webdriver')
-const { By, Key } = webdriver
+const { By, Key, until } = webdriver
const { delay, buildChromeWebDriver, buildFirefoxWebdriver, installWebExt, getExtensionIdChrome, getExtensionIdFirefox } = require('./func')
describe('Metamask popup page', function () {
@@ -71,13 +71,6 @@ describe('Metamask popup page', function () {
it('matches MetaMask title', async () => {
const title = await driver.getTitle()
assert.equal(title, 'MetaMask', 'title matches MetaMask')
- })
-
- it('shows privacy notice', async () => {
- await delay(300)
- const privacy = await driver.findElement(By.css('.terms-header')).getText()
- assert.equal(privacy, 'PRIVACY NOTICE', 'shows privacy notice')
- await driver.findElement(By.css('button')).click()
await delay(300)
})
@@ -100,6 +93,24 @@ describe('Metamask popup page', function () {
await button.click()
})
+ it('shows privacy notice', async () => {
+ const privacy = await driver.findElement(By.css('.terms-header')).getText()
+ assert.equal(privacy, 'PRIVACY NOTICE', 'shows privacy notice')
+ await driver.findElement(By.css('button')).click()
+ await delay(300)
+ })
+
+ it('shows phishing notice', async () => {
+ await delay(300)
+ const noticeHeader = await driver.findElement(By.css('.terms-header')).getText()
+ assert.equal(noticeHeader, 'PHISHING WARNING', 'shows phishing warning')
+ const element = await driver.findElement(By.css('.markdown'))
+ await driver.executeScript('arguments[0].scrollTop = arguments[0].scrollHeight', element)
+ await delay(300)
+ await driver.findElement(By.css('button')).click()
+ await delay(300)
+ })
+
it('accepts password with length of eight', async () => {
const passwordBox = await driver.findElement(By.id('password-box'))
const passwordBoxConfirm = await driver.findElement(By.id('password-box-confirm'))
@@ -218,7 +229,11 @@ describe('Metamask popup page', function () {
it('confirms transaction', async function () {
await delay(300)
- await driver.findElement(By.css('#pending-tx-form > div.flex-row.flex-space-around.conf-buttons > input')).click()
+ const bySubmitButton = By.css('#pending-tx-form > div.flex-row.flex-space-around.conf-buttons > input')
+ const submitButton = await driver.wait(until.elementLocated(bySubmitButton))
+
+ submitButton.click()
+
await delay(500)
})
@@ -258,7 +273,8 @@ describe('Metamask popup page', function () {
it('confirms transaction in MetaMask popup', async function () {
const windowHandles = await driver.getAllWindowHandles()
await driver.switchTo().window(windowHandles[windowHandles.length - 1])
- const metamaskSubmit = await driver.findElement(By.css('#pending-tx-form > div.flex-row.flex-space-around.conf-buttons > input'))
+ const byMetamaskSubmit = By.css('#pending-tx-form > div.flex-row.flex-space-around.conf-buttons > input')
+ const metamaskSubmit = await driver.wait(until.elementLocated(byMetamaskSubmit))
await metamaskSubmit.click()
await delay(1000)
})
@@ -319,7 +335,7 @@ describe('Metamask popup page', function () {
await driver.executeScript('window.metamask.setProviderType(arguments[0])', type)
}
- async function checkBrowserForConsoleErrors() {
+ async function checkBrowserForConsoleErrors () {
const ignoredLogTypes = ['WARNING']
const ignoredErrorMessages = [
// React throws error warnings on "dataset", but still sets the data-* properties correctly
diff --git a/test/flat.conf.js b/test/flat.conf.js
index cd2dbdcdc..1c9ec3dcd 100644
--- a/test/flat.conf.js
+++ b/test/flat.conf.js
@@ -1,6 +1,6 @@
const getBaseConfig = require('./base.conf.js')
-module.exports = function(config) {
+module.exports = function (config) {
const settings = getBaseConfig(config)
settings.files.push('development/bundle.js')
settings.files.push('test/integration/bundle.js')
diff --git a/test/integration/lib/add-token.js b/test/integration/lib/add-token.js
index 5a08c90cd..6de7574c4 100644
--- a/test/integration/lib/add-token.js
+++ b/test/integration/lib/add-token.js
@@ -75,7 +75,7 @@ async function runAddTokenFlowTest (assert, done) {
tokenWrapper[0].click()
// Click Next button
- let nextButton = await queryAsync($, 'button.btn-primary.btn--large')
+ const nextButton = await queryAsync($, 'button.btn-primary.btn--large')
assert.equal(nextButton[0].textContent, 'Next', 'next button rendered')
nextButton[0].click()
diff --git a/test/integration/lib/confirm-sig-requests.js b/test/integration/lib/confirm-sig-requests.js
index d5ed7c77c..5613c0dcb 100644
--- a/test/integration/lib/confirm-sig-requests.js
+++ b/test/integration/lib/confirm-sig-requests.js
@@ -1,10 +1,7 @@
const reactTriggerChange = require('react-trigger-change')
const {
- timeout,
queryAsync,
- findAsync,
} = require('../../lib/util')
-const PASSWORD = 'password123'
QUnit.module('confirm sig requests')
@@ -16,8 +13,8 @@ QUnit.test('successful confirmation of sig requests', (assert) => {
})
})
-async function runConfirmSigRequestsTest(assert, done) {
- let selectState = await queryAsync($, 'select')
+async function runConfirmSigRequestsTest (assert, done) {
+ const selectState = await queryAsync($, 'select')
selectState.val('confirm sig requests')
reactTriggerChange(selectState[0])
@@ -32,7 +29,7 @@ async function runConfirmSigRequestsTest(assert, done) {
let confirmSigHeadline = await queryAsync($, '.request-signature__headline')
assert.equal(confirmSigHeadline[0].textContent, 'Your signature is being requested')
- let confirmSigMessage = await queryAsync($, '.request-signature__notice')
+ const confirmSigMessage = await queryAsync($, '.request-signature__notice')
assert.ok(confirmSigMessage[0].textContent.match(/^Signing\sthis\smessage/))
let confirmSigRowValue = await queryAsync($, '.request-signature__row-value')
@@ -45,7 +42,7 @@ async function runConfirmSigRequestsTest(assert, done) {
assert.equal(confirmSigHeadline[0].textContent, 'Your signature is being requested')
confirmSigRowValue = await queryAsync($, '.request-signature__row-value')
- assert.ok(confirmSigRowValue[0].textContent.match(/^\#\sTerms\sof\sUse/))
+ assert.ok(confirmSigRowValue[0].textContent.match(/^#\sTerms\sof\sUse/))
confirmSigSignButton = await queryAsync($, 'button.btn-primary.btn--large')
confirmSigSignButton[0].click()
diff --git a/test/integration/lib/currency-localization.js b/test/integration/lib/currency-localization.js
index 7705c9720..3ad1a23e5 100644
--- a/test/integration/lib/currency-localization.js
+++ b/test/integration/lib/currency-localization.js
@@ -15,7 +15,7 @@ QUnit.test('renders localized currency', (assert) => {
})
})
-async function runCurrencyLocalizationTest(assert, done) {
+async function runCurrencyLocalizationTest (assert, done) {
console.log('*** start runCurrencyLocalizationTest')
const selectState = await queryAsync($, 'select')
selectState.val('currency localization')
diff --git a/test/integration/lib/mascara-first-time.js b/test/integration/lib/mascara-first-time.js
index f43a30c74..8bbdb4410 100644
--- a/test/integration/lib/mascara-first-time.js
+++ b/test/integration/lib/mascara-first-time.js
@@ -42,7 +42,7 @@ async function runFirstTimeUsageTest (assert, done) {
assert.equal(created.textContent, 'Your unique account image', 'unique image screen')
// Agree button
- let button = (await findAsync(app, 'button'))[0]
+ const button = (await findAsync(app, 'button'))[0]
assert.ok(button, 'button present')
button.click()
diff --git a/test/integration/lib/send-new-ui.js b/test/integration/lib/send-new-ui.js
index 176907926..241358135 100644
--- a/test/integration/lib/send-new-ui.js
+++ b/test/integration/lib/send-new-ui.js
@@ -5,8 +5,6 @@ const {
findAsync,
} = require('../../lib/util')
-const PASSWORD = 'password123'
-
QUnit.module('new ui send flow')
QUnit.test('successful send flow', (assert) => {
@@ -54,7 +52,7 @@ async function customizeGas (assert, price, limit, ethFee, usdFee) {
)
}
-async function runSendFlowTest(assert, done) {
+async function runSendFlowTest (assert, done) {
console.log('*** start runSendFlowTest')
const selectState = await queryAsync($, 'select')
selectState.val('send new ui')
@@ -87,7 +85,7 @@ async function runSendFlowTest(assert, done) {
sendFromFieldItemAddress = await queryAsync($, '.account-list-item__account-name')
assert.equal(sendFromFieldItemAddress[0].textContent, 'Send Account 2', 'send from field dropdown changes account name')
- let sendToFieldInput = await queryAsync($, '.send-v2__to-autocomplete__input')
+ const sendToFieldInput = await queryAsync($, '.send-v2__to-autocomplete__input')
sendToFieldInput[0].focus()
const sendToDropdownList = await queryAsync($, '.send-v2__from-dropdown__list')
@@ -101,7 +99,7 @@ async function runSendFlowTest(assert, done) {
const sendAmountField = await queryAsync($, '.send-v2__form-row:eq(2)')
sendAmountField.find('.currency-display')[0].click()
- const sendAmountFieldInput = await findAsync(sendAmountField, 'input:text')
+ const sendAmountFieldInput = await findAsync(sendAmountField, '.currency-display__input')
sendAmountFieldInput.val('5.1')
reactTriggerChange(sendAmountField.find('input')[0])
@@ -117,17 +115,17 @@ async function runSendFlowTest(assert, done) {
const sendGasField = await queryAsync($, '.send-v2__gas-fee-display')
assert.equal(
sendGasField.find('.currency-display__input-wrapper > input').val(),
- '0.000198',
+ '0.000021',
'send gas field should show estimated gas total'
)
assert.equal(
sendGasField.find('.currency-display__converted-value')[0].textContent,
- '$0.24 USD',
+ '$0.03 USD',
'send gas field should show estimated gas total converted to USD'
)
await customizeGas(assert, 0, 21000, '0', '$0.00 USD')
- await customizeGas(assert, 500, 60000, '0.003', '$3.60 USD')
+ await customizeGas(assert, 500, 60000, '0.03', '$36.03 USD')
const sendButton = await queryAsync($, 'button.btn-primary.btn--large.page-container__footer-button')
assert.equal(sendButton[0].textContent, 'Next', 'next button rendered')
@@ -165,7 +163,7 @@ async function runSendFlowTest(assert, done) {
const sendAmountFieldInEdit = await queryAsync($, '.send-v2__form-row:eq(2)')
sendAmountFieldInEdit.find('.currency-display')[0].click()
- const sendAmountFieldInputInEdit = sendAmountFieldInEdit.find('input:text')
+ const sendAmountFieldInputInEdit = sendAmountFieldInEdit.find('.currency-display__input')
sendAmountFieldInputInEdit.val('1.0')
reactTriggerChange(sendAmountFieldInputInEdit[0])
diff --git a/test/integration/lib/tx-list-items.js b/test/integration/lib/tx-list-items.js
index 4856b3852..6b67b1d2e 100644
--- a/test/integration/lib/tx-list-items.js
+++ b/test/integration/lib/tx-list-items.js
@@ -1,6 +1,5 @@
const reactTriggerChange = require('../../lib/react-trigger-change')
const {
- timeout,
queryAsync,
findAsync,
} = require('../../lib/util')
@@ -15,7 +14,7 @@ QUnit.test('renders list items successfully', (assert) => {
})
})
-async function runTxListItemsTest(assert, done) {
+async function runTxListItemsTest (assert, done) {
console.log('*** start runTxListItemsTest')
const selectState = await queryAsync($, 'select')
selectState.val('tx list items')
diff --git a/test/lib/mock-encryptor.js b/test/lib/mock-encryptor.js
index ef229a82f..48aa9e52c 100644
--- a/test/lib/mock-encryptor.js
+++ b/test/lib/mock-encryptor.js
@@ -31,6 +31,6 @@ module.exports = {
getRandomValues () {
return 'SOO RANDO!!!1'
- }
+ },
}
diff --git a/test/lib/mock-tx-gen.js b/test/lib/mock-tx-gen.js
index 7aea09c59..106101500 100644
--- a/test/lib/mock-tx-gen.js
+++ b/test/lib/mock-tx-gen.js
@@ -17,14 +17,14 @@ class TxGenerator {
}
generate (tx = {}, opts = {}) {
- let { count, fromNonce } = opts
+ const { count, fromNonce } = opts
let nonce = fromNonce || this.txs.length
- let txs = []
+ const txs = []
for (let i = 0; i < count; i++) {
txs.push(extend(template, {
txParams: {
nonce: hexify(nonce++),
- }
+ },
}, tx))
}
this.txs = this.txs.concat(txs)
diff --git a/test/lib/react-trigger-change.js b/test/lib/react-trigger-change.js
index a25ddff00..d169dd614 100644
--- a/test/lib/react-trigger-change.js
+++ b/test/lib/react-trigger-change.js
@@ -1,7 +1,7 @@
// Trigger React's synthetic change events on input, textarea and select elements
// https://github.com/vitalyq/react-trigger-change
-/******************IMPORTANT NOTE******************/
+/** ****************IMPORTANT NOTE******************/
/* This file is a modification of the */
/* 'react-trigger-change' library linked above. */
/* That library breaks when 'onFocus' events are */
@@ -11,13 +11,13 @@
/* This modification removes the accomodations */
/* 'react-trigger-change' makes for IE to ensure */
/* our tests can pass in chrome and firefox. */
-/**************************************************/
+/** ************************************************/
-'use strict';
+'use strict'
// Constants and functions are declared inside the closure.
// In this way, reactTriggerChange can be passed directly to executeScript in Selenium.
-module.exports = function reactTriggerChange(node) {
+module.exports = function reactTriggerChange (node) {
var supportedInputTypes = {
color: true,
date: true,
@@ -33,47 +33,47 @@ module.exports = function reactTriggerChange(node) {
text: true,
time: true,
url: true,
- week: true
- };
- var nodeName = node.nodeName.toLowerCase();
- var type = node.type;
- var event;
- var descriptor;
- var initialValue;
- var initialChecked;
- var initialCheckedRadio;
+ week: true,
+ }
+ var nodeName = node.nodeName.toLowerCase()
+ var type = node.type
+ var event
+ var descriptor
+ var initialValue
+ var initialChecked
+ var initialCheckedRadio
// Do not try to delete non-configurable properties.
// Value and checked properties on DOM elements are non-configurable in PhantomJS.
- function deletePropertySafe(elem, prop) {
- var desc = Object.getOwnPropertyDescriptor(elem, prop);
+ function deletePropertySafe (elem, prop) {
+ var desc = Object.getOwnPropertyDescriptor(elem, prop)
if (desc && desc.configurable) {
- delete elem[prop];
+ delete elem[prop]
}
}
- function getCheckedRadio(radio) {
- var name = radio.name;
- var radios;
- var i;
+ function getCheckedRadio (radio) {
+ var name = radio.name
+ var radios
+ var i
if (name) {
- radios = document.querySelectorAll('input[type="radio"][name="' + name + '"]');
+ radios = document.querySelectorAll('input[type="radio"][name="' + name + '"]')
for (i = 0; i < radios.length; i += 1) {
if (radios[i].checked) {
- return radios[i] !== radio ? radios[i] : null;
+ return radios[i] !== radio ? radios[i] : null
}
}
}
- return null;
+ return null
}
- function preventChecking(e) {
- e.preventDefault();
+ function preventChecking (e) {
+ e.preventDefault()
if (!initialChecked) {
- e.target.checked = false;
+ e.target.checked = false
}
if (initialCheckedRadio) {
- initialCheckedRadio.checked = true;
+ initialCheckedRadio.checked = true
}
}
@@ -81,81 +81,81 @@ module.exports = function reactTriggerChange(node) {
(nodeName === 'input' && type === 'file')) {
// IE9-IE11, non-IE
// Dispatch change.
- event = document.createEvent('HTMLEvents');
- event.initEvent('change', true, false);
- node.dispatchEvent(event);
+ event = document.createEvent('HTMLEvents')
+ event.initEvent('change', true, false)
+ node.dispatchEvent(event)
} else if ((nodeName === 'input' && supportedInputTypes[type]) ||
nodeName === 'textarea') {
// React 16
// Cache artificial value property descriptor.
// Property doesn't exist in React <16, descriptor is undefined.
- descriptor = Object.getOwnPropertyDescriptor(node, 'value');
+ descriptor = Object.getOwnPropertyDescriptor(node, 'value')
// Update inputValueTracking cached value.
// Remove artificial value property.
// Restore initial value to trigger event with it.
- initialValue = node.value;
- node.value = initialValue + '#';
- deletePropertySafe(node, 'value');
- node.value = initialValue;
+ initialValue = node.value
+ node.value = initialValue + '#'
+ deletePropertySafe(node, 'value')
+ node.value = initialValue
// React 0.14: IE10-IE11, non-IE
// React 15: non-IE
// React 16: IE10-IE11, non-IE
- event = document.createEvent('HTMLEvents');
- event.initEvent('input', true, false);
- node.dispatchEvent(event);
+ event = document.createEvent('HTMLEvents')
+ event.initEvent('input', true, false)
+ node.dispatchEvent(event)
// React 16
// Restore artificial value property descriptor.
if (descriptor) {
- Object.defineProperty(node, 'value', descriptor);
+ Object.defineProperty(node, 'value', descriptor)
}
} else if (nodeName === 'input' && type === 'checkbox') {
// Invert inputValueTracking cached value.
- node.checked = !node.checked;
+ node.checked = !node.checked
// Dispatch click.
// Click event inverts checked value.
- event = document.createEvent('MouseEvents');
- event.initEvent('click', true, true);
- node.dispatchEvent(event);
+ event = document.createEvent('MouseEvents')
+ event.initEvent('click', true, true)
+ node.dispatchEvent(event)
} else if (nodeName === 'input' && type === 'radio') {
// Cache initial checked value.
- initialChecked = node.checked;
+ initialChecked = node.checked
// Find and cache initially checked radio in the group.
- initialCheckedRadio = getCheckedRadio(node);
+ initialCheckedRadio = getCheckedRadio(node)
// React 16
// Cache property descriptor.
// Invert inputValueTracking cached value.
// Remove artificial checked property.
// Restore initial value, otherwise preventDefault will eventually revert the value.
- descriptor = Object.getOwnPropertyDescriptor(node, 'checked');
- node.checked = !initialChecked;
- deletePropertySafe(node, 'checked');
- node.checked = initialChecked;
+ descriptor = Object.getOwnPropertyDescriptor(node, 'checked')
+ node.checked = !initialChecked
+ deletePropertySafe(node, 'checked')
+ node.checked = initialChecked
// Prevent toggling during event capturing phase.
// Set checked value to false if initialChecked is false,
// otherwise next listeners will see true.
// Restore initially checked radio in the group.
- node.addEventListener('click', preventChecking, true);
+ node.addEventListener('click', preventChecking, true)
// Dispatch click.
// Click event inverts checked value.
- event = document.createEvent('MouseEvents');
- event.initEvent('click', true, true);
- node.dispatchEvent(event);
+ event = document.createEvent('MouseEvents')
+ event.initEvent('click', true, true)
+ node.dispatchEvent(event)
// Remove listener to stop further change prevention.
- node.removeEventListener('click', preventChecking, true);
+ node.removeEventListener('click', preventChecking, true)
// React 16
// Restore artificial checked property descriptor.
if (descriptor) {
- Object.defineProperty(node, 'checked', descriptor);
+ Object.defineProperty(node, 'checked', descriptor)
}
}
-};
+}
diff --git a/test/lib/util.js b/test/lib/util.js
index 626280745..858565bb9 100644
--- a/test/lib/util.js
+++ b/test/lib/util.js
@@ -11,7 +11,7 @@ function timeout (time) {
})
}
-async function findAsync(container, selector, opts) {
+async function findAsync (container, selector, opts) {
try {
return await pollUntilTruthy(() => {
const result = container.find(selector)
@@ -22,7 +22,7 @@ async function findAsync(container, selector, opts) {
}
}
-async function queryAsync(jQuery, selector, opts) {
+async function queryAsync (jQuery, selector, opts) {
try {
return await pollUntilTruthy(() => {
const result = jQuery(selector)
@@ -33,7 +33,7 @@ async function queryAsync(jQuery, selector, opts) {
}
}
-async function pollUntilTruthy(fn, opts = {}){
+async function pollUntilTruthy (fn, opts = {}) {
const pollingInterval = opts.pollingInterval || 100
const timeoutInterval = opts.timeoutInterval || 5000
const start = Date.now()
diff --git a/test/mascara.conf.js b/test/mascara.conf.js
index 97e53fc2b..faf3147bd 100644
--- a/test/mascara.conf.js
+++ b/test/mascara.conf.js
@@ -1,13 +1,13 @@
const getBaseConfig = require('./base.conf.js')
-module.exports = function(config) {
+module.exports = function (config) {
const settings = getBaseConfig(config)
// ui and tests
settings.files.push('dist/mascara/ui.js')
settings.files.push('dist/mascara/tests.js')
// service worker background
- settings.files.push({ pattern: 'dist/mascara/background.js', watched: false, included: false, served: true }),
+ settings.files.push({ pattern: 'dist/mascara/background.js', watched: false, included: false, served: true })
settings.proxies['/background.js'] = '/base/dist/mascara/background.js'
// use this to keep the browser open for debugging
diff --git a/test/screens/new-ui.js b/test/screens/new-ui.js
index e3ba7f6ab..92d1b8378 100644
--- a/test/screens/new-ui.js
+++ b/test/screens/new-ui.js
@@ -12,7 +12,7 @@ const pngFileStream = require('png-file-stream')
const sizeOfPng = require('image-size/lib/types/png')
const By = webdriver.By
const localesIndex = require('../../app/_locales/index.json')
-const { delay, buildChromeWebDriver, buildFirefoxWebdriver, installWebExt, getExtensionIdChrome, getExtensionIdFirefox } = require('../e2e/func')
+const { delay, buildChromeWebDriver, getExtensionIdChrome } = require('../e2e/func')
const eth = new Ethjs(new Ethjs.HttpProvider('http://localhost:8545'))
@@ -41,11 +41,9 @@ captureAllScreens()
})
-async function captureAllScreens() {
+async function captureAllScreens () {
// common names
- let button
let tabs
- let element
await cleanScreenShotDir()
@@ -108,7 +106,7 @@ async function captureAllScreens() {
await captureLanguageScreenShots('terms')
await delay(300)
- element = driver.findElement(By.linkText('Attributions'))
+ const element = driver.findElement(By.linkText('Attributions'))
await driver.executeScript('arguments[0].scrollIntoView(true)', element)
await delay(300)
await captureLanguageScreenShots('terms-scrolled')
@@ -134,10 +132,10 @@ async function captureAllScreens() {
// enter seed phrase
const seedPhraseButtons = await driver.findElements(By.css('.backup-phrase__confirm-seed-options > button'))
const seedPhraseButtonWords = await Promise.all(seedPhraseButtons.map(button => button.getText()))
- for (let targetWord of seedPhraseWords) {
+ for (const targetWord of seedPhraseWords) {
const wordIndex = seedPhraseButtonWords.indexOf(targetWord)
if (wordIndex === -1) throw new Error(`Captured seed phrase word "${targetWord}" not in found seed phrase button options ${seedPhraseButtonWords.join(' ')}`)
- await driver.findElement(By.css(`.backup-phrase__confirm-seed-options > button:nth-child(${wordIndex+1})`)).click()
+ await driver.findElement(By.css(`.backup-phrase__confirm-seed-options > button:nth-child(${wordIndex + 1})`)).click()
await delay(100)
}
await captureLanguageScreenShots('confirm secret backup phrase - words selected correctly')
@@ -191,11 +189,11 @@ async function captureAllScreens() {
}
-async function captureLanguageScreenShots(label) {
+async function captureLanguageScreenShots (label) {
const nonEnglishLocales = localesIndex.filter(localeMeta => localeMeta.code !== 'en')
// take english shot
await captureScreenShot(`${label} (en)`)
- for (let localeMeta of nonEnglishLocales) {
+ for (const localeMeta of nonEnglishLocales) {
// set locale and take shot
await setLocale(localeMeta.code)
await delay(300)
@@ -206,19 +204,19 @@ async function captureLanguageScreenShots(label) {
await delay(300)
}
-async function setLocale(code) {
+async function setLocale (code) {
await driver.executeScript('window.metamask.updateCurrentLocale(arguments[0])', code)
}
-async function setProviderType(type) {
+async function setProviderType (type) {
await driver.executeScript('window.metamask.setProviderType(arguments[0])', type)
}
-async function cleanScreenShotDir() {
+async function cleanScreenShotDir () {
await pify(rimraf)(`./test-artifacts/screens/`)
}
-async function captureScreenShot(label) {
+async function captureScreenShot (label) {
const shotIndex = screenshotCount.toString().padStart(4, '0')
screenshotCount++
const artifactDir = `./test-artifacts/screens/`
@@ -228,7 +226,7 @@ async function captureScreenShot(label) {
await pify(fs.writeFile)(`${artifactDir}/${shotIndex} - ${label}.png`, screenshot, { encoding: 'base64' })
}
-async function generateGif(){
+async function generateGif () {
// calculate screenshot size
const screenshot = await driver.takeScreenshot()
const pngBuffer = Buffer.from(screenshot, 'base64')
@@ -244,7 +242,7 @@ async function generateGif(){
await pify(endOfStream)(stream)
}
-async function verboseReportOnFailure(test) {
+async function verboseReportOnFailure (test) {
const artifactDir = `./test-artifacts/${test.title}`
const filepathBase = `${artifactDir}/test-failure`
await pify(mkdirp)(artifactDir)
@@ -256,7 +254,7 @@ async function verboseReportOnFailure(test) {
await pify(fs.writeFile)(`${filepathBase}-dom.html`, htmlSource)
}
-async function requestEther(address) {
+async function requestEther (address) {
const accounts = await eth.accounts()
await eth.sendTransaction({ from: accounts[0], to: address, value: 1 * 1e18, data: '0x0' })
}
diff --git a/test/unit/app/account-import-strategies.spec.js b/test/unit/app/account-import-strategies.spec.js
index 83cfaeb3e..d20ba0f0b 100644
--- a/test/unit/app/account-import-strategies.spec.js
+++ b/test/unit/app/account-import-strategies.spec.js
@@ -1,31 +1,58 @@
const assert = require('assert')
-const path = require('path')
-const accountImporter = require('../../../app/scripts/account-import-strategies/index')
const ethUtil = require('ethereumjs-util')
+const accountImporter = require('../../../app/scripts/account-import-strategies/index')
+const { assertRejects } = require('../test-utils')
describe('Account Import Strategies', function () {
const privkey = '0x4cfd3e90fc78b0f86bf7524722150bb8da9c60cd532564d7ff43f5716514f553'
const json = '{"version":3,"id":"dbb54385-0a99-437f-83c0-647de9f244c3","address":"a7f92ce3fba24196cf6f4bd2e1eb3db282ba998c","Crypto":{"ciphertext":"bde13d9ade5c82df80281ca363320ce254a8a3a06535bbf6ffdeaf0726b1312c","cipherparams":{"iv":"fbf93718a57f26051b292f072f2e5b41"},"cipher":"aes-128-ctr","kdf":"scrypt","kdfparams":{"dklen":32,"salt":"7ffe00488319dec48e4c49a120ca49c6afbde9272854c64d9541c83fc6acdffe","n":8192,"r":8,"p":1},"mac":"2adfd9c4bc1cdac4c85bddfb31d9e21a684e0e050247a70c5698facf6b7d4681"}}'
- it('imports a private key and strips 0x prefix', async function () {
- const importPrivKey = await accountImporter.importAccount('Private Key', [ privkey ])
- assert.equal(importPrivKey, ethUtil.stripHexPrefix(privkey))
- })
+ describe('private key import', function () {
+ it('imports a private key and strips 0x prefix', async function () {
+ const importPrivKey = await accountImporter.importAccount('Private Key', [ privkey ])
+ assert.equal(importPrivKey, ethUtil.stripHexPrefix(privkey))
+ })
- it('fails when password is incorrect for keystore', async function () {
- const wrongPassword = 'password2'
+ it('throws an error for empty string private key', async () => {
+ assertRejects(async function () {
+ await accountImporter.importAccount('Private Key', [ '' ])
+ }, Error, 'no empty strings')
+ })
- try {
- await accountImporter.importAccount('JSON File', [ json, wrongPassword])
- } catch (error) {
- assert.equal(error.message, 'Key derivation failed - possibly wrong passphrase')
- }
- })
+ it('throws an error for undefined string private key', async () => {
+ assertRejects(async function () {
+ await accountImporter.importAccount('Private Key', [ undefined ])
+ })
+ })
- it('imports json string and password to return a private key', async function () {
- const fileContentsPassword = 'password1'
- const importJson = await accountImporter.importAccount('JSON File', [ json, fileContentsPassword])
- assert.equal(importJson, '0x5733876abe94146069ce8bcbabbde2677f2e35fa33e875e92041ed2ac87e5bc7')
+ it('throws an error for undefined string private key', async () => {
+ assertRejects(async function () {
+ await accountImporter.importAccount('Private Key', [])
+ })
+ })
+
+ it('throws an error for invalid private key', async () => {
+ assertRejects(async function () {
+ await accountImporter.importAccount('Private Key', [ 'popcorn' ])
+ })
+ })
})
+ describe('JSON keystore import', function () {
+ it('fails when password is incorrect for keystore', async function () {
+ const wrongPassword = 'password2'
+
+ try {
+ await accountImporter.importAccount('JSON File', [ json, wrongPassword])
+ } catch (error) {
+ assert.equal(error.message, 'Key derivation failed - possibly wrong passphrase')
+ }
+ })
+
+ it('imports json string and password to return a private key', async function () {
+ const fileContentsPassword = 'password1'
+ const importJson = await accountImporter.importAccount('JSON File', [ json, fileContentsPassword])
+ assert.equal(importJson, '0x5733876abe94146069ce8bcbabbde2677f2e35fa33e875e92041ed2ac87e5bc7')
+ })
+ })
})
diff --git a/test/unit/app/controllers/address-book-controller.js b/test/unit/app/controllers/address-book-controller.js
index dc4b8e3ff..1350e1a61 100644
--- a/test/unit/app/controllers/address-book-controller.js
+++ b/test/unit/app/controllers/address-book-controller.js
@@ -12,7 +12,7 @@ const stubPreferencesStore = {
},
}
},
-};
+}
describe('address-book-controller', function () {
var addressBookController
diff --git a/test/unit/app/controllers/metamask-controller-test.js b/test/unit/app/controllers/metamask-controller-test.js
index 4bc16e65e..0dda4609b 100644
--- a/test/unit/app/controllers/metamask-controller-test.js
+++ b/test/unit/app/controllers/metamask-controller-test.js
@@ -45,7 +45,7 @@ describe('MetaMaskController', function () {
encryptor: {
encrypt: function (password, object) {
this.object = object
- return Promise.resolve()
+ return Promise.resolve('mock-encrypted')
},
decrypt: function () {
return Promise.resolve(this.object)
@@ -53,6 +53,9 @@ describe('MetaMaskController', function () {
},
initState: clone(firstTimeState),
})
+ // disable diagnostics
+ metamaskController.diagnostics = null
+ // add sinon method spies
sandbox.spy(metamaskController.keyringController, 'createNewVaultAndKeychain')
sandbox.spy(metamaskController.keyringController, 'createNewVaultAndRestore')
})
@@ -62,6 +65,31 @@ describe('MetaMaskController', function () {
sandbox.restore()
})
+ describe('submitPassword', function () {
+ const password = 'password'
+
+ beforeEach(async function () {
+ await metamaskController.createNewVaultAndKeychain(password)
+ })
+
+ it('removes any identities that do not correspond to known accounts.', async function () {
+ const fakeAddress = '0xbad0'
+ metamaskController.preferencesController.addAddresses([fakeAddress])
+ await metamaskController.submitPassword(password)
+
+ const identities = Object.keys(metamaskController.preferencesController.store.getState().identities)
+ const addresses = await metamaskController.keyringController.getAccounts()
+
+ identities.forEach((identity) => {
+ assert.ok(addresses.includes(identity), `addresses should include all IDs: ${identity}`)
+ })
+
+ addresses.forEach((address) => {
+ assert.ok(identities.includes(address), `identities should include all Addresses: ${address}`)
+ })
+ })
+ })
+
describe('#getGasPrice', function () {
it('gives the 50th percentile lowest accepted gas price from recentBlocksController', async function () {
@@ -479,7 +507,7 @@ describe('MetaMaskController', function () {
it('errors when signing a message', async function () {
await metamaskController.signPersonalMessage(personalMessages[0].msgParams)
assert.equal(metamaskPersonalMsgs[msgId].status, 'signed')
- assert.equal(metamaskPersonalMsgs[msgId].rawSig, '0x6a1b65e2b8ed53cf398a769fad24738f9fbe29841fe6854e226953542c4b6a173473cb152b6b1ae5f06d601d45dd699a129b0a8ca84e78b423031db5baa734741b')
+ assert.equal(metamaskPersonalMsgs[msgId].rawSig, '0x6a1b65e2b8ed53cf398a769fad24738f9fbe29841fe6854e226953542c4b6a173473cb152b6b1ae5f06d601d45dd699a129b0a8ca84e78b423031db5baa734741b')
})
})
@@ -513,7 +541,7 @@ describe('MetaMaskController', function () {
})
it('sets up controller dnode api for trusted communication', function (done) {
- streamTest = createThoughStream((chunk, enc, cb) => {
+ streamTest = createThoughStream((chunk, enc, cb) => {
assert.equal(chunk.name, 'controller')
cb()
done()
diff --git a/test/unit/app/controllers/network-contoller-test.js b/test/unit/app/controllers/network-contoller-test.js
index 789850ef3..e16fb104e 100644
--- a/test/unit/app/controllers/network-contoller-test.js
+++ b/test/unit/app/controllers/network-contoller-test.js
@@ -5,9 +5,6 @@ const {
getNetworkDisplayName,
} = require('../../../../app/scripts/controllers/network/util')
-const { createTestProviderTools } = require('../../../stub/provider')
-const providerResultStub = {}
-
describe('# Network Controller', function () {
let networkController
const noop = () => {}
diff --git a/test/unit/app/controllers/notice-controller-test.js b/test/unit/app/controllers/notice-controller-test.js
index e78b69623..b3ae75080 100644
--- a/test/unit/app/controllers/notice-controller-test.js
+++ b/test/unit/app/controllers/notice-controller-test.js
@@ -14,18 +14,6 @@ describe('notice-controller', function () {
})
describe('notices', function () {
- describe('#getNoticesList', function () {
- it('should return an empty array when new', function (done) {
- // const testList = [{
- // id: 0,
- // read: false,
- // title: 'Futuristic Notice',
- // }]
- var result = noticeController.getNoticesList()
- assert.equal(result.length, 0)
- done()
- })
- })
describe('#setNoticesList', function () {
it('should set data appropriately', function (done) {
@@ -41,36 +29,6 @@ describe('notice-controller', function () {
})
})
- describe('#updateNoticeslist', function () {
- it('should integrate the latest changes from the source', function (done) {
- var testList = [{
- id: 55,
- read: false,
- title: 'Futuristic Notice',
- }]
- noticeController.setNoticesList(testList)
- noticeController.updateNoticesList().then(() => {
- var newList = noticeController.getNoticesList()
- assert.ok(newList[0].id === 55)
- assert.ok(newList[1])
- done()
- })
- })
- it('should not overwrite any existing fields', function (done) {
- var testList = [{
- id: 0,
- read: false,
- title: 'Futuristic Notice',
- }]
- noticeController.setNoticesList(testList)
- var newList = noticeController.getNoticesList()
- assert.equal(newList[0].id, 0)
- assert.equal(newList[0].title, 'Futuristic Notice')
- assert.equal(newList.length, 1)
- done()
- })
- })
-
describe('#markNoticeRead', function () {
it('should mark a notice as read', function (done) {
var testList = [{
@@ -86,7 +44,7 @@ describe('notice-controller', function () {
})
})
- describe('#getLatestUnreadNotice', function () {
+ describe('#getNextUnreadNotice', function () {
it('should retrieve the latest unread notice', function (done) {
var testList = [
{id: 0, read: true, title: 'Past Notice'},
@@ -94,8 +52,8 @@ describe('notice-controller', function () {
{id: 2, read: false, title: 'Future Notice'},
]
noticeController.setNoticesList(testList)
- var latestUnread = noticeController.getLatestUnreadNotice()
- assert.equal(latestUnread.id, 2)
+ var latestUnread = noticeController.getNextUnreadNotice()
+ assert.equal(latestUnread.id, 1)
done()
})
it('should return undefined if no unread notices exist.', function (done) {
@@ -105,7 +63,7 @@ describe('notice-controller', function () {
{id: 2, read: true, title: 'Future Notice'},
]
noticeController.setNoticesList(testList)
- var latestUnread = noticeController.getLatestUnreadNotice()
+ var latestUnread = noticeController.getNextUnreadNotice()
assert.ok(!latestUnread)
done()
})
diff --git a/test/unit/app/controllers/transactions/nonce-tracker-test.js b/test/unit/app/controllers/transactions/nonce-tracker-test.js
index fc852458c..6c0ac759f 100644
--- a/test/unit/app/controllers/transactions/nonce-tracker-test.js
+++ b/test/unit/app/controllers/transactions/nonce-tracker-test.js
@@ -1,12 +1,10 @@
const assert = require('assert')
const NonceTracker = require('../../../../../app/scripts/controllers/transactions/nonce-tracker')
const MockTxGen = require('../../../../lib/mock-tx-gen')
-let providerResultStub = {}
+const providerResultStub = {}
describe('Nonce Tracker', function () {
- let nonceTracker, provider
- let getPendingTransactions, pendingTxs
- let getConfirmedTransactions, confirmedTxs
+ let nonceTracker, pendingTxs, confirmedTxs
describe('#getNonceLock', function () {
@@ -182,8 +180,8 @@ describe('Nonce Tracker', function () {
describe('When all three return different values', function () {
beforeEach(function () {
const txGen = new MockTxGen()
- const confirmedTxs = txGen.generate({ status: 'confirmed' }, { count: 10 })
- const pendingTxs = txGen.generate({
+ confirmedTxs = txGen.generate({ status: 'confirmed' }, { count: 10 })
+ pendingTxs = txGen.generate({
status: 'submitted',
nonce: 100,
}, { count: 1 })
@@ -202,8 +200,8 @@ describe('Nonce Tracker', function () {
describe('Faq issue 67', function () {
beforeEach(function () {
const txGen = new MockTxGen()
- const confirmedTxs = txGen.generate({ status: 'confirmed' }, { count: 64 })
- const pendingTxs = txGen.generate({
+ confirmedTxs = txGen.generate({ status: 'confirmed' }, { count: 64 })
+ pendingTxs = txGen.generate({
status: 'submitted',
}, { count: 10 })
// 0x40 is 64 in hex:
diff --git a/test/unit/app/controllers/transactions/pending-tx-test.js b/test/unit/app/controllers/transactions/pending-tx-test.js
index e7705c594..8bf2da6f8 100644
--- a/test/unit/app/controllers/transactions/pending-tx-test.js
+++ b/test/unit/app/controllers/transactions/pending-tx-test.js
@@ -1,20 +1,12 @@
const assert = require('assert')
-const ethUtil = require('ethereumjs-util')
-const EthTx = require('ethereumjs-tx')
-const ObservableStore = require('obs-store')
-const clone = require('clone')
const { createTestProviderTools } = require('../../../../stub/provider')
const PendingTransactionTracker = require('../../../../../app/scripts/controllers/transactions/pending-tx-tracker')
const MockTxGen = require('../../../../lib/mock-tx-gen')
const sinon = require('sinon')
-const noop = () => true
-const currentNetworkId = 42
-const otherNetworkId = 36
-const privKey = new Buffer('8718b9618a37d1fc78c436511fc6df3c8258d3250635bba617f33003270ec03e', 'hex')
describe('PendingTransactionTracker', function () {
- let pendingTxTracker, txMeta, txMetaNoHash, txMetaNoRawTx, providerResultStub,
+ let pendingTxTracker, txMeta, txMetaNoHash, providerResultStub,
provider, txMeta3, txList, knownErrors
this.timeout(10000)
beforeEach(function () {
@@ -34,11 +26,7 @@ describe('PendingTransactionTracker', function () {
status: 'signed',
txParams: { from: '0x1678a085c290ebd122dc42cba69373b5953b831d'},
}
- txMetaNoRawTx = {
- hash: '0x0593ee121b92e10d63150ad08b4b8f9c7857d1bd160195ee648fb9a0f8d00eeb',
- status: 'signed',
- txParams: { from: '0x1678a085c290ebd122dc42cba69373b5953b831d'},
- }
+
providerResultStub = {}
provider = createTestProviderTools({ scaffold: providerResultStub }).provider
@@ -47,10 +35,10 @@ describe('PendingTransactionTracker', function () {
nonceTracker: {
getGlobalLock: async () => {
return { releaseLock: () => {} }
- }
+ },
},
- getPendingTransactions: () => {return []},
- getCompletedTransactions: () => {return []},
+ getPendingTransactions: () => { return [] },
+ getCompletedTransactions: () => { return [] },
publishTransaction: () => {},
})
})
@@ -133,22 +121,20 @@ describe('PendingTransactionTracker', function () {
})
describe('#queryPendingTxs', function () {
it('should call #_checkPendingTxs if their is no oldBlock', function (done) {
- let newBlock, oldBlock
- newBlock = { number: '0x01' }
+ let oldBlock
+ const newBlock = { number: '0x01' }
pendingTxTracker._checkPendingTxs = done
pendingTxTracker.queryPendingTxs({ oldBlock, newBlock })
})
it('should call #_checkPendingTxs if oldBlock and the newBlock have a diff of greater then 1', function (done) {
- let newBlock, oldBlock
- oldBlock = { number: '0x01' }
- newBlock = { number: '0x03' }
+ const oldBlock = { number: '0x01' }
+ const newBlock = { number: '0x03' }
pendingTxTracker._checkPendingTxs = done
pendingTxTracker.queryPendingTxs({ oldBlock, newBlock })
})
it('should not call #_checkPendingTxs if oldBlock and the newBlock have a diff of 1 or less', function (done) {
- let newBlock, oldBlock
- oldBlock = { number: '0x1' }
- newBlock = { number: '0x2' }
+ const oldBlock = { number: '0x1' }
+ const newBlock = { number: '0x2' }
pendingTxTracker._checkPendingTxs = () => {
const err = new Error('should not call #_checkPendingTxs if oldBlock and the newBlock have a diff of 1 or less')
done(err)
@@ -189,7 +175,7 @@ describe('PendingTransactionTracker', function () {
txMeta2.id = 2
txMeta3.id = 3
txList = [txMeta, txMeta2, txMeta3].map((tx) => {
- tx.processed = new Promise ((resolve) => { tx.resolve = resolve })
+ tx.processed = new Promise((resolve) => { tx.resolve = resolve })
return tx
})
})
@@ -197,7 +183,6 @@ describe('PendingTransactionTracker', function () {
it('should warp all txMeta\'s in #_checkPendingTx', function (done) {
pendingTxTracker.getPendingTransactions = () => txList
pendingTxTracker._checkPendingTx = (tx) => { tx.resolve(tx) }
- const list = txList.map
Promise.all(txList.map((tx) => tx.processed))
.then((txCompletedList) => done())
.catch(done)
@@ -207,11 +192,11 @@ describe('PendingTransactionTracker', function () {
})
describe('#resubmitPendingTxs', function () {
- const blockStub = { number: '0x0' };
+ const blockStub = { number: '0x0' }
beforeEach(function () {
const txMeta2 = txMeta3 = txMeta
txList = [txMeta, txMeta2, txMeta3].map((tx) => {
- tx.processed = new Promise ((resolve) => { tx.resolve = resolve })
+ tx.processed = new Promise((resolve) => { tx.resolve = resolve })
return tx
})
})
@@ -228,7 +213,7 @@ describe('PendingTransactionTracker', function () {
pendingTxTracker.resubmitPendingTxs(blockStub)
})
it('should not emit \'tx:failed\' if the txMeta throws a known txError', function (done) {
- knownErrors =[
+ knownErrors = [
// geth
' Replacement transaction Underpriced ',
' known transaction',
@@ -275,7 +260,7 @@ describe('PendingTransactionTracker', function () {
})
describe('#_resubmitTx', function () {
const mockFirstRetryBlockNumber = '0x1'
- let txMetaToTestExponentialBackoff
+ let txMetaToTestExponentialBackoff, enoughBalance
beforeEach(() => {
pendingTxTracker.getBalance = (address) => {
@@ -298,7 +283,7 @@ describe('PendingTransactionTracker', function () {
})
it('should publish the transaction', function (done) {
- const enoughBalance = '0x100000'
+ enoughBalance = '0x100000'
// Stubbing out current account state:
// Adding the fake tx:
@@ -313,7 +298,7 @@ describe('PendingTransactionTracker', function () {
})
it('should not publish the transaction if the limit of retries has been exceeded', function (done) {
- const enoughBalance = '0x100000'
+ enoughBalance = '0x100000'
const mockLatestBlockNumber = '0x5'
pendingTxTracker._resubmitTx(txMetaToTestExponentialBackoff, mockLatestBlockNumber)
@@ -327,7 +312,7 @@ describe('PendingTransactionTracker', function () {
})
it('should publish the transaction if the number of blocks since last retry exceeds the last set limit', function (done) {
- const enoughBalance = '0x100000'
+ enoughBalance = '0x100000'
const mockLatestBlockNumber = '0x11'
pendingTxTracker._resubmitTx(txMetaToTestExponentialBackoff, mockLatestBlockNumber)
@@ -342,8 +327,8 @@ describe('PendingTransactionTracker', function () {
})
describe('#_checkIfNonceIsTaken', function () {
- beforeEach ( function () {
- let confirmedTxList = [{
+ beforeEach(function () {
+ const confirmedTxList = [{
id: 1,
hash: '0x0593ee121b92e10d63150ad08b4b8f9c7857d1bd160195ee648fb9a0f8d00eeb',
status: 'confirmed',
diff --git a/test/unit/app/controllers/transactions/recipient-blacklist-checker-test.js b/test/unit/app/controllers/transactions/recipient-blacklist-checker-test.js
new file mode 100644
index 000000000..cb413545f
--- /dev/null
+++ b/test/unit/app/controllers/transactions/recipient-blacklist-checker-test.js
@@ -0,0 +1,77 @@
+const assert = require('assert')
+const recipientBlackListChecker = require('../../../../../app/scripts/controllers/transactions/lib/recipient-blacklist-checker')
+const {
+ ROPSTEN_CODE,
+ RINKEYBY_CODE,
+ KOVAN_CODE,
+} = require('../../../../../app/scripts/controllers/network/enums')
+
+const KeyringController = require('eth-keyring-controller')
+
+describe('Recipient Blacklist Checker', function () {
+
+ let publicAccounts
+
+ before(async function () {
+ const damnedMnemonic = 'candy maple cake sugar pudding cream honey rich smooth crumble sweet treat'
+ const keyringController = new KeyringController({})
+ const Keyring = keyringController.getKeyringClassForType('HD Key Tree')
+ const opts = {
+ mnemonic: damnedMnemonic,
+ numberOfAccounts: 10,
+ }
+ const keyring = new Keyring(opts)
+ publicAccounts = await keyring.getAccounts()
+ })
+
+ describe('#checkAccount', function () {
+ it('does not fail on test networks', function () {
+ let callCount = 0
+ const networks = [ROPSTEN_CODE, RINKEYBY_CODE, KOVAN_CODE]
+ for (const networkId in networks) {
+ publicAccounts.forEach((account) => {
+ recipientBlackListChecker.checkAccount(networkId, account)
+ callCount++
+ })
+ }
+ assert.equal(callCount, 30)
+ })
+
+ it('fails on mainnet', function () {
+ const mainnetId = 1
+ let callCount = 0
+ publicAccounts.forEach((account) => {
+ try {
+ recipientBlackListChecker.checkAccount(mainnetId, account)
+ assert.fail('function should have thrown an error')
+ } catch (err) {
+ assert.equal(err.message, 'Recipient is a public account')
+ }
+ callCount++
+ })
+ assert.equal(callCount, 10)
+ })
+
+ it('fails for public account - uppercase', function () {
+ const mainnetId = 1
+ const publicAccount = '0X0D1D4E623D10F9FBA5DB95830F7D3839406C6AF2'
+ try {
+ recipientBlackListChecker.checkAccount(mainnetId, publicAccount)
+ assert.fail('function should have thrown an error')
+ } catch (err) {
+ assert.equal(err.message, 'Recipient is a public account')
+ }
+ })
+
+ it('fails for public account - lowercase', async function () {
+ const mainnetId = 1
+ const publicAccount = '0x0d1d4e623d10f9fba5db95830f7d3839406c6af2'
+ try {
+ await recipientBlackListChecker.checkAccount(mainnetId, publicAccount)
+ assert.fail('function should have thrown an error')
+ } catch (err) {
+ assert.equal(err.message, 'Recipient is a public account')
+ }
+ })
+ })
+})
diff --git a/test/unit/app/controllers/transactions/tx-controller-test.js b/test/unit/app/controllers/transactions/tx-controller-test.js
index 1f32a0f37..d4c5ff0ec 100644
--- a/test/unit/app/controllers/transactions/tx-controller-test.js
+++ b/test/unit/app/controllers/transactions/tx-controller-test.js
@@ -1,20 +1,17 @@
const assert = require('assert')
const ethUtil = require('ethereumjs-util')
const EthTx = require('ethereumjs-tx')
-const EthjsQuery = require('ethjs-query')
const ObservableStore = require('obs-store')
const sinon = require('sinon')
const TransactionController = require('../../../../../app/scripts/controllers/transactions')
-const TxGasUtils = require('../../../../../app/scripts/controllers/transactions/tx-gas-utils')
const { createTestProviderTools, getTestAccounts } = require('../../../../stub/provider')
const noop = () => true
const currentNetworkId = 42
-const otherNetworkId = 36
describe('Transaction Controller', function () {
- let txController, provider, providerResultStub, query, fromAccount
+ let txController, provider, providerResultStub, fromAccount
beforeEach(function () {
providerResultStub = {
@@ -24,7 +21,6 @@ describe('Transaction Controller', function () {
eth_getCode: '0x',
}
provider = createTestProviderTools({ scaffold: providerResultStub }).provider
- query = new EthjsQuery(provider)
fromAccount = getTestAccounts()[0]
txController = new TransactionController({
@@ -185,6 +181,23 @@ describe('Transaction Controller', function () {
.catch(done)
})
+ it('should fail if recipient is public', function (done) {
+ txController.networkStore = new ObservableStore(1)
+ txController.addUnapprovedTransaction({ from: '0x1678a085c290ebd122dc42cba69373b5953b831d', to: '0x0d1d4e623D10F9FBA5Db95830F7d3839406C6AF2' })
+ .catch((err) => {
+ if (err.message === 'Recipient is a public account') done()
+ else done(err)
+ })
+ })
+
+ it('should not fail if recipient is public but not on mainnet', function (done) {
+ txController.once('newUnapprovedTx', (txMetaFromEmit) => {
+ assert(txMetaFromEmit, 'txMeta is falsey')
+ done()
+ })
+ txController.addUnapprovedTransaction({ from: '0x1678a085c290ebd122dc42cba69373b5953b831d', to: '0x0d1d4e623D10F9FBA5Db95830F7d3839406C6AF2' })
+ .catch(done)
+ })
})
describe('#addTxGasDefaults', function () {
@@ -371,7 +384,7 @@ describe('Transaction Controller', function () {
describe('#retryTransaction', function () {
it('should create a new txMeta with the same txParams as the original one', function (done) {
- let txParams = {
+ const txParams = {
nonce: '0x00',
from: '0xB09d8505E1F4EF1CeA089D47094f5DD3464083d4',
to: '0xB09d8505E1F4EF1CeA089D47094f5DD3464083d4',
diff --git a/test/unit/app/controllers/transactions/tx-gas-util-test.js b/test/unit/app/controllers/transactions/tx-gas-util-test.js
index d1ee86033..31defd6ed 100644
--- a/test/unit/app/controllers/transactions/tx-gas-util-test.js
+++ b/test/unit/app/controllers/transactions/tx-gas-util-test.js
@@ -1,6 +1,5 @@
const assert = require('assert')
const Transaction = require('ethereumjs-tx')
-const BN = require('bn.js')
const { hexToBn, bnToHex } = require('../../../../../app/scripts/lib/util')
diff --git a/test/unit/app/controllers/transactions/tx-state-history-helper-test.js b/test/unit/app/controllers/transactions/tx-state-history-helper-test.js
index f4c3a6be1..fba0e7fda 100644
--- a/test/unit/app/controllers/transactions/tx-state-history-helper-test.js
+++ b/test/unit/app/controllers/transactions/tx-state-history-helper-test.js
@@ -2,16 +2,16 @@ const assert = require('assert')
const txStateHistoryHelper = require('../../../../../app/scripts/controllers/transactions/lib/tx-state-history-helper')
const testVault = require('../../../../data/v17-long-history.json')
-describe ('Transaction state history helper', function () {
+describe('Transaction state history helper', function () {
describe('#snapshotFromTxMeta', function () {
it('should clone deep', function () {
const input = {
foo: {
bar: {
- bam: 'baz'
- }
- }
+ bam: 'baz',
+ },
+ },
}
const output = txStateHistoryHelper.snapshotFromTxMeta(input)
assert('foo' in output, 'has a foo key')
@@ -50,14 +50,14 @@ describe ('Transaction state history helper', function () {
it('replaying history does not mutate the original obj', function () {
const initialState = { test: true, message: 'hello', value: 1 }
const diff1 = [{
- "op": "replace",
- "path": "/message",
- "value": "haay",
+ 'op': 'replace',
+ 'path': '/message',
+ 'value': 'haay',
}]
const diff2 = [{
- "op": "replace",
- "path": "/value",
- "value": 2,
+ 'op': 'replace',
+ 'path': '/value',
+ 'value': 2,
}]
const history = [initialState, diff1, diff2]
@@ -72,15 +72,15 @@ describe ('Transaction state history helper', function () {
describe('#generateHistoryEntry', function () {
- function generateHistoryEntryTest(note) {
+ function generateHistoryEntryTest (note) {
const prevState = {
someValue: 'value 1',
foo: {
bar: {
- bam: 'baz'
- }
- }
+ bam: 'baz',
+ },
+ },
}
const nextState = {
@@ -89,9 +89,9 @@ describe ('Transaction state history helper', function () {
foo: {
newPropFirstLevel: 'new property - first level',
bar: {
- bam: 'baz'
- }
- }
+ bam: 'baz',
+ },
+ },
}
const before = new Date().getTime()
@@ -106,8 +106,7 @@ describe ('Transaction state history helper', function () {
assert.equal(result[0].path, expectedEntry1.path)
assert.equal(result[0].value, expectedEntry1.value)
assert.equal(result[0].value, expectedEntry1.value)
- if (note)
- assert.equal(result[0].note, note)
+ if (note) { assert.equal(result[0].note, note) }
assert.ok(result[0].timestamp >= before && result[0].timestamp <= after)
@@ -124,6 +123,6 @@ describe ('Transaction state history helper', function () {
it('should add note to first entry', function () {
generateHistoryEntryTest('custom note')
- })
+ })
})
-}) \ No newline at end of file
+})
diff --git a/test/unit/app/controllers/transactions/tx-state-manager-test.js b/test/unit/app/controllers/transactions/tx-state-manager-test.js
index 20bc08b94..2f91b1545 100644
--- a/test/unit/app/controllers/transactions/tx-state-manager-test.js
+++ b/test/unit/app/controllers/transactions/tx-state-manager-test.js
@@ -1,6 +1,4 @@
const assert = require('assert')
-const clone = require('clone')
-const ObservableStore = require('obs-store')
const TxStateManager = require('../../../../../app/scripts/controllers/transactions/tx-state-manager')
const txStateHistoryHelper = require('../../../../../app/scripts/controllers/transactions/lib/tx-state-history-helper')
const noop = () => true
@@ -16,23 +14,23 @@ describe('TransactionStateManager', function () {
transactions: [],
},
txHistoryLimit: 10,
- getNetwork: () => currentNetworkId
+ getNetwork: () => currentNetworkId,
})
})
describe('#setTxStatusSigned', function () {
it('sets the tx status to signed', function () {
- let tx = { id: 1, status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} }
+ const tx = { id: 1, status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} }
txStateManager.addTx(tx, noop)
txStateManager.setTxStatusSigned(1)
- let result = txStateManager.getTxList()
+ const result = txStateManager.getTxList()
assert.ok(Array.isArray(result))
assert.equal(result.length, 1)
assert.equal(result[0].status, 'signed')
})
it('should emit a signed event to signal the exciton of callback', (done) => {
- let tx = { id: 1, status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} }
+ const tx = { id: 1, status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} }
const noop = function () {
assert(true, 'event listener has been triggered and noop executed')
done()
@@ -46,21 +44,24 @@ describe('TransactionStateManager', function () {
describe('#setTxStatusRejected', function () {
it('sets the tx status to rejected', function () {
- let tx = { id: 1, status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} }
+ const tx = { id: 1, status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} }
txStateManager.addTx(tx)
txStateManager.setTxStatusRejected(1)
- let result = txStateManager.getTxList()
+ const result = txStateManager.getTxList()
assert.ok(Array.isArray(result))
assert.equal(result.length, 1)
assert.equal(result[0].status, 'rejected')
})
it('should emit a rejected event to signal the exciton of callback', (done) => {
- let tx = { id: 1, status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} }
+ const tx = { id: 1, status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} }
txStateManager.addTx(tx)
const noop = function (err, txId) {
- assert(true, 'event listener has been triggered and noop executed')
- done()
+ if (err) {
+ console.log('Error: ', err)
+ }
+ assert(true, 'event listener has been triggered and noop executed')
+ done()
}
txStateManager.on('1:rejected', noop)
txStateManager.setTxStatusRejected(1)
@@ -69,7 +70,7 @@ describe('TransactionStateManager', function () {
describe('#getFullTxList', function () {
it('when new should return empty array', function () {
- let result = txStateManager.getTxList()
+ const result = txStateManager.getTxList()
assert.ok(Array.isArray(result))
assert.equal(result.length, 0)
})
@@ -77,7 +78,7 @@ describe('TransactionStateManager', function () {
describe('#getTxList', function () {
it('when new should return empty array', function () {
- let result = txStateManager.getTxList()
+ const result = txStateManager.getTxList()
assert.ok(Array.isArray(result))
assert.equal(result.length, 0)
})
@@ -85,21 +86,21 @@ describe('TransactionStateManager', function () {
describe('#addTx', function () {
it('adds a tx returned in getTxList', function () {
- let tx = { id: 1, status: 'confirmed', metamaskNetworkId: currentNetworkId, txParams: {} }
+ const tx = { id: 1, status: 'confirmed', metamaskNetworkId: currentNetworkId, txParams: {} }
txStateManager.addTx(tx, noop)
- let result = txStateManager.getTxList()
+ const result = txStateManager.getTxList()
assert.ok(Array.isArray(result))
assert.equal(result.length, 1)
assert.equal(result[0].id, 1)
})
it('does not override txs from other networks', function () {
- let tx = { id: 1, status: 'confirmed', metamaskNetworkId: currentNetworkId, txParams: {} }
- let tx2 = { id: 2, status: 'confirmed', metamaskNetworkId: otherNetworkId, txParams: {} }
+ const tx = { id: 1, status: 'confirmed', metamaskNetworkId: currentNetworkId, txParams: {} }
+ const tx2 = { id: 2, status: 'confirmed', metamaskNetworkId: otherNetworkId, txParams: {} }
txStateManager.addTx(tx, noop)
txStateManager.addTx(tx2, noop)
- let result = txStateManager.getFullTxList()
- let result2 = txStateManager.getTxList()
+ const result = txStateManager.getFullTxList()
+ const result2 = txStateManager.getTxList()
assert.equal(result.length, 2, 'txs were deleted')
assert.equal(result2.length, 1, 'incorrect number of txs on network.')
})
@@ -110,7 +111,7 @@ describe('TransactionStateManager', function () {
const tx = { id: i, time: new Date(), status: 'confirmed', metamaskNetworkId: currentNetworkId, txParams: {} }
txStateManager.addTx(tx, noop)
}
- let result = txStateManager.getTxList()
+ const result = txStateManager.getTxList()
assert.equal(result.length, limit, `limit of ${limit} txs enforced`)
assert.equal(result[0].id, 1, 'early txs truncted')
})
@@ -121,20 +122,20 @@ describe('TransactionStateManager', function () {
const tx = { id: i, time: new Date(), status: 'rejected', metamaskNetworkId: currentNetworkId, txParams: {} }
txStateManager.addTx(tx, noop)
}
- let result = txStateManager.getTxList()
+ const result = txStateManager.getTxList()
assert.equal(result.length, limit, `limit of ${limit} txs enforced`)
assert.equal(result[0].id, 1, 'early txs truncted')
})
it('cuts off early txs beyond a limit but does not cut unapproved txs', function () {
- let unconfirmedTx = { id: 0, time: new Date(), status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} }
+ const unconfirmedTx = { id: 0, time: new Date(), status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: {} }
txStateManager.addTx(unconfirmedTx, noop)
const limit = txStateManager.txHistoryLimit
for (let i = 1; i < limit + 1; i++) {
const tx = { id: i, time: new Date(), status: 'confirmed', metamaskNetworkId: currentNetworkId, txParams: {} }
txStateManager.addTx(tx, noop)
}
- let result = txStateManager.getTxList()
+ const result = txStateManager.getTxList()
assert.equal(result.length, limit, `limit of ${limit} txs enforced`)
assert.equal(result[0].id, 0, 'first tx should still be there')
assert.equal(result[0].status, 'unapproved', 'first tx should be unapproved')
@@ -149,7 +150,7 @@ describe('TransactionStateManager', function () {
const txMeta = txStateManager.getTx('1')
txMeta.hash = 'foo'
txStateManager.updateTx(txMeta)
- let result = txStateManager.getTx('1')
+ const result = txStateManager.getTx('1')
assert.equal(result.hash, 'foo')
})
@@ -166,8 +167,6 @@ describe('TransactionStateManager', function () {
},
}
- const updatedMeta = clone(txMeta)
-
txStateManager.addTx(txMeta)
const updatedTx = txStateManager.getTx('1')
// verify tx was initialized correctly
@@ -185,7 +184,7 @@ describe('TransactionStateManager', function () {
// validate history was updated
assert.equal(result.history.length, 2, 'two history items (initial + diff)')
assert.equal(result.history[1].length, 1, 'two history state items (initial + diff)')
-
+
const expectedEntry = { op: 'replace', path: '/txParams/gasPrice', value: desiredGasPrice }
assert.deepEqual(result.history[1][0].op, expectedEntry.op, 'two history items (initial + diff) operation')
assert.deepEqual(result.history[1][0].path, expectedEntry.path, 'two history items (initial + diff) path')
diff --git a/test/unit/app/controllers/transactions/tx-utils-test.js b/test/unit/app/controllers/transactions/tx-utils-test.js
index 115127f85..029fab4d5 100644
--- a/test/unit/app/controllers/transactions/tx-utils-test.js
+++ b/test/unit/app/controllers/transactions/tx-utils-test.js
@@ -27,7 +27,7 @@ describe('txUtils', function () {
describe('#normalizeTxParams', () => {
it('should normalize txParams', () => {
- let txParams = {
+ const txParams = {
chainId: '0x1',
from: 'a7df1beDBF813f57096dF77FCd515f0B3900e402',
to: null,
@@ -91,7 +91,7 @@ describe('txUtils', function () {
assert.throws(() => { txUtils.validateFrom(txParams) }, Error, `Invalid from address`)
// should run
- txParams.from ='0x1678a085c290ebd122dc42cba69373b5953b831d'
+ txParams.from = '0x1678a085c290ebd122dc42cba69373b5953b831d'
txUtils.validateFrom(txParams)
})
})
diff --git a/test/unit/app/edge-encryptor-test.js b/test/unit/app/edge-encryptor-test.js
index cc9777389..1a6255b36 100644
--- a/test/unit/app/edge-encryptor-test.js
+++ b/test/unit/app/edge-encryptor-test.js
@@ -11,7 +11,7 @@ global.crypto = global.crypto || {
array[i] = Math.random() * 100
}
return array
- }
+ },
}
describe('EdgeEncryptor', function () {
@@ -33,10 +33,10 @@ describe('EdgeEncryptor', function () {
it('should return proper format.', function (done) {
edgeEncryptor.encrypt(password, data)
.then(function (encryptedData) {
- let encryptedObject = JSON.parse(encryptedData)
+ const encryptedObject = JSON.parse(encryptedData)
assert.ok(encryptedObject.data, 'there is no data')
- assert.ok(encryptedObject.iv && encryptedObject.iv.length != 0, 'there is no iv')
- assert.ok(encryptedObject.salt && encryptedObject.salt.length != 0, 'there is no salt')
+ assert.ok(encryptedObject.iv && encryptedObject.iv.length !== 0, 'there is no iv')
+ assert.ok(encryptedObject.salt && encryptedObject.salt.length !== 0, 'there is no salt')
done()
}).catch(function (err) {
done(err)
@@ -56,7 +56,7 @@ describe('EdgeEncryptor', function () {
assert.notEqual(encryptedData[1].length, 0)
done()
})
- })
+ })
})
describe('decrypt', function () {
diff --git a/test/unit/app/nodeify-test.js b/test/unit/app/nodeify-test.js
index 901603c8b..938b76c68 100644
--- a/test/unit/app/nodeify-test.js
+++ b/test/unit/app/nodeify-test.js
@@ -13,8 +13,12 @@ describe('nodeify', function () {
it('should retain original context', function (done) {
var nodified = nodeify(obj.promiseFunc, obj)
nodified('baz', function (err, res) {
- assert.equal(res, 'barbaz')
- done()
+ if (!err) {
+ assert.equal(res, 'barbaz')
+ done()
+ } else {
+ done(new Error(err.toString()))
+ }
})
})
diff --git a/test/unit/app/pending-balance-test.js b/test/unit/app/pending-balance-test.js
index 1418e4a4e..508635c46 100644
--- a/test/unit/app/pending-balance-test.js
+++ b/test/unit/app/pending-balance-test.js
@@ -2,7 +2,6 @@ const assert = require('assert')
const PendingBalanceCalculator = require('../../../app/scripts/lib/pending-balance-calculator')
const MockTxGen = require('../../lib/mock-tx-gen')
const BN = require('ethereumjs-util').BN
-let providerResultStub = {}
const zeroBn = new BN(0)
const etherBn = new BN(String(1e18))
@@ -20,7 +19,7 @@ describe('PendingBalanceCalculator', function () {
value: ether,
gasPrice: '0x0',
gas: '0x0',
- }
+ },
}, { count: 1 })
const balanceCalculator = generateBalanceCalcWith([], zeroBn)
@@ -36,7 +35,7 @@ describe('PendingBalanceCalculator', function () {
value: '0x0',
gasPrice: '0x2',
gas: '0x3',
- }
+ },
}, { count: 1 })
const balanceCalculator = generateBalanceCalcWith([], zeroBn)
@@ -66,7 +65,7 @@ describe('PendingBalanceCalculator', function () {
value: ether,
gasPrice: '0x0',
gas: '0x0',
- }
+ },
}, { count: 1 })
balanceCalculator = generateBalanceCalcWith(pendingTxs, etherBn)
diff --git a/test/unit/app/seed-phrase-verifier-test.js b/test/unit/app/seed-phrase-verifier-test.js
index b0da534da..d8720d5a0 100644
--- a/test/unit/app/seed-phrase-verifier-test.js
+++ b/test/unit/app/seed-phrase-verifier-test.js
@@ -9,11 +9,10 @@ describe('SeedPhraseVerifier', function () {
describe('verifyAccounts', function () {
- let password = 'passw0rd1'
- let hdKeyTree = 'HD Key Tree'
+ const password = 'passw0rd1'
+ const hdKeyTree = 'HD Key Tree'
let keyringController
- let vault
let primaryKeyring
beforeEach(async function () {
@@ -24,60 +23,60 @@ describe('SeedPhraseVerifier', function () {
assert(keyringController)
- vault = await keyringController.createNewVaultAndKeychain(password)
+ await keyringController.createNewVaultAndKeychain(password)
primaryKeyring = keyringController.getKeyringsByType(hdKeyTree)[0]
})
it('should be able to verify created account with seed words', async function () {
- let createdAccounts = await primaryKeyring.getAccounts()
+ const createdAccounts = await primaryKeyring.getAccounts()
assert.equal(createdAccounts.length, 1)
- let serialized = await primaryKeyring.serialize()
- let seedWords = serialized.mnemonic
+ const serialized = await primaryKeyring.serialize()
+ const seedWords = serialized.mnemonic
assert.notEqual(seedWords.length, 0)
-
- let result = await seedPhraseVerifier.verifyAccounts(createdAccounts, seedWords)
+
+ await seedPhraseVerifier.verifyAccounts(createdAccounts, seedWords)
})
it('should be able to verify created account (upper case) with seed words', async function () {
- let createdAccounts = await primaryKeyring.getAccounts()
+ const createdAccounts = await primaryKeyring.getAccounts()
assert.equal(createdAccounts.length, 1)
- let upperCaseAccounts = [createdAccounts[0].toUpperCase()]
+ const upperCaseAccounts = [createdAccounts[0].toUpperCase()]
- let serialized = await primaryKeyring.serialize()
- let seedWords = serialized.mnemonic
+ const serialized = await primaryKeyring.serialize()
+ const seedWords = serialized.mnemonic
assert.notEqual(seedWords.length, 0)
-
- let result = await seedPhraseVerifier.verifyAccounts(upperCaseAccounts, seedWords)
+
+ await seedPhraseVerifier.verifyAccounts(upperCaseAccounts, seedWords)
})
it('should be able to verify created account (lower case) with seed words', async function () {
- let createdAccounts = await primaryKeyring.getAccounts()
+ const createdAccounts = await primaryKeyring.getAccounts()
assert.equal(createdAccounts.length, 1)
- let lowerCaseAccounts = [createdAccounts[0].toLowerCase()]
+ const lowerCaseAccounts = [createdAccounts[0].toLowerCase()]
- let serialized = await primaryKeyring.serialize()
- let seedWords = serialized.mnemonic
+ const serialized = await primaryKeyring.serialize()
+ const seedWords = serialized.mnemonic
assert.notEqual(seedWords.length, 0)
-
- let result = await seedPhraseVerifier.verifyAccounts(lowerCaseAccounts, seedWords)
+
+ await seedPhraseVerifier.verifyAccounts(lowerCaseAccounts, seedWords)
})
it('should return error with good but different seed words', async function () {
- let createdAccounts = await primaryKeyring.getAccounts()
+ const createdAccounts = await primaryKeyring.getAccounts()
assert.equal(createdAccounts.length, 1)
- let serialized = await primaryKeyring.serialize()
- let seedWords = 'debris dizzy just program just float decrease vacant alarm reduce speak stadium'
-
- try {
- let result = await seedPhraseVerifier.verifyAccounts(createdAccounts, seedWords)
- assert.fail("Should reject")
+ await primaryKeyring.serialize()
+ const seedWords = 'debris dizzy just program just float decrease vacant alarm reduce speak stadium'
+
+ try {
+ await seedPhraseVerifier.verifyAccounts(createdAccounts, seedWords)
+ assert.fail('Should reject')
} catch (err) {
assert.ok(err.message.indexOf('Not identical accounts!') >= 0, 'Wrong error message')
}
@@ -85,15 +84,15 @@ describe('SeedPhraseVerifier', function () {
it('should return error with undefined existing accounts', async function () {
- let createdAccounts = await primaryKeyring.getAccounts()
+ const createdAccounts = await primaryKeyring.getAccounts()
assert.equal(createdAccounts.length, 1)
- let serialized = await primaryKeyring.serialize()
- let seedWords = 'debris dizzy just program just float decrease vacant alarm reduce speak stadium'
+ await primaryKeyring.serialize()
+ const seedWords = 'debris dizzy just program just float decrease vacant alarm reduce speak stadium'
- try {
- let result = await seedPhraseVerifier.verifyAccounts(undefined, seedWords)
- assert.fail("Should reject")
+ try {
+ await seedPhraseVerifier.verifyAccounts(undefined, seedWords)
+ assert.fail('Should reject')
} catch (err) {
assert.equal(err.message, 'No created accounts defined.')
}
@@ -101,15 +100,15 @@ describe('SeedPhraseVerifier', function () {
it('should return error with empty accounts array', async function () {
- let createdAccounts = await primaryKeyring.getAccounts()
+ const createdAccounts = await primaryKeyring.getAccounts()
assert.equal(createdAccounts.length, 1)
- let serialized = await primaryKeyring.serialize()
- let seedWords = 'debris dizzy just program just float decrease vacant alarm reduce speak stadium'
+ await primaryKeyring.serialize()
+ const seedWords = 'debris dizzy just program just float decrease vacant alarm reduce speak stadium'
- try {
- let result = await seedPhraseVerifier.verifyAccounts([], seedWords)
- assert.fail("Should reject")
+ try {
+ await seedPhraseVerifier.verifyAccounts([], seedWords)
+ assert.fail('Should reject')
} catch (err) {
assert.equal(err.message, 'No created accounts defined.')
}
@@ -117,17 +116,17 @@ describe('SeedPhraseVerifier', function () {
it('should be able to verify more than one created account with seed words', async function () {
- const keyState = await keyringController.addNewAccount(primaryKeyring)
- const keyState2 = await keyringController.addNewAccount(primaryKeyring)
+ await keyringController.addNewAccount(primaryKeyring)
+ await keyringController.addNewAccount(primaryKeyring)
- let createdAccounts = await primaryKeyring.getAccounts()
+ const createdAccounts = await primaryKeyring.getAccounts()
assert.equal(createdAccounts.length, 3)
- let serialized = await primaryKeyring.serialize()
- let seedWords = serialized.mnemonic
+ const serialized = await primaryKeyring.serialize()
+ const seedWords = serialized.mnemonic
assert.notEqual(seedWords.length, 0)
-
- let result = await seedPhraseVerifier.verifyAccounts(createdAccounts, seedWords)
+
+ await seedPhraseVerifier.verifyAccounts(createdAccounts, seedWords)
})
})
})
diff --git a/test/unit/app/util-test.js b/test/unit/app/util-test.js
index 670bc4d22..656b22d92 100644
--- a/test/unit/app/util-test.js
+++ b/test/unit/app/util-test.js
@@ -38,4 +38,4 @@ describe('SufficientBalance', function () {
const result = sufficientBalance(tx, balance)
assert.ok(!result, 'insufficient balance found.')
})
-}) \ No newline at end of file
+})
diff --git a/test/unit/components/balance-component-test.js b/test/unit/components/balance-component-test.js
index 9b1e82acf..81e6fdf9e 100644
--- a/test/unit/components/balance-component-test.js
+++ b/test/unit/components/balance-component-test.js
@@ -8,7 +8,7 @@ const mockState = {
accounts: { abc: {} },
network: 1,
selectedAddress: 'abc',
- }
+ },
}
describe('BalanceComponent', function () {
diff --git a/test/unit/components/bn-as-decimal-input-test.js b/test/unit/components/bn-as-decimal-input-test.js
index 7b9d9814f..fab396548 100644
--- a/test/unit/components/bn-as-decimal-input-test.js
+++ b/test/unit/components/bn-as-decimal-input-test.js
@@ -52,13 +52,13 @@ describe('BnInput', function () {
it('can tolerate wei precision', function (done) {
const renderer = ReactTestUtils.createRenderer()
- let valueStr = '1000000000'
+ const valueStr = '1000000000'
const value = new BN(valueStr, 10)
const inputStr = '1.000000001'
- let targetStr = '1000000001'
+ const targetStr = '1000000001'
const target = new BN(targetStr, 10)
diff --git a/test/unit/components/pending-tx-test.js b/test/unit/components/pending-tx-test.js
index c6c588e1c..c68e013ac 100644
--- a/test/unit/components/pending-tx-test.js
+++ b/test/unit/components/pending-tx-test.js
@@ -13,7 +13,7 @@ const mockState = {
identities,
conversionRate: 10,
selectedAddress: 'abc',
- }
+ },
}
describe('PendingTx', function () {
diff --git a/test/unit/migrations/022-test.js b/test/unit/migrations/022-test.js
index 1333d929d..f8ee00e38 100644
--- a/test/unit/migrations/022-test.js
+++ b/test/unit/migrations/022-test.js
@@ -2,14 +2,14 @@ const assert = require('assert')
const migration22 = require('../../../app/scripts/migrations/022')
const properTime = (new Date()).getTime()
const storage = {
- "meta": {},
- "data": {
- "TransactionController": {
- "transactions": [
- { "status": "submitted" },
- { "status": "submitted", "submittedTime": properTime },
- {"status": "confirmed"},
- ]
+ 'meta': {},
+ 'data': {
+ 'TransactionController': {
+ 'transactions': [
+ { 'status': 'submitted' },
+ { 'status': 'submitted', 'submittedTime': properTime },
+ {'status': 'confirmed'},
+ ],
},
},
}
diff --git a/test/unit/migrations/023-test.js b/test/unit/migrations/023-test.js
index be432d9fa..7da94448d 100644
--- a/test/unit/migrations/023-test.js
+++ b/test/unit/migrations/023-test.js
@@ -1,12 +1,11 @@
const assert = require('assert')
const migration23 = require('../../../app/scripts/migrations/023')
-const properTime = (new Date()).getTime()
const storage = {
- "meta": {},
- "data": {
- "TransactionController": {
- "transactions": [
- ]
+ 'meta': {},
+ 'data': {
+ 'TransactionController': {
+ 'transactions': [
+ ],
},
},
}
@@ -53,7 +52,6 @@ while (transactions20.length < 20) {
}
-
storage.data.TransactionController.transactions = transactions
describe('storage is migrated successfully and the proper transactions are remove from state', () => {
diff --git a/test/unit/migrations/024-test.js b/test/unit/migrations/024-test.js
index c3c03d06b..c7b0611bc 100644
--- a/test/unit/migrations/024-test.js
+++ b/test/unit/migrations/024-test.js
@@ -4,13 +4,12 @@ const firstTimeState = {
meta: {},
data: require('../../../app/scripts/first-time-state'),
}
-const properTime = (new Date()).getTime()
const storage = {
- "meta": {},
- "data": {
- "TransactionController": {
- "transactions": [
- ]
+ 'meta': {},
+ 'data': {
+ 'TransactionController': {
+ 'transactions': [
+ ],
},
},
}
diff --git a/test/unit/migrations/025-test.js b/test/unit/migrations/025-test.js
index 76c25dbb6..1e56913a1 100644
--- a/test/unit/migrations/025-test.js
+++ b/test/unit/migrations/025-test.js
@@ -6,11 +6,11 @@ const firstTimeState = {
}
const storage = {
- "meta": {},
- "data": {
- "TransactionController": {
- "transactions": [
- ]
+ 'meta': {},
+ 'data': {
+ 'TransactionController': {
+ 'transactions': [
+ ],
},
},
}
diff --git a/test/unit/migrations/template-test.js b/test/unit/migrations/template-test.js
index 35060e2fe..0db69d65a 100644
--- a/test/unit/migrations/template-test.js
+++ b/test/unit/migrations/template-test.js
@@ -1,6 +1,5 @@
const assert = require('assert')
const migrationTemplate = require('../../../app/scripts/migrations/template')
-const properTime = (new Date()).getTime()
const storage = {
meta: {},
data: {},
diff --git a/test/unit/responsive/components/dropdown-test.js b/test/unit/responsive/components/dropdown-test.js
index 982d8c6ec..493b01918 100644
--- a/test/unit/responsive/components/dropdown-test.js
+++ b/test/unit/responsive/components/dropdown-test.js
@@ -1,24 +1,24 @@
-const assert = require('assert');
+const assert = require('assert')
-const h = require('react-hyperscript');
-const sinon = require('sinon');
-const path = require('path');
-const Dropdown = require(path.join(__dirname, '..', '..', '..', '..', 'ui', 'app', 'components', 'dropdowns', 'index.js')).Dropdown;
+const h = require('react-hyperscript')
+const sinon = require('sinon')
+const path = require('path')
+const Dropdown = require(path.join(__dirname, '..', '..', '..', '..', 'ui', 'app', 'components', 'dropdowns', 'index.js')).Dropdown
const { createMockStore } = require('redux-test-utils')
const { mountWithStore } = require('../../../lib/shallow-with-store')
const mockState = {
metamask: {
- }
+ },
}
describe('Dropdown components', function () {
- let onClickOutside;
- let closeMenu;
- let onClick;
+ let onClickOutside
+ let closeMenu
+ let onClick
- let dropdownComponentProps = {
+ const dropdownComponentProps = {
isOpen: true,
zIndex: 11,
onClickOutside,
@@ -34,9 +34,9 @@ describe('Dropdown components', function () {
let store
let component
beforeEach(function () {
- onClickOutside = sinon.spy();
- closeMenu = sinon.spy();
- onClick = sinon.spy();
+ onClickOutside = sinon.spy()
+ closeMenu = sinon.spy()
+ onClick = sinon.spy()
store = createMockStore(mockState)
component = mountWithStore(h(
@@ -61,21 +61,21 @@ describe('Dropdown components', function () {
})
it('can render two items', function () {
- const items = dropdownComponent.find('li');
- assert.equal(items.length, 2);
- });
+ const items = dropdownComponent.find('li')
+ assert.equal(items.length, 2)
+ })
- it('closes when item clicked', function() {
- const items = dropdownComponent.find('li');
- const node = items.at(0);
- node.simulate('click');
- assert.equal(node.props().closeMenu, closeMenu);
- });
+ it('closes when item clicked', function () {
+ const items = dropdownComponent.find('li')
+ const node = items.at(0)
+ node.simulate('click')
+ assert.equal(node.props().closeMenu, closeMenu)
+ })
- it('invokes click handler when item clicked', function() {
- const items = dropdownComponent.find('li');
- const node = items.at(0);
- node.simulate('click');
- assert.equal(onClick.calledOnce, true);
- });
-});
+ it('invokes click handler when item clicked', function () {
+ const items = dropdownComponent.find('li')
+ const node = items.at(0)
+ node.simulate('click')
+ assert.equal(onClick.calledOnce, true)
+ })
+})
diff --git a/test/unit/test-utils.js b/test/unit/test-utils.js
new file mode 100644
index 000000000..7d0ae4d91
--- /dev/null
+++ b/test/unit/test-utils.js
@@ -0,0 +1,17 @@
+const assert = require('assert')
+
+module.exports = {
+ assertRejects,
+}
+
+// assert.rejects added in node v10
+async function assertRejects (asyncFn, regExp) {
+ let f = () => {}
+ try {
+ await asyncFn()
+ } catch (error) {
+ f = () => { throw error }
+ } finally {
+ assert.throws(f, regExp)
+ }
+}