2018-05-25 03:17:26 +02:00
const path = require ( 'path' )
const assert = require ( 'assert' )
const webdriver = require ( 'selenium-webdriver' )
2018-06-06 04:21:55 +02:00
const { By , Key , until } = webdriver
2018-05-25 03:17:26 +02:00
const {
delay ,
buildChromeWebDriver ,
buildFirefoxWebdriver ,
installWebExt ,
getExtensionIdChrome ,
getExtensionIdFirefox ,
} = require ( '../func' )
const {
2018-07-10 17:43:17 +02:00
assertElementNotPresent ,
2018-07-07 00:55:30 +02:00
checkBrowserForConsoleErrors ,
closeAllWindowHandlesExcept ,
2018-06-06 04:21:55 +02:00
findElement ,
findElements ,
2018-05-25 03:17:26 +02:00
loadExtension ,
2018-06-21 14:19:27 +02:00
openNewPage ,
2018-07-07 00:55:30 +02:00
switchToWindowWithTitle ,
verboseReportOnFailure ,
waitUntilXWindowHandles ,
2018-05-25 03:17:26 +02:00
} = require ( './helpers' )
2018-11-05 17:50:06 +01:00
const fetchMockResponses = require ( './fetch-mocks.js' )
2018-05-25 03:17:26 +02:00
describe ( 'MetaMask' , function ( ) {
let extensionId
let driver
let tokenAddress
const testSeedPhrase = 'phrase upgrade clock rough situate wedding elder clever doctor stamp excess tent'
2018-07-07 00:55:30 +02:00
const tinyDelayMs = 200
2018-05-25 03:17:26 +02:00
const regularDelayMs = tinyDelayMs * 2
const largeDelayMs = regularDelayMs * 2
this . timeout ( 0 )
this . bail ( true )
before ( async function ( ) {
2018-11-26 21:45:59 +01:00
let extensionUrl
2018-05-25 03:17:26 +02:00
switch ( process . env . SELENIUM _BROWSER ) {
case 'chrome' : {
const extPath = path . resolve ( 'dist/chrome' )
driver = buildChromeWebDriver ( extPath )
extensionId = await getExtensionIdChrome ( driver )
2018-11-26 21:45:59 +01:00
await delay ( largeDelayMs )
extensionUrl = ` chrome-extension:// ${ extensionId } /home.html `
2018-05-25 03:17:26 +02:00
break
}
case 'firefox' : {
const extPath = path . resolve ( 'dist/firefox' )
driver = buildFirefoxWebdriver ( )
await installWebExt ( driver , extPath )
2018-11-26 21:45:59 +01:00
await delay ( largeDelayMs )
2018-05-25 03:17:26 +02:00
extensionId = await getExtensionIdFirefox ( driver )
2018-11-26 21:45:59 +01:00
extensionUrl = ` moz-extension:// ${ extensionId } /home.html `
break
2018-05-25 03:17:26 +02:00
}
}
2018-11-26 21:45:59 +01:00
// Depending on the state of the application built into the above directory (extPath) and the value of
// METAMASK_DEBUG we will see different post-install behaviour and possibly some extra windows. Here we
// are closing any extraneous windows to reset us to a single window before continuing.
const [ tab1 ] = await driver . getAllWindowHandles ( )
await closeAllWindowHandlesExcept ( driver , [ tab1 ] )
await driver . switchTo ( ) . window ( tab1 )
await driver . get ( extensionUrl )
2018-05-25 03:17:26 +02:00
} )
2018-11-05 17:50:06 +01:00
beforeEach ( async function ( ) {
await driver . executeScript (
2018-12-10 22:51:00 +01:00
'window.origFetch = window.fetch.bind(window);' +
2018-11-05 17:50:06 +01:00
'window.fetch = ' +
'(...args) => { ' +
'if (args[0] === "https://ethgasstation.info/json/ethgasAPI.json") { return ' +
'Promise.resolve({ json: () => Promise.resolve(JSON.parse(\'' + fetchMockResponses . ethGasBasic + '\')) }); } else if ' +
'(args[0] === "https://ethgasstation.info/json/predictTable.json") { return ' +
2018-11-13 17:36:52 +01:00
'Promise.resolve({ json: () => Promise.resolve(JSON.parse(\'' + fetchMockResponses . ethGasPredictTable + '\')) }); } else if ' +
'(args[0] === "https://dev.blockscale.net/api/gasexpress.json") { return ' +
'Promise.resolve({ json: () => Promise.resolve(JSON.parse(\'' + fetchMockResponses . gasExpress + '\')) }); } ' +
2018-12-10 22:51:00 +01:00
'return window.origFetch(...args); }'
2018-11-05 17:50:06 +01:00
)
} )
2018-05-25 03:17:26 +02:00
afterEach ( async function ( ) {
if ( process . env . SELENIUM _BROWSER === 'chrome' ) {
const errors = await checkBrowserForConsoleErrors ( driver )
if ( errors . length ) {
const errorReports = errors . map ( err => err . message )
const errorMessage = ` Errors found in browser console: \n ${ errorReports . join ( '\n' ) } `
console . error ( new Error ( errorMessage ) )
}
}
if ( this . currentTest . state === 'failed' ) {
2018-06-23 00:20:00 +02:00
await verboseReportOnFailure ( driver , this . currentTest )
2018-05-25 03:17:26 +02:00
}
} )
after ( async function ( ) {
await driver . quit ( )
} )
2018-09-24 22:45:15 +02:00
describe ( 'Going through the first time flow' , ( ) => {
it ( 'clicks the continue button on the welcome screen' , async ( ) => {
2019-01-23 16:25:34 +01:00
const welcomeScreenBtn = await findElement ( driver , By . css ( '.welcome-page .first-time-flow__button' ) )
2018-09-24 22:45:15 +02:00
welcomeScreenBtn . click ( )
await delay ( largeDelayMs )
2018-05-25 03:17:26 +02:00
} )
it ( 'accepts a secure password' , async ( ) => {
2019-01-23 16:25:34 +01:00
const passwordBox = await findElement ( driver , By . css ( '.first-time-flow__form #create-password' ) )
const passwordBoxConfirm = await findElement ( driver , By . css ( '.first-time-flow__form #confirm-password' ) )
const button = await findElement ( driver , By . css ( '.first-time-flow__form button' ) )
2018-05-25 03:17:26 +02:00
await passwordBox . sendKeys ( 'correct horse battery staple' )
await passwordBoxConfirm . sendKeys ( 'correct horse battery staple' )
await button . click ( )
await delay ( regularDelayMs )
} )
it ( 'clicks through the unique image screen' , async ( ) => {
2019-01-23 16:25:34 +01:00
await findElement ( driver , By . css ( '.first-time-flow__unique-image' ) )
const nextScreen = await findElement ( driver , By . css ( 'button.first-time-flow__button' ) )
2018-05-25 03:17:26 +02:00
await nextScreen . click ( )
await delay ( regularDelayMs )
} )
2018-06-14 09:36:14 +02:00
it ( 'clicks through the ToS' , async ( ) => {
2018-06-14 08:52:51 +02:00
// terms of use
2019-01-23 16:25:34 +01:00
await findElement ( driver , By . css ( '.first-time-flow__markdown' ) )
const canClickThrough = await driver . findElement ( By . css ( 'button.first-time-flow__button' ) ) . isEnabled ( )
2018-05-25 03:17:26 +02:00
assert . equal ( canClickThrough , false , 'disabled continue button' )
2018-06-06 04:21:55 +02:00
const bottomOfTos = await findElement ( driver , By . linkText ( 'Attributions' ) )
2018-05-25 03:17:26 +02:00
await driver . executeScript ( 'arguments[0].scrollIntoView(true)' , bottomOfTos )
await delay ( regularDelayMs )
2019-01-23 16:25:34 +01:00
const acceptTos = await findElement ( driver , By . css ( 'button.first-time-flow__button' ) )
2018-06-11 15:06:15 +02:00
driver . wait ( until . elementIsEnabled ( acceptTos ) )
2018-05-25 03:17:26 +02:00
await acceptTos . click ( )
await delay ( regularDelayMs )
2018-06-14 09:36:14 +02:00
} )
2018-06-14 08:52:51 +02:00
2018-06-14 09:36:14 +02:00
it ( 'clicks through the privacy notice' , async ( ) => {
2018-06-14 08:52:51 +02:00
// privacy notice
2019-01-23 16:25:34 +01:00
const nextScreen = await findElement ( driver , By . css ( 'button.first-time-flow__button' ) )
2018-06-14 08:52:51 +02:00
await nextScreen . click ( )
await delay ( regularDelayMs )
2018-06-14 09:36:14 +02:00
} )
2018-06-14 08:52:51 +02:00
2018-06-14 09:36:14 +02:00
it ( 'clicks through the phishing notice' , async ( ) => {
2018-06-14 08:52:51 +02:00
// phishing notice
2019-01-23 16:25:34 +01:00
const noticeElement = await driver . findElement ( By . css ( '.first-time-flow__markdown' ) )
2018-06-14 09:23:38 +02:00
await driver . executeScript ( 'arguments[0].scrollTop = arguments[0].scrollHeight' , noticeElement )
await delay ( regularDelayMs )
2019-01-23 16:25:34 +01:00
const nextScreen = await findElement ( driver , By . css ( 'button.first-time-flow__button' ) )
2018-06-14 08:52:51 +02:00
await nextScreen . click ( )
await delay ( regularDelayMs )
2018-05-25 03:17:26 +02:00
} )
let seedPhrase
it ( 'reveals the seed phrase' , async ( ) => {
2019-01-23 16:25:34 +01:00
const byRevealButton = By . css ( '.reveal-seed-phrase__secret-blocker .reveal-seed-phrase__reveal-button' )
2018-06-11 15:06:15 +02:00
await driver . wait ( until . elementLocated ( byRevealButton , 10000 ) )
const revealSeedPhraseButton = await findElement ( driver , byRevealButton , 10000 )
2018-06-08 15:46:47 +02:00
await revealSeedPhraseButton . click ( )
2018-05-25 03:17:26 +02:00
await delay ( regularDelayMs )
2019-01-23 16:25:34 +01:00
seedPhrase = await driver . findElement ( By . css ( '.reveal-seed-phrase__secret-words' ) ) . getText ( )
2018-05-25 03:17:26 +02:00
assert . equal ( seedPhrase . split ( ' ' ) . length , 12 )
await delay ( regularDelayMs )
2019-01-23 16:25:34 +01:00
const nextScreen = await findElement ( driver , By . css ( 'button.first-time-flow__button' ) )
2018-05-25 03:17:26 +02:00
await nextScreen . click ( )
await delay ( regularDelayMs )
} )
2018-08-06 16:11:40 +02:00
async function clickWordAndWait ( word ) {
2019-01-23 16:25:34 +01:00
const xpath = ` //div[contains(@class, 'confirm-seed-phrase__seed-word--shuffled') and not(contains(@class, 'confirm-seed-phrase__seed-word--selected')) and contains(text(), ' ${ word } ')] `
2018-08-06 16:11:40 +02:00
const word0 = await findElement ( driver , By . xpath ( xpath ) , 10000 )
await word0 . click ( )
await delay ( tinyDelayMs )
}
async function retypeSeedPhrase ( words , wasReloaded , count = 0 ) {
2018-06-26 16:43:28 +02:00
try {
2018-07-09 18:08:05 +02:00
if ( wasReloaded ) {
2019-01-23 16:25:34 +01:00
const byRevealButton = By . css ( '.reveal-seed-phrase__secret-blocker .reveal-seed-phrase__reveal-button' )
2018-07-09 18:08:05 +02:00
await driver . wait ( until . elementLocated ( byRevealButton , 10000 ) )
const revealSeedPhraseButton = await findElement ( driver , byRevealButton , 10000 )
await revealSeedPhraseButton . click ( )
await delay ( regularDelayMs )
2019-01-23 16:25:34 +01:00
const nextScreen = await findElement ( driver , By . css ( 'button.first-time-flow__button' ) )
2018-07-09 18:08:05 +02:00
await nextScreen . click ( )
await delay ( regularDelayMs )
}
2018-08-07 10:57:46 +02:00
for ( let i = 0 ; i < 12 ; i ++ ) {
await clickWordAndWait ( words [ i ] )
}
2018-06-22 21:36:22 +02:00
} catch ( e ) {
2018-08-06 16:11:40 +02:00
if ( count > 2 ) {
throw e
} else {
await loadExtension ( driver , extensionId )
await retypeSeedPhrase ( words , true , count + 1 )
}
2018-06-22 21:36:22 +02:00
}
}
it ( 'can retype the seed phrase' , async ( ) => {
const words = seedPhrase . split ( ' ' )
await retypeSeedPhrase ( words )
2018-05-25 03:17:26 +02:00
2018-06-06 04:21:55 +02:00
const confirm = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Confirm')] ` ) )
2018-05-25 03:17:26 +02:00
await confirm . click ( )
await delay ( regularDelayMs )
} )
it ( 'clicks through the deposit modal' , async ( ) => {
2018-06-19 19:30:32 +02:00
const byBuyModal = By . css ( 'span .modal' )
const buyModal = await driver . wait ( until . elementLocated ( byBuyModal ) )
2018-06-06 04:21:55 +02:00
const closeModal = await findElement ( driver , By . css ( '.page-container__header-close' ) )
2018-05-25 03:17:26 +02:00
await closeModal . click ( )
2018-06-06 17:38:37 +02:00
await driver . wait ( until . stalenessOf ( buyModal ) )
2018-05-25 03:17:26 +02:00
await delay ( regularDelayMs )
} )
} )
describe ( 'Show account information' , ( ) => {
it ( 'shows the QR code for the account' , async ( ) => {
await driver . findElement ( By . css ( '.wallet-view__details-button' ) ) . click ( )
await driver . findElement ( By . css ( '.qr-wrapper' ) ) . isDisplayed ( )
await delay ( regularDelayMs )
2018-07-03 00:49:33 +02:00
const accountModal = await driver . findElement ( By . css ( 'span .modal' ) )
2018-06-11 15:06:15 +02:00
2018-05-25 03:17:26 +02:00
await driver . executeScript ( "document.querySelector('.account-modal-close').click()" )
2018-06-11 15:06:15 +02:00
await driver . wait ( until . stalenessOf ( accountModal ) )
await delay ( regularDelayMs )
2018-05-25 03:17:26 +02:00
} )
} )
2018-10-10 20:52:26 +02:00
describe ( 'Enable privacy mode' , ( ) => {
it ( 'enables privacy mode' , async ( ) => {
const networkDropdown = await findElement ( driver , By . css ( '.network-name' ) )
await networkDropdown . click ( )
await delay ( regularDelayMs )
const customRpcButton = await findElement ( driver , By . xpath ( ` //span[contains(text(), 'Custom RPC')] ` ) )
await customRpcButton . click ( )
await delay ( regularDelayMs )
2018-10-17 18:44:06 +02:00
const privacyToggle = await findElement ( driver , By . css ( '.settings-page__content-row:nth-of-type(10) .settings-page__content-item-col > div' ) )
2018-10-10 20:52:26 +02:00
await privacyToggle . click ( )
await delay ( largeDelayMs * 2 )
} )
} )
2018-05-25 03:17:26 +02:00
describe ( 'Log out an log back in' , ( ) => {
it ( 'logs out of the account' , async ( ) => {
await driver . findElement ( By . css ( '.account-menu__icon' ) ) . click ( )
await delay ( regularDelayMs )
2018-06-06 04:21:55 +02:00
const logoutButton = await findElement ( driver , By . css ( '.account-menu__logout-button' ) )
2018-05-25 03:17:26 +02:00
assert . equal ( await logoutButton . getText ( ) , 'Log out' )
await logoutButton . click ( )
await delay ( regularDelayMs )
} )
it ( 'accepts the account password after lock' , async ( ) => {
await driver . findElement ( By . id ( 'password' ) ) . sendKeys ( 'correct horse battery staple' )
await driver . findElement ( By . id ( 'password' ) ) . sendKeys ( Key . ENTER )
2018-07-09 18:08:05 +02:00
await delay ( largeDelayMs * 4 )
2018-05-25 03:17:26 +02:00
} )
} )
describe ( 'Add account' , ( ) => {
it ( 'choose Create Account from the account menu' , async ( ) => {
await driver . findElement ( By . css ( '.account-menu__icon' ) ) . click ( )
await delay ( regularDelayMs )
2018-06-06 04:21:55 +02:00
const createAccount = await findElement ( driver , By . xpath ( ` //div[contains(text(), 'Create Account')] ` ) )
2018-05-25 03:17:26 +02:00
await createAccount . click ( )
await delay ( regularDelayMs )
} )
it ( 'set account name' , async ( ) => {
2018-06-06 04:21:55 +02:00
const accountName = await findElement ( driver , By . css ( '.new-account-create-form input' ) )
2018-05-25 03:17:26 +02:00
await accountName . sendKeys ( '2nd account' )
await delay ( regularDelayMs )
2018-06-06 04:21:55 +02:00
const create = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Create')] ` ) )
2018-05-25 03:17:26 +02:00
await create . click ( )
2018-07-07 00:55:30 +02:00
await delay ( largeDelayMs )
2018-05-25 03:17:26 +02:00
} )
2018-07-07 00:55:30 +02:00
it ( 'should display correct account name' , async ( ) => {
2018-06-06 04:21:55 +02:00
const accountName = await findElement ( driver , By . css ( '.account-name' ) )
2018-05-25 03:17:26 +02:00
assert . equal ( await accountName . getText ( ) , '2nd account' )
await delay ( regularDelayMs )
} )
} )
describe ( 'Import seed phrase' , ( ) => {
it ( 'logs out of the vault' , async ( ) => {
await driver . findElement ( By . css ( '.account-menu__icon' ) ) . click ( )
await delay ( regularDelayMs )
2018-06-06 04:21:55 +02:00
const logoutButton = await findElement ( driver , By . css ( '.account-menu__logout-button' ) )
2018-05-25 03:17:26 +02:00
assert . equal ( await logoutButton . getText ( ) , 'Log out' )
await logoutButton . click ( )
await delay ( regularDelayMs )
} )
it ( 'imports seed phrase' , async ( ) => {
2018-06-06 04:21:55 +02:00
const restoreSeedLink = await findElement ( driver , By . css ( '.unlock-page__link--import' ) )
2018-05-25 03:17:26 +02:00
assert . equal ( await restoreSeedLink . getText ( ) , 'Import using account seed phrase' )
await restoreSeedLink . click ( )
await delay ( regularDelayMs )
2018-06-06 04:21:55 +02:00
const seedTextArea = await findElement ( driver , By . css ( 'textarea' ) )
2018-05-25 03:17:26 +02:00
await seedTextArea . sendKeys ( testSeedPhrase )
await delay ( regularDelayMs )
2018-06-22 19:11:18 +02:00
const passwordInputs = await driver . findElements ( By . css ( 'input' ) )
await delay ( regularDelayMs )
2018-08-14 17:08:25 +02:00
await passwordInputs [ 0 ] . sendKeys ( 'correct horse battery staple' )
await passwordInputs [ 1 ] . sendKeys ( 'correct horse battery staple' )
2018-06-22 19:11:18 +02:00
await driver . findElement ( By . css ( '.first-time-flow__button' ) ) . click ( )
2018-05-25 03:17:26 +02:00
await delay ( regularDelayMs )
} )
2018-07-26 18:02:17 +02:00
it ( 'switches to localhost' , async ( ) => {
const networkDropdown = await findElement ( driver , By . css ( '.network-name' ) )
await networkDropdown . click ( )
await delay ( regularDelayMs )
const [ localhost ] = await findElements ( driver , By . xpath ( ` //span[contains(text(), 'Localhost')] ` ) )
await localhost . click ( )
await delay ( largeDelayMs * 2 )
} )
2018-05-25 03:17:26 +02:00
it ( 'balance renders' , async ( ) => {
2018-06-06 04:21:55 +02:00
const balance = await findElement ( driver , By . css ( '.balance-display .token-amount' ) )
2018-10-21 13:12:40 +02:00
await driver . wait ( until . elementTextMatches ( balance , /100\s*ETH/ ) )
2018-05-25 03:17:26 +02:00
await delay ( regularDelayMs )
} )
} )
2019-02-08 15:22:19 +01:00
describe ( 'Send ETH from inside MetaMask using default gas' , ( ) => {
it ( 'starts a send 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 ( '.unit-input__input' ) )
await inputAddress . sendKeys ( '0x2f318C334780961FB129D2a6c30D0763d9a5C970' )
await inputAmount . sendKeys ( '1' )
const inputValue = await inputAmount . getAttribute ( 'value' )
assert . equal ( inputValue , '1' )
await delay ( regularDelayMs )
// Continue to next screen
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 findElement ( driver , By . xpath ( ` //button[contains(text(), 'Confirm')] ` ) )
await confirmButton . click ( )
await delay ( largeDelayMs )
} )
it ( 'finds the transaction in the transactions list' , async function ( ) {
const transactions = await findElements ( driver , By . css ( '.transaction-list-item' ) )
assert . equal ( transactions . length , 1 )
if ( process . env . SELENIUM _BROWSER !== 'firefox' ) {
const txValues = await findElement ( driver , By . css ( '.transaction-list-item__amount--primary' ) )
await driver . wait ( until . elementTextMatches ( txValues , /-1\s*ETH/ ) , 10000 )
}
} )
} )
describe ( 'Send ETH from inside MetaMask using fast gas option' , ( ) => {
it ( 'starts a send 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 ( '.unit-input__input' ) )
await inputAddress . sendKeys ( '0x2f318C334780961FB129D2a6c30D0763d9a5C970' )
await inputAmount . sendKeys ( '1' )
const inputValue = await inputAmount . getAttribute ( 'value' )
assert . equal ( inputValue , '1' )
// Set the gas price
const fastGas = await findElement ( driver , By . xpath ( ` //button/div/div[contains(text(), "Fast")] ` ) )
await fastGas . click ( )
await delay ( regularDelayMs )
// Continue to next screen
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 findElement ( driver , By . xpath ( ` //button[contains(text(), 'Confirm')] ` ) )
await confirmButton . click ( )
await delay ( largeDelayMs )
} )
it ( 'finds the transaction in the transactions list' , async function ( ) {
const transactions = await findElements ( driver , By . css ( '.transaction-list-item' ) )
assert . equal ( transactions . length , 2 )
if ( process . env . SELENIUM _BROWSER !== 'firefox' ) {
const txValues = await findElement ( driver , By . css ( '.transaction-list-item__amount--primary' ) )
await driver . wait ( until . elementTextMatches ( txValues , /-1\s*ETH/ ) , 10000 )
}
} )
} )
describe ( 'Send ETH from inside MetaMask using advanced gas modal' , ( ) => {
2018-11-05 17:50:06 +01:00
it ( 'starts a send transaction' , async function ( ) {
2018-06-06 04:21:55 +02:00
const sendButton = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Send')] ` ) )
2018-05-25 03:17:26 +02:00
await sendButton . click ( )
await delay ( regularDelayMs )
2018-06-06 04:21:55 +02:00
const inputAddress = await findElement ( driver , By . css ( 'input[placeholder="Recipient Address"]' ) )
2018-10-17 01:03:29 +02:00
const inputAmount = await findElement ( driver , By . css ( '.unit-input__input' ) )
2018-05-25 03:17:26 +02:00
await inputAddress . sendKeys ( '0x2f318C334780961FB129D2a6c30D0763d9a5C970' )
await inputAmount . sendKeys ( '1' )
2018-07-09 18:08:05 +02:00
const inputValue = await inputAmount . getAttribute ( 'value' )
assert . equal ( inputValue , '1' )
2018-05-25 03:17:26 +02:00
// Set the gas limit
2018-11-05 17:50:06 +01:00
const configureGas = await findElement ( driver , By . css ( '.advanced-gas-options-btn' ) )
2018-05-25 03:17:26 +02:00
await configureGas . click ( )
await delay ( regularDelayMs )
2018-06-07 14:37:41 +02:00
const gasModal = await driver . findElement ( By . css ( 'span .modal' ) )
2018-06-06 04:21:55 +02:00
const save = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Save')] ` ) )
2018-05-25 03:17:26 +02:00
await save . click ( )
2018-06-07 14:37:41 +02:00
await driver . wait ( until . stalenessOf ( gasModal ) )
2018-05-25 03:17:26 +02:00
await delay ( regularDelayMs )
// Continue to next screen
2018-06-06 04:21:55 +02:00
const nextScreen = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Next')] ` ) )
2018-05-25 03:17:26 +02:00
await nextScreen . click ( )
await delay ( regularDelayMs )
} )
it ( 'confirms the transaction' , async function ( ) {
2018-06-06 04:21:55 +02:00
const confirmButton = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Confirm')] ` ) )
2018-05-25 03:17:26 +02:00
await confirmButton . click ( )
2018-07-07 00:55:30 +02:00
await delay ( largeDelayMs )
2018-05-25 03:17:26 +02:00
} )
it ( 'finds the transaction in the transactions list' , async function ( ) {
2018-08-03 22:11:31 +02:00
const transactions = await findElements ( driver , By . css ( '.transaction-list-item' ) )
2019-02-08 15:22:19 +01:00
assert . equal ( transactions . length , 3 )
2018-05-25 03:17:26 +02:00
2018-07-07 00:55:30 +02:00
if ( process . env . SELENIUM _BROWSER !== 'firefox' ) {
2018-09-01 01:03:02 +02:00
const txValues = await findElement ( driver , By . css ( '.transaction-list-item__amount--primary' ) )
2018-10-21 13:12:40 +02:00
await driver . wait ( until . elementTextMatches ( txValues , /-1\s*ETH/ ) , 10000 )
2018-07-07 00:55:30 +02:00
}
2018-05-25 03:17:26 +02:00
} )
} )
2019-02-13 15:03:14 +01:00
describe ( 'Send ETH from dapp using advanced gas controls' , ( ) => {
2018-09-27 20:19:09 +02:00
let windowHandles
let extension
let popup
let dapp
2019-02-13 15:03:14 +01:00
it ( 'goes to the settings screen' , async ( ) => {
await driver . findElement ( By . css ( '.account-menu__icon' ) ) . click ( )
await delay ( regularDelayMs )
const settingsButton = await findElement ( driver , By . xpath ( ` //div[contains(text(), 'Settings')] ` ) )
settingsButton . click ( )
await findElement ( driver , By . css ( '.tab-bar' ) )
const advancedGasTitle = await findElement ( driver , By . xpath ( ` //span[contains(text(), 'Advanced gas controls')] ` ) )
await driver . executeScript ( 'arguments[0].scrollIntoView(true)' , advancedGasTitle )
const advancedGasToggle = await findElement ( driver , By . css ( '.settings-page__content-row:nth-of-type(11) .settings-page__content-item-col > div' ) )
await advancedGasToggle . click ( )
windowHandles = await driver . getAllWindowHandles ( )
extension = windowHandles [ 0 ]
await closeAllWindowHandlesExcept ( driver , [ extension ] )
const metamaskHomeButton = await findElement ( driver , By . css ( '.app-header__logo-container' ) )
await metamaskHomeButton . click ( )
await delay ( largeDelayMs )
} )
2018-07-07 00:55:30 +02:00
it ( 'starts a send transaction inside the dapp' , async ( ) => {
await openNewPage ( driver , 'http://127.0.0.1:8080/' )
await delay ( regularDelayMs )
2018-05-25 03:17:26 +02:00
2018-09-27 20:19:09 +02:00
await waitUntilXWindowHandles ( driver , 3 )
windowHandles = await driver . getAllWindowHandles ( )
extension = windowHandles [ 0 ]
popup = await switchToWindowWithTitle ( driver , 'MetaMask Notification' , windowHandles )
dapp = windowHandles . find ( handle => handle !== extension && handle !== popup )
2018-06-21 14:19:27 +02:00
2018-09-27 20:19:09 +02:00
await delay ( regularDelayMs )
2018-11-05 14:07:56 +01:00
const approveButton = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Connect')] ` ) )
2018-09-27 20:19:09 +02:00
await approveButton . click ( )
2018-07-07 00:55:30 +02:00
await driver . switchTo ( ) . window ( dapp )
2018-05-25 03:17:26 +02:00
await delay ( regularDelayMs )
2018-11-05 17:50:06 +01:00
} )
2018-05-25 03:17:26 +02:00
2018-11-05 17:50:06 +01:00
it ( 'initiates a send from the dapp' , async ( ) => {
2018-07-07 00:55:30 +02:00
const send3eth = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Send')] ` ) , 10000 )
await send3eth . click ( )
2018-09-27 20:19:09 +02:00
await delay ( 5000 )
2018-05-25 03:17:26 +02:00
2018-07-07 00:55:30 +02:00
windowHandles = await driver . getAllWindowHandles ( )
2018-09-27 20:19:09 +02:00
await switchToWindowWithTitle ( driver , 'MetaMask Notification' , windowHandles )
2018-05-25 03:17:26 +02:00
await delay ( regularDelayMs )
2018-08-14 17:08:25 +02:00
await assertElementNotPresent ( webdriver , driver , By . xpath ( ` //li[contains(text(), 'Data')] ` ) )
2018-07-10 17:43:17 +02:00
2019-02-13 15:03:14 +01:00
const [ gasPriceInput , gasLimitInput ] = await findElements ( driver , By . css ( '.advanced-gas-inputs__gas-edit-row__input' ) )
await gasPriceInput . clear ( )
await delay ( tinyDelayMs )
await gasPriceInput . sendKeys ( Key . BACK _SPACE )
await gasPriceInput . sendKeys ( Key . BACK _SPACE )
await gasPriceInput . sendKeys ( '10' )
await delay ( tinyDelayMs )
await gasLimitInput . sendKeys ( '5' )
await delay ( tinyDelayMs )
2018-07-07 00:55:30 +02:00
const confirmButton = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Confirm')] ` ) , 10000 )
2018-05-25 03:17:26 +02:00
await confirmButton . click ( )
await delay ( regularDelayMs )
2018-07-24 15:54:36 +02:00
await waitUntilXWindowHandles ( driver , 2 )
2018-05-25 03:17:26 +02:00
await driver . switchTo ( ) . window ( extension )
await delay ( regularDelayMs )
2018-07-07 00:55:30 +02:00
} )
it ( 'finds the transaction in the transactions list' , async function ( ) {
2018-08-03 22:11:31 +02:00
const transactions = await findElements ( driver , By . css ( '.transaction-list-item' ) )
2019-02-08 15:22:19 +01:00
assert . equal ( transactions . length , 4 )
2018-07-07 00:55:30 +02:00
2018-09-01 01:03:02 +02:00
const txValues = await findElement ( driver , By . css ( '.transaction-list-item__amount--primary' ) )
2018-10-21 13:12:40 +02:00
await driver . wait ( until . elementTextMatches ( txValues , /-3\s*ETH/ ) , 10000 )
2018-05-25 03:17:26 +02:00
} )
2019-02-13 15:03:14 +01:00
it ( 'the transaction has the expected gas price' , async function ( ) {
const txValues = await findElement ( driver , By . css ( '.transaction-list-item__amount--primary' ) )
await txValues . click ( )
await delay ( tinyDelayMs )
await findElement ( driver , By . xpath ( ` //div[contains(text(), 'Gas Price (GWEI)')] ` ) )
await findElement ( driver , By . xpath ( ` //span[contains(text(), '7')] ` ) )
txValues . click ( )
} )
2018-05-25 03:17:26 +02:00
} )
2018-11-13 18:19:12 +01:00
describe ( 'Navigate transactions' , ( ) => {
it ( 'adds multiple transactions' , async ( ) => {
await delay ( regularDelayMs )
await waitUntilXWindowHandles ( driver , 2 )
const windowHandles = await driver . getAllWindowHandles ( )
const extension = windowHandles [ 0 ]
const dapp = windowHandles [ 1 ]
await driver . switchTo ( ) . window ( dapp )
await delay ( regularDelayMs )
const send3eth = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Send')] ` ) , 10000 )
await send3eth . click ( )
await delay ( regularDelayMs )
const contractDeployment = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Deploy Contract')] ` ) , 10000 )
await contractDeployment . click ( )
await delay ( regularDelayMs )
await send3eth . click ( )
await contractDeployment . click ( )
await delay ( regularDelayMs )
await driver . switchTo ( ) . window ( extension )
await delay ( regularDelayMs )
const transactions = await findElements ( driver , By . css ( '.transaction-list-item' ) )
await transactions [ 3 ] . click ( )
await delay ( regularDelayMs )
} )
it ( 'navigates the transactions' , async ( ) => {
2019-02-08 15:22:19 +01:00
let navigateTxButtons = await findElements ( driver , By . css ( '.confirm-page-container-navigation__arrow' ) , 20000 )
2018-11-13 18:19:12 +01:00
assert . equal ( navigateTxButtons . length , 4 , 'navigation button present' )
await navigateTxButtons [ 2 ] . click ( )
let navigationElement = await findElement ( driver , By . css ( '.confirm-page-container-navigation' ) )
let navigationText = await navigationElement . getText ( )
assert . equal ( navigationText . includes ( '2' ) , true , 'changed transaction right' )
navigateTxButtons = await findElements ( driver , By . css ( '.confirm-page-container-navigation__arrow' ) )
await navigateTxButtons [ 2 ] . click ( )
navigationElement = await findElement ( driver , By . css ( '.confirm-page-container-navigation' ) )
navigationText = await navigationElement . getText ( )
assert . equal ( navigationText . includes ( '3' ) , true , 'changed transaction right' )
navigateTxButtons = await findElements ( driver , By . css ( '.confirm-page-container-navigation__arrow' ) )
await navigateTxButtons [ 2 ] . click ( )
navigationElement = await findElement ( driver , By . css ( '.confirm-page-container-navigation' ) )
navigationText = await navigationElement . getText ( )
assert . equal ( navigationText . includes ( '4' ) , true , 'changed transaction right' )
navigateTxButtons = await findElements ( driver , By . css ( '.confirm-page-container-navigation__arrow' ) )
await navigateTxButtons [ 0 ] . click ( )
navigationElement = await findElement ( driver , By . css ( '.confirm-page-container-navigation' ) )
navigationText = await navigationElement . getText ( )
assert . equal ( navigationText . includes ( '1' ) , true , 'navigate to first transaction' )
navigateTxButtons = await findElements ( driver , By . css ( '.confirm-page-container-navigation__arrow' ) )
await navigateTxButtons [ 3 ] . click ( )
navigationElement = await findElement ( driver , By . css ( '.confirm-page-container-navigation' ) )
navigationText = await navigationElement . getText ( )
assert . equal ( navigationText . split ( '4' ) . length , 3 , 'navigate to last transaction' )
navigateTxButtons = await findElements ( driver , By . css ( '.confirm-page-container-navigation__arrow' ) )
await navigateTxButtons [ 1 ] . click ( )
navigationElement = await findElement ( driver , By . css ( '.confirm-page-container-navigation' ) )
navigationText = await navigationElement . getText ( )
assert . equal ( navigationText . includes ( '3' ) , true , 'changed transaction left' )
navigateTxButtons = await findElements ( driver , By . css ( '.confirm-page-container-navigation__arrow' ) )
await navigateTxButtons [ 1 ] . click ( )
navigationElement = await findElement ( driver , By . css ( '.confirm-page-container-navigation' ) )
navigationText = await navigationElement . getText ( )
assert . equal ( navigationText . includes ( '2' ) , true , 'changed transaction left' )
} )
it ( 'adds a transaction while confirm screen is in focus' , async ( ) => {
let navigationElement = await findElement ( driver , By . css ( '.confirm-page-container-navigation' ) )
let navigationText = await navigationElement . getText ( )
assert . equal ( navigationText . includes ( '2' ) , true , 'second transaction in focus' )
const windowHandles = await driver . getAllWindowHandles ( )
const extension = windowHandles [ 0 ]
const dapp = windowHandles [ 1 ]
await driver . switchTo ( ) . window ( dapp )
await delay ( regularDelayMs )
const send3eth = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Send')] ` ) , 10000 )
await send3eth . click ( )
await delay ( regularDelayMs )
await driver . switchTo ( ) . window ( extension )
await delay ( regularDelayMs )
navigationElement = await findElement ( driver , By . css ( '.confirm-page-container-navigation' ) )
navigationText = await navigationElement . getText ( )
assert . equal ( navigationText . includes ( '3' ) , true , 'correct transaction in focus' )
} )
it ( 'confirms a transaction' , async ( ) => {
const confirmButton = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Confirm')] ` ) , 10000 )
await confirmButton . click ( )
await delay ( regularDelayMs )
const navigationElement = await findElement ( driver , By . css ( '.confirm-page-container-navigation' ) )
const navigationText = await navigationElement . getText ( )
assert . equal ( navigationText . includes ( '4' ) , true , 'transaction confirmed' )
} )
it ( 'rejects a transaction' , async ( ) => {
const rejectButton = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Reject')] ` ) , 10000 )
await rejectButton . click ( )
await delay ( regularDelayMs )
const navigationElement = await findElement ( driver , By . css ( '.confirm-page-container-navigation' ) )
const navigationText = await navigationElement . getText ( )
assert . equal ( navigationText . includes ( '3' ) , true , 'transaction rejected' )
} )
it ( 'rejects the rest of the transactions' , async ( ) => {
const rejectAllButton = await findElement ( driver , By . xpath ( ` //a[contains(text(), 'Reject 3')] ` ) , 10000 )
await rejectAllButton . click ( )
await delay ( regularDelayMs )
const rejectButton = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Reject All')] ` ) , 10000 )
await rejectButton . click ( )
await delay ( largeDelayMs * 2 )
const confirmedTxes = await findElements ( driver , By . css ( '.transaction-list__completed-transactions .transaction-list-item' ) )
2019-02-08 15:22:19 +01:00
assert . equal ( confirmedTxes . length , 5 , '5 transactions present' )
2018-11-13 18:19:12 +01:00
} )
} )
2018-06-22 14:13:01 +02:00
describe ( 'Deploy contract and call contract methods' , ( ) => {
let extension
2018-07-07 00:55:30 +02:00
let dapp
2018-07-10 17:43:17 +02:00
it ( 'creates a deploy contract transaction' , async ( ) => {
2018-07-07 00:55:30 +02:00
const windowHandles = await driver . getAllWindowHandles ( )
extension = windowHandles [ 0 ]
dapp = windowHandles [ 1 ]
await delay ( tinyDelayMs )
2018-06-11 15:08:24 +02:00
2018-07-07 00:55:30 +02:00
await driver . switchTo ( ) . window ( dapp )
2018-06-21 21:40:11 +02:00
await delay ( regularDelayMs )
2018-06-11 15:08:24 +02:00
2018-06-22 14:13:01 +02:00
const deployContractButton = await findElement ( driver , By . css ( '#deployButton' ) )
await deployContractButton . click ( )
2018-06-11 15:08:24 +02:00
await delay ( regularDelayMs )
2018-06-22 14:13:01 +02:00
await driver . switchTo ( ) . window ( extension )
2018-06-11 15:08:24 +02:00
await delay ( regularDelayMs )
2018-08-07 10:57:46 +02:00
const txListItem = await findElement ( driver , By . xpath ( ` //div[contains(text(), 'Contract Deployment')] ` ) )
2018-06-22 14:13:01 +02:00
await txListItem . click ( )
2018-08-17 03:53:54 +02:00
await delay ( largeDelayMs )
2018-07-10 17:43:17 +02:00
} )
it ( 'displays the contract creation data' , async ( ) => {
const dataTab = await findElement ( driver , By . xpath ( ` //li[contains(text(), 'Data')] ` ) )
2018-07-24 19:24:13 +02:00
await dataTab . click ( )
2018-07-15 08:36:42 +02:00
await delay ( regularDelayMs )
2018-07-10 17:43:17 +02:00
await findElement ( driver , By . xpath ( ` //div[contains(text(), '127.0.0.1')] ` ) )
const confirmDataDiv = await findElement ( driver , By . css ( '.confirm-page-container-content__data-box' ) )
const confirmDataText = await confirmDataDiv . getText ( )
assert . equal ( confirmDataText . match ( /0x608060405234801561001057600080fd5b5033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff/ ) )
2018-06-11 15:08:24 +02:00
2018-07-10 17:43:17 +02:00
const detailsTab = await findElement ( driver , By . xpath ( ` //li[contains(text(), 'Details')] ` ) )
2018-07-24 19:24:13 +02:00
await detailsTab . click ( )
2018-07-15 08:36:42 +02:00
await delay ( regularDelayMs )
2018-07-10 17:43:17 +02:00
} )
it ( 'confirms a deploy contract transaction' , async ( ) => {
2018-06-11 15:08:24 +02:00
const confirmButton = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Confirm')] ` ) )
await confirmButton . click ( )
2018-08-07 10:57:46 +02:00
await delay ( largeDelayMs )
2018-06-11 15:08:24 +02:00
2019-01-24 16:58:47 +01:00
await driver . wait ( async ( ) => {
2018-08-07 10:57:46 +02:00
const confirmedTxes = await findElements ( driver , By . css ( '.transaction-list__completed-transactions .transaction-list-item' ) )
2019-02-08 15:22:19 +01:00
return confirmedTxes . length === 6
2018-08-23 05:17:37 +02:00
} , 10000 )
2018-06-11 15:08:24 +02:00
2018-08-07 10:57:46 +02:00
const txAction = await findElements ( driver , By . css ( '.transaction-list-item__action' ) )
await driver . wait ( until . elementTextMatches ( txAction [ 0 ] , /Contract\sDeployment/ ) , 10000 )
2018-07-07 00:55:30 +02:00
await delay ( regularDelayMs )
2018-06-11 15:08:24 +02:00
} )
2018-06-22 14:13:01 +02:00
it ( 'calls and confirms a contract method where ETH is sent' , async ( ) => {
2018-07-07 00:55:30 +02:00
await driver . switchTo ( ) . window ( dapp )
2018-06-11 15:08:24 +02:00
await delay ( regularDelayMs )
2018-08-14 17:08:25 +02:00
let contractStatus = await findElement ( driver , By . css ( '#contractStatus' ) )
2018-08-14 20:58:04 +02:00
await driver . wait ( until . elementTextMatches ( contractStatus , /Deployed/ ) , 15000 )
2018-07-24 19:24:13 +02:00
2018-06-22 14:13:01 +02:00
const depositButton = await findElement ( driver , By . css ( '#depositButton' ) )
2018-06-11 15:08:24 +02:00
await depositButton . click ( )
2018-07-24 19:24:13 +02:00
await delay ( largeDelayMs )
2018-08-14 17:08:25 +02:00
contractStatus = await findElement ( driver , By . css ( '#contractStatus' ) )
await driver . wait ( until . elementTextMatches ( contractStatus , /Deposit\sinitiated/ ) , 10000 )
2018-06-11 15:08:24 +02:00
await driver . switchTo ( ) . window ( extension )
2018-07-15 08:36:42 +02:00
await delay ( largeDelayMs )
2018-06-22 14:13:01 +02:00
2018-08-07 10:57:46 +02:00
await findElements ( driver , By . css ( '.transaction-list-item' ) )
2018-09-01 01:03:02 +02:00
const [ txListValue ] = await findElements ( driver , By . css ( '.transaction-list-item__amount--primary' ) )
2018-10-21 13:12:40 +02:00
await driver . wait ( until . elementTextMatches ( txListValue , /-4\s*ETH/ ) , 10000 )
2018-07-11 19:21:58 +02:00
await txListValue . click ( )
2018-06-11 15:08:24 +02:00
await delay ( regularDelayMs )
// Set the gas limit
2018-07-09 18:08:05 +02:00
const configureGas = await findElement ( driver , By . css ( '.confirm-detail-row__header-text--edit' ) )
2018-06-11 15:08:24 +02:00
await configureGas . click ( )
await delay ( regularDelayMs )
2018-08-14 17:08:25 +02:00
const gasModal = await findElement ( driver , By . css ( 'span .modal' ) )
2018-11-05 17:50:06 +01:00
await delay ( regularDelayMs )
const modalTabs = await findElements ( driver , By . css ( '.page-container__tab' ) )
await modalTabs [ 1 ] . click ( )
await delay ( regularDelayMs )
2018-06-11 15:08:24 +02:00
2018-11-05 17:50:06 +01:00
const [ gasPriceInput , gasLimitInput ] = await findElements ( driver , By . css ( '.advanced-tab__gas-edit-row__input' ) )
2018-06-11 15:08:24 +02:00
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 )
2019-01-24 16:58:47 +01:00
await driver . wait ( async ( ) => {
2018-08-15 17:00:55 +02:00
const confirmedTxes = await findElements ( driver , By . css ( '.transaction-list__completed-transactions .transaction-list-item' ) )
2019-02-08 15:22:19 +01:00
return confirmedTxes . length === 7
2018-08-23 05:17:37 +02:00
} , 10000 )
2018-06-11 15:08:24 +02:00
2018-09-01 01:03:02 +02:00
const txValues = await findElements ( driver , By . css ( '.transaction-list-item__amount--primary' ) )
2018-10-21 13:12:40 +02:00
await driver . wait ( until . elementTextMatches ( txValues [ 0 ] , /-4\s*ETH/ ) , 10000 )
2018-06-22 14:13:01 +02:00
2018-08-07 10:57:46 +02:00
// 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}$/))
2018-06-22 14:13:01 +02:00
} )
it ( 'calls and confirms a contract method where ETH is received' , async ( ) => {
2018-07-07 00:55:30 +02:00
await driver . switchTo ( ) . window ( dapp )
2018-06-22 14:13:01 +02:00
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 )
2018-08-06 23:08:00 +02:00
const txListItem = await findElement ( driver , By . css ( '.transaction-list-item' ) )
2018-06-22 14:13:01 +02:00
await txListItem . click ( )
await delay ( regularDelayMs )
const confirmButton = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Confirm')] ` ) )
await confirmButton . click ( )
await delay ( regularDelayMs )
2019-01-24 16:58:47 +01:00
await driver . wait ( async ( ) => {
2018-08-15 17:00:55 +02:00
const confirmedTxes = await findElements ( driver , By . css ( '.transaction-list__completed-transactions .transaction-list-item' ) )
2019-02-08 15:22:19 +01:00
return confirmedTxes . length === 8
2018-08-23 05:17:37 +02:00
} , 10000 )
2018-06-11 15:08:24 +02:00
2018-09-01 01:03:02 +02:00
const txValues = await findElement ( driver , By . css ( '.transaction-list-item__amount--primary' ) )
2018-10-21 13:12:40 +02:00
await driver . wait ( until . elementTextMatches ( txValues , /-0\s*ETH/ ) , 10000 )
2018-06-22 14:13:01 +02:00
2018-07-07 00:55:30 +02:00
await closeAllWindowHandlesExcept ( driver , [ extension , dapp ] )
2018-06-11 15:08:24 +02:00
await driver . switchTo ( ) . window ( extension )
2018-06-22 14:13:01 +02:00
} )
it ( 'renders the correct ETH balance' , async ( ) => {
2018-08-24 04:19:48 +02:00
const balance = await findElement ( driver , By . css ( '.transaction-view-balance__primary-balance' ) )
2018-06-11 15:08:24 +02:00
await delay ( regularDelayMs )
2018-07-07 00:55:30 +02:00
if ( process . env . SELENIUM _BROWSER !== 'firefox' ) {
2019-02-08 15:22:19 +01:00
await driver . wait ( until . elementTextMatches ( balance , /^87.*\s*ETH.*$/ ) , 10000 )
2018-07-07 00:55:30 +02:00
const tokenAmount = await balance . getText ( )
2019-02-08 15:22:19 +01:00
assert . ok ( /^87.*\s*ETH.*$/ . test ( tokenAmount ) )
2018-07-07 00:55:30 +02:00
await delay ( regularDelayMs )
}
2018-06-11 15:08:24 +02:00
} )
} )
2018-07-07 00:55:30 +02:00
describe ( 'Add a custom token from a dapp' , ( ) => {
2018-05-25 03:17:26 +02:00
it ( 'creates a new token' , async ( ) => {
2018-08-13 19:31:07 +02:00
let windowHandles = await driver . getAllWindowHandles ( )
2018-07-07 00:55:30 +02:00
const extension = windowHandles [ 0 ]
const dapp = windowHandles [ 1 ]
await delay ( regularDelayMs * 2 )
2018-06-21 18:29:20 +02:00
2018-07-07 00:55:30 +02:00
await driver . switchTo ( ) . window ( dapp )
2018-08-13 19:31:07 +02:00
await delay ( regularDelayMs * 2 )
2018-05-25 03:17:26 +02:00
2018-06-06 04:21:55 +02:00
const createToken = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Create Token')] ` ) )
2018-05-25 03:17:26 +02:00
await createToken . click ( )
2018-08-13 19:31:07 +02:00
await delay ( largeDelayMs )
2018-05-25 03:17:26 +02:00
2018-08-13 19:31:07 +02:00
windowHandles = await driver . getAllWindowHandles ( )
const popup = windowHandles [ 2 ]
await driver . switchTo ( ) . window ( popup )
2018-05-25 03:17:26 +02:00
await delay ( regularDelayMs )
2018-12-12 15:54:03 +01:00
const configureGas = await driver . wait ( until . elementLocated ( By . css ( '.confirm-detail-row__header-text--edit' ) ) , 10000 )
await configureGas . click ( )
await delay ( regularDelayMs )
const advancedTabButton = await driver . wait ( until . elementLocated ( By . xpath ( ` //li[contains(text(), 'Advanced')] ` ) ) , 10000 )
await advancedTabButton . click ( )
await delay ( tinyDelayMs )
const [ gasPriceInput , gasLimitInput ] = await findElements ( driver , By . css ( '.advanced-tab__gas-edit-row__input' ) )
assert ( gasPriceInput . getAttribute ( 'value' ) , 20 )
assert ( gasLimitInput . getAttribute ( 'value' ) , 4700000 )
const saveButton = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Save')] ` ) )
await saveButton . click ( )
await delay ( regularDelayMs )
2018-06-06 04:21:55 +02:00
const confirmButton = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Confirm')] ` ) )
2018-05-25 03:17:26 +02:00
await confirmButton . click ( )
await delay ( regularDelayMs )
2018-07-07 00:55:30 +02:00
await driver . switchTo ( ) . window ( dapp )
await delay ( tinyDelayMs )
2018-06-21 18:29:20 +02:00
2018-07-07 00:55:30 +02:00
const tokenContractAddress = await driver . findElement ( By . css ( '#tokenAddress' ) )
await driver . wait ( until . elementTextMatches ( tokenContractAddress , /0x/ ) )
tokenAddress = await tokenContractAddress . getText ( )
2018-06-21 18:29:20 +02:00
2018-07-07 00:55:30 +02:00
await delay ( regularDelayMs )
await closeAllWindowHandlesExcept ( driver , [ extension , dapp ] )
await delay ( regularDelayMs )
2018-06-26 14:40:04 +02:00
await driver . switchTo ( ) . window ( extension )
2018-08-07 10:57:46 +02:00
await delay ( largeDelayMs )
2018-05-25 03:17:26 +02:00
} )
it ( 'clicks on the Add Token button' , async ( ) => {
2018-10-16 22:54:34 +02:00
const addToken = await driver . findElement ( By . xpath ( ` //div[contains(text(), 'Add Token')] ` ) )
2018-05-25 03:17:26 +02:00
await addToken . click ( )
await delay ( regularDelayMs )
} )
it ( 'picks the newly created Test token' , async ( ) => {
2018-07-19 02:47:01 +02:00
const addCustomToken = await findElement ( driver , By . xpath ( "//li[contains(text(), 'Custom Token')]" ) )
2018-05-25 03:17:26 +02:00
await addCustomToken . click ( )
await delay ( regularDelayMs )
2018-06-06 04:21:55 +02:00
const newTokenAddress = await findElement ( driver , By . css ( '#custom-address' ) )
2018-05-25 03:17:26 +02:00
await newTokenAddress . sendKeys ( tokenAddress )
await delay ( regularDelayMs )
2018-06-06 04:21:55 +02:00
const nextScreen = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Next')] ` ) )
2018-05-25 03:17:26 +02:00
await nextScreen . click ( )
await delay ( regularDelayMs )
2018-06-06 04:21:55 +02:00
const addTokens = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Add Tokens')] ` ) )
2018-05-25 03:17:26 +02:00
await addTokens . click ( )
await delay ( regularDelayMs )
} )
it ( 'renders the balance for the new token' , async ( ) => {
2018-11-20 01:06:34 +01:00
const balance = await findElement ( driver , By . css ( '.transaction-view-balance .transaction-view-balance__primary-balance' ) )
2018-06-20 20:17:11 +02:00
await driver . wait ( until . elementTextMatches ( balance , /^100\s*TST\s*$/ ) )
2018-05-25 03:17:26 +02:00
const tokenAmount = await balance . getText ( )
2018-06-20 20:17:11 +02:00
assert . ok ( /^100\s*TST\s*$/ . test ( tokenAmount ) )
2018-05-25 03:17:26 +02:00
await delay ( regularDelayMs )
} )
} )
2018-06-07 14:37:41 +02:00
describe ( 'Send token from inside MetaMask' , ( ) => {
2018-06-07 18:53:54 +02:00
let gasModal
2018-06-07 14:37:41 +02:00
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"]' ) )
2018-10-17 01:03:29 +02:00
const inputAmount = await findElement ( driver , By . css ( '.unit-input__input' ) )
2018-06-07 14:37:41 +02:00
await inputAddress . sendKeys ( '0x2f318C334780961FB129D2a6c30D0763d9a5C970' )
await inputAmount . sendKeys ( '50' )
// Set the gas limit
2018-11-05 17:50:06 +01:00
const configureGas = await findElement ( driver , By . css ( '.advanced-gas-options-btn' ) )
2018-06-07 14:37:41 +02:00
await configureGas . click ( )
await delay ( regularDelayMs )
2018-06-07 18:53:54 +02:00
gasModal = await driver . findElement ( By . css ( 'span .modal' ) )
2018-11-05 17:50:06 +01:00
await delay ( regularDelayMs )
2018-06-07 18:53:54 +02:00
} )
2018-11-05 17:50:06 +01:00
it ( 'opens customize gas modal' , async ( ) => {
await driver . wait ( until . elementLocated ( By . css ( '.page-container__title' ) ) )
2018-06-07 14:37:41 +02:00
const save = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Save')] ` ) )
await save . click ( )
await delay ( regularDelayMs )
2018-06-07 18:53:54 +02:00
} )
it ( 'transitions to the confirm screen' , async ( ) => {
await driver . wait ( until . stalenessOf ( gasModal ) )
2018-06-07 14:37:41 +02:00
// Continue to next screen
const nextScreen = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Next')] ` ) )
await nextScreen . click ( )
await delay ( regularDelayMs )
} )
2018-07-10 17:43:17 +02:00
it ( 'displays the token transfer data' , async ( ) => {
const dataTab = await findElement ( driver , By . xpath ( ` //li[contains(text(), 'Data')] ` ) )
dataTab . click ( )
2018-07-15 08:36:42 +02:00
await delay ( regularDelayMs )
2018-07-10 17:43:17 +02:00
const functionType = await findElement ( driver , By . css ( '.confirm-page-container-content__function-type' ) )
const functionTypeText = await functionType . getText ( )
assert . equal ( functionTypeText , 'Transfer' )
const confirmDataDiv = await findElement ( driver , By . css ( '.confirm-page-container-content__data-box' ) )
const confirmDataText = await confirmDataDiv . getText ( )
assert . equal ( confirmDataText . match ( /0xa9059cbb0000000000000000000000002f318c334780961fb129d2a6c30d0763d9a5c97/ ) )
const detailsTab = await findElement ( driver , By . xpath ( ` //li[contains(text(), 'Details')] ` ) )
detailsTab . click ( )
2018-07-15 08:36:42 +02:00
await delay ( regularDelayMs )
2018-07-10 17:43:17 +02:00
} )
2018-06-07 18:53:54 +02:00
it ( 'submits the transaction' , async function ( ) {
2018-06-07 14:37:41 +02:00
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 ( ) {
2018-08-06 23:08:00 +02:00
const transactions = await findElements ( driver , By . css ( '.transaction-list-item' ) )
2018-06-07 14:37:41 +02:00
assert . equal ( transactions . length , 1 )
2018-08-06 23:08:00 +02:00
const txValues = await findElements ( driver , By . css ( '.transaction-list-item__amount--primary' ) )
2018-06-07 14:37:41 +02:00
assert . equal ( txValues . length , 1 )
2018-06-26 14:40:04 +02:00
// 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' ) {
2018-10-21 13:12:40 +02:00
await driver . wait ( until . elementTextMatches ( txValues [ 0 ] , /-50\s*TST/ ) , 10000 )
2018-06-26 14:40:04 +02:00
}
2018-07-03 00:49:33 +02:00
2019-01-24 16:58:47 +01:00
await driver . wait ( async ( ) => {
2018-08-07 10:57:46 +02:00
const confirmedTxes = await findElements ( driver , By . css ( '.transaction-list__completed-transactions .transaction-list-item' ) )
return confirmedTxes . length === 1
2018-08-23 05:17:37 +02:00
} , 10000 )
2018-08-07 10:57:46 +02:00
const txStatuses = await findElements ( driver , By . css ( '.transaction-list-item__action' ) )
2018-08-16 21:46:40 +02:00
const tx = await driver . wait ( until . elementTextMatches ( txStatuses [ 0 ] , /Sent\sToken|Failed/ ) , 10000 )
assert . equal ( await tx . getText ( ) , 'Sent Tokens' )
2018-06-07 18:53:54 +02:00
} )
} )
2018-07-07 00:55:30 +02:00
describe ( 'Send a custom token from dapp' , ( ) => {
2018-06-19 17:44:01 +02:00
let gasModal
2018-06-07 18:53:54 +02:00
it ( 'sends an already created token' , async ( ) => {
2018-07-07 00:55:30 +02:00
const windowHandles = await driver . getAllWindowHandles ( )
const extension = windowHandles [ 0 ]
const dapp = await switchToWindowWithTitle ( driver , 'E2E Test Dapp' , windowHandles )
await closeAllWindowHandlesExcept ( driver , [ extension , dapp ] )
await delay ( regularDelayMs )
2018-06-07 18:53:54 +02:00
2018-07-07 00:55:30 +02:00
await driver . switchTo ( ) . window ( dapp )
await delay ( tinyDelayMs )
2018-06-07 18:53:54 +02:00
2018-07-07 00:55:30 +02:00
const transferTokens = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Transfer Tokens')] ` ) )
await transferTokens . click ( )
2018-06-07 18:53:54 +02:00
2018-07-10 17:43:17 +02:00
await closeAllWindowHandlesExcept ( driver , [ extension , dapp ] )
2018-06-07 18:53:54 +02:00
await driver . switchTo ( ) . window ( extension )
2018-07-10 17:43:17 +02:00
await delay ( largeDelayMs )
2018-06-07 18:53:54 +02:00
2018-08-07 10:57:46 +02:00
await findElements ( driver , By . css ( '.transaction-list__pending-transactions' ) )
const [ txListValue ] = await findElements ( driver , By . css ( '.transaction-list-item__amount--primary' ) )
2018-10-21 13:12:40 +02:00
await driver . wait ( until . elementTextMatches ( txListValue , /-7\s*TST/ ) , 10000 )
2018-07-11 19:21:58 +02:00
await txListValue . click ( )
2018-06-27 04:14:38 +02:00
await delay ( regularDelayMs )
2018-06-19 17:44:01 +02:00
// Set the gas limit
2018-07-11 19:21:58 +02:00
const configureGas = await driver . wait ( until . elementLocated ( By . css ( '.confirm-detail-row__header-text--edit' ) ) , 10000 )
2018-06-19 17:44:01 +02:00
await configureGas . click ( )
await delay ( regularDelayMs )
gasModal = await driver . findElement ( By . css ( 'span .modal' ) )
} )
it ( 'customizes gas' , async ( ) => {
2018-11-05 17:50:06 +01:00
const modalTabs = await findElements ( driver , By . css ( '.page-container__tab' ) )
await modalTabs [ 1 ] . click ( )
await delay ( regularDelayMs )
2018-06-19 17:44:01 +02:00
2018-11-05 17:50:06 +01:00
const [ gasPriceInput , gasLimitInput ] = await findElements ( driver , By . css ( '.advanced-tab__gas-edit-row__input' ) )
2018-06-19 17:44:01 +02:00
await gasPriceInput . clear ( )
2018-06-21 18:29:20 +02:00
await delay ( tinyDelayMs )
2019-01-24 16:58:47 +01:00
await gasPriceInput . sendKeys ( Key . BACK _SPACE )
await gasPriceInput . sendKeys ( Key . BACK _SPACE )
2018-06-19 17:44:01 +02:00
await gasPriceInput . sendKeys ( '10' )
2018-06-21 18:29:20 +02:00
await delay ( tinyDelayMs )
2018-06-19 17:44:01 +02:00
await gasLimitInput . clear ( )
2018-06-21 18:29:20 +02:00
await delay ( tinyDelayMs )
await gasLimitInput . sendKeys ( Key . chord ( Key . CONTROL , 'a' ) )
2019-01-24 16:58:47 +01:00
await gasLimitInput . sendKeys ( Key . BACK _SPACE )
await gasLimitInput . sendKeys ( Key . BACK _SPACE )
await gasLimitInput . sendKeys ( Key . BACK _SPACE )
await gasLimitInput . sendKeys ( Key . BACK _SPACE )
await gasLimitInput . sendKeys ( Key . BACK _SPACE )
2018-06-19 17:44:01 +02:00
await gasLimitInput . sendKeys ( '60000' )
2018-06-21 18:29:20 +02:00
await gasLimitInput . sendKeys ( Key . chord ( Key . CONTROL , 'e' ) )
2018-06-27 18:20:44 +02:00
2018-11-05 17:50:06 +01:00
const save = await findElement ( driver , By . css ( '.page-container__footer-button' ) )
2018-06-19 17:44:01 +02:00
await save . click ( )
await driver . wait ( until . stalenessOf ( gasModal ) )
2018-10-17 01:03:29 +02:00
const gasFeeInputs = await findElements ( driver , By . css ( '.confirm-detail-row__primary' ) )
2019-01-24 16:58:47 +01:00
const renderedGasFee = await gasFeeInputs [ 0 ] . getText ( )
assert . equal ( renderedGasFee , '0.0006' )
2018-06-19 17:44:01 +02:00
} )
it ( 'submits the transaction' , async function ( ) {
2018-06-07 18:53:54 +02:00
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 ( ) {
2019-01-24 16:58:47 +01:00
await driver . wait ( async ( ) => {
2018-08-07 10:57:46 +02:00
const confirmedTxes = await findElements ( driver , By . css ( '.transaction-list__completed-transactions .transaction-list-item' ) )
return confirmedTxes . length === 2
2018-08-23 05:17:37 +02:00
} , 10000 )
2018-06-07 18:53:54 +02:00
2018-08-07 10:57:46 +02:00
const txValues = await findElements ( driver , By . css ( '.transaction-list-item__amount--primary' ) )
2018-10-21 13:12:40 +02:00
await driver . wait ( until . elementTextMatches ( txValues [ 0 ] , /-7\s*TST/ ) )
2018-08-07 10:57:46 +02:00
const txStatuses = await findElements ( driver , By . css ( '.transaction-list-item__action' ) )
2018-08-16 21:46:40 +02:00
await driver . wait ( until . elementTextMatches ( txStatuses [ 0 ] , /Sent\sToken/ ) )
2018-06-08 15:46:47 +02:00
2018-06-27 12:31:37 +02:00
const walletBalance = await findElement ( driver , By . css ( '.wallet-balance' ) )
await walletBalance . click ( )
2018-06-27 04:14:38 +02:00
2018-06-08 15:46:47 +02:00
const tokenListItems = await findElements ( driver , By . css ( '.token-list-item' ) )
2018-06-27 04:14:38 +02:00
await tokenListItems [ 0 ] . click ( )
2018-08-07 10:57:46 +02:00
await delay ( regularDelayMs )
2018-06-07 18:53:54 +02:00
2018-06-27 19:10:16 +02:00
// 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' ) {
2018-11-20 01:06:34 +01:00
const tokenBalanceAmount = await findElements ( driver , By . css ( '.transaction-view-balance__primary-balance' ) )
await driver . wait ( until . elementTextMatches ( tokenBalanceAmount [ 0 ] , /43\s*TST/ ) )
2018-06-27 19:10:16 +02:00
}
2018-06-08 15:46:47 +02:00
} )
} )
2018-07-10 17:43:17 +02:00
describe ( 'Approves a custom token from dapp' , ( ) => {
let gasModal
it ( 'approves an already created token' , async ( ) => {
const windowHandles = await driver . getAllWindowHandles ( )
const extension = windowHandles [ 0 ]
const dapp = await switchToWindowWithTitle ( driver , 'E2E Test Dapp' , windowHandles )
await closeAllWindowHandlesExcept ( driver , [ extension , dapp ] )
await delay ( regularDelayMs )
await driver . switchTo ( ) . window ( dapp )
await delay ( tinyDelayMs )
const transferTokens = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Approve Tokens')] ` ) )
await transferTokens . click ( )
await closeAllWindowHandlesExcept ( driver , extension )
await driver . switchTo ( ) . window ( extension )
await delay ( regularDelayMs )
2019-01-24 16:58:47 +01:00
await driver . wait ( async ( ) => {
2018-08-07 10:57:46 +02:00
const pendingTxes = await findElements ( driver , By . css ( '.transaction-list__pending-transactions .transaction-list-item' ) )
return pendingTxes . length === 1
} , 10000 )
const [ txListItem ] = await findElements ( driver , By . css ( '.transaction-list-item' ) )
const [ txListValue ] = await findElements ( driver , By . css ( '.transaction-list-item__amount--primary' ) )
2018-10-21 13:12:40 +02:00
await driver . wait ( until . elementTextMatches ( txListValue , /-7\s*TST/ ) )
2018-07-10 17:43:17 +02:00
await txListItem . click ( )
await delay ( regularDelayMs )
} )
it ( 'displays the token approval data' , async ( ) => {
const dataTab = await findElement ( driver , By . xpath ( ` //li[contains(text(), 'Data')] ` ) )
dataTab . click ( )
2018-07-15 08:36:42 +02:00
await delay ( regularDelayMs )
2018-07-10 17:43:17 +02:00
const functionType = await findElement ( driver , By . css ( '.confirm-page-container-content__function-type' ) )
const functionTypeText = await functionType . getText ( )
assert . equal ( functionTypeText , 'Approve' )
const confirmDataDiv = await findElement ( driver , By . css ( '.confirm-page-container-content__data-box' ) )
const confirmDataText = await confirmDataDiv . getText ( )
assert . equal ( confirmDataText . match ( /0x095ea7b30000000000000000000000002f318c334780961fb129d2a6c30d0763d9a5c97/ ) )
const detailsTab = await findElement ( driver , By . xpath ( ` //li[contains(text(), 'Details')] ` ) )
detailsTab . click ( )
2018-07-15 08:36:42 +02:00
await delay ( regularDelayMs )
2018-07-10 17:43:17 +02:00
const approvalWarning = await findElement ( driver , By . css ( '.confirm-page-container-warning__warning' ) )
const approvalWarningText = await approvalWarning . getText ( )
assert ( approvalWarningText . match ( /By approving this/ ) )
2018-07-15 08:36:42 +02:00
await delay ( regularDelayMs )
2018-07-10 17:43:17 +02:00
} )
it ( 'opens the gas edit modal' , async ( ) => {
const configureGas = await driver . wait ( until . elementLocated ( By . css ( '.confirm-detail-row__header-text--edit' ) ) )
await configureGas . click ( )
await delay ( regularDelayMs )
gasModal = await driver . findElement ( By . css ( 'span .modal' ) )
} )
it ( 'customizes gas' , async ( ) => {
2018-11-05 17:50:06 +01:00
const modalTabs = await findElements ( driver , By . css ( '.page-container__tab' ) )
await modalTabs [ 1 ] . click ( )
await delay ( regularDelayMs )
2018-07-10 17:43:17 +02:00
2018-11-05 17:50:06 +01:00
const [ gasPriceInput , gasLimitInput ] = await findElements ( driver , By . css ( '.advanced-tab__gas-edit-row__input' ) )
2018-07-10 17:43:17 +02:00
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 )
}
2018-11-05 17:50:06 +01:00
const save = await findElement ( driver , By . css ( '.page-container__footer-button' ) )
2018-07-10 17:43:17 +02:00
await save . click ( )
await driver . wait ( until . stalenessOf ( gasModal ) )
2018-10-17 01:03:29 +02:00
const gasFeeInputs = await findElements ( driver , By . css ( '.confirm-detail-row__primary' ) )
assert . equal ( await gasFeeInputs [ 0 ] . getText ( ) , '0.0006' )
2018-07-10 17:43:17 +02:00
} )
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 ( ) {
2019-01-24 16:58:47 +01:00
await driver . wait ( async ( ) => {
2018-08-07 10:57:46 +02:00
const confirmedTxes = await findElements ( driver , By . css ( '.transaction-list__completed-transactions .transaction-list-item' ) )
return confirmedTxes . length === 3
2018-08-23 05:17:37 +02:00
} , 10000 )
2018-08-07 10:57:46 +02:00
const txValues = await findElements ( driver , By . css ( '.transaction-list-item__amount--primary' ) )
2018-10-21 13:12:40 +02:00
await driver . wait ( until . elementTextMatches ( txValues [ 0 ] , /-7\s*TST/ ) )
2018-08-07 10:57:46 +02:00
const txStatuses = await findElements ( driver , By . css ( '.transaction-list-item__action' ) )
await driver . wait ( until . elementTextMatches ( txStatuses [ 0 ] , /Approve/ ) )
2018-07-10 17:43:17 +02:00
} )
} )
2018-06-11 15:52:44 +02:00
describe ( 'Hide token' , ( ) => {
it ( 'hides the token when clicked' , async ( ) => {
const [ hideTokenEllipsis ] = await findElements ( driver , By . css ( '.token-list-item__ellipsis' ) )
2018-06-27 04:14:38 +02:00
await hideTokenEllipsis . click ( )
2018-06-11 15:52:44 +02:00
2018-06-19 01:35:38 +02:00
const byTokenMenuDropdownOption = By . css ( '.menu__item--clickable' )
2018-06-11 15:52:44 +02:00
const tokenMenuDropdownOption = await driver . wait ( until . elementLocated ( byTokenMenuDropdownOption ) )
2018-06-19 01:35:38 +02:00
2018-06-27 04:14:38 +02:00
await tokenMenuDropdownOption . click ( )
2018-06-11 15:52:44 +02:00
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 ) )
2018-06-27 04:14:38 +02:00
await hideTokenConfirmationButton . click ( )
2018-06-11 15:52:44 +02:00
await driver . wait ( until . stalenessOf ( confirmHideModal ) )
} )
} )
2018-06-08 15:46:47 +02:00
describe ( 'Add existing token using search' , ( ) => {
it ( 'clicks on the Add Token button' , async ( ) => {
2018-10-16 22:54:34 +02:00
const addToken = await findElement ( driver , By . xpath ( ` //div[contains(text(), 'Add Token')] ` ) )
2018-06-08 15:46:47 +02:00
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 ( ) => {
2018-11-20 01:06:34 +01:00
const balance = await findElement ( driver , By . css ( '.transaction-view-balance__primary-balance' ) )
2018-10-21 13:12:40 +02:00
await driver . wait ( until . elementTextMatches ( balance , /0\s*BAT/ ) )
2018-06-08 15:46:47 +02:00
await delay ( regularDelayMs )
2018-06-07 14:37:41 +02:00
} )
} )
2018-08-19 19:25:33 +02:00
describe ( 'Stores custom RPC history' , ( ) => {
const customRpcUrls = [
'https://mainnet.infura.io/1' ,
'https://mainnet.infura.io/2' ,
'https://mainnet.infura.io/3' ,
'https://mainnet.infura.io/4' ,
]
customRpcUrls . forEach ( customRpcUrl => {
2018-10-01 16:53:53 +02:00
it ( ` creates custom RPC: ${ customRpcUrl } ` , async ( ) => {
2018-08-19 19:25:33 +02:00
const networkDropdown = await findElement ( driver , By . css ( '.network-name' ) )
await networkDropdown . click ( )
await delay ( regularDelayMs )
const customRpcButton = await findElement ( driver , By . xpath ( ` //span[contains(text(), 'Custom RPC')] ` ) )
await customRpcButton . click ( )
await delay ( regularDelayMs )
const customRpcInput = await findElement ( driver , By . css ( 'input[placeholder="New RPC URL"]' ) )
await customRpcInput . clear ( )
await customRpcInput . sendKeys ( customRpcUrl )
2018-09-12 02:32:37 +02:00
const customRpcSave = await findElement ( driver , By . css ( '.settings-tab__rpc-save-button' ) )
2018-08-19 19:25:33 +02:00
await customRpcSave . click ( )
await delay ( largeDelayMs * 2 )
} )
} )
it ( 'selects another provider' , async ( ) => {
const networkDropdown = await findElement ( driver , By . css ( '.network-name' ) )
await networkDropdown . click ( )
await delay ( regularDelayMs )
const customRpcButton = await findElement ( driver , By . xpath ( ` //span[contains(text(), 'Main Ethereum Network')] ` ) )
await customRpcButton . click ( )
await delay ( largeDelayMs * 2 )
} )
2018-10-01 16:54:30 +02:00
it ( 'finds all recent RPCs in history' , async ( ) => {
2018-08-19 19:25:33 +02:00
const networkDropdown = await findElement ( driver , By . css ( '.network-name' ) )
await networkDropdown . click ( )
await delay ( regularDelayMs )
// only recent 3 are found and in correct order (most recent at the top)
const customRpcs = await findElements ( driver , By . xpath ( ` //span[contains(text(), 'https://mainnet.infura.io/')] ` ) )
2018-10-01 16:54:30 +02:00
assert . equal ( customRpcs . length , customRpcUrls . length )
2018-08-19 19:25:33 +02:00
} )
} )
2018-08-03 22:11:31 +02:00
} )