mirror of
https://github.com/status-im/status-desktop.git
synced 2025-02-23 12:08:53 +00:00
952 lines
45 KiB
QML
952 lines
45 KiB
QML
import QtQuick 2.15
|
|
import QtTest 1.15
|
|
|
|
import StatusQ.Core.Theme 0.1
|
|
import StatusQ.Core.Utils 0.1 as SQUtils
|
|
|
|
import Models 1.0
|
|
import utils 1.0
|
|
|
|
import AppLayouts.Wallet.popups.simpleSend 1.0
|
|
|
|
Item {
|
|
id: root
|
|
width: 600
|
|
height: 800
|
|
|
|
Component {
|
|
id: componentUnderTest
|
|
|
|
SimpleSendModal {
|
|
id: simpleSend
|
|
|
|
accountsModel: ListModel {
|
|
readonly property var data: [
|
|
{
|
|
"address":"0x7F47C2e98a4BBf5487E6fb082eC2D9Ab0E6d8884",
|
|
"accountBalance":null,
|
|
"migratedToKeycard":false,
|
|
"currencyBalance":{"amount":999,"displayDecimals":2,"stripTrailingZeroes":false,"symbol":"USD"},
|
|
"assets":[
|
|
{"enabledNetworkBalance":{"amount":3.5,"displayDecimals":2,"stripTrailingZeroes":false,"symbol":"SOX"},"symbol":"socks"}
|
|
],
|
|
"currencyBalanceDouble":999,
|
|
"color":"#C78F67",
|
|
"colorId":"camel",
|
|
"emoji":"🔑",
|
|
"name":"Fab (key)",
|
|
"position":4,
|
|
"canSend":true,
|
|
"walletType":"key"
|
|
},
|
|
{
|
|
"address":"0x7F47C2e98a4BBf5487E6fb082eC2D9Ab0E6d8882",
|
|
"accountBalance":null,
|
|
"migratedToKeycard":false,
|
|
"currencyBalance":{"amount":110.05,"displayDecimals":2,"stripTrailingZeroes":false,"symbol":"USD"},
|
|
"assets":[
|
|
{"enabledNetworkBalance":{"amount":42,"displayDecimals":6,"stripTrailingZeroes":true,"symbol":"AAVE"},"symbol":"Aave"},
|
|
{"enabledNetworkBalance":{"amount":120.123,"displayDecimals":2,"stripTrailingZeroes":true,"symbol":"DAI"},"symbol":"dai"}
|
|
],
|
|
"currencyBalanceDouble":110.05,
|
|
"color":"#EC266C"
|
|
,"colorId":"magenta",
|
|
"emoji":"🎨",
|
|
"name":"Family (seed)",
|
|
"position":1,
|
|
"canSend":true,
|
|
"walletType":"seed"
|
|
},
|
|
{
|
|
"address":"0x7F47C2e98a4BBf5487E6fb082eC2D9Ab0E6d8881",
|
|
"accountBalance":null
|
|
,"migratedToKeycard":false,
|
|
"currencyBalance":{"amount":10,"displayDecimals":2,"stripTrailingZeroes":false,"symbol":"USD"},
|
|
"assets":[
|
|
{"enabledNetworkBalance":{"amount":1,"displayDecimals":1,"stripTrailingZeroes":true,"symbol":"DBF"},"symbol":"deadbeef"}
|
|
],
|
|
"currencyBalanceDouble":10,
|
|
"color":"#216266",
|
|
"colorId":"army",
|
|
"emoji":"🚗",
|
|
"name":"Hot wallet (generated)",
|
|
"position":3,"canSend":true,
|
|
"walletType":"generated"
|
|
}
|
|
]
|
|
Component.onCompleted: append(data)
|
|
}
|
|
assetsModel: ListModel {
|
|
readonly property var data: [
|
|
{
|
|
"decimals":18,
|
|
"addressPerChain":[
|
|
{address:"0x0000000000000000000000000000000000000000","chainId":1},
|
|
{address:"0x0000000000000000000000000000000000000000","chainId":5},
|
|
{address:"0x0000000000000000000000000000000000000000","chainId":10},
|
|
{address:"0x0000000000000000000000000000000000000000","chainId":11155420},
|
|
{address:"0x0000000000000000000000000000000000000000","chainId":42161},
|
|
{address:"0x0000000000000000000000000000000000000000","chainId":421614},
|
|
{address:"0x0000000000000000000000000000000000000000","chainId":11155111}],
|
|
"communityId":"","type":1,"websiteUrl":"https://www.ethereum.org/",
|
|
"description":"Ethereum is a decentralized, open-source blockchain platform that enables developers to build and deploy smart contracts and decentralized applications.",
|
|
"detailsLoading":false,
|
|
"marketDetails":{
|
|
"change24hour":0.9121310349524345,
|
|
"changePct24hour":0.05209315257442912,
|
|
"changePctDay":1.19243897022671,"changePctHour":0.3655439934313061,
|
|
"currencyPrice":{"amount":2098.790000016801,"displayDecimals":2,"stripTrailingZeroes":false,"symbol":"USD"},
|
|
"highDay":{"amount":2090.658790484828,"displayDecimals":2,"stripTrailingZeroes":false,"symbol":"USD"},
|
|
"lowDay":{"amount":2059.795033958552,"displayDecimals":2,"stripTrailingZeroes":false,"symbol":"USD"},
|
|
"marketCap":{"amount":250980621528.3937,"displayDecimals":2,"stripTrailingZeroes":false,"symbol":"USD"}
|
|
},
|
|
"marketDetailsLoading":false,
|
|
"currentBalance":0.1220829289681219,
|
|
"currencyBalanceAsString":"256,23 USD",
|
|
"currencyBalance":256.2264304910557,
|
|
"sectionId":"section_1",
|
|
"iconSource":"file:///Users/khushboomehta/Documents/status-desktop/ui/StatusQ/src/assets/png/tokens/ETH.png",
|
|
"sectionName":"Your assets on Mainnet",
|
|
"balances":[
|
|
{
|
|
"balance":"122082928968121891",
|
|
"balanceAsDouble":0.1220829289681219,
|
|
"chainId":1,
|
|
"account":"0x7F47C2e98a4BBf5487E6fb082eC2D9Ab0E6d8884",
|
|
"balanceAsString":"0,12"
|
|
}
|
|
],
|
|
"tokensKey":"ETH",
|
|
"name":"Ether",
|
|
"sources":";native;",
|
|
"symbol":"ETH"
|
|
},
|
|
{
|
|
"decimals":6,
|
|
"addressPerChain":[
|
|
{address:"0x6b175474e89094c44da98b954eedeac495271d0f","chainId":1},
|
|
{address:"0xda10009cbd5d07dd0cecc66161fc93d7c9000da1","chainId":10},
|
|
],
|
|
"communityId":"","type":1,
|
|
"websiteUrl":"https://makerdao.com/",
|
|
"description":"Dai (DAI) is a decentralized, stablecoin cryptocurrency built on the Ethereum blockchain.",
|
|
"detailsLoading":false,
|
|
"marketDetails":{
|
|
"change24hour":0.0004424433543155981,
|
|
"changePct24hour":0.04426443627508443,
|
|
"changePctDay":0.0008257482387743841,
|
|
"changePctHour":0.003162399421324529,
|
|
"currencyPrice":{"amount":0.9999000202515163,"displayDecimals":2,"stripTrailingZeroes":false,"symbol":"USD"},
|
|
"highDay":{"amount":1.000069852130498,"displayDecimals":2,"stripTrailingZeroes":false,"symbol":"USD"},
|
|
"lowDay":{"amount":0.9989457077643417,"displayDecimals":2,"stripTrailingZeroes":false,"symbol":"USD"},
|
|
"marketCap":{"amount":3641953745.413845,"displayDecimals":2,"stripTrailingZeroes":false,"symbol":"USD"}
|
|
},
|
|
"marketDetailsLoading":false
|
|
,"currentBalance":1000,
|
|
"currencyBalanceAsString":"",
|
|
"currencyBalance":0,
|
|
"sectionId":"section_zzz",
|
|
"iconSource":"file:///Users/khushboomehta/Documents/status-desktop/ui/StatusQ/src/assets/png/tokens/DAI.png",
|
|
"sectionName":"Popular assets",
|
|
"balances":[
|
|
{
|
|
"balance":"122082928968121891",
|
|
"balanceAsDouble":1000,
|
|
"chainId":10,
|
|
"account":"0x7F47C2e98a4BBf5487E6fb082eC2D9Ab0E6d8884",
|
|
"balanceAsString":"1000"
|
|
}
|
|
],
|
|
"tokensKey":"DAI",
|
|
"name":"Dai Stablecoin",
|
|
"sources":";uniswap;status;",
|
|
"symbol":"DAI"
|
|
}
|
|
]
|
|
Component.onCompleted: append(data)
|
|
}
|
|
flatCollectiblesModel: ListModel {
|
|
readonly property var data: [
|
|
// collection 2
|
|
{
|
|
tokenId: "id_3",
|
|
symbol: "abc",
|
|
chainId: NetworksModel.mainnetChainId,
|
|
name: "Multi-seq NFT 1",
|
|
contractAddress: "contract_2",
|
|
collectionName: "Multi-sequencer Test NFT",
|
|
collectionUid: "collection_2",
|
|
ownership: [
|
|
{
|
|
accountAddress: "0x7F47C2e98a4BBf5487E6fb082eC2D9Ab0E6d8884",
|
|
balance: 1,
|
|
txTimestamp: 1714059810
|
|
}
|
|
],
|
|
imageUrl: Constants.tokenIcon("ETH", false),
|
|
mediaUrl: Qt.resolvedUrl(""),
|
|
communityId: "",
|
|
communityName: "",
|
|
communityImage: Qt.resolvedUrl(""),
|
|
tokenType: Constants.TokenType.ERC721
|
|
},
|
|
{
|
|
tokenId: "id_4",
|
|
symbol: "def",
|
|
chainId: NetworksModel.mainnetChainId,
|
|
name: "Multi-seq NFT 2",
|
|
contractAddress: "contract_2",
|
|
collectionName: "Multi-sequencer Test NFT",
|
|
collectionUid: "collection_2",
|
|
ownership: [
|
|
{
|
|
accountAddress: "0x7F47C2e98a4BBf5487E6fb082eC2D9Ab0E6d8884",
|
|
balance: 1,
|
|
txTimestamp: 1714059811
|
|
}
|
|
],
|
|
imageUrl: Constants.tokenIcon("ETH", false),
|
|
mediaUrl: Qt.resolvedUrl(""),
|
|
communityId: "",
|
|
communityName: "",
|
|
communityImage: Qt.resolvedUrl(""),
|
|
tokenType: Constants.TokenType.ERC721
|
|
},
|
|
{
|
|
tokenId: "id_5",
|
|
symbol: "ghi",
|
|
chainId: NetworksModel.mainnetChainId,
|
|
name: "Multi-seq NFT 3",
|
|
contractAddress: "contract_2",
|
|
collectionName: "Multi-sequencer Test NFT",
|
|
collectionUid: "collection_2",
|
|
ownership: [
|
|
{
|
|
accountAddress: "0x7F47C2e98a4BBf5487E6fb082eC2D9Ab0E6d8882",
|
|
balance: 1,
|
|
txTimestamp: 1714059899
|
|
}
|
|
],
|
|
imageUrl: Constants.tokenIcon("ETH", false),
|
|
mediaUrl: Qt.resolvedUrl(""),
|
|
communityId: "",
|
|
communityName: "",
|
|
communityImage: Qt.resolvedUrl(""),
|
|
tokenType: Constants.TokenType.ERC721
|
|
}
|
|
]
|
|
Component.onCompleted: append(data)
|
|
}
|
|
collectiblesModel: ListModel {
|
|
readonly property var data: [
|
|
{
|
|
"isRouteEnabled":true,
|
|
"layer":1,
|
|
"type":"other",
|
|
"subitems":[
|
|
{
|
|
"isRouteEnabled":true,
|
|
"layer":1,
|
|
"key":"abc",
|
|
"icon":"file:///Users/khushboomehta/Documents/status-desktop/ui/StatusQ/src/assets/png/tokens/ETH.png",
|
|
"shortName":"eth",
|
|
"chainColor":"#627EEA",
|
|
"iconUrl":"network/Network=Ethereum",
|
|
"blockExplorerURL":"https://etherscan.io/",
|
|
"isTest":false,
|
|
"nativeCurrencyDecimals":18,
|
|
"nativeCurrencySymbol":"ETH",
|
|
"nativeCurrencyName":"Ether",
|
|
"communityName":"",
|
|
"communityId":"",
|
|
"mediaUrl":"",
|
|
"imageUrl":"file:///Users/khushboomehta/Documents/status-desktop/ui/StatusQ/src/assets/png/tokens/ETH.png",
|
|
"chainName":"Mainnet",
|
|
"tokenType":2,
|
|
"communityImage":"",
|
|
"name":"Multi-seq NFT 1",
|
|
"chainId":1,
|
|
"symbol":"abc",
|
|
"tokenId":"id_3",
|
|
"ownership":[{"txTimestamp":1714059810,"balance":1,"accountAddress":"0x7F47C2e98a4BBf5487E6fb082eC2D9Ab0E6d8884"}],
|
|
"collectionUid":"collection_2",
|
|
"collectionName":"Multi-sequencer Test NFT",
|
|
"contractAddress":"contract_2",
|
|
"groupingValue":"collection_2",
|
|
"balance":1
|
|
},
|
|
{"isRouteEnabled":true,
|
|
"layer":1,
|
|
"key":"def",
|
|
"icon":"file:///Users/khushboomehta/Documents/status-desktop/ui/StatusQ/src/assets/png/tokens/ETH.png",
|
|
"shortName":"eth",
|
|
"chainColor":"#627EEA",
|
|
"iconUrl":"network/Network=Ethereum",
|
|
"blockExplorerURL":"https://etherscan.io/",
|
|
"isTest":false,
|
|
"nativeCurrencyDecimals":18,
|
|
"nativeCurrencySymbol":"ETH",
|
|
"nativeCurrencyName":"Ether",
|
|
"communityName":"",
|
|
"communityId":"",
|
|
"mediaUrl":"",
|
|
"imageUrl":"file:///Users/khushboomehta/Documents/status-desktop/ui/StatusQ/src/assets/png/tokens/ETH.png",
|
|
"chainName":"Mainnet",
|
|
"tokenType":2,
|
|
"communityImage":"",
|
|
"name":"Multi-seq NFT 2",
|
|
"chainId":1,
|
|
"symbol":"def",
|
|
"tokenId":"id_4",
|
|
"ownership":[{"txTimestamp":1714059811,"balance":1,"accountAddress":"0x7F47C2e98a4BBf5487E6fb082eC2D9Ab0E6d8884"}],
|
|
"collectionUid":"collection_2",
|
|
"collectionName":"Multi-sequencer Test NFT",
|
|
"contractAddress":"contract_2",
|
|
"groupingValue":"collection_2",
|
|
"balance":1
|
|
},
|
|
{
|
|
"isRouteEnabled":true,
|
|
"layer":1,
|
|
"key":"ghi",
|
|
"icon":"file:///Users/khushboomehta/Documents/status-desktop/ui/StatusQ/src/assets/png/tokens/ETH.png",
|
|
"shortName":"eth",
|
|
"chainColor":"#627EEA",
|
|
"iconUrl":"network/Network=Ethereum",
|
|
"blockExplorerURL":"https://etherscan.io/",
|
|
"isTest":false,
|
|
"nativeCurrencyDecimals":18,
|
|
"nativeCurrencySymbol":"ETH",
|
|
"nativeCurrencyName":"Ether",
|
|
"communityName":"","communityId":"",
|
|
"mediaUrl":"",
|
|
"imageUrl":"file:///Users/khushboomehta/Documents/status-desktop/ui/StatusQ/src/assets/png/tokens/ETH.png",
|
|
"chainName":"Mainnet",
|
|
"tokenType":2,
|
|
"communityImage":"",
|
|
"name":"Multi-seq NFT 3",
|
|
"chainId":1,
|
|
"symbol":"ghi",
|
|
"tokenId":"id_5",
|
|
"ownership":[{"txTimestamp":1714059899,"balance":1,"accountAddress":"0x7F47C2e98a4BBf5487E6fb082eC2D9Ab0E6d8884"}],
|
|
"collectionUid":"collection_2",
|
|
"collectionName":"Multi-sequencer Test NFT",
|
|
"contractAddress":"contract_2",
|
|
"groupingValue":"collection_2",
|
|
"balance":1
|
|
}
|
|
],
|
|
"key":"abc","icon":"file:///Users/khushboomehta/Documents/status-desktop/ui/StatusQ/src/assets/png/tokens/ETH.png",
|
|
"shortName":"eth",
|
|
"chainColor":"#627EEA",
|
|
"iconUrl":"network/Network=Ethereum",
|
|
"blockExplorerURL":"https://etherscan.io/",
|
|
"isTest":false,
|
|
"nativeCurrencyDecimals":18,
|
|
"nativeCurrencySymbol":"ETH",
|
|
"nativeCurrencyName":"Ether",
|
|
"communityName":"",
|
|
"communityId":"",
|
|
"mediaUrl":"",
|
|
"imageUrl":"file:///Users/khushboomehta/Documents/status-desktop/ui/StatusQ/src/assets/png/tokens/ETH.png",
|
|
"chainName":"Mainnet",
|
|
"tokenType":2,
|
|
"communityImage":"",
|
|
"name":"Multi-seq NFT 1",
|
|
"chainId":1,
|
|
"symbol":"abc",
|
|
"tokenId":"id_3",
|
|
"ownership":[{"txTimestamp":1714059810,"balance":1,"accountAddress":"0x7F47C2e98a4BBf5487E6fb082eC2D9Ab0E6d8884"}],
|
|
"collectionUid":"collection_2",
|
|
"collectionName":"Multi-sequencer Test NFT",
|
|
"contractAddress":"contract_2",
|
|
"groupName":"Multi-sequencer Test NFT",
|
|
"groupingValue":"collection_2",
|
|
"balance":1
|
|
}
|
|
]
|
|
Component.onCompleted: append(data)
|
|
}
|
|
networksModel: ListModel {
|
|
readonly property var data: [
|
|
{
|
|
|
|
"layer":1,
|
|
"isRouteEnabled":true,
|
|
"chainId":1,
|
|
"chainName":"Mainnet",
|
|
"blockExplorerURL":"https://etherscan.io/",
|
|
"iconUrl":"network/Network=Ethereum",
|
|
"chainColor":"#627EEA",
|
|
"shortName":"eth",
|
|
"nativeCurrencyName":"Ether",
|
|
"nativeCurrencySymbol":"ETH",
|
|
"nativeCurrencyDecimals":18,
|
|
"isTest":false
|
|
},
|
|
{
|
|
"layer":2,
|
|
"isRouteEnabled":true,
|
|
"chainId":10,
|
|
"chainName":"Optimism",
|
|
"blockExplorerURL":"https://optimistic.etherscan.io",
|
|
"iconUrl":"network/Network=Optimism",
|
|
"chainColor":"#E90101",
|
|
"shortName":"oeth",
|
|
"nativeCurrencyName":"Ether",
|
|
"nativeCurrencySymbol":"ETH",
|
|
"nativeCurrencyDecimals":18,
|
|
"isTest":false
|
|
},
|
|
{
|
|
"layer":2,
|
|
"isRouteEnabled":true,
|
|
"chainId":42161,
|
|
"chainName":"Arbitrum",
|
|
"blockExplorerURL":"https://arbiscan.io/",
|
|
"iconUrl":"network/Network=Arbitrum",
|
|
"chainColor":"#51D0F0",
|
|
"shortName":"arb1",
|
|
"nativeCurrencyName":"Ether",
|
|
"nativeCurrencySymbol":"ETH",
|
|
"nativeCurrencyDecimals":18,
|
|
"isTest":false
|
|
}
|
|
|
|
]
|
|
Component.onCompleted: append(data)
|
|
}
|
|
recipientsModel: ListModel {
|
|
Component.onCompleted: {
|
|
for (let i = 0; i < 10; i++) {
|
|
append({
|
|
name: "some saved addr name " + i,
|
|
ens: "ens %1".arg(i),
|
|
address: "0x2B748A02e06B159C7C3E98F5064577B96E55A7b%1".arg(i),
|
|
})
|
|
|
|
append({
|
|
name: "some addr name " + i,
|
|
ens: "ens %1".arg(i),
|
|
address: "0x1B748A02e06B159C7C3E69F5064577B96E55A7b%1".arg(i),
|
|
})
|
|
}
|
|
}
|
|
}
|
|
recipientsFilterModel: recipientsModel
|
|
currentCurrency: "USD"
|
|
fnFormatCurrencyAmount: function (amount, symbol, options = null, locale = null) {
|
|
if (isNaN(amount)) {
|
|
return "N/A"
|
|
}
|
|
var currencyAmount = ({
|
|
amount: amount,
|
|
symbol: symbol ? symbol.toUpperCase() : "USD",
|
|
displayDecimals: 2,
|
|
stripTrailingZeroes: false
|
|
})
|
|
return LocaleUtils.currencyAmountToLocaleString(currencyAmount, options, locale)
|
|
}
|
|
|
|
fnResolveENS: function (ensName, uuid) {}
|
|
|
|
readonly property SignalSpy formChangedSpy: SignalSpy {
|
|
target: simpleSend
|
|
signalName: "formChanged"
|
|
}
|
|
|
|
readonly property SignalSpy reviewSendClickedSpy: SignalSpy {
|
|
target: simpleSend
|
|
signalName: "reviewSendClicked"
|
|
}
|
|
|
|
readonly property SignalSpy launchBuyFlowSpy: SignalSpy {
|
|
target: simpleSend
|
|
signalName: "launchBuyFlow"
|
|
}
|
|
}
|
|
}
|
|
|
|
TestCase {
|
|
name: "SimpleSendModal"
|
|
when: windowShown
|
|
|
|
property SimpleSendModal controlUnderTest: null
|
|
|
|
function init() {
|
|
controlUnderTest = createTemporaryObject(componentUnderTest, root)
|
|
}
|
|
|
|
function test_launchPopup() {
|
|
verify(!!controlUnderTest)
|
|
controlUnderTest.open()
|
|
verify(controlUnderTest.opened)
|
|
}
|
|
|
|
function test_closeModal() {
|
|
// close popup
|
|
controlUnderTest.close()
|
|
verify(!controlUnderTest.opened)
|
|
}
|
|
|
|
function test_default_state() {
|
|
verify(!!controlUnderTest)
|
|
controlUnderTest.open()
|
|
verify(controlUnderTest.opened)
|
|
|
|
// Default account item from model at 0th position
|
|
const defaultAccountItem = SQUtils.ModelUtils.get(controlUnderTest.accountsModel, 0)
|
|
|
|
// Default network item from model at 0th position
|
|
const defaultNetworkItem = SQUtils.ModelUtils.get(controlUnderTest.networksModel, 0)
|
|
|
|
// Account Selector
|
|
const accountSelector = findChild(controlUnderTest, "accountSelector")
|
|
verify(!!accountSelector)
|
|
const accountSelectorHeaderBackground = findChild(accountSelector, "headerBackground")
|
|
verify(!!accountSelectorHeaderBackground)
|
|
const accountSelectorAssetContent = findChild(accountSelector, "assetContent")
|
|
verify(!!accountSelectorAssetContent)
|
|
const accountSelectorTextContent = findChild(accountSelector, "textContent")
|
|
verify(!!accountSelectorTextContent)
|
|
|
|
compare(accountSelectorHeaderBackground.color, Utils.getColorForId(defaultAccountItem.colorId))
|
|
compare(accountSelectorAssetContent.asset.emoji, defaultAccountItem.emoji)
|
|
compare(accountSelectorAssetContent.asset.color, Utils.getColorForId(defaultAccountItem.colorId))
|
|
compare(accountSelectorTextContent.text, defaultAccountItem.name)
|
|
|
|
// Sticky Header should not be visible when not scrolling
|
|
const stickySendModalHeader = findChild(controlUnderTest, "stickySendModalHeader")
|
|
verify(!!stickySendModalHeader)
|
|
compare(stickySendModalHeader.height, 0)
|
|
|
|
// Regular Header
|
|
const sendModalHeader = findChild(controlUnderTest, "sendModalHeader")
|
|
verify(!!sendModalHeader)
|
|
|
|
// Title
|
|
const sendModalTitleText = findChild(controlUnderTest, "sendModalTitleText")
|
|
verify(!!sendModalTitleText)
|
|
verify(sendModalHeader.visible)
|
|
compare(sendModalTitleText.text, qsTr("Send"))
|
|
|
|
// Token Selector
|
|
const tokenSelector = findChild(controlUnderTest, "tokenSelector")
|
|
verify(!!tokenSelector)
|
|
const tokenSelectorButton = findChild(controlUnderTest, "tokenSelectorButton")
|
|
verify(!!tokenSelectorButton)
|
|
verify(!tokenSelectorButton.selected)
|
|
compare(tokenSelectorButton.name, "")
|
|
compare(tokenSelectorButton.icon, "")
|
|
compare(tokenSelectorButton.text, qsTr("Select token"))
|
|
|
|
// Network picker
|
|
const networkFilter = findChild(controlUnderTest, "networkFilter")
|
|
verify(!!networkFilter)
|
|
compare(networkFilter.selection, [defaultNetworkItem.chainId])
|
|
|
|
// Amount input area
|
|
const amountToSend = findChild(controlUnderTest, "amountToSend")
|
|
verify(!!amountToSend)
|
|
verify(!amountToSend.visible)
|
|
|
|
// Recipient Area
|
|
const recipientsPanel = findChild(controlUnderTest, "recipientsPanel")
|
|
verify(!!recipientsPanel)
|
|
compare(recipientsPanel.selectedRecipientType, Constants.RecipientAddressObjectType.RecentsAddress)
|
|
compare(recipientsPanel.selectedRecipientAddress, "")
|
|
|
|
// Fees Layout
|
|
const feesLayout = findChild(controlUnderTest, "feesLayout")
|
|
verify(!!feesLayout)
|
|
verify(!feesLayout.visible)
|
|
|
|
// Footer
|
|
const sendModalFooter = findChild(controlUnderTest, "sendModalFooter")
|
|
verify(!!sendModalFooter)
|
|
compare(sendModalFooter.estimatedTime, "")
|
|
compare(sendModalFooter.estimatedFees, "")
|
|
verify(!sendModalFooter.loading)
|
|
verify(!sendModalFooter.error)
|
|
verify(!sendModalFooter.errorTags)
|
|
|
|
// form not filled completely
|
|
verify(!controlUnderTest.allValuesFilledCorrectly)
|
|
}
|
|
|
|
function test_preset_values() {
|
|
verify(!!controlUnderTest)
|
|
controlUnderTest.open()
|
|
verify(controlUnderTest.opened)
|
|
|
|
waitForRendering(controlUnderTest.contentItem)
|
|
|
|
controlUnderTest.sendType = Constants.SendType.Transfer
|
|
controlUnderTest.selectedAccountAddress = "0x7F47C2e98a4BBf5487E6fb082eC2D9Ab0E6d8884"
|
|
controlUnderTest.selectedChainId = 10
|
|
controlUnderTest.selectedTokenKey = "DAI"
|
|
controlUnderTest.selectedRawAmount = "10000000" // 10 DAI
|
|
controlUnderTest.selectedRecipientAddress = "0x7F47C2e98a4BBf5487E6fb082eC2D9Ab0E6d8881"
|
|
|
|
const selectedAccount = SQUtils.ModelUtils.getByKey(controlUnderTest.accountsModel, "address", controlUnderTest.selectedAccountAddress)
|
|
const selectedToken = SQUtils.ModelUtils.getByKey(controlUnderTest.assetsModel, "tokensKey", controlUnderTest.selectedTokenKey)
|
|
|
|
// Account Selector
|
|
const accountSelector = findChild(controlUnderTest, "accountSelector")
|
|
verify(!!accountSelector)
|
|
const accountSelectorHeaderBackground = findChild(accountSelector, "headerBackground")
|
|
verify(!!accountSelectorHeaderBackground)
|
|
const accountSelectorAssetContent = findChild(accountSelector, "assetContent")
|
|
verify(!!accountSelectorAssetContent)
|
|
const accountSelectorTextContent = findChild(accountSelector, "textContent")
|
|
verify(!!accountSelectorTextContent)
|
|
|
|
compare(accountSelectorHeaderBackground.color, Utils.getColorForId(selectedAccount.colorId))
|
|
compare(accountSelectorAssetContent.asset.emoji, selectedAccount.emoji)
|
|
compare(accountSelectorAssetContent.asset.color, Utils.getColorForId(selectedAccount.colorId))
|
|
compare(accountSelectorTextContent.text, selectedAccount.name)
|
|
|
|
// Sticky Header should not be visible when not scrolling
|
|
const stickySendModalHeader = findChild(controlUnderTest, "stickySendModalHeader")
|
|
verify(!!stickySendModalHeader)
|
|
compare(stickySendModalHeader.height, 0)
|
|
|
|
// Regular Header
|
|
const sendModalHeader = findChild(controlUnderTest, "sendModalHeader")
|
|
verify(!!sendModalHeader)
|
|
|
|
// Token Selector
|
|
const tokenSelector = findChild(sendModalHeader, "tokenSelector")
|
|
verify(!!tokenSelector)
|
|
const tokenSelectorButton = findChild(sendModalHeader, "tokenSelectorButton")
|
|
verify(!!tokenSelectorButton)
|
|
verify(tokenSelectorButton.selected)
|
|
compare(tokenSelectorButton.name, selectedToken.symbol)
|
|
compare(tokenSelectorButton.icon, Constants.tokenIcon(selectedToken.symbol))
|
|
|
|
// Network picker
|
|
const networkFilter = findChild(controlUnderTest, "networkFilter")
|
|
verify(!!networkFilter)
|
|
compare(networkFilter.selection, [controlUnderTest.selectedChainId])
|
|
|
|
// Amount input area
|
|
const amountToSend = findChild(controlUnderTest, "amountToSend")
|
|
verify(!!amountToSend)
|
|
verify(amountToSend.visible)
|
|
verify(amountToSend.cursorVisible)
|
|
compare(amountToSend.placeholderText, "0")
|
|
verify(!amountToSend.bottomTextLoading)
|
|
compare(amountToSend.text, "10")
|
|
|
|
// Recipient Area
|
|
const recipientsPanel = findChild(controlUnderTest, "recipientsPanel")
|
|
verify(!!recipientsPanel)
|
|
compare(recipientsPanel.selectedRecipientType, Constants.RecipientAddressObjectType.RecentsAddress)
|
|
compare(recipientsPanel.selectedRecipientAddress, "0x7F47C2e98a4BBf5487E6fb082eC2D9Ab0E6d8881")
|
|
|
|
controlUnderTest.formChangedSpy.wait()
|
|
tryCompare(controlUnderTest, "allValuesFilledCorrectly", true)
|
|
|
|
// set loading state to true, mimicing fectSuggestedRoutes is called
|
|
controlUnderTest.routesLoading = true
|
|
|
|
verify(amountToSend.bottomTextLoading)
|
|
|
|
// Fees Layout
|
|
const feesLayout = findChild(controlUnderTest, "feesLayout")
|
|
verify(!!feesLayout)
|
|
const signTransactionFees = findChild(feesLayout, "signTransactionFees")
|
|
verify(!!signTransactionFees)
|
|
const cryptoFeesText = findChild(signTransactionFees, "cryptoFeesText")
|
|
verify(!!cryptoFeesText)
|
|
const fiatFeesText = findChild(signTransactionFees, "fiatFeesText")
|
|
verify(!!fiatFeesText)
|
|
verify(feesLayout.visible)
|
|
verify(signTransactionFees.loading)
|
|
verify(cryptoFeesText.loading)
|
|
compare(cryptoFeesText.customColor, Theme.palette.baseColor1)
|
|
verify(fiatFeesText.loading)
|
|
compare(fiatFeesText.customColor, Theme.palette.baseColor1)
|
|
|
|
// Footer
|
|
const sendModalFooter = findChild(controlUnderTest, "sendModalFooter")
|
|
verify(!!sendModalFooter)
|
|
compare(sendModalFooter.estimatedTime, "")
|
|
compare(sendModalFooter.estimatedFees, "")
|
|
verify(sendModalFooter.loading)
|
|
verify(!sendModalFooter.error)
|
|
verify(!sendModalFooter.errorTags)
|
|
|
|
// set correct values for router such that a valid route was returned
|
|
controlUnderTest.routesLoading = false
|
|
controlUnderTest.estimatedTime = "~60s"
|
|
controlUnderTest.estimatedFiatFees = "1.45 EUR"
|
|
controlUnderTest.estimatedCryptoFees = "0.0007 ETH"
|
|
controlUnderTest.routerErrorCode = ""
|
|
controlUnderTest.routerError = ""
|
|
controlUnderTest.routerErrorDetails = ""
|
|
|
|
// check route set values
|
|
verify(!amountToSend.bottomTextLoading)
|
|
verify(!signTransactionFees.loading)
|
|
compare(signTransactionFees.cryptoFees, controlUnderTest.estimatedCryptoFees)
|
|
compare(signTransactionFees.fiatFees, controlUnderTest.estimatedFiatFees)
|
|
verify(!signTransactionFees.error)
|
|
compare(cryptoFeesText.customColor, Theme.palette.baseColor1)
|
|
compare(fiatFeesText.customColor, Theme.palette.baseColor1)
|
|
compare(sendModalFooter.estimatedTime,controlUnderTest.estimatedTime)
|
|
compare(sendModalFooter.estimatedFees, controlUnderTest.estimatedFiatFees)
|
|
verify(!sendModalFooter.loading)
|
|
verify(!sendModalFooter.error)
|
|
verify(!sendModalFooter.errorTags)
|
|
|
|
// clear amount and check if allValuesFilledCorrectly changes
|
|
amountToSend.clear()
|
|
tryCompare(controlUnderTest, "allValuesFilledCorrectly", false)
|
|
|
|
controlUnderTest.selectedRawAmount = "110000000" // 11 DAI
|
|
|
|
// set error path
|
|
controlUnderTest.routesLoading = false
|
|
controlUnderTest.estimatedTime = "~60s"
|
|
controlUnderTest.estimatedFiatFees = "1.45 EUR"
|
|
controlUnderTest.estimatedCryptoFees = "0.0007 ETH"
|
|
controlUnderTest.routerErrorCode = Constants.routerErrorCodes.router.errNotEnoughNativeBalance
|
|
controlUnderTest.routerError = qsTr("Not enough ETH to pay gas fees")
|
|
controlUnderTest.routerErrorDetails = ""
|
|
|
|
// check error state
|
|
compare(signTransactionFees.cryptoFees, controlUnderTest.estimatedCryptoFees)
|
|
compare(signTransactionFees.fiatFees, controlUnderTest.estimatedFiatFees)
|
|
verify(signTransactionFees.error)
|
|
compare(cryptoFeesText.customColor, Theme.palette.dangerColor1)
|
|
compare(fiatFeesText.customColor, Theme.palette.dangerColor1)
|
|
compare(sendModalFooter.estimatedTime,controlUnderTest.estimatedTime)
|
|
compare(sendModalFooter.estimatedFees, controlUnderTest.estimatedFiatFees)
|
|
verify(!sendModalFooter.loading)
|
|
verify(sendModalFooter.error)
|
|
compare(sendModalFooter.errorTags.count, 2)
|
|
}
|
|
|
|
function test_scrolling_state() {
|
|
verify(!!controlUnderTest)
|
|
controlUnderTest.open()
|
|
verify(controlUnderTest.opened)
|
|
|
|
waitForRendering(controlUnderTest.contentItem)
|
|
|
|
// Default network item from model at 0th position
|
|
const defaultNetworkItem = SQUtils.ModelUtils.get(controlUnderTest.networksModel, 0)
|
|
|
|
// Sticky Header should not be visible when not scrolling
|
|
const stickySendModalHeader = findChild(controlUnderTest, "stickySendModalHeader")
|
|
verify(!!stickySendModalHeader)
|
|
verify(stickySendModalHeader.height === 0)
|
|
|
|
// Sticky Header Title
|
|
const stickyHeaderTitleText = findChild(stickySendModalHeader, "sendModalTitleText")
|
|
verify(!!stickyHeaderTitleText)
|
|
compare(stickyHeaderTitleText.text, qsTr("Send"))
|
|
|
|
// Sticky Header Token Selector
|
|
const stickyHeaderTokenSelector = findChild(stickySendModalHeader, "tokenSelector")
|
|
verify(!!stickyHeaderTokenSelector)
|
|
const stickyHeaderTokenSelectorButton = findChild(stickySendModalHeader, "tokenSelectorButton")
|
|
verify(!!stickyHeaderTokenSelectorButton)
|
|
const stickyHeaderTokenSelectorDropdown = findChild(stickySendModalHeader, "dropdown")
|
|
verify(!!stickyHeaderTokenSelectorDropdown)
|
|
|
|
verify(!stickyHeaderTokenSelectorButton.selected)
|
|
compare(stickyHeaderTokenSelectorButton.name, "")
|
|
compare(stickyHeaderTokenSelectorButton.icon, "")
|
|
compare(stickyHeaderTokenSelectorButton.text, qsTr("Select token"))
|
|
|
|
// Sticky Header Network picker
|
|
const stickyHeaderNetworkFilter = findChild(stickySendModalHeader, "networkFilter")
|
|
verify(!!stickyHeaderNetworkFilter)
|
|
compare(stickyHeaderNetworkFilter.selection, [defaultNetworkItem.chainId])
|
|
|
|
// Regular Header
|
|
const sendModalHeader = findChild(controlUnderTest, "sendModalHeader")
|
|
verify(!!sendModalHeader)
|
|
|
|
// Regular Header Title
|
|
const sendModalTitleText = findChild(sendModalHeader, "sendModalTitleText")
|
|
verify(!!sendModalTitleText)
|
|
verify(sendModalHeader.visible)
|
|
compare(sendModalTitleText.text, qsTr("Send"))
|
|
|
|
// Regular Header Token Selector
|
|
const tokenSelector = findChild(sendModalHeader, "tokenSelector")
|
|
verify(!!tokenSelector)
|
|
const tokenSelectorButton = findChild(sendModalHeader, "tokenSelectorButton")
|
|
verify(!!tokenSelectorButton)
|
|
const tokenSelectorDropdown = findChild(sendModalHeader, "dropdown")
|
|
verify(!!tokenSelectorDropdown)
|
|
|
|
verify(!tokenSelectorButton.selected)
|
|
compare(tokenSelectorButton.name, "")
|
|
compare(tokenSelectorButton.icon, "")
|
|
compare(tokenSelectorButton.text, qsTr("Select token"))
|
|
|
|
// Regular Header Network picker
|
|
const networkFilter = findChild(sendModalHeader, "networkFilter")
|
|
verify(!!networkFilter)
|
|
compare(networkFilter.selection, [defaultNetworkItem.chainId])
|
|
|
|
// launch token selector dropdown
|
|
tokenSelectorButton.clicked()
|
|
verify(tokenSelectorDropdown.opened)
|
|
|
|
// scroll
|
|
const scrollView = findChild(controlUnderTest, "scrollView")
|
|
verify(!!scrollView)
|
|
scrollView.scrollEnd()
|
|
|
|
// the opened popup should be closed and sticky header should become visible
|
|
tryCompare(tokenSelectorDropdown, "opened", false)
|
|
tryVerify(() => stickySendModalHeader.height > 0)
|
|
|
|
stickyHeaderTokenSelectorButton.clicked()
|
|
verify(stickyHeaderTokenSelectorDropdown.opened)
|
|
|
|
// scroll back up
|
|
scrollView.scrollHome()
|
|
tryCompare(stickyHeaderTokenSelectorDropdown, "opened", false)
|
|
tryVerify(() => stickySendModalHeader.height === 0)
|
|
|
|
// set values for headers using modal api
|
|
controlUnderTest.selectedChainId = 10
|
|
controlUnderTest.selectedTokenKey = "DAI"
|
|
|
|
const selectedToken = SQUtils.ModelUtils.getByKey(controlUnderTest.assetsModel, "tokensKey", controlUnderTest.selectedTokenKey)
|
|
|
|
// Check regular header
|
|
verify(tokenSelectorButton.selected)
|
|
compare(tokenSelectorButton.name, selectedToken.symbol)
|
|
compare(tokenSelectorButton.icon, Constants.tokenIcon(selectedToken.symbol))
|
|
compare(networkFilter.selection, [10])
|
|
|
|
// Check sticky header
|
|
verify(tokenSelectorButton.selected)
|
|
compare(tokenSelectorButton.name, selectedToken.symbol)
|
|
compare(tokenSelectorButton.icon, Constants.tokenIcon(selectedToken.symbol))
|
|
compare(networkFilter.selection, [10])
|
|
}
|
|
|
|
function test_set_interactive_false() {
|
|
verify(!!controlUnderTest)
|
|
controlUnderTest.open()
|
|
verify(controlUnderTest.opened)
|
|
|
|
// waitForRendering(controlUnderTest.contentItem)
|
|
|
|
controlUnderTest.interactive = false
|
|
|
|
// Sticky Header
|
|
const stickySendModalHeader = findChild(controlUnderTest, "stickySendModalHeader")
|
|
verify(!!stickySendModalHeader)
|
|
const stickyHeaderTokenSelector = findChild(stickySendModalHeader, "tokenSelector")
|
|
verify(!!stickyHeaderTokenSelector)
|
|
const stickyHeaderNetworkFilter = findChild(stickySendModalHeader, "networkFilter")
|
|
verify(!!stickyHeaderNetworkFilter)
|
|
|
|
// Regular Header
|
|
const sendModalHeader = findChild(controlUnderTest, "sendModalHeader")
|
|
verify(!!sendModalHeader)
|
|
const tokenSelector = findChild(sendModalHeader, "tokenSelector")
|
|
verify(!!tokenSelector)
|
|
const networkFilter = findChild(sendModalHeader, "networkFilter")
|
|
verify(!!networkFilter)
|
|
|
|
// Amount input area
|
|
const amountToSend = findChild(controlUnderTest, "amountToSend")
|
|
verify(!!amountToSend)
|
|
|
|
// Recipient Panel
|
|
const recipientsPanel = findChild(controlUnderTest, "recipientsPanel")
|
|
verify(!!recipientsPanel)
|
|
|
|
verify(!stickyHeaderTokenSelector.enabled)
|
|
verify(!stickyHeaderNetworkFilter.selectionAllowed)
|
|
|
|
verify(!tokenSelector.enabled)
|
|
verify(!networkFilter.selectionAllowed)
|
|
|
|
verify(!amountToSend.interactive)
|
|
|
|
verify(!recipientsPanel.interactive)
|
|
}
|
|
|
|
function test_displayOnlyAssets() {
|
|
verify(!!controlUnderTest)
|
|
controlUnderTest.open()
|
|
verify(controlUnderTest.opened)
|
|
|
|
const sendModalHeader = findChild(controlUnderTest, "sendModalHeader")
|
|
verify(!!sendModalHeader)
|
|
const tokenSelector = findChild(sendModalHeader, "tokenSelector")
|
|
verify(!!tokenSelector)
|
|
|
|
verify(tokenSelector.collectiblesModel)
|
|
|
|
controlUnderTest.displayOnlyAssets = true
|
|
|
|
verify(!tokenSelector.collectiblesModel)
|
|
}
|
|
|
|
function test_transferOwnership() {
|
|
verify(!!controlUnderTest)
|
|
controlUnderTest.open()
|
|
verify(controlUnderTest.opened)
|
|
|
|
const stickySendModalHeader = findChild(controlUnderTest, "stickySendModalHeader")
|
|
verify(!!stickySendModalHeader)
|
|
const sendModalHeader = findChild(controlUnderTest, "sendModalHeader")
|
|
verify(!!sendModalHeader)
|
|
|
|
verify(stickySendModalHeader.interactive)
|
|
verify(sendModalHeader.interactive)
|
|
|
|
controlUnderTest.transferOwnership = true
|
|
|
|
verify(!stickySendModalHeader.interactive)
|
|
verify(!sendModalHeader.interactive)
|
|
}
|
|
|
|
// verify that when a token is selected from the asset selecte values are set correctly
|
|
function test_selectAssetOrCollectible() {
|
|
verify(!!controlUnderTest)
|
|
controlUnderTest.open()
|
|
verify(controlUnderTest.opened)
|
|
|
|
const sendModalHeader = findChild(controlUnderTest, "sendModalHeader")
|
|
verify(!!sendModalHeader)
|
|
|
|
compare(controlUnderTest.sendType, Constants.SendType.Transfer)
|
|
compare(controlUnderTest.selectedChainId, 1)
|
|
compare(controlUnderTest.selectedTokenKey, "")
|
|
compare(controlUnderTest.selectedRawAmount, "")
|
|
|
|
// Asset Selection
|
|
sendModalHeader.assetSelected("ETH")
|
|
|
|
compare(controlUnderTest.sendType, Constants.SendType.Transfer)
|
|
compare(controlUnderTest.selectedTokenKey, "ETH")
|
|
compare(controlUnderTest.selectedChainId, 1)
|
|
compare(controlUnderTest.selectedRawAmount, "")
|
|
|
|
// Collectible Selection
|
|
sendModalHeader.collectibleSelected("abc")
|
|
|
|
compare(controlUnderTest.sendType, Constants.SendType.ERC721Transfer)
|
|
compare(controlUnderTest.selectedTokenKey, "abc")
|
|
compare(controlUnderTest.selectedChainId, 1)
|
|
compare(controlUnderTest.selectedRawAmount, "1")
|
|
|
|
sendModalHeader.assetSelected("ETH")
|
|
}
|
|
|
|
}
|
|
}
|