import QtQuick 2.15 import QtQuick.Controls 2.15 import QtTest 1.15 import QtQml 2.15 import Models 1.0 import StatusQ.Core.Utils 0.1 as SQUtils import AppLayouts.Wallet.popups.swap 1.0 import utils 1.0 Item { id: root width: 600 height: 400 Component { id: componentUnderTest SwapSignModal { anchors.centerIn: parent formatBigNumber: (number, symbol, noSymbolOption) => parseFloat(number).toLocaleString(Qt.locale(), 'f', 2) + (noSymbolOption ? "" : " " + symbol) fromTokenSymbol: "DAI" fromTokenAmount: "100.07" fromTokenContractAddress: "0x6B175474E89094C44Da98b954EedeAC495271d0F" toTokenSymbol: "USDT" toTokenAmount: "142.07" toTokenContractAddress: "0xdAC17F958D2ee523a2206206994597C13D831ec7" accountName: "Hot wallet (generated)" accountAddress: "0x7F47C2e98a4BBf5487E6fb082eC2D9Ab0E6d8881" accountEmoji: "🚗" accountColor: Utils.getColorForId(Constants.walletAccountColors.primary) networkShortName: Constants.networkShortChainNames.mainnet networkName: "Mainnet" networkIconPath: Style.svg("network/Network=Ethereum") networkBlockExplorerUrl: "https://etherscan.io/" serviceProviderName: Constants.swap.paraswapName serviceProviderURL: Constants.swap.termsAndConditionParaswapUrl fiatFees: "1.54 EUR" cryptoFees: "0.001 ETH" slippage: 0.2 loginType: Constants.LoginType.Password } } SignalSpy { id: signalSpyAccepted target: controlUnderTest signalName: "accepted" } SignalSpy { id: signalSpyRejected target: controlUnderTest signalName: "rejected" } property SwapSignModal controlUnderTest: null TestCase { name: "SwapSignModal" when: windowShown function init() { controlUnderTest = createTemporaryObject(componentUnderTest, root) signalSpyAccepted.clear() signalSpyRejected.clear() } function test_basicGeometry() { verify(!!controlUnderTest) verify(controlUnderTest.width > 0) verify(controlUnderTest.height > 0) } function test_fromToProps_data() { return [ {tag: "ETH", toTokenSymbol: "ETH"}, {tag: "DAI", toTokenSymbol: "DAI"}, ] } function test_fromToProps(data) { verify(!!controlUnderTest) controlUnderTest.fromTokenSymbol = "SNT" controlUnderTest.fromTokenAmount = "1000.123456789" controlUnderTest.fromTokenContractAddress = "Oxdeadbeef" controlUnderTest.toTokenSymbol = data.toTokenSymbol controlUnderTest.toTokenAmount = "1.42" controlUnderTest.toTokenContractAddress = "0xdeadcaff" // title & subtitle compare(controlUnderTest.title, qsTr("Sign Swap")) compare(controlUnderTest.subtitle, qsTr("%1 to %2").arg(controlUnderTest.formatBigNumber(controlUnderTest.fromTokenAmount, controlUnderTest.fromTokenSymbol)) .arg(controlUnderTest.formatBigNumber(controlUnderTest.toTokenAmount, controlUnderTest.toTokenSymbol))) // info box const headerText = findChild(controlUnderTest.contentItem, "headerText") verify(!!headerText) compare(headerText.text, qsTr("Swap 1,000.12 SNT to 1.42 %3 in %1 on %2").arg(controlUnderTest.accountName).arg(controlUnderTest.networkName).arg(data.toTokenSymbol)) const fromImage = findChild(controlUnderTest.contentItem, "fromImageIdenticon") verify(!!fromImage) compare(fromImage.asset.name, Constants.tokenIcon(controlUnderTest.fromTokenSymbol)) const toImage = findChild(controlUnderTest.contentItem, "toImageIdenticon") verify(!!toImage) compare(toImage.asset.name, Constants.tokenIcon(controlUnderTest.toTokenSymbol)) // pay box const payBox = findChild(controlUnderTest.contentItem, "payBox") verify(!!payBox) compare(payBox.caption, qsTr("Pay")) compare(payBox.primaryText, "1,000.12 SNT") compare(payBox.secondaryText, SQUtils.Utils.elideAndFormatWalletAddress(controlUnderTest.fromTokenContractAddress)) // receive box const receiveBox = findChild(controlUnderTest.contentItem, "receiveBox") verify(!!receiveBox) compare(receiveBox.caption, qsTr("Receive")) compare(receiveBox.primaryText, "%1 %2".arg(controlUnderTest.toTokenAmount).arg(controlUnderTest.toTokenSymbol)) compare(receiveBox.secondaryText, data.toTokenSymbol === "ETH" ? "" : SQUtils.Utils.elideAndFormatWalletAddress(controlUnderTest.toTokenContractAddress)) } function test_accountInfo() { verify(!!controlUnderTest) // account box const accountBox = findChild(controlUnderTest.contentItem, "accountBox") verify(!!accountBox) compare(accountBox.caption, qsTr("In account")) compare(accountBox.primaryText, controlUnderTest.accountName) compare(accountBox.secondaryText, SQUtils.Utils.elideAndFormatWalletAddress(controlUnderTest.accountAddress)) compare(accountBox.asset.emoji, controlUnderTest.accountEmoji) compare(accountBox.asset.color, controlUnderTest.accountColor) } function test_networkInfo() { verify(!!controlUnderTest) // network box const networkBox = findChild(controlUnderTest.contentItem, "networkBox") verify(!!networkBox) compare(networkBox.caption, qsTr("Network")) compare(networkBox.primaryText, controlUnderTest.networkName) compare(networkBox.icon, controlUnderTest.networkIconPath) } function test_feesInfo() { verify(!!controlUnderTest) // fees box const feesBox = findChild(controlUnderTest.contentItem, "feesBox") verify(!!feesBox) compare(feesBox.caption, qsTr("Fees")) compare(feesBox.primaryText, qsTr("Max. fees on %1").arg(controlUnderTest.networkName)) const fiatFeesText = findChild(feesBox, "fiatFeesText") verify(!!fiatFeesText) compare(fiatFeesText.text, controlUnderTest.fiatFees) const cryptoFeesText = findChild(feesBox, "cryptoFeesText") verify(!!cryptoFeesText) compare(cryptoFeesText.text, controlUnderTest.cryptoFees) } function test_loginType_data() { return [ { tag: "password", loginType: Constants.LoginType.Password, iconName: "password" }, { tag: "touchId", loginType: Constants.LoginType.Biometrics, iconName: "touch-id" }, { tag: "keycard", loginType: Constants.LoginType.Keycard, iconName: "keycard" } ] } function test_loginType(data) { const loginType = data.loginType const iconName = data.iconName verify(!!controlUnderTest) controlUnderTest.loginType = loginType const signButton = findChild(controlUnderTest.footer, "signButton") verify(!!signButton) compare(signButton.icon.name, iconName) } function test_loading() { verify(!!controlUnderTest) compare(controlUnderTest.feesLoading, false) const signButton = findChild(controlUnderTest.footer, "signButton") verify(!!signButton) compare(signButton.interactive, true) const footerFiatFeesText = findChild(controlUnderTest.footer, "footerFiatFeesText") verify(!!footerFiatFeesText) compare(footerFiatFeesText.loading, false) const fiatFeesText = findChild(controlUnderTest.contentItem, "fiatFeesText") verify(!!fiatFeesText) compare(fiatFeesText.loading, false) const cryptoFeesText = findChild(controlUnderTest.contentItem, "cryptoFeesText") verify(!!cryptoFeesText) compare(cryptoFeesText.loading, false) controlUnderTest.feesLoading = true compare(signButton.interactive, false) compare(footerFiatFeesText.loading, true) compare(fiatFeesText.loading, true) compare(cryptoFeesText.loading, true) } function test_footerInfo() { verify(!!controlUnderTest) const fiatFeesText = findChild(controlUnderTest.footer, "footerFiatFeesText") verify(!!fiatFeesText) compare(fiatFeesText.text, controlUnderTest.fiatFees) const maxSlippageText = findChild(controlUnderTest.footer, "footerMaxSlippageText") verify(!!maxSlippageText) compare(maxSlippageText.text, "%1%".arg(controlUnderTest.slippage)) } function test_signButton() { verify(!!controlUnderTest) const signButton = findChild(controlUnderTest.footer, "signButton") verify(!!signButton) compare(signButton.interactive, true) signButton.clicked() compare(signalSpyAccepted.count, 1) compare(controlUnderTest.opened, false) compare(controlUnderTest.result, Dialog.Accepted) } function test_rejectButton() { verify(!!controlUnderTest) const rejectButton = findChild(controlUnderTest.footer, "rejectButton") verify(!!rejectButton) compare(rejectButton.interactive, true) rejectButton.clicked() compare(signalSpyRejected.count, 1) compare(controlUnderTest.opened, false) compare(controlUnderTest.result, Dialog.Rejected) } } }