@ -16,6 +16,7 @@ const {
checkBrowserForConsoleErrors ,
checkBrowserForConsoleErrors ,
loadExtension ,
loadExtension ,
verboseReportOnFailure ,
verboseReportOnFailure ,
openNewPage ,
} = require ( './helpers' )
} = require ( './helpers' )
describe ( 'MetaMask' , function ( ) {
describe ( 'MetaMask' , function ( ) {
@ -62,7 +63,7 @@ describe('MetaMask', function () {
}
}
}
}
if ( this . currentTest . state === 'failed' ) {
if ( this . currentTest . state === 'failed' ) {
await verboseReportOnFailure ( this . currentTest )
await verboseReportOnFailure ( driver , this . currentTest )
}
}
} )
} )
@ -71,14 +72,20 @@ describe('MetaMask', function () {
} )
} )
describe ( 'New UI setup' , async function ( ) {
describe ( 'New UI setup' , async function ( ) {
let networkSelector
it ( 'switches to first tab' , async function ( ) {
it ( 'switches to first tab' , async function ( ) {
const [ firstTab ] = await driver . getAllWindowHandles ( )
const [ firstTab ] = await driver . getAllWindowHandles ( )
await driver . switchTo ( ) . window ( firstTab )
await driver . switchTo ( ) . window ( firstTab )
await delay ( regularDelayMs )
await delay ( regularDelayMs )
try {
networkSelector = await findElement ( driver , By . css ( '#network_component' ) )
} catch ( e ) {
await loadExtension ( driver , extensionId )
}
await delay ( regularDelayMs )
} )
} )
it ( 'use the local network' , async function ( ) {
it ( 'use the local network' , async function ( ) {
const networkSelector = await findElement ( driver , By . css ( '#network_component' ) )
await networkSelector . click ( )
await networkSelector . click ( )
await delay ( regularDelayMs )
await delay ( regularDelayMs )
@ -128,27 +135,43 @@ describe('MetaMask', function () {
await delay ( regularDelayMs )
await delay ( regularDelayMs )
} )
} )
it ( 'clicks through the privacy notice' , async ( ) => {
it ( 'clicks through the ToS' , async ( ) => {
const nextScreen = await findElement ( driver , By . css ( '.tou button' ) )
// terms of use
await nextScreen . click ( )
await delay ( regularDelayMs )
const canClickThrough = await driver . findElement ( By . css ( '.tou button' ) ) . isEnabled ( )
const canClickThrough = await driver . findElement ( By . css ( '.tou button' ) ) . isEnabled ( )
assert . equal ( canClickThrough , false , 'disabled continue button' )
assert . equal ( canClickThrough , false , 'disabled continue button' )
const bottomOfTos = await findElement ( driver , By . linkText ( 'Attributions' ) )
const bottomOfTos = await findElement ( driver , By . linkText ( 'Attributions' ) )
await driver . executeScript ( 'arguments[0].scrollIntoView(true)' , bottomOfTos )
await driver . executeScript ( 'arguments[0].scrollIntoView(true)' , bottomOfTos )
await delay ( regularDelayMs )
await delay ( regularDelayMs )
const acceptTos = await findElement ( driver , By . css ( '.tou button' ) )
const acceptTos = await findElement ( driver , By . css ( '.tou button' ) )
driver . wait ( until . elementIsEnabled ( acceptTos ) )
await acceptTos . click ( )
await acceptTos . click ( )
await delay ( regularDelayMs )
await delay ( regularDelayMs )
} )
} )
it ( 'clicks through the privacy notice' , async ( ) => {
// privacy notice
const nextScreen = await findElement ( driver , By . css ( '.tou button' ) )
await nextScreen . click ( )
await delay ( regularDelayMs )
} )
it ( 'clicks through the phishing notice' , async ( ) => {
// phishing notice
const noticeElement = await driver . findElement ( By . css ( '.markdown' ) )
await driver . executeScript ( 'arguments[0].scrollTop = arguments[0].scrollHeight' , noticeElement )
await delay ( regularDelayMs )
const nextScreen = await findElement ( driver , By . css ( '.tou button' ) )
await nextScreen . click ( )
await delay ( regularDelayMs )
} )
let seedPhrase
let seedPhrase
it ( 'reveals the seed phrase' , async ( ) => {
it ( 'reveals the seed phrase' , async ( ) => {
const revealSeedPhrase = await findElement ( driver , By . css ( '.backup-phrase__secret-blocker' ) )
const byRevealButton = By . css ( '.backup-phrase__secret-blocker .backup-phrase__reveal-button' )
await revealSeedPhrase . click ( )
await driver . wait ( until . elementLocated ( byRevealButton , 10000 ) )
const revealSeedPhraseButton = await findElement ( driver , byRevealButton , 10000 )
await revealSeedPhraseButton . click ( )
await delay ( regularDelayMs )
await delay ( regularDelayMs )
seedPhrase = await driver . findElement ( By . css ( '.backup-phrase__secret-words' ) ) . getText ( )
seedPhrase = await driver . findElement ( By . css ( '.backup-phrase__secret-words' ) ) . getText ( )
@ -160,56 +183,76 @@ describe('MetaMask', function () {
await delay ( regularDelayMs )
await delay ( regularDelayMs )
} )
} )
it ( 'can retype the seed phrase' , async ( ) => {
async function retypeSeedPhrase ( words ) {
const words = seedPhrase . split ( ' ' )
try {
const word0 = await findElement ( driver , By . xpath ( ` //button[contains(text(), ' ${ words [ 0 ] } ')] ` ) , 10000 )
const word0 = await findElement ( driver , By . xpath ( ` //button[contains(text(), ' ${ words [ 0 ] } ')] ` ) )
await word0 . click ( )
await word0 . click ( )
await delay ( tinyDelayMs )
await delay ( tinyDelayMs )
const word1 = await findElement ( driver , By . xpath ( ` //button[contains(text(), ' ${ words [ 1 ] } ')] ` ) )
const word1 = await findElement ( driver , By . xpath ( ` //button[contains(text(), ' ${ words [ 1 ] } ')] ` ) , 10000 )
await word1 . click ( )
await delay ( tinyDelayMs )
const word2 = await findElement ( driver , By . xpath ( ` //button[contains(text(), ' ${ words [ 2 ] } ')] ` ) )
await word1 . click ( )
await word2 . click ( )
await delay ( tinyDelayMs )
await delay ( tinyDelayMs )
const word3 = await findElement ( driver , By . xpath ( ` //button[contains(text(), ' ${ words [ 3 ] } ')] ` ) )
const word2 = await findElement ( driver , By . xpath ( ` //button[contains(text(), ' ${ words [ 2 ] } ')] ` ) , 10000 )
await word3 . click ( )
await delay ( tinyDelayMs )
const word4 = await findElement ( driver , By . xpath ( ` //button[contains(text(), ' ${ words [ 4 ] } ')] ` ) )
await word2 . click ( )
await word4 . click ( )
await delay ( tinyDelayMs )
await delay ( tinyDelayMs )
const word5 = await findElement ( driver , By . xpath ( ` //button[contains(text(), ' ${ words [ 5 ] } ')] ` ) )
const word3 = await findElement ( driver , By . xpath ( ` //button[contains(text(), ' ${ words [ 3 ] } ')] ` ) , 10000 )
await word5 . click ( )
await delay ( tinyDelayMs )
const word6 = await findElement ( driver , By . xpath ( ` //button[contains(text(), ' ${ words [ 6 ] } ')] ` ) )
await word3 . click ( )
await word6 . click ( )
await delay ( tinyDelayMs )
await delay ( tinyDelayMs )
const word7 = await findElement ( driver , By . xpath ( ` //button[contains(text(), ' ${ words [ 7 ] } ')] ` ) )
const word4 = await findElement ( driver , By . xpath ( ` //button[contains(text(), ' ${ words [ 4 ] } ')] ` ) , 10000 )
await word7 . click ( )
await delay ( tinyDelayMs )
const word8 = await findElement ( driver , By . xpath ( ` //button[contains(text(), ' ${ words [ 8 ] } ')] ` ) )
await word4 . click ( )
await word8 . click ( )
await delay ( tinyDelayMs )
await delay ( tinyDelayMs )
const word9 = await findElement ( driver , By . xpath ( ` //button[contains(text(), ' ${ words [ 9 ] } ')] ` ) )
const word5 = await findElement ( driver , By . xpath ( ` //button[contains(text(), ' ${ words [ 5 ] } ')] ` ) , 10000 )
await word9 . click ( )
await delay ( tinyDelayMs )
const word10 = await findElement ( driver , By . xpath ( ` //button[contains(text(), ' ${ words [ 10 ] } ')] ` ) )
await word5 . click ( )
await word10 . click ( )
await delay ( tinyDelayMs )
await delay ( tinyDelayMs )
const word11 = await findElement ( driver , By . xpath ( ` //button[contains(text(), ' ${ words [ 11 ] } ')] ` ) )
const word6 = await findElement ( driver , By . xpath ( ` //button[contains(text(), ' ${ words [ 6 ] } ')] ` ) , 10000 )
await word11 . click ( )
await delay ( tinyDelayMs )
await word6 . click ( )
await delay ( tinyDelayMs )
const word7 = await findElement ( driver , By . xpath ( ` //button[contains(text(), ' ${ words [ 7 ] } ')] ` ) , 10000 )
await word7 . click ( )
await delay ( tinyDelayMs )
const word8 = await findElement ( driver , By . xpath ( ` //button[contains(text(), ' ${ words [ 8 ] } ')] ` ) , 10000 )
await word8 . click ( )
await delay ( tinyDelayMs )
const word9 = await findElement ( driver , By . xpath ( ` //button[contains(text(), ' ${ words [ 9 ] } ')] ` ) , 10000 )
await word9 . click ( )
await delay ( tinyDelayMs )
const word10 = await findElement ( driver , By . xpath ( ` //button[contains(text(), ' ${ words [ 10 ] } ')] ` ) , 10000 )
await word10 . click ( )
await delay ( tinyDelayMs )
const word11 = await findElement ( driver , By . xpath ( ` //button[contains(text(), ' ${ words [ 11 ] } ')] ` ) , 10000 )
await word11 . click ( )
await delay ( tinyDelayMs )
} catch ( e ) {
await loadExtension ( driver , extensionId )
await retypeSeedPhrase ( words )
}
}
it ( 'can retype the seed phrase' , async ( ) => {
const words = seedPhrase . split ( ' ' )
await retypeSeedPhrase ( words )
const confirm = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Confirm')] ` ) )
const confirm = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Confirm')] ` ) )
await confirm . click ( )
await confirm . click ( )
@ -217,7 +260,8 @@ describe('MetaMask', function () {
} )
} )
it ( 'clicks through the deposit modal' , async ( ) => {
it ( 'clicks through the deposit modal' , async ( ) => {
const buyModal = await driver . findElement ( By . css ( 'span .modal' ) )
const byBuyModal = By . css ( 'span .modal' )
const buyModal = await driver . wait ( until . elementLocated ( byBuyModal ) )
const closeModal = await findElement ( driver , By . css ( '.page-container__header-close' ) )
const closeModal = await findElement ( driver , By . css ( '.page-container__header-close' ) )
await closeModal . click ( )
await closeModal . click ( )
await driver . wait ( until . stalenessOf ( buyModal ) )
await driver . wait ( until . stalenessOf ( buyModal ) )
@ -231,8 +275,12 @@ describe('MetaMask', function () {
await driver . findElement ( By . css ( '.qr-wrapper' ) ) . isDisplayed ( )
await driver . findElement ( By . css ( '.qr-wrapper' ) ) . isDisplayed ( )
await delay ( regularDelayMs )
await delay ( regularDelayMs )
let accountModal = await driver . findElement ( By . css ( 'span .modal' ) )
await driver . executeScript ( "document.querySelector('.account-modal-close').click()" )
await driver . executeScript ( "document.querySelector('.account-modal-close').click()" )
await delay ( regularDelayMs * 4 )
await driver . wait ( until . stalenessOf ( accountModal ) )
await delay ( regularDelayMs )
} )
} )
} )
} )
@ -332,8 +380,11 @@ describe('MetaMask', function () {
await configureGas . click ( )
await configureGas . click ( )
await delay ( regularDelayMs )
await delay ( regularDelayMs )
const gasModal = await driver . findElement ( By . css ( 'span .modal' ) )
const save = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Save')] ` ) )
const save = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Save')] ` ) )
await save . click ( )
await save . click ( )
await driver . wait ( until . stalenessOf ( gasModal ) )
await delay ( regularDelayMs )
await delay ( regularDelayMs )
// Continue to next screen
// Continue to next screen
@ -352,19 +403,20 @@ describe('MetaMask', function () {
const transactions = await findElements ( driver , By . css ( '.tx-list-item' ) )
const transactions = await findElements ( driver , By . css ( '.tx-list-item' ) )
assert . equal ( transactions . length , 1 )
assert . equal ( transactions . length , 1 )
const txValues = await findElements ( driver , By . css ( '.tx-list-value' ) )
const txValues = await findElement ( driver , By . css ( '.tx-list-value' ) )
assert . equal ( txValues . length , 1 )
await driver . wait ( until . elementTextMatches ( txValues , /1\sETH/ ) , 10000 )
assert . equal ( await txValues [ 0 ] . getText ( ) , '1 ETH' )
} )
} )
} )
} )
describe ( 'Send ETH from Faucet' , ( ) => {
describe ( 'Send ETH from Faucet' , ( ) => {
it ( 'starts a send transaction inside Faucet' , async ( ) => {
it ( 'starts a send transaction inside Faucet' , async ( ) => {
await driver . executeScript ( 'window.open("https://faucet.metamask.io")' )
await openNewPage ( driver , 'https://faucet.metamask.io' )
await delay ( waitingNewPageDelayMs )
const [ extension , faucet ] = await driver . getAllWindowHandles ( )
const [ extension , faucet ] = await driver . getAllWindowHandles ( )
await driver . switchTo ( ) . window ( faucet )
await driver . switchTo ( ) . window ( faucet )
const faucetPageTitle = await findElement ( driver , By . css ( '.container-fluid' ) )
await driver . wait ( until . elementTextMatches ( faucetPageTitle , /MetaMask/ ) )
await delay ( regularDelayMs )
await delay ( regularDelayMs )
const send1eth = await findElement ( driver , By . xpath ( ` //button[contains(text(), '10 ether')] ` ) , 14000 )
const send1eth = await findElement ( driver , By . xpath ( ` //button[contains(text(), '10 ether')] ` ) , 14000 )
@ -390,47 +442,133 @@ describe('MetaMask', function () {
} )
} )
} )
} )
describe ( 'Add existing token using search' , ( ) => {
describe ( 'Deploy contract and call contract methods' , ( ) => {
it ( 'clicks on the Add Token button' , async ( ) => {
let extension
const addToken = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Add Token')] ` ) )
let contractTestPage
await addToken . click ( )
it ( 'confirms a deploy contract transaction' , async ( ) => {
await openNewPage ( driver , 'http://127.0.0.1:8080/' ) ;
[ extension , contractTestPage ] = await driver . getAllWindowHandles ( )
await delay ( regularDelayMs )
const deployContractButton = await findElement ( driver , By . css ( '#deployButton' ) )
await deployContractButton . click ( )
await delay ( regularDelayMs )
await driver . switchTo ( ) . window ( extension )
await delay ( regularDelayMs )
await delay ( regularDelayMs )
const txListItem = await findElement ( driver , By . css ( '.tx-list-item' ) )
await txListItem . click ( )
await delay ( regularDelayMs )
const confirmButton = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Confirm')] ` ) )
await confirmButton . click ( )
await delay ( regularDelayMs )
const txStatuses = await findElements ( driver , By . css ( '.tx-list-status' ) )
await driver . wait ( until . elementTextMatches ( txStatuses [ 0 ] , /Confirmed/ ) )
const txAccounts = await findElements ( driver , By . css ( '.tx-list-account' ) )
assert . equal ( await txAccounts [ 0 ] . getText ( ) , 'Contract Deployment' )
} )
} )
it ( 'can pick a token from the existing options' , async ( ) => {
it ( 'calls and confirms a contract method where ETH is sent' , async ( ) => {
const tokenSearch = await findElement ( driver , By . css ( '#search-tokens' ) )
await driver . switchTo ( ) . window ( contractTestPage )
await tokenSearch . sendKeys ( 'BAT' )
await delay ( regularDelayMs )
await delay ( regularDelayMs )
const token = await findElement ( driver , By . xpath ( "//span[contains(text(), 'BAT')]" ) )
const depositBut ton = await findElement ( driver , By . css ( '#depositButton' ) )
await token . click ( )
await depositBut ton. click ( )
await delay ( regularDelayMs )
await delay ( regularDelayMs )
const nextScreen = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Next')] ` ) )
await driver . switchTo ( ) . window ( extension )
await nextScreen . click ( )
await delay ( regularDelayMs )
await delay ( regularDelayMs )
const addTokens = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Add Tokens')] ` ) )
const txListItem = await findElement ( driver , By . css ( '.tx-list-item' ) )
await addTokens . click ( )
await txListItem . click ( )
await delay ( largeDelayMs )
await delay ( regularDelayMs )
// Set the gas limit
const configureGas = await findElement ( driver , By . css ( '.sliders-icon-container' ) )
await configureGas . click ( )
await delay ( regularDelayMs )
let gasModal = await driver . findElement ( By . css ( 'span .modal' ) )
await driver . wait ( until . elementLocated ( By . css ( '.send-v2__customize-gas__title' ) ) )
const [ gasPriceInput , gasLimitInput ] = await findElements ( driver , By . css ( '.customize-gas-input' ) )
await gasPriceInput . clear ( )
await gasPriceInput . sendKeys ( '10' )
await gasLimitInput . clear ( )
await gasLimitInput . sendKeys ( '60001' )
const save = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Save')] ` ) )
await save . click ( )
await delay ( regularDelayMs )
await driver . wait ( until . stalenessOf ( gasModal ) )
const confirmButton = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Confirm')] ` ) )
await confirmButton . click ( )
await delay ( regularDelayMs )
const txStatuses = await findElements ( driver , By . css ( '.tx-list-status' ) )
await driver . wait ( until . elementTextMatches ( txStatuses [ 0 ] , /Confirmed/ ) )
const txValues = await findElement ( driver , By . css ( '.tx-list-value' ) )
await driver . wait ( until . elementTextMatches ( txValues , /3\sETH/ ) , 10000 )
const txAccounts = await findElements ( driver , By . css ( '.tx-list-account' ) )
const firstTxAddress = await txAccounts [ 0 ] . getText ( )
assert ( firstTxAddress . match ( /^0x\w{8}\.{3}\w{4}$/ ) )
} )
} )
it ( 'renders the balance for the chosen token' , async ( ) => {
it ( 'calls and confirms a contract method where ETH is received' , async ( ) => {
await driver . switchTo ( ) . window ( contractTestPage )
await delay ( regularDelayMs )
const withdrawButton = await findElement ( driver , By . css ( '#withdrawButton' ) )
await withdrawButton . click ( )
await delay ( regularDelayMs )
await driver . switchTo ( ) . window ( extension )
await delay ( regularDelayMs )
const txListItem = await findElement ( driver , By . css ( '.tx-list-item' ) )
await txListItem . click ( )
await delay ( regularDelayMs )
const confirmButton = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Confirm')] ` ) )
await confirmButton . click ( )
await delay ( regularDelayMs )
const txStatuses = await findElements ( driver , By . css ( '.tx-list-status' ) )
await driver . wait ( until . elementTextMatches ( txStatuses [ 0 ] , /Confirmed/ ) )
const txValues = await findElement ( driver , By . css ( '.tx-list-value' ) )
await driver . wait ( until . elementTextMatches ( txValues , /0\sETH/ ) , 10000 )
await driver . switchTo ( ) . window ( contractTestPage )
await driver . close ( )
await driver . switchTo ( ) . window ( extension )
} )
it ( 'renders the correct ETH balance' , async ( ) => {
const balance = await findElement ( driver , By . css ( '.tx-view .balance-display .token-amount' ) )
const balance = await findElement ( driver , By . css ( '.tx-view .balance-display .token-amount' ) )
await driver . wait ( until . elementTextIs ( balance , '0BAT' ) )
await driver . wait ( until . elementTextMatche s ( balance , /^86.*ETH.*$/ ) , 10000 )
const tokenAmount = await balance . getText ( )
const tokenAmount = await balance . getText ( )
assert . equal ( tokenAmount , '0BAT' )
assert . ok ( /^86.*ETH.*$/ . test ( tokenAmount ) )
await delay ( regularDelayMs )
await delay ( regularDelayMs )
} )
} )
} )
} )
describe ( 'Add a custom token from TokenFactory' , ( ) => {
describe ( 'Add a custom token from TokenFactory' , ( ) => {
it ( 'creates a new token' , async ( ) => {
it ( 'creates a new token' , async ( ) => {
await driver . executeScript ( 'window.open("https://tokenfactory.surge.sh/#/factory")' )
openNewPage ( driver , 'https://tokenfactory.surge.sh/#/factory' )
await delay ( waitingNewPageDelayMs )
await delay ( regularDelayMs * 10 )
const [ extension , tokenFactory ] = await driver . getAllWindowHandles ( )
const [ extension , tokenFactory ] = await driver . getAllWindowHandles ( )
await driver . switchTo ( ) . window ( tokenFactory )
const [
const [
totalSupply ,
totalSupply ,
tokenName ,
tokenName ,
@ -457,12 +595,16 @@ describe('MetaMask', function () {
await driver . switchTo ( ) . window ( tokenFactory )
await driver . switchTo ( ) . window ( tokenFactory )
await delay ( regularDelayMs )
await delay ( regularDelayMs )
const tokenContactAddress = await driver . findElement ( By . css ( 'div > div > div:nth-child(2) > span:nth-child(3)' ) )
const tokenContactAddress = await driver . findElement ( By . css ( 'div > div > div:nth-child(2) > span:nth-child(3)' ) )
tokenAddress = await tokenContactAddress . getText ( )
tokenAddress = await tokenContactAddress . getText ( )
await driver . close ( )
await driver . close ( )
await driver . switchTo ( ) . window ( extension )
await driver . switchTo ( ) . window ( extension )
await loadExtension ( driver , extensionId )
await loadExtension ( driver , extensionId )
await driver . switchTo ( ) . window ( extension )
await delay ( regularDelayMs )
await delay ( regularDelayMs )
} )
} )
it ( 'clicks on the Add Token button' , async ( ) => {
it ( 'clicks on the Add Token button' , async ( ) => {
@ -491,9 +633,217 @@ describe('MetaMask', function () {
it ( 'renders the balance for the new token' , async ( ) => {
it ( 'renders the balance for the new token' , async ( ) => {
const balance = await findElement ( driver , By . css ( '.tx-view .balance-display .token-amount' ) )
const balance = await findElement ( driver , By . css ( '.tx-view .balance-display .token-amount' ) )
await driver . wait ( until . elementTextI s ( balance , '100TST' ) )
await driver . wait ( until . elementTextMatche s ( balance , /^100\s*TST\s*$/ ) )
const tokenAmount = await balance . getText ( )
const tokenAmount = await balance . getText ( )
assert . equal ( tokenAmount , '100TST' )
assert . ok ( /^100\s*TST\s*$/ . test ( tokenAmount ) )
await delay ( regularDelayMs )
} )
} )
describe ( 'Send token from inside MetaMask' , ( ) => {
let gasModal
it ( 'starts to send a transaction' , async function ( ) {
const sendButton = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Send')] ` ) )
await sendButton . click ( )
await delay ( regularDelayMs )
const inputAddress = await findElement ( driver , By . css ( 'input[placeholder="Recipient Address"]' ) )
const inputAmount = await findElement ( driver , By . css ( '.currency-display__input' ) )
await inputAddress . sendKeys ( '0x2f318C334780961FB129D2a6c30D0763d9a5C970' )
await inputAmount . sendKeys ( '50' )
// Set the gas limit
const configureGas = await findElement ( driver , By . css ( '.send-v2__gas-fee-display button' ) )
await configureGas . click ( )
await delay ( regularDelayMs )
gasModal = await driver . findElement ( By . css ( 'span .modal' ) )
} )
it ( 'customizes gas' , async ( ) => {
await driver . wait ( until . elementLocated ( By . css ( '.send-v2__customize-gas__title' ) ) )
const save = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Save')] ` ) )
await save . click ( )
await delay ( regularDelayMs )
} )
it ( 'transitions to the confirm screen' , async ( ) => {
await driver . wait ( until . stalenessOf ( gasModal ) )
// Continue to next screen
const nextScreen = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Next')] ` ) )
await nextScreen . click ( )
await delay ( regularDelayMs )
} )
it ( 'submits the transaction' , async function ( ) {
const confirmButton = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Confirm')] ` ) )
await confirmButton . click ( )
await delay ( regularDelayMs )
} )
it ( 'finds the transaction in the transactions list' , async function ( ) {
const transactions = await findElements ( driver , By . css ( '.tx-list-item' ) )
assert . equal ( transactions . length , 1 )
const txValues = await findElements ( driver , By . css ( '.tx-list-value' ) )
assert . equal ( txValues . length , 1 )
// test cancelled on firefox until https://github.com/mozilla/geckodriver/issues/906 is resolved,
// or possibly until we use latest version of firefox in the tests
if ( process . env . SELENIUM _BROWSER !== 'firefox' ) {
await driver . wait ( until . elementTextMatches ( txValues [ 0 ] , /50\sTST/ ) , 10000 )
}
const txStatuses = await findElements ( driver , By . css ( '.tx-list-status' ) )
const tx = await driver . wait ( until . elementTextMatches ( txStatuses [ 0 ] , /Confirmed|Failed/ ) , 10000 )
assert . equal ( await tx . getText ( ) , 'Confirmed' )
} )
} )
describe ( 'Send a custom token from TokenFactory' , ( ) => {
let gasModal
it ( 'sends an already created token' , async ( ) => {
openNewPage ( driver , ` https://tokenfactory.surge.sh/#/token/ ${ tokenAddress } ` )
const [ extension , tokenFactory ] = await driver . getAllWindowHandles ( )
const [
transferToAddress ,
transferToAmount ,
] = await findElements ( driver , By . css ( '.form-control' ) )
await transferToAddress . sendKeys ( '0x2f318C334780961FB129D2a6c30D0763d9a5C970' )
await transferToAmount . sendKeys ( '26' )
const transferAmountButton = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Transfer Amount')] ` ) )
await transferAmountButton . click ( )
await delay ( regularDelayMs )
const [ , , popup ] = await driver . getAllWindowHandles ( )
await driver . switchTo ( ) . window ( popup )
await driver . close ( )
await driver . switchTo ( ) . window ( extension )
await delay ( regularDelayMs )
const [ txListItem ] = await findElements ( driver , By . css ( '.tx-list-item' ) )
await txListItem . click ( )
await delay ( regularDelayMs )
// Set the gas limit
const configureGas = await driver . wait ( until . elementLocated ( By . css ( '.send-v2__gas-fee-display button' ) ) )
await configureGas . click ( )
await delay ( regularDelayMs )
gasModal = await driver . findElement ( By . css ( 'span .modal' ) )
} )
it ( 'customizes gas' , async ( ) => {
await driver . wait ( until . elementLocated ( By . css ( '.send-v2__customize-gas__title' ) ) )
const [ gasPriceInput , gasLimitInput ] = await findElements ( driver , By . css ( '.customize-gas-input' ) )
await gasPriceInput . clear ( )
await delay ( tinyDelayMs )
await gasPriceInput . sendKeys ( '10' )
await delay ( tinyDelayMs )
await gasLimitInput . clear ( )
await delay ( tinyDelayMs )
await gasLimitInput . sendKeys ( Key . chord ( Key . CONTROL , 'a' ) )
await gasLimitInput . sendKeys ( '60000' )
await gasLimitInput . sendKeys ( Key . chord ( Key . CONTROL , 'e' ) )
// Needed for different behaviour of input in different versions of firefox
const gasLimitInputValue = await gasLimitInput . getAttribute ( 'value' )
if ( gasLimitInputValue === '600001' ) {
await gasLimitInput . sendKeys ( Key . BACK _SPACE )
}
const save = await findElement ( driver , By . css ( '.send-v2__customize-gas__save' ) )
await save . click ( )
await driver . wait ( until . stalenessOf ( gasModal ) )
const gasFeeInput = await findElement ( driver , By . css ( '.currency-display__input' ) )
assert . equal ( await gasFeeInput . getAttribute ( 'value' ) , 0.0006 )
} )
it ( 'submits the transaction' , async function ( ) {
const confirmButton = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Confirm')] ` ) )
await confirmButton . click ( )
await delay ( regularDelayMs )
} )
it ( 'finds the transaction in the transactions list' , async function ( ) {
const transactions = await findElements ( driver , By . css ( '.tx-list-item' ) )
assert . equal ( transactions . length , 2 )
const txValues = await findElements ( driver , By . css ( '.tx-list-value' ) )
await driver . wait ( until . elementTextMatches ( txValues [ 0 ] , /26\sTST/ ) )
const txStatuses = await findElements ( driver , By . css ( '.tx-list-status' ) )
await driver . wait ( until . elementTextMatches ( txStatuses [ 0 ] , /Confirmed/ ) )
const walletBalance = await findElement ( driver , By . css ( '.wallet-balance' ) )
await walletBalance . click ( )
const tokenListItems = await findElements ( driver , By . css ( '.token-list-item' ) )
await tokenListItems [ 0 ] . click ( )
// test cancelled on firefox until https://github.com/mozilla/geckodriver/issues/906 is resolved,
// or possibly until we use latest version of firefox in the tests
if ( process . env . SELENIUM _BROWSER !== 'firefox' ) {
const tokenBalanceAmount = await findElement ( driver , By . css ( '.token-balance__amount' ) )
assert . equal ( await tokenBalanceAmount . getText ( ) , '24' )
}
} )
} )
describe ( 'Hide token' , ( ) => {
it ( 'hides the token when clicked' , async ( ) => {
const [ hideTokenEllipsis ] = await findElements ( driver , By . css ( '.token-list-item__ellipsis' ) )
await hideTokenEllipsis . click ( )
const byTokenMenuDropdownOption = By . css ( '.menu__item--clickable' )
const tokenMenuDropdownOption = await driver . wait ( until . elementLocated ( byTokenMenuDropdownOption ) )
await tokenMenuDropdownOption . click ( )
const confirmHideModal = await findElement ( driver , By . css ( 'span .modal' ) )
const byHideTokenConfirmationButton = By . css ( '.hide-token-confirmation__button' )
const hideTokenConfirmationButton = await driver . wait ( until . elementLocated ( byHideTokenConfirmationButton ) )
await hideTokenConfirmationButton . click ( )
await driver . wait ( until . stalenessOf ( confirmHideModal ) )
} )
} )
describe ( 'Add existing token using search' , ( ) => {
it ( 'clicks on the Add Token button' , async ( ) => {
const addToken = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Add Token')] ` ) )
await addToken . click ( )
await delay ( regularDelayMs )
} )
it ( 'can pick a token from the existing options' , async ( ) => {
const tokenSearch = await findElement ( driver , By . css ( '#search-tokens' ) )
await tokenSearch . sendKeys ( 'BAT' )
await delay ( regularDelayMs )
const token = await findElement ( driver , By . xpath ( "//span[contains(text(), 'BAT')]" ) )
await token . click ( )
await delay ( regularDelayMs )
const nextScreen = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Next')] ` ) )
await nextScreen . click ( )
await delay ( regularDelayMs )
const addTokens = await findElement ( driver , By . xpath ( ` //button[contains(text(), 'Add Tokens')] ` ) )
await addTokens . click ( )
await delay ( largeDelayMs )
} )
it ( 'renders the balance for the chosen token' , async ( ) => {
const balance = await findElement ( driver , By . css ( '.tx-view .balance-display .token-amount' ) )
await driver . wait ( until . elementTextMatches ( balance , /0\sBAT/ ) )
await delay ( regularDelayMs )
await delay ( regularDelayMs )
} )
} )
} )
} )