mirror of
https://github.com/cryptoadvance/specter-desktop.git
synced 2026-08-13 12:33:29 +02:00
Chore: Some more Cypress tests (#970)
* Cypress GitHub Action * Update main.yml * Update main.yml * . * Update main.yml * Update main.yml * Update main.yml * Update main.yml * Update main.yml * Update main.yml * Update main.yml * Update main.yml * Update main.yml * Update main.yml * Update main.yml * Update main.yml * . * Update main.yml * Update main.yml * Update main.yml * Update main.yml * Update main.yml * Update test-cypress.sh * . * . * . * Update main.yml * Update main.yml * Update test-cypress.sh * Update main.yml * Update main.yml * Update main.yml * Update main.yml * fix * fix * Update test-cypress.sh * Update test-cypress.sh * Update test-cypress.sh * Update main.yml * added debugging * more logging * more visibility * even more visibility * moar visibility * moar visibility * moar visibility * Multisig test * UTXO tab tests * remove changes for gh actions * Remove bitcoind changes * Fix bug in coin selection from UTXO tab Co-authored-by: Kim Neunert <k9ert@gmx.de>
This commit is contained in:
parent
b3cdf7fc0a
commit
20ecbe24a0
9 changed files with 198 additions and 15 deletions
|
|
@ -2,7 +2,8 @@
|
|||
"testFiles": [
|
||||
"spec_empty_specter_home.js",
|
||||
"spec_node_configured.js",
|
||||
"spec_existing_history.js"
|
||||
"spec_wallet_send.js",
|
||||
"spec_wallet_utxo.js"
|
||||
],
|
||||
"baseUrl": "http://localhost:25444"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +0,0 @@
|
|||
describe('Rescanning existing wallets', () => {
|
||||
it('Creates a wallet on specter', () => {
|
||||
cy.viewport(1200,660)
|
||||
cy.visit('/')
|
||||
// empty so far
|
||||
})
|
||||
|
||||
})
|
||||
94
cypress/integration/spec_wallet_send.js
Normal file
94
cypress/integration/spec_wallet_send.js
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
describe('Send transactions from wallets', () => {
|
||||
it('Creates a single sig wallet on specter and send transaction', () => {
|
||||
cy.viewport(1200,660)
|
||||
cy.visit('/')
|
||||
// empty so far
|
||||
cy.addHotDevice("Hot Device 1")
|
||||
cy.get('body').then(($body) => {
|
||||
if ($body.text().includes('Test Hot Wallet 1')) {
|
||||
cy.get('#wallets_list > .item > svg').click()
|
||||
cy.get(':nth-child(6) > .right').click()
|
||||
cy.get('#advanced_settings_tab_btn').click()
|
||||
cy.get('.card > :nth-child(9) > .btn').click()
|
||||
}
|
||||
})
|
||||
cy.get('#btn_new_wallet').click()
|
||||
cy.get('[href="./simple/"]').click()
|
||||
cy.get('#hot_device_1').click()
|
||||
cy.get('#wallet_name').type("Test Hot Wallet 1")
|
||||
cy.get('#keysform > .centered').click()
|
||||
cy.get('body').contains("New wallet was created successfully!")
|
||||
// Download PDF
|
||||
// unfortunately this results in weird effects in cypress run
|
||||
//cy.get('#pdf-wallet-download > img').click()
|
||||
cy.task("node:mine")
|
||||
cy.get('#btn_continue').click()
|
||||
cy.get('#btn_transactions').click()
|
||||
cy.get('#fullbalance_amount')
|
||||
.should(($div) => {
|
||||
const n = parseFloat($div.text())
|
||||
expect(n).to.be.gt(0).and.be.lte(50)
|
||||
})
|
||||
cy.get('#btn_send').click()
|
||||
cy.get('#address_0').type("bcrt1qsj30deg0fgzckvlrn5757yk55yajqv6dqx0x7u")
|
||||
cy.get('#label_0').type("Burn address")
|
||||
cy.get('#send_max_0').click()
|
||||
cy.get('#create_psbt_btn').click()
|
||||
cy.get('body').contains("Paste signed transaction")
|
||||
cy.get('#hot_device_1_tx_sign_btn').click()
|
||||
cy.get('#hot_device_1_hot_sign_btn').click()
|
||||
cy.get('#hot_enter_passphrase__submit').click()
|
||||
cy.get('#broadcast_local_btn').click()
|
||||
cy.get('#fullbalance_amount')
|
||||
.should(($div) => {
|
||||
const n = parseFloat($div.text())
|
||||
expect(n).to.be.equals(0)
|
||||
})
|
||||
})
|
||||
|
||||
it('Creates a multi sig wallet on specter and send transaction', () => {
|
||||
cy.viewport(1200,660)
|
||||
cy.visit('/')
|
||||
cy.get('body').then(($body) => {
|
||||
if ($body.text().includes('Test Multisig Wallet 1')) {
|
||||
cy.get('#wallets_list > .item > svg').click()
|
||||
cy.get(':nth-child(6) > .right').click()
|
||||
cy.get('#advanced_settings_tab_btn').click()
|
||||
cy.get('.card > :nth-child(9) > .btn').click()
|
||||
}
|
||||
})
|
||||
cy.get('#btn_new_wallet').click()
|
||||
cy.get('[href="./multisig/"]').click()
|
||||
cy.get('#hot_device_1').click()
|
||||
cy.get('#testdevice_ghost').click()
|
||||
cy.get('#submit-device').click()
|
||||
cy.get('#wallet_name').type("Test Multisig Wallet 1")
|
||||
|
||||
cy.get('#keysform > .centered').click()
|
||||
cy.get('body').contains("New wallet was created successfully!")
|
||||
cy.get('#page_overlay_popup_cancel_button').click()
|
||||
// Send transaction
|
||||
cy.task("node:mine")
|
||||
cy.get('#btn_transactions').click()
|
||||
cy.get('#fullbalance_amount')
|
||||
.should(($div) => {
|
||||
const n = parseFloat($div.text())
|
||||
expect(n).to.be.gt(0).and.be.lte(50)
|
||||
})
|
||||
cy.get('#btn_send').click()
|
||||
cy.get('#address_0').type("bcrt1qsj30deg0fgzckvlrn5757yk55yajqv6dqx0x7u")
|
||||
cy.get('#label_0').type("Burn address")
|
||||
cy.get('#send_max_0').click()
|
||||
cy.get('#create_psbt_btn').click()
|
||||
cy.get('body').contains("Paste signed transaction")
|
||||
cy.get('#hot_device_1_tx_sign_btn').click()
|
||||
cy.get('#hot_device_1_hot_sign_btn').click()
|
||||
cy.get('#hot_enter_passphrase__submit').click()
|
||||
cy.get('#broadcast_local_btn').click()
|
||||
cy.get('#fullbalance_amount')
|
||||
.should(($div) => {
|
||||
const n = parseFloat($div.text())
|
||||
expect(n).to.be.equals(0)
|
||||
})
|
||||
})
|
||||
})
|
||||
74
cypress/integration/spec_wallet_utxo.js
Normal file
74
cypress/integration/spec_wallet_utxo.js
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
describe('Send transactions from wallets', () => {
|
||||
it('Freeze and unfreeze UTXO', () => {
|
||||
cy.viewport(1200,660)
|
||||
cy.task("node:mine")
|
||||
cy.wait(10000)
|
||||
cy.task("node:mine")
|
||||
cy.wait(10000)
|
||||
cy.task("node:mine")
|
||||
cy.wait(10000)
|
||||
|
||||
cy.visit('/wallets/wallet/test_hot_wallet_1/history')
|
||||
|
||||
cy.wait(1000)
|
||||
cy.get('tx-table').shadow().find('.utxo-view-btn').click()
|
||||
|
||||
cy.get('tx-table').shadow().find('tx-row').each(($el, index, $list) => {
|
||||
cy.wrap($el).shadow().find('.tx-row').should('not.have.class', 'frozen')
|
||||
cy.wrap($el).shadow().find('.frozen-img').should('have.class', 'hidden')
|
||||
})
|
||||
|
||||
// Freeze the UTXO
|
||||
cy.get('tx-table').shadow().find('tx-row').eq(0).shadow().find('.select-tx-img').click()
|
||||
cy.get('tx-table').shadow().find('.freeze-tx-btn').click()
|
||||
|
||||
cy.get('tx-table').shadow().find('tx-row').each(($el, index, $list) => {
|
||||
if (index == 0) {
|
||||
cy.wrap($el).shadow().find('.tx-row').should('have.class', 'frozen')
|
||||
cy.wrap($el).shadow().find('.frozen-img').should('not.have.class', 'hidden')
|
||||
} else {
|
||||
cy.wrap($el).shadow().find('.tx-row').should('not.have.class', 'frozen')
|
||||
cy.wrap($el).shadow().find('.frozen-img').should('have.class', 'hidden')
|
||||
}
|
||||
})
|
||||
|
||||
// Test freeze UTXO can't be spend, and unfreeze works for coin selection option
|
||||
cy.get('tx-table').shadow().find('tx-row').eq(0).shadow().find('.select-tx-img').click()
|
||||
cy.get('tx-table').shadow().find('tx-row').eq(1).shadow().find('.select-tx-img').click()
|
||||
cy.get('tx-table').shadow().find('tx-row').eq(3).shadow().find('.select-tx-img').click()
|
||||
cy.get('tx-table').shadow().find('.compose-tx-btn').click()
|
||||
|
||||
// cy.get('#coin_selection_table').find('tr').eq(0).find('.coin_select_checkbox').should('be.checked')
|
||||
cy.get('.coin_select_checkbox[checked]').should('have.length', 2);
|
||||
|
||||
cy.get('.coin_select_checkbox').eq(0).should('be.checked')
|
||||
cy.get('.coin_select_checkbox').eq(1).should('not.be.checked')
|
||||
cy.get('.coin_select_checkbox').eq(2).should('be.checked')
|
||||
|
||||
// Unfreeze the UTXO
|
||||
cy.get('#btn_transactions').click()
|
||||
cy.wait(1000)
|
||||
cy.get('tx-table').shadow().find('.utxo-view-btn').click()
|
||||
|
||||
cy.get('tx-table').shadow().find('tx-row').eq(0).shadow().find('.select-tx-img').click()
|
||||
cy.get('tx-table').shadow().find('.freeze-tx-btn').click()
|
||||
|
||||
cy.get('tx-table').shadow().find('tx-row').each(($el, index, $list) => {
|
||||
cy.wrap($el).shadow().find('.tx-row').should('not.have.class', 'frozen')
|
||||
cy.wrap($el).shadow().find('.frozen-img').should('have.class', 'hidden')
|
||||
})
|
||||
|
||||
// Ensure selection of unfreeze now works
|
||||
cy.get('tx-table').shadow().find('tx-row').eq(0).shadow().find('.select-tx-img').click()
|
||||
cy.get('tx-table').shadow().find('tx-row').eq(1).shadow().find('.select-tx-img').click()
|
||||
cy.get('tx-table').shadow().find('tx-row').eq(3).shadow().find('.select-tx-img').click()
|
||||
cy.get('tx-table').shadow().find('.compose-tx-btn').click()
|
||||
|
||||
cy.get('.coin_select_checkbox[checked]').should('have.length', 3);
|
||||
|
||||
cy.get('.coin_select_checkbox').eq(0).should('be.checked')
|
||||
cy.get('.coin_select_checkbox').eq(1).should('be.checked')
|
||||
cy.get('.coin_select_checkbox').eq(2).should('not.be.checked')
|
||||
cy.get('.coin_select_checkbox').eq(3).should('be.checked')
|
||||
})
|
||||
})
|
||||
|
|
@ -44,8 +44,29 @@ Cypress.Commands.add("addDevice", (name) => {
|
|||
cy.get('#step1 > .note').click()
|
||||
cy.get('#device_name').type(name)
|
||||
cy.get('#device_type').select("Specter-DIY")
|
||||
cy.get('#txt').type("[8c24a510/84h/1h/0h]vpub5Y24kG7ZrCFRkRnHia2sdnt5N7MmsrNry1jMrP8XptMEcZZqkjQA6bc1f52RGiEoJmdy1Vk9Qck9tAL1ohKvuq3oFXe3ADVse6UiTHzuyKx")
|
||||
cy.get('#txt').type("[6ea15da6/84h/1h/0h]vpub5Yw9Qps1aUVBpD3eyKVUhe5K8gbaWav9ArB4FudKeCLPb5vSsX8afAWfYvEASbkv4qxKzxSRyd3wqdgM3ir2fbrUJwiHDAJUNWGeqMDQfTj")
|
||||
cy.get('#txt').type("\n[6ea15da6/49h/1h/0h]upub5DANnftqN2Tj4S185offdMnaM6Qea3jinT57VfScASP2fuENSrFn9ixZ7zFX7ZmLovp7j2oEiWYSpCcPkeBuR2ULCiiEn8TW8P8mjaaydR3")
|
||||
cy.get('#txt').type("\n[6ea15da6/48h/1h/0h/2h]Vpub5mvDKGjRsucYGM7PWahGKJKkC3um3oJMqCYDf6SzdkPp8yES65bLfvxhE1bCZsqWobZKpcdTk3niqKR3f6T4B2zJDSyDdes3TyRM17vXYQs")
|
||||
cy.get('#txt').type("\n[6ea15da6/48h/1h/0h/1h]Upub5T5x1c4WjE54P7PsaPCUa9WNtcZuNyijXdytoHAzcK5AWrMHXX8ebWyQCXaBJuRVLDgKJMjTGSmZUans2ghMGBA8g9xRjdhuFrTyJxKYKDE")
|
||||
cy.get('#cold_device > [type="submit"]').click()
|
||||
cy.get('#devices_list > .item > div').contains(name)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
Cypress.Commands.add("addHotDevice", (name) => {
|
||||
cy.get('body').then(($body) => {
|
||||
if ($body.text().includes(name)) {
|
||||
cy.get('#devices_list > .item > div').click()
|
||||
cy.get('#forget_device').click()
|
||||
}
|
||||
cy.get('#side-content').click()
|
||||
cy.get('#btn_new_device').click()
|
||||
// Creating a Device
|
||||
cy.contains('Select Your Device Type')
|
||||
cy.get('#bitcoincore_device_card').click()
|
||||
cy.get('#wizard-next').click()
|
||||
cy.get('#device_name').type(name)
|
||||
cy.get('#wizard-submit').click()
|
||||
cy.get('#devices_list > .item > div').contains(name)
|
||||
})
|
||||
})
|
||||
|
|
@ -100,7 +100,7 @@
|
|||
<div {% if not existing_device or existing_device.hot_wallet %}id="step2" class="hidden"{% else %}id="step1"{% endif %}>
|
||||
<h1 style="font-size: 1.8em;">Upload Keys</h1>
|
||||
{% if not existing_device %}
|
||||
<h2 style="max-width: 500px; margin: auto;">Name your Device: <input type="text" name="device_name" placeholder="My device" required/></h2>
|
||||
<h2 style="max-width: 500px; margin: auto;">Name your Device: <input type="text" name="device_name" placeholder="My device" id="device_name" required/></h2>
|
||||
<br>
|
||||
{% endif %}
|
||||
<div id="coldcard-instructions">
|
||||
|
|
|
|||
|
|
@ -402,7 +402,7 @@
|
|||
this.composeTxBtn.onclick = () => {
|
||||
for (let tx of this.selectedRows) {
|
||||
this.composeTxForm.innerHTML += `
|
||||
<input type="checkbox" checked class="hidden" name="coinselect" value="${tx.txid}, ${tx.vout}, ${tx.amount}">
|
||||
<input type="checkbox" checked class="hidden" name="coinselect" value="${tx.txid}, ${tx.vout}">
|
||||
`
|
||||
}
|
||||
this.composeTxForm.action = `{{ url_for('wallets_endpoint.send_new', wallet_alias='WALLET_ALIAS') }}`.replace("WALLET_ALIAS", this.wallet);
|
||||
|
|
|
|||
|
|
@ -133,7 +133,7 @@
|
|||
</div>
|
||||
<br>
|
||||
Address label (optional):<br>
|
||||
<input type="text" id="label" name="label_${i}" value="${label}">
|
||||
<input type="text" id="label_${i}" name="label_${i}" value="${label}">
|
||||
<br><br>
|
||||
Amount:<br>
|
||||
<input style="width: 200px" type="number" name="amount_${i}" oninput="calculateConvertedUnit(${i})" id="amount_${i}" min=0 step="${step}" autocomplete="off" value="${amount}">
|
||||
|
|
@ -141,7 +141,7 @@
|
|||
<div class="mobile-only" style="margin-top: 10px;"></div>
|
||||
<label><input type="radio" class="inline" style="margin: 0 5px;" name="amount_unit_${i}" value="sat" onchange="toggleUnit(this, ${i})" ${satChecked}>sat</label>
|
||||
<label><input type="radio" class="inline" style="margin: 0 5px;" name="amount_unit_${i}" value="btc" onchange="toggleUnit(this, ${i})" ${btcChecked}>BTC</label>
|
||||
<span class="note max-btn" style="margin-left: 5px;" onclick="setMaxAmount(${i})">(send max)</span>
|
||||
<span class="note max-btn" style="margin-left: 5px;" id="send_max_${i}" onclick="setMaxAmount(${i})">(send max)</span>
|
||||
<div>
|
||||
<span class="note" id="converted_unit_amount_${i}">-</span> <span class="note" id="converted_unit_label_${i}">${convertedUnit}</span> <span class="note" id="converted_unit_alt_${i}"></span>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ function check_consistency {
|
|||
fi
|
||||
$(npm bin)/cypress verify
|
||||
}
|
||||
|
||||
check_consistency
|
||||
|
||||
function sub_default {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue