AssetSelector covered with unit tests
This commit is contained in:
parent
bb2eeaa79d
commit
c8b8d1ee9d
|
@ -0,0 +1,238 @@
|
|||
import QtQuick 2.15
|
||||
import QtQuick.Controls 2.15
|
||||
import QtTest 1.15
|
||||
|
||||
import AppLayouts.Wallet.controls 1.0
|
||||
|
||||
import utils 1.0
|
||||
|
||||
Item {
|
||||
id: root
|
||||
|
||||
width: 600
|
||||
height: 600
|
||||
|
||||
readonly property var assetsData: [
|
||||
{
|
||||
tokensKey: "stt_key",
|
||||
communityId: "",
|
||||
name: "Status Test Token",
|
||||
currencyBalanceAsString: "42,23 USD",
|
||||
symbol: "STT",
|
||||
iconSource: Constants.tokenIcon("STT"),
|
||||
|
||||
balances: [
|
||||
{
|
||||
balanceAsString: "0,56",
|
||||
iconUrl: "network/Network=Ethereum"
|
||||
}
|
||||
],
|
||||
|
||||
sectionText: "My assets on Mainnet"
|
||||
},
|
||||
{
|
||||
tokensKey: "eth_key",
|
||||
communityId: "",
|
||||
name: "Ether",
|
||||
currencyBalanceAsString: "4 276,86 USD",
|
||||
symbol: "ETH",
|
||||
iconSource: Constants.tokenIcon("ETH"),
|
||||
|
||||
balances: [
|
||||
{
|
||||
balanceAsString: "0,12",
|
||||
iconUrl: "network/Network=Ethereum"
|
||||
}
|
||||
],
|
||||
|
||||
sectionText: "My assets on Mainnet"
|
||||
},
|
||||
{
|
||||
tokensKey: "dai_key",
|
||||
communityId: "",
|
||||
name: "Dai Stablecoin",
|
||||
currencyBalanceAsString: "45,92 USD",
|
||||
symbol: "DAI",
|
||||
iconSource: Constants.tokenIcon("DAI"),
|
||||
balances: [],
|
||||
|
||||
sectionText: "Popular assets"
|
||||
}
|
||||
]
|
||||
|
||||
ListModel {
|
||||
id: assetsModel
|
||||
|
||||
Component.onCompleted: append(assetsData)
|
||||
}
|
||||
|
||||
Component {
|
||||
id: selectorCmp
|
||||
|
||||
AssetSelector {
|
||||
id: selector
|
||||
|
||||
anchors.centerIn: parent
|
||||
model: assetsModel
|
||||
|
||||
readonly property SignalSpy selectedSpy: SignalSpy {
|
||||
target: selector
|
||||
signalName: "selected"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TestCase {
|
||||
name: "AssetSelector"
|
||||
when: windowShown
|
||||
|
||||
function test_basic() {
|
||||
const selector = createTemporaryObject(selectorCmp, root)
|
||||
selector.nonInteractiveKey = "eth_key"
|
||||
selector.sectionProperty = "sectionText"
|
||||
|
||||
compare(selector.isSelected, false)
|
||||
waitForRendering(selector)
|
||||
|
||||
verify(selector.width > 0)
|
||||
verify(selector.height > 0)
|
||||
|
||||
mouseClick(selector)
|
||||
|
||||
const panel = findChild(selector.Overlay.overlay, "searchableAssetsPanel")
|
||||
compare(panel.model, selector.model)
|
||||
compare(panel.nonInteractiveKey, selector.nonInteractiveKey)
|
||||
compare(panel.sectionProperty, selector.sectionProperty)
|
||||
}
|
||||
|
||||
function test_basicSelection() {
|
||||
const selector = createTemporaryObject(selectorCmp, root)
|
||||
const button = selector.contentItem
|
||||
|
||||
compare(selector.isSelected, false)
|
||||
compare(button.selected, false)
|
||||
waitForRendering(selector)
|
||||
|
||||
// click to open popup
|
||||
mouseClick(selector)
|
||||
compare(selector.isSelected, false)
|
||||
compare(button.selected, false)
|
||||
|
||||
const listView = findChild(selector.Overlay.overlay, "assetsListView")
|
||||
verify(listView)
|
||||
|
||||
compare(listView.count, root.assetsData.length)
|
||||
waitForRendering(listView)
|
||||
|
||||
const delegate1 = listView.itemAtIndex(0)
|
||||
const delegate2 = listView.itemAtIndex(1)
|
||||
|
||||
verify(delegate1)
|
||||
verify(delegate2)
|
||||
|
||||
// click on delegate to select
|
||||
mouseClick(delegate2)
|
||||
compare(selector.isSelected, true)
|
||||
compare(selector.selectedSpy.count, 1)
|
||||
compare(selector.selectedSpy.signalArguments[0][0], "eth_key")
|
||||
compare(button.selected, true)
|
||||
compare(button.name, "ETH")
|
||||
compare(button.icon, Constants.tokenIcon("ETH"))
|
||||
|
||||
// popup should be closed, content not accessible
|
||||
verify(!findChild(selector.Overlay.overlay, "searchableAssetsPanel"))
|
||||
|
||||
// reopen popup
|
||||
mouseClick(selector)
|
||||
const panel = findChild(selector.Overlay.overlay, "searchableAssetsPanel")
|
||||
verify(panel)
|
||||
|
||||
compare(panel.highlightedKey, "eth_key")
|
||||
compare(panel.nonInteractiveKey, "")
|
||||
}
|
||||
|
||||
function test_resetSelection() {
|
||||
const selector = createTemporaryObject(selectorCmp, root)
|
||||
const button = selector.contentItem
|
||||
|
||||
compare(selector.isSelected, false)
|
||||
compare(button.selected, false)
|
||||
waitForRendering(selector)
|
||||
|
||||
// click to open popup
|
||||
mouseClick(selector)
|
||||
|
||||
const listView = findChild(selector.Overlay.overlay, "assetsListView")
|
||||
verify(listView)
|
||||
|
||||
waitForRendering(listView)
|
||||
const delegate2 = listView.itemAtIndex(1)
|
||||
|
||||
verify(delegate2)
|
||||
|
||||
// click on delegate to select
|
||||
mouseClick(delegate2)
|
||||
compare(selector.isSelected, true)
|
||||
|
||||
// reset
|
||||
selector.reset()
|
||||
compare(selector.isSelected, false)
|
||||
compare(button.selected, false)
|
||||
|
||||
// reopen popup
|
||||
mouseClick(selector)
|
||||
const panel = findChild(selector.Overlay.overlay, "searchableAssetsPanel")
|
||||
verify(panel)
|
||||
|
||||
compare(panel.highlightedKey, "")
|
||||
compare(panel.nonInteractiveKey, "")
|
||||
}
|
||||
|
||||
function test_customSelection() {
|
||||
const selector = createTemporaryObject(selectorCmp, root)
|
||||
const button = selector.contentItem
|
||||
|
||||
compare(selector.isSelected, false)
|
||||
waitForRendering(selector)
|
||||
|
||||
const imageUrl = Constants.tokenIcon("DAI")
|
||||
selector.setCustom("Custom", imageUrl, "custom_key")
|
||||
|
||||
compare(selector.isSelected, true)
|
||||
compare(selector.selectedSpy.count, 0)
|
||||
compare(button.selected, true)
|
||||
compare(button.name, "Custom")
|
||||
compare(button.icon, Constants.tokenIcon("DAI"))
|
||||
}
|
||||
|
||||
function test_searchNotPersistent() {
|
||||
const selector = createTemporaryObject(selectorCmp, root)
|
||||
const button = selector.contentItem
|
||||
|
||||
compare(selector.isSelected, false)
|
||||
compare(button.selected, false)
|
||||
waitForRendering(selector)
|
||||
|
||||
// click to open popup
|
||||
mouseClick(selector)
|
||||
|
||||
const panel = findChild(selector.Overlay.overlay, "searchableAssetsPanel")
|
||||
verify(panel)
|
||||
|
||||
const searchBox = findChild(panel, "searchBox")
|
||||
verify(searchBox)
|
||||
|
||||
compare(searchBox.text, "")
|
||||
searchBox.text = "seach string"
|
||||
keyClick(Qt.Key_Escape)
|
||||
|
||||
// click to re-open popup
|
||||
mouseClick(selector)
|
||||
{
|
||||
const searchBox = findChild(panel, "searchBox")
|
||||
verify(searchBox)
|
||||
compare(searchBox.text, "")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,209 @@
|
|||
import QtQuick 2.15
|
||||
import QtTest 1.15
|
||||
|
||||
import AppLayouts.Wallet.panels 1.0
|
||||
|
||||
import Storybook 1.0
|
||||
|
||||
import utils 1.0
|
||||
|
||||
Item {
|
||||
id: root
|
||||
|
||||
width: 600
|
||||
height: 400
|
||||
|
||||
Component {
|
||||
id: panelCmp
|
||||
|
||||
SearchableAssetsPanel {
|
||||
id: panel
|
||||
|
||||
sectionProperty: "sectionText"
|
||||
|
||||
readonly property SignalSpy selectedSpy: SignalSpy {
|
||||
target: panel
|
||||
signalName: "selected"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
readonly property var assetsData: [
|
||||
{
|
||||
tokensKey: "stt_key",
|
||||
communityId: "",
|
||||
name: "Status Test Token",
|
||||
currencyBalanceAsString: "42,23 USD",
|
||||
symbol: "STT",
|
||||
iconSource: Constants.tokenIcon("STT"),
|
||||
balances: [
|
||||
{
|
||||
balanceAsString: "0,56",
|
||||
iconUrl: "network/Network=Ethereum"
|
||||
},
|
||||
{
|
||||
balanceAsString: "0,22",
|
||||
iconUrl: "network/Network=Arbitrum"
|
||||
},
|
||||
{
|
||||
balanceAsString: "0,12",
|
||||
iconUrl: "network/Network=Optimism"
|
||||
}
|
||||
],
|
||||
|
||||
sectionText: ""
|
||||
},
|
||||
{
|
||||
tokensKey: "dai_key",
|
||||
communityId: "",
|
||||
name: "Dai Stablecoin",
|
||||
currencyBalanceAsString: "45,92 USD",
|
||||
symbol: "DAI",
|
||||
iconSource: Constants.tokenIcon("DAI"),
|
||||
balances: [],
|
||||
|
||||
sectionText: "Popular assets"
|
||||
},
|
||||
{
|
||||
tokensKey: "zrx_key",
|
||||
communityId: "",
|
||||
name: "0x",
|
||||
currencyBalanceAsString: "41,22 USD",
|
||||
symbol: "ZRX",
|
||||
iconSource: Constants.tokenIcon("ZRX"),
|
||||
balances: [],
|
||||
|
||||
sectionText: "Popular assets"
|
||||
}
|
||||
]
|
||||
|
||||
ListModel {
|
||||
id: model
|
||||
|
||||
Component.onCompleted: append(root.assetsData)
|
||||
}
|
||||
|
||||
TestCase {
|
||||
name: "SearchableAssetsPanel"
|
||||
when: windowShown
|
||||
|
||||
function test_sections() {
|
||||
const control = createTemporaryObject(panelCmp, root, { model })
|
||||
|
||||
const listView = findChild(control, "assetsListView")
|
||||
waitForRendering(listView)
|
||||
|
||||
compare(listView.count, 3)
|
||||
|
||||
const delegate1 = listView.itemAtIndex(0)
|
||||
const delegate2 = listView.itemAtIndex(1)
|
||||
const delegate3 = listView.itemAtIndex(2)
|
||||
|
||||
verify(delegate1)
|
||||
verify(delegate2)
|
||||
verify(delegate3)
|
||||
|
||||
compare(delegate1.ListView.section, "")
|
||||
compare(delegate2.ListView.section, "Popular assets")
|
||||
compare(delegate3.ListView.section, "Popular assets")
|
||||
|
||||
const sectionDelegate = TestUtils.findTextItem(listView, "Popular assets")
|
||||
verify(sectionDelegate)
|
||||
|
||||
control.sectionProperty = ""
|
||||
waitForRendering(listView)
|
||||
|
||||
compare(delegate1.ListView.section, "")
|
||||
compare(delegate2.ListView.section, "")
|
||||
compare(delegate3.ListView.section, "")
|
||||
}
|
||||
|
||||
function test_search() {
|
||||
const control = createTemporaryObject(panelCmp, root, { model })
|
||||
|
||||
const listView = findChild(control, "assetsListView")
|
||||
waitForRendering(listView)
|
||||
|
||||
const searchBox = findChild(control, "searchBox")
|
||||
|
||||
{
|
||||
searchBox.text = "Status"
|
||||
waitForRendering(listView)
|
||||
|
||||
compare(listView.count, 1)
|
||||
const delegate1 = listView.itemAtIndex(0)
|
||||
verify(delegate1)
|
||||
compare(delegate1.name, "Status Test Token")
|
||||
}
|
||||
{
|
||||
searchBox.text = "zrx"
|
||||
waitForRendering(listView)
|
||||
|
||||
compare(listView.count, 1)
|
||||
const delegate1 = listView.itemAtIndex(0)
|
||||
verify(delegate1)
|
||||
compare(delegate1.name, "0x")
|
||||
}
|
||||
{
|
||||
control.clearSearch()
|
||||
waitForRendering(listView)
|
||||
|
||||
compare(searchBox.text, "")
|
||||
compare(listView.count, 3)
|
||||
}
|
||||
}
|
||||
|
||||
function test_highlightedKey() {
|
||||
const control = createTemporaryObject(panelCmp, root, { model })
|
||||
control.highlightedKey = "dai_key"
|
||||
|
||||
const listView = findChild(control, "assetsListView")
|
||||
waitForRendering(listView)
|
||||
|
||||
compare(listView.count, 3)
|
||||
|
||||
const delegate1 = listView.itemAtIndex(0)
|
||||
const delegate2 = listView.itemAtIndex(1)
|
||||
const delegate3 = listView.itemAtIndex(2)
|
||||
|
||||
verify(delegate1)
|
||||
verify(delegate2)
|
||||
verify(delegate3)
|
||||
|
||||
compare(delegate1.highlighted, false)
|
||||
compare(delegate2.highlighted, true)
|
||||
compare(delegate3.highlighted, false)
|
||||
}
|
||||
|
||||
function test_nonInteractiveKey() {
|
||||
const control = createTemporaryObject(panelCmp, root, { model })
|
||||
control.nonInteractiveKey = "dai_key"
|
||||
|
||||
const listView = findChild(control, "assetsListView")
|
||||
waitForRendering(listView)
|
||||
|
||||
compare(listView.count, 3)
|
||||
|
||||
const delegate1 = listView.itemAtIndex(0)
|
||||
const delegate2 = listView.itemAtIndex(1)
|
||||
const delegate3 = listView.itemAtIndex(2)
|
||||
|
||||
verify(delegate1)
|
||||
verify(delegate2)
|
||||
verify(delegate3)
|
||||
|
||||
compare(delegate1.enabled, true)
|
||||
compare(delegate2.enabled, false)
|
||||
compare(delegate3.enabled, true)
|
||||
|
||||
mouseClick(delegate1)
|
||||
compare(control.selectedSpy.count, 1)
|
||||
|
||||
mouseClick(delegate2)
|
||||
compare(control.selectedSpy.count, 1)
|
||||
|
||||
mouseClick(delegate3)
|
||||
compare(control.selectedSpy.count, 2)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,133 @@
|
|||
import QtQuick 2.15
|
||||
import QtTest 1.15
|
||||
|
||||
import AppLayouts.Wallet.views 1.0
|
||||
|
||||
import Storybook 1.0
|
||||
|
||||
Item {
|
||||
id: root
|
||||
|
||||
width: 600
|
||||
height: 400
|
||||
|
||||
Component {
|
||||
id: delegateCmp
|
||||
|
||||
TokenSelectorAssetDelegate {
|
||||
id: delegate
|
||||
|
||||
name: "Ether"
|
||||
symbol: "ETH"
|
||||
currencyBalanceAsString: "42.02 USD"
|
||||
iconSource: ""
|
||||
width: 250
|
||||
|
||||
readonly property SignalSpy clickSpy: SignalSpy {
|
||||
target: delegate
|
||||
signalName: "clicked"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ListModel {
|
||||
id: balancesModel
|
||||
|
||||
ListElement {
|
||||
balanceAsString: "1234.50"
|
||||
iconUrl: "network/Network=Ethereum"
|
||||
}
|
||||
ListElement {
|
||||
balanceAsString: "33.52"
|
||||
iconUrl: "network/Network=Arbitrum"
|
||||
}
|
||||
}
|
||||
|
||||
TestCase {
|
||||
name: "TokenSelectorAssetDelegate"
|
||||
when: windowShown
|
||||
|
||||
function test_elision() {
|
||||
const control = createTemporaryObject(delegateCmp, root)
|
||||
|
||||
const nameText = TestUtils.findTextItem(control, "Ether")
|
||||
const symbolText = TestUtils.findTextItem(control, "ETH")
|
||||
const balanceText = TestUtils.findTextItem(control, "42.02 USD")
|
||||
|
||||
verify(nameText)
|
||||
verify(symbolText)
|
||||
verify(balanceText)
|
||||
|
||||
verify(nameText.visible)
|
||||
verify(symbolText.visible)
|
||||
verify(balanceText.visible)
|
||||
|
||||
waitForRendering(control)
|
||||
|
||||
verify(nameText.width > 0)
|
||||
verify(symbolText.width > 0)
|
||||
verify(balanceText.width > 0)
|
||||
|
||||
verify(!nameText.truncated)
|
||||
verify(!symbolText.truncated)
|
||||
verify(!balanceText.truncated)
|
||||
|
||||
control.name = "Ether ".repeat(10)
|
||||
|
||||
verify(nameText.truncated)
|
||||
verify(!symbolText.truncated)
|
||||
verify(!balanceText.truncated)
|
||||
}
|
||||
|
||||
function test_noBalances() {
|
||||
const control = createTemporaryObject(delegateCmp, root)
|
||||
|
||||
const list = findChild(control, "balancesListView")
|
||||
compare(list.visible, false)
|
||||
compare(list.count, 0)
|
||||
compare(list.interactive, true)
|
||||
|
||||
compare(control.opacity, 1)
|
||||
control.enabled = false
|
||||
verify(control.opacity < 1)
|
||||
|
||||
mouseClick(control)
|
||||
compare(control.clickSpy.count, 0)
|
||||
|
||||
control.enabled = true
|
||||
|
||||
mouseClick(control)
|
||||
compare(control.clickSpy.count, 1)
|
||||
}
|
||||
|
||||
function test_withBalances() {
|
||||
const control = createTemporaryObject(delegateCmp, root,
|
||||
{ balancesModel })
|
||||
|
||||
const list = findChild(control, "balancesListView")
|
||||
waitForRendering(list)
|
||||
|
||||
compare(list.visible, true)
|
||||
compare(list.count, 2)
|
||||
compare(list.interactive, true)
|
||||
|
||||
mouseClick(control)
|
||||
compare(control.clickSpy.count, 1)
|
||||
|
||||
mouseClick(list)
|
||||
compare(control.clickSpy.count, 2)
|
||||
|
||||
control.balancesListInteractive = false
|
||||
compare(list.interactive, false)
|
||||
|
||||
const subBalanceText1 = TestUtils.findTextItem(control, "1234.50")
|
||||
const subBalanceText2 = TestUtils.findTextItem(control, "33.52")
|
||||
|
||||
verify(subBalanceText1)
|
||||
verify(subBalanceText2)
|
||||
|
||||
verify(subBalanceText1.visible)
|
||||
verify(subBalanceText2.visible)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
import QtQuick 2.15
|
||||
import QtTest 1.15
|
||||
|
||||
import AppLayouts.Wallet.controls 1.0
|
||||
|
||||
import Storybook 1.0
|
||||
|
||||
Item {
|
||||
id: root
|
||||
|
||||
width: 600
|
||||
height: 400
|
||||
|
||||
Component {
|
||||
id: buttonCmp
|
||||
|
||||
TokenSelectorButton {
|
||||
name: "ETH"
|
||||
icon: ""
|
||||
}
|
||||
}
|
||||
|
||||
TestCase {
|
||||
name: "TokenSelectorButton"
|
||||
when: windowShown
|
||||
|
||||
function test_notSelected() {
|
||||
const button = createTemporaryObject(buttonCmp, root)
|
||||
|
||||
verify(TestUtils.findTextItem(button, button.text))
|
||||
verify(!TestUtils.findTextItem(button, "ETH"))
|
||||
verify(findChild(button, "notSelectedContent"))
|
||||
}
|
||||
|
||||
function test_selected() {
|
||||
const button = createTemporaryObject(buttonCmp, root)
|
||||
button.selected = true
|
||||
|
||||
verify(!TestUtils.findTextItem(button, button.text))
|
||||
verify(TestUtils.findTextItem(button, "ETH"))
|
||||
verify(findChild(button, "selectedContent"))
|
||||
}
|
||||
}
|
||||
}
|
|
@ -44,6 +44,8 @@ Control {
|
|||
id: notSelectedContent
|
||||
|
||||
RowLayout {
|
||||
objectName: "notSelectedContent"
|
||||
|
||||
spacing: 10
|
||||
|
||||
StatusBaseText {
|
||||
|
@ -64,6 +66,8 @@ Control {
|
|||
id: selectedContent
|
||||
|
||||
RowLayout {
|
||||
objectName: "selectedContent"
|
||||
|
||||
spacing: Style.current.halfPadding
|
||||
|
||||
StatusRoundedImage {
|
||||
|
|
Loading…
Reference in New Issue