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 ,
2019-07-03 03:49:59 +02:00
} = require ( './func' )
2018-05-25 03:17:26 +02:00
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 ,
2019-09-07 08:44:22 +02:00
setupFetchMocking ,
2018-05-25 03:17:26 +02:00
} = require ( './helpers' )
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 ( ) {
2019-09-07 08:44:22 +02:00
await setupFetchMocking ( driver )
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-02-27 15:46:41 +01:00
await findElement ( driver , By . css ( '.welcome-page__header' ) )
const welcomeScreenBtn = await findElement ( driver , By . css ( '.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
} )
2019-02-27 15:46:41 +01:00
it ( 'clicks the "Create New Wallet" option' , async ( ) => {
const customRpcButton = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Create a Wallet')] ` ) )
customRpcButton . click ( )
await delay ( largeDelayMs )
} )
2019-03-05 16:45:01 +01:00
it ( 'clicks the "No thanks" option on the metametrics opt-in screen' , async ( ) => {
const optOutButton = await findElement ( driver , By . css ( '.btn-default' ) )
optOutButton . 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' )
2019-02-27 15:46:41 +01:00
const tosCheckBox = await findElement ( driver , By . css ( '.first-time-flow__checkbox' ) )
await tosCheckBox . click ( )
2018-06-14 08:52:51 +02:00
2019-02-27 15:46:41 +01:00
await button . click ( )
2018-06-14 08:52:51 +02:00
await delay ( regularDelayMs )
2018-06-14 09:36:14 +02:00
} )
2018-06-14 08:52:51 +02:00
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-08-02 05:57:26 +02:00
const nextScreen = ( await findElements ( driver , By . css ( 'button.first-time-flow__button' ) ) ) [ 1 ]
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 )
} )
2019-02-27 15:46:41 +01:00
it ( 'clicks through the success screen' , async ( ) => {
await findElement ( driver , By . xpath ( ` //div[contains(text(), 'Congratulations')] ` ) )
const doneButton = await findElement ( driver , By . css ( 'button.first-time-flow__button' ) )
await doneButton . click ( )
2018-05-25 03:17:26 +02:00
await delay ( regularDelayMs )
} )
} )
describe ( 'Show account information' , ( ) => {
it ( 'shows the QR code for the account' , async ( ) => {
2019-08-02 14:36:31 +02:00
await driver . findElement ( By . css ( '.account-details__details-button' ) ) . click ( )
2018-05-25 03:17:26 +02:00
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
} )
} )
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 ( ) => {
2019-08-02 14:36:31 +02:00
const accountName = await findElement ( driver , By . css ( '.account-details__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 )
} )
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 )
2019-07-31 21:56:44 +02:00
const inputAddress = await findElement ( driver , By . css ( 'input[placeholder="Search, public address (0x), or ENS"]' ) )
2019-02-08 15:22:19 +01:00
await inputAddress . sendKeys ( '0x2f318C334780961FB129D2a6c30D0763d9a5C970' )
2019-07-31 21:56:44 +02:00
const inputAmount = await findElement ( driver , By . css ( '.unit-input__input' ) )
await inputAmount . sendKeys ( '1000' )
const errorAmount = await findElement ( driver , By . css ( '.send-v2__error-amount' ) )
assert . equal ( await errorAmount . getText ( ) , 'Insufficient funds.' , 'send screen should render an insufficient fund error message' )
await inputAmount . sendKeys ( Key . BACK _SPACE )
await delay ( 50 )
await inputAmount . sendKeys ( Key . BACK _SPACE )
await delay ( 50 )
await inputAmount . sendKeys ( Key . BACK _SPACE )
await delay ( tinyDelayMs )
await assertElementNotPresent ( webdriver , driver , By . css ( '.send-v2__error-amount' ) )
const amountMax = await findElement ( driver , By . css ( '.send-v2__amount-max' ) )
await amountMax . click ( )
assert . equal ( await inputAmount . isEnabled ( ) , false )
let inputValue = await inputAmount . getAttribute ( 'value' )
assert ( Number ( inputValue ) > 99 )
await amountMax . click ( )
assert . equal ( await inputAmount . isEnabled ( ) , true )
2019-02-08 15:22:19 +01:00
await inputAmount . sendKeys ( '1' )
2019-07-31 21:56:44 +02:00
inputValue = await inputAmount . getAttribute ( 'value' )
2019-02-08 15:22:19 +01:00
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 ( )
2019-07-03 22:33:44 +02:00
await delay ( largeDelayMs * 2 )
2019-02-08 15:22:19 +01:00
} )
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 )
2019-07-31 21:56:44 +02:00
const inputAddress = await findElement ( driver , By . css ( 'input[placeholder="Search, public address (0x), or ENS"]' ) )
2019-02-08 15:22:19 +01:00
await inputAddress . sendKeys ( '0x2f318C334780961FB129D2a6c30D0763d9a5C970' )
2019-07-31 21:56:44 +02:00
const inputAmount = await findElement ( driver , By . css ( '.unit-input__input' ) )
2019-02-08 15:22:19 +01:00
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 )
2019-07-31 21:56:44 +02:00
const inputAddress = await findElement ( driver , By . css ( 'input[placeholder="Search, public address (0x), or ENS"]' ) )
2018-05-25 03:17:26 +02:00
await inputAddress . sendKeys ( '0x2f318C334780961FB129D2a6c30D0763d9a5C970' )
2019-07-31 21:56:44 +02:00
const inputAmount = await findElement ( driver , By . css ( '.unit-input__input' ) )
2018-05-25 03:17:26 +02:00
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 ( ) {
2019-07-03 22:33:44 +02:00
const transactionAmounts = await findElements ( driver , By . css ( '.currency-display-component__text' ) )
const transactionAmount = transactionAmounts [ 0 ]
assert . equal ( await transactionAmount . getText ( ) , '1' )
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 ( )
2019-03-25 17:13:23 +01:00
// await findElement(driver, By.css('.tab-bar'))
const advancedTab = await findElement ( driver , By . xpath ( ` //div[contains(text(), 'Advanced')] ` ) )
await advancedTab . click ( )
await delay ( regularDelayMs )
2019-02-13 15:03:14 +01:00
2019-07-08 19:58:35 +02:00
const showConversionToggle = await findElement ( driver , By . css ( '.settings-page__content-row:nth-of-type(6) .settings-page__content-item-col > div > div' ) )
2019-02-26 19:30:41 +01:00
await showConversionToggle . click ( )
2019-02-13 15:03:14 +01:00
const advancedGasTitle = await findElement ( driver , By . xpath ( ` //span[contains(text(), 'Advanced gas controls')] ` ) )
await driver . executeScript ( 'arguments[0].scrollIntoView(true)' , advancedGasTitle )
2019-07-08 19:58:35 +02:00
const advancedGasToggle = await findElement ( driver , By . css ( '.settings-page__content-row:nth-of-type(4) .settings-page__content-item-col > div > div' ) )
2019-02-13 15:03:14 +01:00
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' ) )
2019-03-29 15:48:08 +01:00
await gasPriceInput . sendKeys ( Key . chord ( Key . CONTROL , 'a' ) )
await delay ( 50 )
2019-02-13 15:03:14 +01:00
await gasPriceInput . sendKeys ( Key . BACK _SPACE )
2019-03-29 15:48:08 +01:00
await delay ( 50 )
2019-02-13 15:03:14 +01:00
await gasPriceInput . sendKeys ( Key . BACK _SPACE )
2019-03-29 15:48:08 +01:00
await delay ( 50 )
2019-02-13 15:03:14 +01:00
await gasPriceInput . sendKeys ( '10' )
2019-03-29 15:48:08 +01:00
await delay ( 50 )
2019-02-13 15:03:14 +01:00
await delay ( tinyDelayMs )
2019-03-29 15:48:08 +01:00
await delay ( 50 )
await gasLimitInput . sendKeys ( Key . chord ( Key . CONTROL , 'a' ) )
await delay ( 50 )
await gasLimitInput . sendKeys ( '25000' )
2019-07-03 22:33:44 +02:00
await delay ( largeDelayMs * 2 )
2019-02-13 15:03:14 +01:00
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
} )
2019-02-26 19:30:41 +01:00
let txValues
2018-07-07 00:55:30 +02:00
it ( 'finds the transaction in the transactions list' , async function ( ) {
2019-03-29 15:48:08 +01:00
await driver . wait ( async ( ) => {
const confirmedTxes = await findElements ( driver , By . css ( '.transaction-list__completed-transactions .transaction-list-item' ) )
return confirmedTxes . length === 4
} , 10000 )
2018-07-07 00:55:30 +02:00
2019-02-26 19:30:41 +01:00
txValues = await findElements ( driver , By . css ( '.transaction-list-item__amount--primary' ) )
await driver . wait ( until . elementTextMatches ( txValues [ 0 ] , /-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 ( ) {
2019-02-26 19:30:41 +01:00
await delay ( largeDelayMs )
let txGasPriceLabels
let txGasPrices
try {
await txValues [ 0 ] . click ( )
txGasPrices = await findElements ( driver , By . css ( '.transaction-breakdown__value' ) )
txGasPriceLabels = await findElements ( driver , By . css ( '.transaction-breakdown-row__title' ) )
txGasPrices = await findElements ( driver , By . css ( '.transaction-breakdown__value' ) )
await driver . wait ( until . elementTextMatches ( txGasPrices [ 3 ] , /^10$/ ) , 10000 )
} catch ( e ) {
console . log ( e . message )
txValues = await findElements ( driver , By . css ( '.transaction-list-item__amount--primary' ) )
await txValues [ 0 ] . click ( )
txGasPriceLabels = await findElements ( driver , By . css ( '.transaction-breakdown-row__title' ) )
txGasPrices = await findElements ( driver , By . css ( '.transaction-breakdown__value' ) )
await driver . wait ( until . elementTextMatches ( txGasPrices [ 3 ] , /^10$/ ) , 10000 )
}
assert ( txGasPriceLabels [ 2 ] )
2019-02-13 15:03:14 +01:00
2019-02-26 19:30:41 +01:00
await txValues [ 0 ] . click ( )
2019-02-13 15:03:14 +01:00
} )
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 ( )
2019-10-07 21:29:37 +02:00
await delay ( largeDelayMs * 2 )
2018-11-13 18:19:12 +01:00
const contractDeployment = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Deploy Contract')] ` ) , 10000 )
await contractDeployment . click ( )
2019-10-07 21:29:37 +02:00
await delay ( largeDelayMs * 2 )
2018-11-13 18:19:12 +01:00
await send3eth . click ( )
await contractDeployment . click ( )
2019-10-07 21:29:37 +02:00
await delay ( largeDelayMs * 2 )
2018-11-13 18:19:12 +01:00
await driver . switchTo ( ) . window ( extension )
2019-10-07 21:29:37 +02:00
await delay ( largeDelayMs * 2 )
2018-11-13 18:19:12 +01:00
2019-03-28 17:05:40 +01:00
let transactions = await findElements ( driver , By . css ( '.transaction-list-item' ) )
2018-11-13 18:19:12 +01:00
await transactions [ 3 ] . click ( )
await delay ( regularDelayMs )
2019-03-28 17:05:40 +01:00
try {
transactions = await findElements ( driver , By . css ( '.transaction-list-item' ) , 1000 )
await transactions [ 3 ] . click ( )
} catch ( e ) {
console . log ( e )
}
await delay ( regularDelayMs )
2018-11-13 18:19:12 +01:00
} )
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 ( ) => {
2019-07-03 22:33:44 +02:00
await delay ( tinyDelayMs )
2018-11-13 18:19:12 +01:00
const confirmButton = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Confirm')] ` ) , 10000 )
await confirmButton . click ( )
2019-07-03 22:33:44 +02:00
await delay ( largeDelayMs * 2 )
2018-11-13 18:19:12 +01:00
const navigationElement = await findElement ( driver , By . css ( '.confirm-page-container-navigation' ) )
2019-07-03 22:33:44 +02:00
await delay ( tinyDelayMs )
2018-11-13 18:19:12 +01:00
const navigationText = await navigationElement . getText ( )
assert . equal ( navigationText . includes ( '4' ) , true , 'transaction confirmed' )
} )
it ( 'rejects a transaction' , async ( ) => {
2019-03-05 16:45:01 +01:00
await delay ( tinyDelayMs / 2 )
2018-11-13 18:19:12 +01:00
const rejectButton = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Reject')] ` ) , 10000 )
2019-03-05 16:45:01 +01:00
await delay ( tinyDelayMs / 2 )
2018-11-13 18:19:12 +01:00
await rejectButton . click ( )
await delay ( regularDelayMs )
const navigationElement = await findElement ( driver , By . css ( '.confirm-page-container-navigation' ) )
2019-03-05 16:45:01 +01:00
await delay ( tinyDelayMs / 2 )
2018-11-13 18:19:12 +01:00
const navigationText = await navigationElement . getText ( )
2019-03-05 16:45:01 +01:00
await delay ( tinyDelayMs / 2 )
2018-11-13 18:19:12 +01:00
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 )
2019-07-03 22:33:44 +02:00
await delay ( largeDelayMs * 2 )
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' ) )
2019-07-03 22:33:44 +02:00
const gasLimitValue = await gasLimitInput . getAttribute ( 'value' )
assert ( Number ( gasLimitValue ) < 100000 , 'Gas Limit too high' )
2019-05-14 20:14:07 +02:00
await gasPriceInput . sendKeys ( Key . chord ( Key . CONTROL , 'a' ) )
await delay ( 50 )
await gasPriceInput . sendKeys ( Key . BACK _SPACE )
await delay ( 50 )
await gasPriceInput . sendKeys ( Key . BACK _SPACE )
await delay ( 50 )
2018-06-11 15:08:24 +02:00
await gasPriceInput . sendKeys ( '10' )
2019-05-14 20:14:07 +02:00
await delay ( 50 )
await gasLimitInput . sendKeys ( Key . chord ( Key . CONTROL , 'a' ) )
await delay ( 50 )
await gasLimitInput . sendKeys ( Key . BACK _SPACE )
await delay ( 50 )
await gasLimitInput . sendKeys ( Key . BACK _SPACE )
await delay ( 50 )
await gasLimitInput . sendKeys ( Key . BACK _SPACE )
await delay ( 50 )
await gasLimitInput . sendKeys ( Key . BACK _SPACE )
await delay ( 50 )
await gasLimitInput . sendKeys ( Key . BACK _SPACE )
await delay ( 50 )
2018-06-11 15:08:24 +02:00
await gasLimitInput . sendKeys ( '60001' )
2019-05-14 20:14:07 +02:00
await delay ( 50 )
await gasLimitInput . sendKeys ( Key . chord ( Key . CONTROL , 'e' ) )
await delay ( 50 )
2018-06-11 15:08:24 +02:00
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 )
2019-07-03 22:33:44 +02:00
await delay ( largeDelayMs * 2 )
2018-06-22 14:13:01 +02:00
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' ) )
2019-06-28 05:52:21 +02:00
await driver . wait ( until . elementTextMatches ( balance , /^10.000\s*TST\s*$/ ) )
2018-05-25 03:17:26 +02:00
const tokenAmount = await balance . getText ( )
2019-06-28 05:52:21 +02:00
assert . ok ( /^10.000\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 )
2019-07-31 21:56:44 +02:00
const inputAddress = await findElement ( driver , By . css ( 'input[placeholder="Search, public address (0x), or ENS"]' ) )
2018-06-07 14:37:41 +02:00
await inputAddress . sendKeys ( '0x2f318C334780961FB129D2a6c30D0763d9a5C970' )
2019-07-31 21:56:44 +02:00
const inputAmount = await findElement ( driver , By . css ( '.unit-input__input' ) )
2019-06-28 05:52:21 +02:00
await inputAmount . sendKeys ( '1' )
2018-06-07 14:37:41 +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-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 ( )
2019-03-29 15:48:08 +01:00
assert . equal ( functionTypeText , 'Transfer' )
2018-07-10 17:43:17 +02:00
2019-06-28 05:52:21 +02:00
const tokenAmount = await findElement ( driver , By . css ( '.confirm-page-container-summary__title-text' ) )
const tokenAmountText = await tokenAmount . getText ( )
assert . equal ( tokenAmountText , '1 TST' )
2018-07-10 17:43:17 +02:00
const confirmDataDiv = await findElement ( driver , By . css ( '.confirm-page-container-content__data-box' ) )
const confirmDataText = await confirmDataDiv . getText ( )
2019-03-28 13:23:38 +01:00
await delay ( regularDelayMs )
assert ( confirmDataText . match ( /0xa9059cbb0000000000000000000000002f318c334780961fb129d2a6c30d0763d9a5c97/ ) )
2018-07-10 17:43:17 +02:00
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' ) {
2019-06-28 05:52:21 +02:00
await driver . wait ( until . elementTextMatches ( txValues [ 0 ] , /-1\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' ) )
2019-03-29 15:48:08 +01:00
await driver . wait ( until . elementTextMatches ( txStatuses [ 0 ] , /Sent\sToken/i ) , 10000 )
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 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
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' ) )
2019-06-28 05:52:21 +02:00
await driver . wait ( until . elementTextMatches ( txListValue , /-1.5\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 )
2019-07-03 22:33:44 +02:00
const transactionAmounts = await findElements ( driver , By . css ( '.currency-display-component__text' ) )
const transactionAmount = transactionAmounts [ 0 ]
assert ( await transactionAmount . getText ( ) , '1.5 TST' )
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' ) )
2019-03-29 15:48:08 +01:00
await gasPriceInput . sendKeys ( Key . chord ( Key . CONTROL , 'a' ) )
await delay ( 50 )
2019-01-24 16:58:47 +01:00
await gasPriceInput . sendKeys ( Key . BACK _SPACE )
2019-03-29 15:48:08 +01:00
await delay ( 50 )
2019-01-24 16:58:47 +01:00
await gasPriceInput . sendKeys ( Key . BACK _SPACE )
2019-03-29 15:48:08 +01:00
await delay ( 50 )
2018-06-19 17:44:01 +02:00
await gasPriceInput . sendKeys ( '10' )
2019-03-29 15:48:08 +01:00
await delay ( 50 )
2018-06-21 18:29:20 +02:00
await gasLimitInput . sendKeys ( Key . chord ( Key . CONTROL , 'a' ) )
2019-03-29 15:48:08 +01:00
await delay ( 50 )
2019-01-24 16:58:47 +01:00
await gasLimitInput . sendKeys ( Key . BACK _SPACE )
2019-03-29 15:48:08 +01:00
await delay ( 50 )
2019-01-24 16:58:47 +01:00
await gasLimitInput . sendKeys ( Key . BACK _SPACE )
2019-03-29 15:48:08 +01:00
await delay ( 50 )
2019-01-24 16:58:47 +01:00
await gasLimitInput . sendKeys ( Key . BACK _SPACE )
2019-03-29 15:48:08 +01:00
await delay ( 50 )
2019-01-24 16:58:47 +01:00
await gasLimitInput . sendKeys ( Key . BACK _SPACE )
2019-03-29 15:48:08 +01:00
await delay ( 50 )
2019-01-24 16:58:47 +01:00
await gasLimitInput . sendKeys ( Key . BACK _SPACE )
2019-03-29 15:48:08 +01:00
await delay ( 50 )
2018-06-19 17:44:01 +02:00
await gasLimitInput . sendKeys ( '60000' )
2019-03-29 15:48:08 +01:00
await delay ( 50 )
2018-06-21 18:29:20 +02:00
await gasLimitInput . sendKeys ( Key . chord ( Key . CONTROL , 'e' ) )
2019-03-29 15:48:08 +01:00
await delay ( 50 )
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 ( ) {
2019-06-28 05:52:21 +02:00
const tokenAmount = await findElement ( driver , By . css ( '.confirm-page-container-summary__title-text' ) )
const tokenAmountText = await tokenAmount . getText ( )
assert . equal ( tokenAmountText , '1.5 TST' )
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
2019-02-26 19:30:41 +01:00
await delay ( regularDelayMs )
2018-08-07 10:57:46 +02:00
const txValues = await findElements ( driver , By . css ( '.transaction-list-item__amount--primary' ) )
2019-06-28 05:52:21 +02:00
await driver . wait ( until . elementTextMatches ( txValues [ 0 ] , /-1.5\s*TST/ ) )
2018-08-07 10:57:46 +02:00
const txStatuses = await findElements ( driver , By . css ( '.transaction-list-item__action' ) )
2019-03-29 15:48:08 +01:00
await driver . wait ( until . elementTextMatches ( txStatuses [ 0 ] , /Sent\sToken/ ) , 10000 )
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' ) )
2019-06-28 05:52:21 +02:00
await driver . wait ( until . elementTextMatches ( tokenBalanceAmount [ 0 ] , /7.500\s*TST/ ) , 10000 )
2018-06-27 19:10:16 +02:00
}
2018-06-08 15:46:47 +02:00
} )
} )
2019-03-29 15:48:08 +01:00
describe ( 'Approves a custom token from dapp' , ( ) => {
2018-07-10 17:43:17 +02:00
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 ( )
2019-08-13 14:57:18 +02:00
if ( process . env . SELENIUM _BROWSER !== 'firefox' ) {
await closeAllWindowHandlesExcept ( driver , [ extension , dapp ] )
}
2018-07-10 17:43:17 +02:00
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 ( )
2019-03-29 15:48:08 +01:00
assert . equal ( functionTypeText , 'Approve' )
2018-07-10 17:43:17 +02:00
const confirmDataDiv = await findElement ( driver , By . css ( '.confirm-page-container-content__data-box' ) )
const confirmDataText = await confirmDataDiv . getText ( )
2019-09-16 21:35:21 +02:00
assert ( confirmDataText . match ( /0x095ea7b30000000000000000000000009bc5baf874d2da8d216ae9f137804184ee5afef4/ ) )
2018-07-10 17:43:17 +02:00
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' ) )
2019-05-14 20:14:07 +02:00
await gasPriceInput . sendKeys ( Key . chord ( Key . CONTROL , 'a' ) )
await delay ( 50 )
await gasPriceInput . sendKeys ( Key . BACK _SPACE )
await delay ( 50 )
await gasPriceInput . sendKeys ( Key . BACK _SPACE )
await delay ( 50 )
2018-07-10 17:43:17 +02:00
await gasPriceInput . sendKeys ( '10' )
2019-05-14 20:14:07 +02:00
await delay ( 50 )
2018-07-10 17:43:17 +02:00
await gasLimitInput . sendKeys ( Key . chord ( Key . CONTROL , 'a' ) )
2019-05-14 20:14:07 +02:00
await delay ( 50 )
await gasLimitInput . sendKeys ( Key . BACK _SPACE )
await delay ( 50 )
await gasLimitInput . sendKeys ( Key . BACK _SPACE )
await delay ( 50 )
await gasLimitInput . sendKeys ( Key . BACK _SPACE )
await delay ( 50 )
await gasLimitInput . sendKeys ( Key . BACK _SPACE )
await delay ( 50 )
await gasLimitInput . sendKeys ( Key . BACK _SPACE )
await delay ( 50 )
await gasLimitInput . sendKeys ( '60001' )
await delay ( 50 )
2018-07-10 17:43:17 +02:00
await gasLimitInput . sendKeys ( Key . chord ( Key . CONTROL , 'e' ) )
2019-05-14 20:14:07 +02:00
await delay ( 50 )
2018-07-10 17:43:17 +02:00
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
} )
2019-09-16 21:35:21 +02:00
it ( 'shows the correct recipient' , async function ( ) {
const senderToRecipientDivs = await findElements ( driver , By . css ( '.sender-to-recipient__name' ) )
const recipientDiv = senderToRecipientDivs [ 1 ]
assert . equal ( await recipientDiv . getText ( ) , '0x9bc5...fEF4' )
} )
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-08-13 14:57:18 +02:00
if ( process . env . SELENIUM _BROWSER === 'firefox' ) {
this . skip ( )
}
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
} )
} )
2019-05-14 20:14:07 +02:00
describe ( 'Tranfers a custom token from dapp when no gas value is specified' , ( ) => {
2019-08-13 14:57:18 +02:00
before ( function ( ) {
if ( process . env . SELENIUM _BROWSER === 'firefox' ) {
this . skip ( )
}
} )
2019-05-14 20:14:07 +02:00
it ( 'transfers an already created token, without specifying gas' , 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 )
const transferTokens = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Transfer Tokens Without Gas')] ` ) )
await transferTokens . click ( )
await closeAllWindowHandlesExcept ( driver , [ extension , dapp ] )
await driver . switchTo ( ) . window ( extension )
await delay ( regularDelayMs )
await driver . wait ( async ( ) => {
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' ) )
2019-06-28 05:52:21 +02:00
await driver . wait ( until . elementTextMatches ( txListValue , /-1.5\s*TST/ ) )
2019-05-14 20:14:07 +02:00
await txListItem . click ( )
await delay ( regularDelayMs )
} )
it ( 'submits the transaction' , async function ( ) {
2019-07-03 22:33:44 +02:00
await delay ( largeDelayMs * 2 )
2019-05-14 20:14:07 +02:00
const confirmButton = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Confirm')] ` ) )
await confirmButton . click ( )
2019-07-03 22:33:44 +02:00
await delay ( largeDelayMs * 2 )
2019-05-14 20:14:07 +02:00
} )
it ( 'finds the transaction in the transactions list' , async function ( ) {
await driver . wait ( async ( ) => {
const confirmedTxes = await findElements ( driver , By . css ( '.transaction-list__completed-transactions .transaction-list-item' ) )
return confirmedTxes . length === 4
} , 10000 )
const txValues = await findElements ( driver , By . css ( '.transaction-list-item__amount--primary' ) )
2019-06-28 05:52:21 +02:00
await driver . wait ( until . elementTextMatches ( txValues [ 0 ] , /-1.5\s*TST/ ) )
2019-05-14 20:14:07 +02:00
const txStatuses = await findElements ( driver , By . css ( '.transaction-list-item__action' ) )
await driver . wait ( until . elementTextMatches ( txStatuses [ 0 ] , /Sent Tokens/ ) )
} )
} )
describe ( 'Approves a custom token from dapp when no gas value is specified' , ( ) => {
2019-08-13 14:57:18 +02:00
before ( function ( ) {
if ( process . env . SELENIUM _BROWSER === 'firefox' ) {
this . skip ( )
}
} )
2019-05-14 20:14:07 +02:00
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 Without Gas')] ` ) )
await transferTokens . click ( )
await closeAllWindowHandlesExcept ( driver , extension )
await driver . switchTo ( ) . window ( extension )
await delay ( regularDelayMs )
await driver . wait ( async ( ) => {
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' ) )
await driver . wait ( until . elementTextMatches ( txListValue , /-7\s*TST/ ) )
await txListItem . click ( )
await delay ( regularDelayMs )
} )
2019-09-16 21:35:21 +02:00
it ( 'shows the correct recipient' , async function ( ) {
const senderToRecipientDivs = await findElements ( driver , By . css ( '.sender-to-recipient__name' ) )
const recipientDiv = senderToRecipientDivs [ 1 ]
assert . equal ( await recipientDiv . getText ( ) , 'Account 2' )
} )
2019-05-14 20:14:07 +02:00
it ( 'submits the transaction' , async function ( ) {
await delay ( regularDelayMs )
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 ( ) {
await driver . wait ( async ( ) => {
const confirmedTxes = await findElements ( driver , By . css ( '.transaction-list__completed-transactions .transaction-list-item' ) )
return confirmedTxes . length === 5
} , 10000 )
const txValues = await findElements ( driver , By . css ( '.transaction-list-item__amount--primary' ) )
await driver . wait ( until . elementTextMatches ( txValues [ 0 ] , /-7\s*TST/ ) )
const txStatuses = await findElements ( driver , By . css ( '.transaction-list-item__action' ) )
await driver . wait ( until . elementTextMatches ( txStatuses [ 0 ] , /Approve/ ) )
} )
} )
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 = [
2019-03-29 04:14:00 +01:00
'http://127.0.0.1:8545/1' ,
'http://127.0.0.1:8545/2' ,
'http://127.0.0.1:8545/3' ,
'http://127.0.0.1:8545/4' ,
2018-08-19 19:25:33 +02:00
]
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 )
2019-05-09 19:27:14 +02:00
await findElement ( driver , By . css ( '.settings-page__sub-header-text' ) )
const customRpcInputs = await findElements ( driver , By . css ( 'input[type="text"]' ) )
const customRpcInput = customRpcInputs [ 1 ]
2018-08-19 19:25:33 +02:00
await customRpcInput . clear ( )
await customRpcInput . sendKeys ( customRpcUrl )
2019-06-17 16:05:47 +02:00
const customRpcSave = await findElement ( driver , By . css ( '.network-form__footer .btn-secondary' ) )
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)
2019-03-29 04:14:00 +01:00
const customRpcs = await findElements ( driver , By . xpath ( ` //span[contains(text(), 'http://127.0.0.1:8545/')] ` ) )
2018-08-19 19:25:33 +02:00
2018-10-01 16:54:30 +02:00
assert . equal ( customRpcs . length , customRpcUrls . length )
2018-08-19 19:25:33 +02:00
} )
2019-06-17 16:05:47 +02:00
it ( 'deletes a custom RPC' , async ( ) => {
const networkListItems = await findElements ( driver , By . css ( '.networks-tab__networks-list-name' ) )
const lastNetworkListItem = networkListItems [ networkListItems . length - 1 ]
await lastNetworkListItem . click ( )
await delay ( 100 )
const deleteButton = await findElement ( driver , By . css ( '.btn-danger' ) )
await deleteButton . click ( )
await delay ( regularDelayMs )
2019-07-02 14:13:02 +02:00
const confirmDeleteNetworkModal = await findElement ( driver , By . css ( 'span .modal' ) )
const byConfirmDeleteNetworkButton = By . css ( '.button.btn-danger.modal-container__footer-button' )
const confirmDeleteNetworkButton = await driver . wait ( until . elementLocated ( byConfirmDeleteNetworkButton ) )
await confirmDeleteNetworkButton . click ( )
await driver . wait ( until . stalenessOf ( confirmDeleteNetworkModal ) )
2019-06-17 16:05:47 +02:00
const newNetworkListItems = await findElements ( driver , By . css ( '.networks-tab__networks-list-name' ) )
assert . equal ( networkListItems . length - 1 , newNetworkListItems . length )
} )
2018-08-19 19:25:33 +02:00
} )
2018-08-03 22:11:31 +02:00
} )