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:
benk10 2021-03-14 15:32:54 +02:00 committed by GitHub
parent b3cdf7fc0a
commit 20ecbe24a0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 198 additions and 15 deletions

View file

@ -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"
}

View file

@ -1,8 +0,0 @@
describe('Rescanning existing wallets', () => {
it('Creates a wallet on specter', () => {
cy.viewport(1200,660)
cy.visit('/')
// empty so far
})
})

View 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)
})
})
})

View 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')
})
})

View file

@ -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)
})
})

View file

@ -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">

View file

@ -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);

View file

@ -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>

View file

@ -28,6 +28,7 @@ function check_consistency {
fi
$(npm bin)/cypress verify
}
check_consistency
function sub_default {