diff --git a/frontend/cypress/integration/bisq/bisq.spec.ts b/frontend/cypress/integration/bisq/bisq.spec.ts index bafca218a..bc9e1e3b9 100644 --- a/frontend/cypress/integration/bisq/bisq.spec.ts +++ b/frontend/cypress/integration/bisq/bisq.spec.ts @@ -1,87 +1,163 @@ describe('Bisq', () => { - const baseModule = Cypress.env("BASE_MODULE"); - const basePath = ''; - - beforeEach(() => { - cy.intercept('/sockjs-node/info*').as('socket'); - cy.intercept('/bisq/api/markets/hloc?market=btc_usd&interval=day').as('hloc'); - cy.intercept('/bisq/api/markets/ticker').as('ticker'); - cy.intercept('/bisq/api/markets/markets').as('markets'); - cy.intercept('/bisq/api/markets/volumes/7d').as('7d'); - cy.intercept('/bisq/api/markets/trades?market=all').as('trades'); - cy.intercept('/bisq/api/txs/*/*').as('txs'); - cy.intercept('/bisq/api/blocks/*/*').as('blocks'); - cy.intercept('/bisq/api/stats').as('stats'); - - Cypress.Commands.add('waitForDashboard', () => { - cy.wait('@socket'); - cy.wait('@hloc'); - cy.wait('@ticker'); - cy.wait('@markets'); - cy.wait('@7d'); - cy.wait('@trades'); - }); + const baseModule = Cypress.env("BASE_MODULE"); + const basePath = ''; + + beforeEach(() => { + cy.intercept('/sockjs-node/info*').as('socket'); + cy.intercept('/bisq/api/markets/hloc?market=btc_usd&interval=day').as('hloc'); + cy.intercept('/bisq/api/markets/ticker').as('ticker'); + cy.intercept('/bisq/api/markets/markets').as('markets'); + cy.intercept('/bisq/api/markets/volumes/7d').as('7d'); + cy.intercept('/bisq/api/markets/trades?market=all').as('trades'); + cy.intercept('/bisq/api/txs/*/*').as('txs'); + cy.intercept('/bisq/api/blocks/*/*').as('blocks'); + cy.intercept('/bisq/api/stats').as('stats'); + }); + + if (baseModule === 'bisq') { + it('loads the dashboard', () => { + cy.visit(`${basePath}`); + cy.waitForSkeletonGone(); }); - if (baseModule === 'bisq') { - - it('loads the dashboard', () => { - cy.visit(`${basePath}`); - cy.waitForSkeletonGone(); + describe("transactions", () => { + it('loads the transactions screen', () => { + cy.visit(`${basePath}`); + cy.waitForSkeletonGone(); + cy.get('#btn-transactions').click().then(() => { + cy.get('.table > tr').should('have.length', 50); }); + }); - it('loads the transactions screen', () => { - cy.visit(`${basePath}`); - cy.waitForSkeletonGone(); - cy.get('li:nth-of-type(2) > a').click().then(() => { - cy.get('.table > tr').should('have.length', 50); - }); + const filters = [ + "Asset listing fee", "Blind vote", "Compensation request", + "Genesis", "Irregular", "Lockup", "Pay trade fee", "Proof of burn", + "Proposal", "Reimbursement request", "Transfer BSQ", "Unlock", "Vote reveal" + ]; + filters.forEach((filter) => { + it(`filters the transaction screen by ${filter}`, () => { + cy.visit(`${basePath}/transactions`); + cy.waitForSkeletonGone(); + cy.get('#filter').click(); + cy.contains(filter).find('input').click(); + //TODO: change this waiter + cy.wait(1000); + cy.get('td:nth-of-type(2)').each(($td) => { + expect($td.text().trim()).to.eq(filter); + }); }); + }); - it('loads the blocks screen', () => { - cy.visit(`${basePath}`); - cy.waitForSkeletonGone(); - cy.get('li:nth-of-type(3) > a').click().then(() => { - cy.wait('@blocks'); - cy.get('tbody tr').should('have.length', 10); - }); + it("filters using multiple criteria", () => { + const filters = ['Proposal', 'Lockup', 'Unlock']; + cy.visit(`${basePath}/transactions`); + cy.waitForSkeletonGone(); + cy.get('#filter').click(); + filters.forEach((filter) => { + cy.contains(filter).find('input').click(); + //TODO: change this waiter + cy.wait(1000); }); + cy.get('td:nth-of-type(2)').each(($td) => { + const regex = new RegExp(`${filters.join('|')}`, 'g'); + expect($td.text().trim()).to.match(regex); + }); + }); - it('loads the stats screen', () => { - cy.visit(`${basePath}`); - cy.waitForSkeletonGone(); - cy.get('li:nth-of-type(4) > a').click().then(() => { - cy.wait('@stats'); - }); - }); + const transactions = [ + { type: 'Asset listing fee', txid: '3548aa0c002b015ea700072b7d7d76d45d4f10a3573804d0d2f624c0bb255b6b' }, + { type: 'Blind vote', txid: 'f8fabb95efa1bb81325e4c961b9fc7e3508a9b9ecd4eddf1400e58867eff8d92' }, + { type: 'Compensation request', txid: 'a8cdc65fe6bb8730f5f89f99f779d0469b0a493e1ae570e20eb7afda696a18a9' }, + { type: 'Genesis', txid: '4b5417ec5ab6112bedf539c3b4f5a806ed539542d8b717e1c4470aa3180edce5' }, + { type: 'Irregular', txid: '90b06684a517388fec2237e2362a29810dc82f0e13e019c84747ec27051e6c53' }, + { type: 'Lockup', txid: '365425b3b7487229e2ba598fb8f2a9e359e3351620383e5018548649a28b78c4' }, + { type: 'Pay trade fee', txid: 'a66b30e9777e16572ab36723539df8f45bd5d8130d810b2c3d75b8c02a191eaf' }, + { type: 'Proof of burn', txid: '8325ccb87065fb9243ed9ff1cbb431fc2ac5060a60433bcde474ccbd97b76dcb' }, + { type: 'Proposal', txid: '34e2a20f045c82fbcf7cb191b42dea6fba45641777e1751ffb29d3981c4bf413' }, + { type: 'Reimbursement request', txid: '04c16c79ca6b9ec9978880024b0d0ad3100020f33286b63c85ca7b1a319421ae' }, + { type: 'Transfer BSQ', txid: '64500bd9220675ad30d5ace27de95a341a498d7eda08162ee0ce7feb8c56cb14' }, + { type: 'Unlock', txid: '5a756841bbb11137d15b0082a3fcadbe102791f41a95d661d3bd0c5ad0b3b1a3' }, + { type: 'Vote reveal', txid: 'bd7daae1d4af8837db5e47d7bd9d8b9f83dcfd35d112f85e90728b9be45191f7' } + ]; - it('loads the api screen', () => { - cy.visit(`${basePath}`); - cy.waitForSkeletonGone(); - cy.get('li:nth-of-type(5) > a').click().then(() => { - cy.get('.section-header').should('have.length.at.least', 1); - cy.get('.endpoint-container').should('have.length.at.least', 1); - }); + transactions.forEach((transaction) => { + it(`loads a "${transaction.type}" transaction`, () => { + cy.visit(`${basePath}/tx/${transaction.txid}`); + cy.waitForSkeletonGone(); }); + }); + }); - it('shows blocks pagination with 5 pages (desktop)', () => { - cy.viewport(760, 800); - cy.visit(`${basePath}/blocks`); - cy.waitForSkeletonGone(); - cy.get('tbody tr').should('have.length', 10); - // 5 pages + 4 buttons = 9 buttons - cy.get('.pagination-container ul.pagination').first().children().should('have.length', 9); + describe('blocks', () => { + it('loads the blocks screen', () => { + cy.visit(`${basePath}`); + cy.waitForSkeletonGone(); + cy.get('#btn-blocks').click().then(() => { + cy.wait('@blocks'); + cy.get('tbody tr').should('have.length', 10); }); + }); - it('shows blocks pagination with 3 pages (mobile)', () => { - cy.viewport(669, 800); - cy.visit(`${basePath}/blocks`); - cy.waitForSkeletonGone(); - cy.get('tbody tr').should('have.length', 10); - // 3 pages + 4 buttons = 7 buttons - cy.get('.pagination-container ul.pagination').first().children().should('have.length', 7); - }); - } else { - it.skip(`Tests cannot be run on the selected BASE_MODULE ${baseModule}`); - } - }); + it('loads a specific block', () => { + cy.visit(`${basePath}/block/0000000000000000000137ef33faa63bc6e809ab30932cf77d454fb36d2bd83a`); + cy.waitForSkeletonGone(); + }); + + }); + + describe('markets', () => { + it('loads the markets screen', () => { + cy.visit(`${basePath}/markets`); + cy.waitForSkeletonGone(); + }); + + it('loads a specific market', () => { + cy.visit(`${basePath}/market/btc_eur`); + cy.waitForSkeletonGone(); + //Buy Offers + cy.get('.row > :nth-child(1) td').should('have.length.at.least', 1); + //Sell offers + cy.get('.row > :nth-child(1) td').should('have.length.at.least', 1); + //Trades + cy.get('app-bisq-trades > .table-container td').should('have.length.at.least', 1); + }); + }); + + it('loads the stats screen', () => { + cy.visit(`${basePath}`); + cy.waitForSkeletonGone(); + cy.get('#btn-stats').click().then(() => { + cy.wait('@stats'); + }); + }); + + it('loads the api screen', () => { + cy.visit(`${basePath}`); + cy.waitForSkeletonGone(); + cy.get('#btn-docs').click().then(() => { + cy.get('.section-header').should('have.length.at.least', 1); + cy.get('.endpoint-container').should('have.length.at.least', 1); + }); + }); + + it('shows blocks pagination with 5 pages (desktop)', () => { + cy.viewport(760, 800); + cy.visit(`${basePath}/blocks`); + cy.waitForSkeletonGone(); + cy.get('tbody tr').should('have.length', 10); + // 5 pages + 4 buttons = 9 buttons + cy.get('.pagination-container ul.pagination').first().children().should('have.length', 9); + }); + + it('shows blocks pagination with 3 pages (mobile)', () => { + cy.viewport(669, 800); + cy.visit(`${basePath}/blocks`); + cy.waitForSkeletonGone(); + cy.get('tbody tr').should('have.length', 10); + // 3 pages + 4 buttons = 7 buttons + cy.get('.pagination-container ul.pagination').first().children().should('have.length', 7); + }); + } else { + it.skip(`Tests cannot be run on the selected BASE_MODULE ${baseModule}`); + } +}); diff --git a/frontend/cypress/integration/liquid/liquid.spec.ts b/frontend/cypress/integration/liquid/liquid.spec.ts index b705655d3..af76314a1 100644 --- a/frontend/cypress/integration/liquid/liquid.spec.ts +++ b/frontend/cypress/integration/liquid/liquid.spec.ts @@ -1,210 +1,214 @@ describe('Liquid', () => { - const baseModule = Cypress.env("BASE_MODULE"); - const basePath = ''; + const baseModule = Cypress.env("BASE_MODULE"); + const basePath = ''; - beforeEach(() => { - cy.intercept('/liquid/api/block/**').as('block'); - cy.intercept('/liquid/api/blocks/').as('blocks'); - cy.intercept('/liquid/api/tx/**/outspends').as('outspends'); - cy.intercept('/liquid/api/block/**/txs/**').as('block-txs'); - cy.intercept('/resources/pools.json').as('pools'); + beforeEach(() => { + cy.intercept('/liquid/api/block/**').as('block'); + cy.intercept('/liquid/api/blocks/').as('blocks'); + cy.intercept('/liquid/api/tx/**/outspends').as('outspends'); + cy.intercept('/liquid/api/block/**/txs/**').as('block-txs'); + cy.intercept('/resources/pools.json').as('pools'); - Cypress.Commands.add('waitForBlockData', () => { - cy.wait('@socket'); - cy.wait('@block'); - cy.wait('@outspends'); - }); + Cypress.Commands.add('waitForBlockData', () => { + cy.wait('@socket'); + cy.wait('@block'); + cy.wait('@outspends'); + }); + }); + + if (baseModule === 'liquid') { + + it('check first mempool block after skeleton loads', () => { + cy.visit(`${basePath}`); + cy.waitForSkeletonGone(); + cy.get('#mempool-block-0 > .blockLink').should('exist'); }); - if (baseModule === 'liquid') { + it('loads the dashboard', () => { + cy.visit(`${basePath}`); + cy.waitForSkeletonGone(); + }); - it('check first mempool block after skeleton loads', () => { - cy.visit(`${basePath}`); - cy.waitForSkeletonGone(); - cy.get('#mempool-block-0 > .blockLink').should('exist'); + it('loads the blocks page', () => { + cy.visit(`${basePath}`); + cy.get('#btn-blocks').click().then(() => { + cy.wait(1000); + }); + cy.waitForSkeletonGone(); + }); + + it('loads a specific block page', () => { + cy.visit(`${basePath}/block/7e1369a23a5ab861e7bdede2aadcccae4ea873ffd9caf11c7c5541eb5bcdff54`); + cy.waitForSkeletonGone(); + }); + + it('loads the graphs page', () => { + cy.visit(`${basePath}`); + cy.waitForSkeletonGone(); + cy.get('#btn-graphs').click().then(() => { + cy.wait(1000); + }); + }); + + it('loads the tv page - desktop', () => { + cy.visit(`${basePath}/tv`); + cy.waitForSkeletonGone(); + }); + + it('loads the graphs page - mobile', () => { + cy.visit(`${basePath}`) + cy.waitForSkeletonGone(); + cy.get('#btn-graphs').click().then(() => { + cy.viewport('iphone-6'); + cy.wait(1000); + cy.get('.tv-only').should('not.exist'); + }); + }); + + it('renders unconfidential addresses correctly on mobile', () => { + cy.viewport('iphone-6'); + cy.visit(`${basePath}/address/ex1qqmmjdwrlg59c8q4l75sj6wedjx57tj5grt8pat`); + cy.waitForSkeletonGone(); + //TODO: Add proper IDs for these selectors + const firstRowSelector = '.container-xl > :nth-child(3) > div > :nth-child(1) > .table > tbody'; + const thirdRowSelector = '.container-xl > :nth-child(3) > div > :nth-child(3)'; + cy.get(firstRowSelector).invoke('css', 'width').then(firstRowWidth => { + cy.get(thirdRowSelector).invoke('css', 'width').then(thirdRowWidth => { + expect(parseInt(firstRowWidth)).to.be.lessThan(parseInt(thirdRowWidth)); }); + }); + }); - it('loads the dashboard', () => { - cy.visit(`${basePath}`); - cy.waitForSkeletonGone(); + describe('peg in/peg out', () => { + it('loads peg in addresses', () => { + cy.visit(`${basePath}/tx/fe764f7bedfc2a37b29d9c8aef67d64a57d253a6b11c5a55555cfd5826483a58`); + cy.waitForSkeletonGone(); + //TODO: Change to an element id so we don't assert on a string + cy.get('#table-tx-vin').should('contain', 'Peg-in'); + cy.get('#table-tx-vin a').click().then(() => { + cy.waitForSkeletonGone(); + if (baseModule === 'liquid') { + cy.url().should('eq', 'https://mempool.space/tx/f148c0d854db4174ea420655235f910543f0ec3680566dcfdf84fb0a1697b592'); + } else { + //TODO: Use an environment variable to get the hostname + cy.url().should('eq', 'http://localhost:4200/tx/f148c0d854db4174ea420655235f910543f0ec3680566dcfdf84fb0a1697b592'); + } }); + }); - it('loads the blocks page', () => { - cy.visit(`${basePath}/blocks`); - cy.waitForSkeletonGone(); + it('loads peg out addresses', () => { + cy.visit(`${basePath}/tx/ecf6eba04ffb3946faa172343c87162df76f1a57b07b0d6dc6ad956b13376dc8`); + cy.waitForSkeletonGone(); + cy.get('#table-tx-vout a').first().click().then(() => { + cy.waitForSkeletonGone(); + if (baseModule === 'liquid') { + cy.url().should('eq', 'https://mempool.space/address/1BxoGcMg14oaH3CwHD2hF4gU9VcfgX5yoR'); + } else { + //TODO: Use an environment variable to get the hostname + cy.url().should('eq', 'http://localhost:4200/address/1BxoGcMg14oaH3CwHD2hF4gU9VcfgX5yoR'); + } + //TODO: Add a custom class so we don't assert on a string + cy.get('.badge').should('contain', 'Liquid Peg Out'); }); + }); + }); - it('loads a specific block page', () => { - cy.visit(`${basePath}/block/7e1369a23a5ab861e7bdede2aadcccae4ea873ffd9caf11c7c5541eb5bcdff54`); - cy.waitForSkeletonGone(); + describe('assets', () => { + it('shows the assets screen', () => { + cy.visit(`${basePath}`); + cy.get('#btn-assets'); + cy.waitForSkeletonGone(); + cy.get('table tr').should('have.length.at.least', 5); + }); + + it('allows searching assets', () => { + cy.visit(`${basePath}/assets`); + cy.waitForSkeletonGone(); + cy.get('.container-xl input').click().type('Liquid Bitcoin').then(() => { + cy.get('table tr').should('have.length', 1); }); + }); - it('loads the graphs page', () => { - cy.visit(`${basePath}/graphs`); - cy.waitForSkeletonGone(); - }); - - it('loads the tv page - desktop', () => { - cy.visit(`${basePath}`); - cy.waitForSkeletonGone(); - cy.get('li:nth-of-type(3) > a').click().then(() => { - cy.wait(1000); - }); - }); - - it('loads the graphs page - mobile', () => { - cy.visit(`${basePath}`) - cy.waitForSkeletonGone(); - cy.get('li:nth-of-type(3) > a').click().then(() => { - cy.viewport('iphone-6'); - cy.wait(1000); - cy.get('.tv-only').should('not.exist'); - }); - }); - - it('renders unconfidential addresses correctly on mobile', () => { - cy.viewport('iphone-6'); - cy.visit(`${basePath}/address/ex1qqmmjdwrlg59c8q4l75sj6wedjx57tj5grt8pat`); - cy.waitForSkeletonGone(); - //TODO: Add proper IDs for these selectors - const firstRowSelector = '.container-xl > :nth-child(3) > div > :nth-child(1) > .table > tbody'; - const thirdRowSelector = '.container-xl > :nth-child(3) > div > :nth-child(3)'; - cy.get(firstRowSelector).invoke('css', 'width').then(firstRowWidth => { - cy.get(thirdRowSelector).invoke('css', 'width').then(thirdRowWidth => { - expect(parseInt(firstRowWidth)).to.be.lessThan(parseInt(thirdRowWidth)); - }); - }); - }); - - describe('peg in/peg out', () => { - it('loads peg in addresses', () => { - cy.visit(`${basePath}/tx/fe764f7bedfc2a37b29d9c8aef67d64a57d253a6b11c5a55555cfd5826483a58`); - cy.waitForSkeletonGone(); - //TODO: Change to an element id so we don't assert on a string - cy.get('#table-tx-vin').should('contain', 'Peg-in'); - cy.get('#table-tx-vin a').click().then(() => { - cy.waitForSkeletonGone(); - if (baseModule === 'liquid') { - cy.url().should('eq', 'https://mempool.space/tx/f148c0d854db4174ea420655235f910543f0ec3680566dcfdf84fb0a1697b592'); - } else { - //TODO: Use an environment variable to get the hostname - cy.url().should('eq', 'http://localhost:4200/tx/f148c0d854db4174ea420655235f910543f0ec3680566dcfdf84fb0a1697b592'); - } - }); - }); - - it('loads peg out addresses', () => { - cy.visit(`${basePath}/tx/ecf6eba04ffb3946faa172343c87162df76f1a57b07b0d6dc6ad956b13376dc8`); - cy.waitForSkeletonGone(); - cy.get('#table-tx-vout a').first().click().then(() => { - cy.waitForSkeletonGone(); - if (baseModule === 'liquid') { - cy.url().should('eq', 'https://mempool.space/address/1BxoGcMg14oaH3CwHD2hF4gU9VcfgX5yoR'); - } else { - //TODO: Use an environment variable to get the hostname - cy.url().should('eq', 'http://localhost:4200/address/1BxoGcMg14oaH3CwHD2hF4gU9VcfgX5yoR'); - } - //TODO: Add a custom class so we don't assert on a string - cy.get('.badge').should('contain','Liquid Peg Out'); - }); - }); - }); - - describe('assets', () => { - it('shows the assets screen', () => { - cy.visit(`${basePath}/assets`); - cy.waitForSkeletonGone(); - cy.get('table tr').should('have.length.at.least', 5); - }); - - it('allows searching assets', () => { - cy.visit(`${basePath}/assets`); - cy.waitForSkeletonGone(); - cy.get('.container-xl input').click().type('Liquid Bitcoin').then(() => { - cy.get('table tr').should('have.length', 1); - }); - }); - - it('shows a specific asset ID', () => { - cy.visit(`${basePath}/assets`); - cy.waitForSkeletonGone(); - cy.get('.container-xl input').click().type('Liquid AUD').then(() => { - cy.get('table tr td:nth-of-type(1) a').click(); - }); - }); + it('shows a specific asset ID', () => { + cy.visit(`${basePath}/assets`); + cy.waitForSkeletonGone(); + cy.get('.container-xl input').click().type('Liquid AUD').then(() => { + cy.get('table tr td:nth-of-type(1) a').click(); }); + }); + }); - describe('unblinded TX', () => { + describe('unblinded TX', () => { - it('should not show an unblinding error message for regular txs', () => { - cy.visit(`${basePath}/tx/82a479043ec3841e0d3f829afc8df4f0e2bbd675a13f013ea611b2fde0027d45`); - cy.waitForSkeletonGone(); - cy.get('.error-unblinded' ).should('not.exist'); - }); + it('should not show an unblinding error message for regular txs', () => { + cy.visit(`${basePath}/tx/82a479043ec3841e0d3f829afc8df4f0e2bbd675a13f013ea611b2fde0027d45`); + cy.waitForSkeletonGone(); + cy.get('.error-unblinded').should('not.exist'); + }); - it('show unblinded TX', () => { - cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=100000,6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d,0ab9f70650f16b1db8dfada05237f7d0d65191c3a13183da8a2ddddfbde9a2ad,fd98b2edc5530d76acd553f206a431f4c1fab27e10e290ad719582af878e98fc,2364760,6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d,90c7a43b15b905bca045ca42a01271cfe71d2efe3133f4197792c24505cb32ed,12eb5959d9293b8842e7dd8bc9aa9639fd3fd031c5de3ba911adeca94eb57a3a`); - cy.waitForSkeletonGone(); - cy.get('#table-tx-vin tr:nth-child(1) .amount').should('contain.text', '0.02465000 L-BTC'); - cy.get('#table-tx-vin tr').should('have.class', 'assetBox'); - cy.get('#table-tx-vout tr:nth-child(1) .amount').should('contain.text', '0.00100000 L-BTC'); - cy.get('#table-tx-vout tr:nth-child(2) .amount').should('contain.text', '0.02364760 L-BTC'); - cy.get('#table-tx-vout tr').should('have.class', 'assetBox'); - }); + it('show unblinded TX', () => { + cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=100000,6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d,0ab9f70650f16b1db8dfada05237f7d0d65191c3a13183da8a2ddddfbde9a2ad,fd98b2edc5530d76acd553f206a431f4c1fab27e10e290ad719582af878e98fc,2364760,6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d,90c7a43b15b905bca045ca42a01271cfe71d2efe3133f4197792c24505cb32ed,12eb5959d9293b8842e7dd8bc9aa9639fd3fd031c5de3ba911adeca94eb57a3a`); + cy.waitForSkeletonGone(); + cy.get('#table-tx-vin tr:nth-child(1) .amount').should('contain.text', '0.02465000 L-BTC'); + cy.get('#table-tx-vin tr').should('have.class', 'assetBox'); + cy.get('#table-tx-vout tr:nth-child(1) .amount').should('contain.text', '0.00100000 L-BTC'); + cy.get('#table-tx-vout tr:nth-child(2) .amount').should('contain.text', '0.02364760 L-BTC'); + cy.get('#table-tx-vout tr').should('have.class', 'assetBox'); + }); - it('show empty unblinded TX', () => { - cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=`); - cy.waitForSkeletonGone(); - cy.get('#table-tx-vin tr:nth-child(1)').should('have.class', ''); - cy.get('#table-tx-vin tr:nth-child(1) .amount').should('contain.text', 'Confidential'); - cy.get('#table-tx-vout tr:nth-child(1)').should('have.class', ''); - cy.get('#table-tx-vout tr:nth-child(2)').should('have.class', ''); - cy.get('#table-tx-vout tr:nth-child(1) .amount').should('contain.text', 'Confidential'); - cy.get('#table-tx-vout tr:nth-child(2) .amount').should('contain.text', 'Confidential'); - }); + it('show empty unblinded TX', () => { + cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=`); + cy.waitForSkeletonGone(); + cy.get('#table-tx-vin tr:nth-child(1)').should('have.class', ''); + cy.get('#table-tx-vin tr:nth-child(1) .amount').should('contain.text', 'Confidential'); + cy.get('#table-tx-vout tr:nth-child(1)').should('have.class', ''); + cy.get('#table-tx-vout tr:nth-child(2)').should('have.class', ''); + cy.get('#table-tx-vout tr:nth-child(1) .amount').should('contain.text', 'Confidential'); + cy.get('#table-tx-vout tr:nth-child(2) .amount').should('contain.text', 'Confidential'); + }); - it('show invalid unblinded TX hex', () => { - cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=123`); - cy.waitForSkeletonGone(); - cy.get('#table-tx-vin tr').should('have.class', ''); - cy.get('#table-tx-vout tr').should('have.class', ''); - cy.get('.error-unblinded' ).contains('Error: Invalid blinding data (invalid hex)'); - }); + it('show invalid unblinded TX hex', () => { + cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=123`); + cy.waitForSkeletonGone(); + cy.get('#table-tx-vin tr').should('have.class', ''); + cy.get('#table-tx-vout tr').should('have.class', ''); + cy.get('.error-unblinded').contains('Error: Invalid blinding data (invalid hex)'); + }); - it('show first unblinded vout', () => { - cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=100000,6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d,0ab9f70650f16b1db8dfada05237f7d0d65191c3a13183da8a2ddddfbde9a2ad,fd98b2edc5530d76acd553f206a431f4c1fab27e10e290ad719582af878e98fc`); - cy.waitForSkeletonGone(); - cy.get('#table-tx-vout tr:nth-child(1)').should('have.class', 'assetBox'); - cy.get('#table-tx-vout tr:nth-child(1) .amount').should('contain.text', '0.00100000 L-BTC'); - }); + it('show first unblinded vout', () => { + cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=100000,6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d,0ab9f70650f16b1db8dfada05237f7d0d65191c3a13183da8a2ddddfbde9a2ad,fd98b2edc5530d76acd553f206a431f4c1fab27e10e290ad719582af878e98fc`); + cy.waitForSkeletonGone(); + cy.get('#table-tx-vout tr:nth-child(1)').should('have.class', 'assetBox'); + cy.get('#table-tx-vout tr:nth-child(1) .amount').should('contain.text', '0.00100000 L-BTC'); + }); - it('show second unblinded vout', () => { - cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=2364760,6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d,90c7a43b15b905bca045ca42a01271cfe71d2efe3133f4197792c24505cb32ed,12eb5959d9293b8842e7dd8bc9aa9639fd3fd031c5de3ba911adeca94eb57a3a`); - cy.get('#table-tx-vout tr:nth-child(2').should('have.class', 'assetBox'); - cy.get('#table-tx-vout tr:nth-child(2) .amount').should('contain.text', '0.02364760 L-BTC'); - }); + it('show second unblinded vout', () => { + cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=2364760,6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d,90c7a43b15b905bca045ca42a01271cfe71d2efe3133f4197792c24505cb32ed,12eb5959d9293b8842e7dd8bc9aa9639fd3fd031c5de3ba911adeca94eb57a3a`); + cy.get('#table-tx-vout tr:nth-child(2').should('have.class', 'assetBox'); + cy.get('#table-tx-vout tr:nth-child(2) .amount').should('contain.text', '0.02364760 L-BTC'); + }); - it('show invalid error unblinded TX', () => { - cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=100000,6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d,0ab9f70650f16b1db8dfada05237f7d0d65191c3a13183da8a2ddddfbde9a2ad,fd98b2edc5530d76acd553f206a431f4c1fab27e10e290ad719582af878e98fc,2364760,6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d,90c7a43b15b905bca045ca42a01271cfe71d2efe3133f4197792c24505cb32ed,12eb5959d9293b8842e7dd8bc9aa9639fd3fd031c5de3ba911adeca94eb57a3c`); - cy.waitForSkeletonGone(); - cy.get('#table-tx-vout tr').should('have.class', 'assetBox'); - cy.get('.error-unblinded' ).contains('Error: Invalid blinding data.'); - }); + it('show invalid error unblinded TX', () => { + cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=100000,6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d,0ab9f70650f16b1db8dfada05237f7d0d65191c3a13183da8a2ddddfbde9a2ad,fd98b2edc5530d76acd553f206a431f4c1fab27e10e290ad719582af878e98fc,2364760,6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d,90c7a43b15b905bca045ca42a01271cfe71d2efe3133f4197792c24505cb32ed,12eb5959d9293b8842e7dd8bc9aa9639fd3fd031c5de3ba911adeca94eb57a3c`); + cy.waitForSkeletonGone(); + cy.get('#table-tx-vout tr').should('have.class', 'assetBox'); + cy.get('.error-unblinded').contains('Error: Invalid blinding data.'); + }); - it('shows asset peg in/out and burn transactions', () => { - cy.visit(`${basePath}/asset/6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d`); - cy.waitForSkeletonGone(); - cy.get('#table-tx-vout tr').not('.assetBox'); - cy.get('#table-tx-vin tr').not('.assetBox'); - }); + it('shows asset peg in/out and burn transactions', () => { + cy.visit(`${basePath}/asset/6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d`); + cy.waitForSkeletonGone(); + cy.get('#table-tx-vout tr').not('.assetBox'); + cy.get('#table-tx-vin tr').not('.assetBox'); + }); - it('prevents regressing issue #644', () => { - cy.visit(`${basePath}/tx/393b890966f305e7c440fcfb12a13f51a7a9011cc59ff5f14f6f93214261bd82`); - cy.waitForSkeletonGone(); - }); - }); - } else { - it.skip(`Tests cannot be run on the selected BASE_MODULE ${baseModule}`); - } + it('prevents regressing issue #644', () => { + cy.visit(`${basePath}/tx/393b890966f305e7c440fcfb12a13f51a7a9011cc59ff5f14f6f93214261bd82`); + cy.waitForSkeletonGone(); + }); + }); + } else { + it.skip(`Tests cannot be run on the selected BASE_MODULE ${baseModule}`); + } }); diff --git a/frontend/cypress/integration/liquidtestnet/liquidtestnet.spec.ts b/frontend/cypress/integration/liquidtestnet/liquidtestnet.spec.ts index bef477d4b..eb75be773 100644 --- a/frontend/cypress/integration/liquidtestnet/liquidtestnet.spec.ts +++ b/frontend/cypress/integration/liquidtestnet/liquidtestnet.spec.ts @@ -3,177 +3,173 @@ describe('Liquid Testnet', () => { const basePath = '/testnet'; beforeEach(() => { - cy.intercept('/liquidtestnet/api/block/**').as('block'); - cy.intercept('/liquidtestnet/api/blocks/').as('blocks'); - cy.intercept('/liquidtestnet/api/tx/**/outspends').as('outspends'); - cy.intercept('/liquidtestnet/api/block/**/txs/**').as('block-txs'); - cy.intercept('/resources/pools.json').as('pools'); + cy.intercept('/liquidtestnet/api/block/**').as('block'); + cy.intercept('/liquidtestnet/api/blocks/').as('blocks'); + cy.intercept('/liquidtestnet/api/tx/**/outspends').as('outspends'); + cy.intercept('/liquidtestnet/api/block/**/txs/**').as('block-txs'); + cy.intercept('/resources/pools.json').as('pools'); - Cypress.Commands.add('waitForBlockData', () => { - cy.wait('@socket'); - cy.wait('@block'); - cy.wait('@outspends'); - }); + Cypress.Commands.add('waitForBlockData', () => { + cy.wait('@socket'); + cy.wait('@block'); + cy.wait('@outspends'); + }); }); if (baseModule === 'liquid') { - it('check first mempool block after skeleton loads', () => { - cy.visit(`${basePath}`); + it('check first mempool block after skeleton loads', () => { + cy.visit(`${basePath}`); + cy.waitForSkeletonGone(); + cy.get('#mempool-block-0 > .blockLink').should('exist'); + }); + + it('loads the dashboard', () => { + cy.visit(`${basePath}`); + cy.waitForSkeletonGone(); + }); + + it('loads the blocks page', () => { + cy.visit(`${basePath}`) + cy.get('#btn-blocks'); + cy.waitForSkeletonGone(); + }); + + it('loads a specific block page', () => { + cy.visit(`${basePath}/block/7e1369a23a5ab861e7bdede2aadcccae4ea873ffd9caf11c7c5541eb5bcdff54`); + cy.waitForSkeletonGone(); + }); + + it('loads the graphs page', () => { + cy.visit(`${basePath}`); + cy.get('#btn-graphs'); + cy.waitForSkeletonGone(); + }); + + it('loads the tv page - desktop', () => { + cy.visit(`${basePath}/tv`); + cy.waitForSkeletonGone(); + }); + + it('loads the graphs page - mobile', () => { + cy.visit(`${basePath}`) + cy.waitForSkeletonGone(); + cy.viewport('iphone-6'); + cy.get('.tv-only').should('not.exist'); + }); + + it.skip('renders unconfidential addresses correctly on mobile', () => { + cy.viewport('iphone-6'); + cy.visit(`${basePath}/address/__TODO__`); + cy.waitForSkeletonGone(); + //TODO: Add proper IDs for these selectors + const firstRowSelector = '.container-xl > :nth-child(3) > div > :nth-child(1) > .table > tbody'; + const thirdRowSelector = '.container-xl > :nth-child(3) > div > :nth-child(3)'; + cy.get(firstRowSelector).invoke('css', 'width').then(firstRowWidth => { + cy.get(thirdRowSelector).invoke('css', 'width').then(thirdRowWidth => { + expect(parseInt(firstRowWidth)).to.be.lessThan(parseInt(thirdRowWidth)); + }); + }); + }); + + describe('assets', () => { + it('shows the assets screen', () => { + cy.visit(`${basePath}/assets`); + cy.waitForSkeletonGone(); + cy.get('table tr').should('have.length.at.least', 5); + }); + + it('allows searching assets', () => { + cy.visit(`${basePath}/assets`); + cy.waitForSkeletonGone(); + cy.get('.container-xl input').click().type('Liquid Bitcoin').then(() => { + cy.get('table tr').should('have.length', 1); + }); + }); + + it('shows a specific asset ID', () => { + cy.visit(`${basePath}/assets`); + cy.waitForSkeletonGone(); + cy.get('.container-xl input').click().type('Liquid CAD').then(() => { + cy.get('table tr td:nth-of-type(1) a').click(); + }); + }); + }); + + describe('unblinded TX', () => { + it('should not show an unblinding error message for regular txs', () => { + cy.visit(`${basePath}/tx/82a479043ec3841e0d3f829afc8df4f0e2bbd675a13f013ea611b2fde0027d45`); + cy.waitForSkeletonGone(); + cy.get('.error-unblinded').should('not.exist'); + }); + + it('show unblinded TX', () => { + cy.visit(`${basePath}/tx/c3d908ab77891e4c569b0df71aae90f4720b157019ebb20db176f4f9c4d626b8#blinded=100000,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,df290ead654d7d110ebc5aaf0bcf11d5b5d360431a467f1cde0a856fde986893,33cb3a2fd2e76643843691cf44a78c5cd28ec652a414da752160ad63fbd37bc9,49741,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,edb0713bcbfcb3daabf601cb50978439667d208e15fed8a5ebbfea5696cda1d5,4de70115501e8c7d6bd763e229bf42781edeacf6e75e1d7bdfa4c63104bc508a`); + cy.waitForSkeletonGone(); + cy.get('#table-tx-vin tr:nth-child(1) .amount').should('contain.text', '0.00100000 tL-BTC'); + cy.get('#table-tx-vin tr').should('have.class', 'assetBox'); + cy.get('#table-tx-vout tr:nth-child(1) .amount').should('contain.text', '0.00050000 tL-BTC'); + cy.get('#table-tx-vout tr:nth-child(2) .amount').should('contain.text', '0.00049741 tL-BTC'); + cy.get('#table-tx-vout tr').should('have.class', 'assetBox'); + }); + + it('show empty unblinded TX', () => { + cy.visit(`${basePath}/tx/c3d908ab77891e4c569b0df71aae90f4720b157019ebb20db176f4f9c4d626b8#blinded=`); + cy.waitForSkeletonGone(); + cy.get('#table-tx-vin tr:nth-child(1)').should('have.class', ''); + cy.get('#table-tx-vin tr:nth-child(1) .amount').should('contain.text', 'Confidential'); + cy.get('#table-tx-vout tr:nth-child(1)').should('have.class', ''); + cy.get('#table-tx-vout tr:nth-child(2)').should('have.class', ''); + cy.get('#table-tx-vout tr:nth-child(1) .amount').should('contain.text', 'Confidential'); + cy.get('#table-tx-vout tr:nth-child(2) .amount').should('contain.text', 'Confidential'); + }); + + it('show invalid unblinded TX hex', () => { + cy.visit(`${basePath}/tx/2477f220eef1d03f8ffa4a2861c275d155c3562adf0d79523aeeb0c59ee611ba#blinded=5000`); + cy.waitForSkeletonGone(); + cy.get('#table-tx-vin tr').should('have.class', ''); + cy.get('#table-tx-vout tr').should('have.class', ''); + cy.get('.error-unblinded').contains('Error: Invalid blinding data (invalid hex)'); + }); + + it('show first unblinded vout', () => { + cy.visit(`${basePath}/tx/0877bc0c7aa5c2b8d0e4b15450425879b8783c40e341806037a605ef836fb886#blinded=5000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,328de54e90e867a9154b4f1eb7fcab86267e880fa2ee9e53b41a91e61dab86e6,8885831e6b089eaf06889d53a24843f0da533d300a7b1527b136883a6819f3ae,5000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,aca78b953615d69ae0ae68c4c5c3c0ee077c10bc20ad3f0c5960706004e6cb56,d2ec175afe5f761e2dbd443faf46abbb7091f341deb3387e5787d812bdb2df9f,100000,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,4b54a4ca809b3844f34dd88b68617c4c866d92a02211f02ba355755bac20a1c6,eddd02e92b0cfbad8cab89828570a50f2c643bb2a54d886c86e25ce47e818685,99729,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,8b86d565c9549eb0352bb81ee576d01d064435b64fddcc045decebeb1d9913ce,b082ce3448d40d47b5b39f15d72b285f4a1046b636b56c25f32f498ece29d062,10000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,62b04ee86198d6b41681cdd0acb450ab366af727a010aaee8ba0b9e69ff43896,3f98429bca9b538dc943c22111f25d9c4448d45a63ff0f4e58b22fd434c0365e`); + cy.waitForSkeletonGone(); + cy.get('#table-tx-vout tr:nth-child(1)').should('have.class', 'assetBox'); + cy.get('#table-tx-vout tr:nth-child(1) .amount').should('contain.text', '0.00099729 tL-BTC'); + }); + + it('show second unblinded vout (asset)', () => { + cy.visit(`${basePath}/tx/0877bc0c7aa5c2b8d0e4b15450425879b8783c40e341806037a605ef836fb886#blinded=5000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,328de54e90e867a9154b4f1eb7fcab86267e880fa2ee9e53b41a91e61dab86e6,8885831e6b089eaf06889d53a24843f0da533d300a7b1527b136883a6819f3ae,5000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,aca78b953615d69ae0ae68c4c5c3c0ee077c10bc20ad3f0c5960706004e6cb56,d2ec175afe5f761e2dbd443faf46abbb7091f341deb3387e5787d812bdb2df9f,100000,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,4b54a4ca809b3844f34dd88b68617c4c866d92a02211f02ba355755bac20a1c6,eddd02e92b0cfbad8cab89828570a50f2c643bb2a54d886c86e25ce47e818685,99729,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,8b86d565c9549eb0352bb81ee576d01d064435b64fddcc045decebeb1d9913ce,b082ce3448d40d47b5b39f15d72b285f4a1046b636b56c25f32f498ece29d062,10000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,62b04ee86198d6b41681cdd0acb450ab366af727a010aaee8ba0b9e69ff43896,3f98429bca9b538dc943c22111f25d9c4448d45a63ff0f4e58b22fd434c0365e`); + cy.get('#table-tx-vout tr:nth-child(2)').should('have.class', 'assetBox'); + //TODO Update after the precision bug fix is merged + cy.get('#table-tx-vout tr:nth-child(2) .amount').should('contain.text', '0 TEST'); + }); + + it('should link to the asset page from the unblinded tx', () => { + cy.visit(`${basePath}/tx/0877bc0c7aa5c2b8d0e4b15450425879b8783c40e341806037a605ef836fb886#blinded=5000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,328de54e90e867a9154b4f1eb7fcab86267e880fa2ee9e53b41a91e61dab86e6,8885831e6b089eaf06889d53a24843f0da533d300a7b1527b136883a6819f3ae,5000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,aca78b953615d69ae0ae68c4c5c3c0ee077c10bc20ad3f0c5960706004e6cb56,d2ec175afe5f761e2dbd443faf46abbb7091f341deb3387e5787d812bdb2df9f,100000,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,4b54a4ca809b3844f34dd88b68617c4c866d92a02211f02ba355755bac20a1c6,eddd02e92b0cfbad8cab89828570a50f2c643bb2a54d886c86e25ce47e818685,99729,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,8b86d565c9549eb0352bb81ee576d01d064435b64fddcc045decebeb1d9913ce,b082ce3448d40d47b5b39f15d72b285f4a1046b636b56c25f32f498ece29d062,10000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,62b04ee86198d6b41681cdd0acb450ab366af727a010aaee8ba0b9e69ff43896,3f98429bca9b538dc943c22111f25d9c4448d45a63ff0f4e58b22fd434c0365e`); + cy.get('#table-tx-vout tr:nth-child(2) .amount a').click().then(() => { cy.waitForSkeletonGone(); - cy.get('#mempool-block-0 > .blockLink').should('exist'); + cy.url().should('contain', '/asset/38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5'); + }); }); - it('loads the dashboard', () => { - cy.visit(`${basePath}`); - cy.waitForSkeletonGone(); + it('show invalid error unblinded TX', () => { + cy.visit(`${basePath}/tx/c3d908ab77891e4c569b0df71aae90f4720b157019ebb20db176f4f9c4d626b8#blinded=100000,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,df290ead654d7d110ebc5aaf0bcf11d5b5d360431a467f1cde0a856fde986893,33cb3a2fd2e76643843691cf44a78c5cd28ec652a414da752160ad63fbd37bc9,49741,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,edb0713bcbfcb3daabf601cb50978439667d208e15fed8a5ebbfea5696cda1d5,4de70115501e8c7d6bd763e229bf42781edeacf6e75e1d7bdfa4c63104bc508c`); + cy.waitForSkeletonGone(); + cy.get('#table-tx-vin tr').should('have.class', 'assetBox'); + cy.get('.error-unblinded').contains('Error: Invalid blinding data.'); }); - it('loads the blocks page', () => { - cy.visit(`${basePath}/blocks`); - cy.waitForSkeletonGone(); + it('shows asset peg in/out and burn transactions', () => { + cy.visit(`${basePath}/asset/ac3e0ff248c5051ffd61e00155b7122e5ebc04fd397a0ecbdd4f4e4a56232926`); + cy.waitForSkeletonGone(); + cy.get('#table-tx-vout tr').not('.assetBox'); + cy.get('#table-tx-vin tr').not('.assetBox'); }); - it('loads a specific block page', () => { - cy.visit(`${basePath}/block/7e1369a23a5ab861e7bdede2aadcccae4ea873ffd9caf11c7c5541eb5bcdff54`); - cy.waitForSkeletonGone(); - }); - - it('loads the graphs page', () => { - cy.visit(`${basePath}/graphs`); - cy.waitForSkeletonGone(); - }); - - it('loads the tv page - desktop', () => { - cy.visit(`${basePath}`); - cy.waitForSkeletonGone(); - cy.get('li:nth-of-type(3) > a').click().then(() => { - cy.wait(1000); - }); - }); - - it('loads the graphs page - mobile', () => { - cy.visit(`${basePath}`) - cy.waitForSkeletonGone(); - cy.get('li:nth-of-type(3) > a').click().then(() => { - cy.viewport('iphone-6'); - cy.wait(1000); - cy.get('.tv-only').should('not.exist'); - }); - }); - - it.skip('renders unconfidential addresses correctly on mobile', () => { - cy.viewport('iphone-6'); - cy.visit(`${basePath}/address/__TODO__`); - cy.waitForSkeletonGone(); - //TODO: Add proper IDs for these selectors - const firstRowSelector = '.container-xl > :nth-child(3) > div > :nth-child(1) > .table > tbody'; - const thirdRowSelector = '.container-xl > :nth-child(3) > div > :nth-child(3)'; - cy.get(firstRowSelector).invoke('css', 'width').then(firstRowWidth => { - cy.get(thirdRowSelector).invoke('css', 'width').then(thirdRowWidth => { - expect(parseInt(firstRowWidth)).to.be.lessThan(parseInt(thirdRowWidth)); - }); - }); - }); - - describe('assets', () => { - it('shows the assets screen', () => { - cy.visit(`${basePath}/assets`); - cy.waitForSkeletonGone(); - cy.get('table tr').should('have.length.at.least', 5); - }); - - it('allows searching assets', () => { - cy.visit(`${basePath}/assets`); - cy.waitForSkeletonGone(); - cy.get('.container-xl input').click().type('Liquid Bitcoin').then(() => { - cy.get('table tr').should('have.length', 1); - }); - }); - - it('shows a specific asset ID', () => { - cy.visit(`${basePath}/assets`); - cy.waitForSkeletonGone(); - cy.get('.container-xl input').click().type('Liquid CAD').then(() => { - cy.get('table tr td:nth-of-type(1) a').click(); - }); - }); - }); - - describe('unblinded TX', () => { - it('should not show an unblinding error message for regular txs', () => { - cy.visit(`${basePath}/tx/82a479043ec3841e0d3f829afc8df4f0e2bbd675a13f013ea611b2fde0027d45`); - cy.waitForSkeletonGone(); - cy.get('.error-unblinded' ).should('not.exist'); - }); - - it('show unblinded TX', () => { - cy.visit(`${basePath}/tx/c3d908ab77891e4c569b0df71aae90f4720b157019ebb20db176f4f9c4d626b8#blinded=100000,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,df290ead654d7d110ebc5aaf0bcf11d5b5d360431a467f1cde0a856fde986893,33cb3a2fd2e76643843691cf44a78c5cd28ec652a414da752160ad63fbd37bc9,49741,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,edb0713bcbfcb3daabf601cb50978439667d208e15fed8a5ebbfea5696cda1d5,4de70115501e8c7d6bd763e229bf42781edeacf6e75e1d7bdfa4c63104bc508a`); - cy.waitForSkeletonGone(); - cy.get('#table-tx-vin tr:nth-child(1) .amount').should('contain.text', '0.00100000 tL-BTC'); - cy.get('#table-tx-vin tr').should('have.class', 'assetBox'); - cy.get('#table-tx-vout tr:nth-child(1) .amount').should('contain.text', '0.00050000 tL-BTC'); - cy.get('#table-tx-vout tr:nth-child(2) .amount').should('contain.text', '0.00049741 tL-BTC'); - cy.get('#table-tx-vout tr').should('have.class', 'assetBox'); - }); - - it('show empty unblinded TX', () => { - cy.visit(`${basePath}/tx/c3d908ab77891e4c569b0df71aae90f4720b157019ebb20db176f4f9c4d626b8#blinded=`); - cy.waitForSkeletonGone(); - cy.get('#table-tx-vin tr:nth-child(1)').should('have.class', ''); - cy.get('#table-tx-vin tr:nth-child(1) .amount').should('contain.text', 'Confidential'); - cy.get('#table-tx-vout tr:nth-child(1)').should('have.class', ''); - cy.get('#table-tx-vout tr:nth-child(2)').should('have.class', ''); - cy.get('#table-tx-vout tr:nth-child(1) .amount').should('contain.text', 'Confidential'); - cy.get('#table-tx-vout tr:nth-child(2) .amount').should('contain.text', 'Confidential'); - }); - - it('show invalid unblinded TX hex', () => { - cy.visit(`${basePath}/tx/2477f220eef1d03f8ffa4a2861c275d155c3562adf0d79523aeeb0c59ee611ba#blinded=5000`); - cy.waitForSkeletonGone(); - cy.get('#table-tx-vin tr').should('have.class', ''); - cy.get('#table-tx-vout tr').should('have.class', ''); - cy.get('.error-unblinded' ).contains('Error: Invalid blinding data (invalid hex)'); - }); - - it('show first unblinded vout', () => { - cy.visit(`${basePath}/tx/0877bc0c7aa5c2b8d0e4b15450425879b8783c40e341806037a605ef836fb886#blinded=5000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,328de54e90e867a9154b4f1eb7fcab86267e880fa2ee9e53b41a91e61dab86e6,8885831e6b089eaf06889d53a24843f0da533d300a7b1527b136883a6819f3ae,5000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,aca78b953615d69ae0ae68c4c5c3c0ee077c10bc20ad3f0c5960706004e6cb56,d2ec175afe5f761e2dbd443faf46abbb7091f341deb3387e5787d812bdb2df9f,100000,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,4b54a4ca809b3844f34dd88b68617c4c866d92a02211f02ba355755bac20a1c6,eddd02e92b0cfbad8cab89828570a50f2c643bb2a54d886c86e25ce47e818685,99729,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,8b86d565c9549eb0352bb81ee576d01d064435b64fddcc045decebeb1d9913ce,b082ce3448d40d47b5b39f15d72b285f4a1046b636b56c25f32f498ece29d062,10000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,62b04ee86198d6b41681cdd0acb450ab366af727a010aaee8ba0b9e69ff43896,3f98429bca9b538dc943c22111f25d9c4448d45a63ff0f4e58b22fd434c0365e`); - cy.waitForSkeletonGone(); - cy.get('#table-tx-vout tr:nth-child(1)').should('have.class', 'assetBox'); - cy.get('#table-tx-vout tr:nth-child(1) .amount').should('contain.text', '0.00099729 tL-BTC'); - }); - - it('show second unblinded vout (asset)', () => { - cy.visit(`${basePath}/tx/0877bc0c7aa5c2b8d0e4b15450425879b8783c40e341806037a605ef836fb886#blinded=5000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,328de54e90e867a9154b4f1eb7fcab86267e880fa2ee9e53b41a91e61dab86e6,8885831e6b089eaf06889d53a24843f0da533d300a7b1527b136883a6819f3ae,5000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,aca78b953615d69ae0ae68c4c5c3c0ee077c10bc20ad3f0c5960706004e6cb56,d2ec175afe5f761e2dbd443faf46abbb7091f341deb3387e5787d812bdb2df9f,100000,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,4b54a4ca809b3844f34dd88b68617c4c866d92a02211f02ba355755bac20a1c6,eddd02e92b0cfbad8cab89828570a50f2c643bb2a54d886c86e25ce47e818685,99729,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,8b86d565c9549eb0352bb81ee576d01d064435b64fddcc045decebeb1d9913ce,b082ce3448d40d47b5b39f15d72b285f4a1046b636b56c25f32f498ece29d062,10000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,62b04ee86198d6b41681cdd0acb450ab366af727a010aaee8ba0b9e69ff43896,3f98429bca9b538dc943c22111f25d9c4448d45a63ff0f4e58b22fd434c0365e`); - cy.get('#table-tx-vout tr:nth-child(2)').should('have.class', 'assetBox'); - //TODO Update after the precision bug fix is merged - cy.get('#table-tx-vout tr:nth-child(2) .amount').should('contain.text', '0 TEST'); - }); - - it('should link to the asset page from the unblinded tx', () => { - cy.visit(`${basePath}/tx/0877bc0c7aa5c2b8d0e4b15450425879b8783c40e341806037a605ef836fb886#blinded=5000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,328de54e90e867a9154b4f1eb7fcab86267e880fa2ee9e53b41a91e61dab86e6,8885831e6b089eaf06889d53a24843f0da533d300a7b1527b136883a6819f3ae,5000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,aca78b953615d69ae0ae68c4c5c3c0ee077c10bc20ad3f0c5960706004e6cb56,d2ec175afe5f761e2dbd443faf46abbb7091f341deb3387e5787d812bdb2df9f,100000,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,4b54a4ca809b3844f34dd88b68617c4c866d92a02211f02ba355755bac20a1c6,eddd02e92b0cfbad8cab89828570a50f2c643bb2a54d886c86e25ce47e818685,99729,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,8b86d565c9549eb0352bb81ee576d01d064435b64fddcc045decebeb1d9913ce,b082ce3448d40d47b5b39f15d72b285f4a1046b636b56c25f32f498ece29d062,10000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,62b04ee86198d6b41681cdd0acb450ab366af727a010aaee8ba0b9e69ff43896,3f98429bca9b538dc943c22111f25d9c4448d45a63ff0f4e58b22fd434c0365e`); - cy.get('#table-tx-vout tr:nth-child(2) .amount a').click().then(() => { - cy.waitForSkeletonGone(); - cy.url().should('contain', '/asset/38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5'); - }); - }); - - it('show invalid error unblinded TX', () => { - cy.visit(`${basePath}/tx/c3d908ab77891e4c569b0df71aae90f4720b157019ebb20db176f4f9c4d626b8#blinded=100000,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,df290ead654d7d110ebc5aaf0bcf11d5b5d360431a467f1cde0a856fde986893,33cb3a2fd2e76643843691cf44a78c5cd28ec652a414da752160ad63fbd37bc9,49741,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,edb0713bcbfcb3daabf601cb50978439667d208e15fed8a5ebbfea5696cda1d5,4de70115501e8c7d6bd763e229bf42781edeacf6e75e1d7bdfa4c63104bc508c`); - cy.waitForSkeletonGone(); - cy.get('#table-tx-vin tr').should('have.class', 'assetBox'); - cy.get('.error-unblinded' ).contains('Error: Invalid blinding data.'); - }); - - it('shows asset peg in/out and burn transactions', () => { - cy.visit(`${basePath}/asset/ac3e0ff248c5051ffd61e00155b7122e5ebc04fd397a0ecbdd4f4e4a56232926`); - cy.waitForSkeletonGone(); - cy.get('#table-tx-vout tr').not('.assetBox'); - cy.get('#table-tx-vin tr').not('.assetBox'); - }); - - }); + }); } else { - it.skip(`Tests cannot be run on the selected BASE_MODULE ${baseModule}`); + it.skip(`Tests cannot be run on the selected BASE_MODULE ${baseModule}`); } }); diff --git a/frontend/cypress/integration/mainnet/mainnet.spec.ts b/frontend/cypress/integration/mainnet/mainnet.spec.ts index 77095781a..1c6907db0 100644 --- a/frontend/cypress/integration/mainnet/mainnet.spec.ts +++ b/frontend/cypress/integration/mainnet/mainnet.spec.ts @@ -12,18 +12,18 @@ const baseModule = Cypress.env("BASE_MODULE"); * @returns {boolean} */ const areOverlapping = (rect1, rect2) => { - // if one rectangle is on the left side of the other - if (rect1.right < rect2.left || rect2.right < rect1.left) { - return false - } + // if one rectangle is on the left side of the other + if (rect1.right < rect2.left || rect2.right < rect1.left) { + return false + } - // if one rectangle is above the other - if (rect1.bottom < rect2.top || rect2.bottom < rect1.top) { - return false - } + // if one rectangle is above the other + if (rect1.bottom < rect2.top || rect2.bottom < rect1.top) { + return false + } - // the rectangles must overlap - return true + // the rectangles must overlap + return true } /** @@ -33,502 +33,503 @@ const areOverlapping = (rect1, rect2) => { const getRectangle = ($el) => $el[0].getBoundingClientRect(); describe('Mainnet', () => { - beforeEach(() => { - //cy.intercept('/sockjs-node/info*').as('socket'); - cy.intercept('/api/block-height/*').as('block-height'); - cy.intercept('/api/block/*').as('block'); - cy.intercept('/api/block/*/txs/0').as('block-txs'); - cy.intercept('/api/tx/*/outspends').as('tx-outspends'); - cy.intercept('/resources/pools.json').as('pools'); + beforeEach(() => { + //cy.intercept('/sockjs-node/info*').as('socket'); + cy.intercept('/api/block-height/*').as('block-height'); + cy.intercept('/api/block/*').as('block'); + cy.intercept('/api/block/*/txs/0').as('block-txs'); + cy.intercept('/api/tx/*/outspends').as('tx-outspends'); + cy.intercept('/resources/pools.json').as('pools'); - // Search Auto Complete - cy.intercept('/api/address-prefix/1wiz').as('search-1wiz'); - cy.intercept('/api/address-prefix/1wizS').as('search-1wizS'); - cy.intercept('/api/address-prefix/1wizSA').as('search-1wizSA'); + // Search Auto Complete + cy.intercept('/api/address-prefix/1wiz').as('search-1wiz'); + cy.intercept('/api/address-prefix/1wizS').as('search-1wizS'); + cy.intercept('/api/address-prefix/1wizSA').as('search-1wizSA'); - Cypress.Commands.add('waitForBlockData', () => { - cy.wait('@tx-outspends'); - cy.wait('@pools'); - }); + Cypress.Commands.add('waitForBlockData', () => { + cy.wait('@tx-outspends'); + cy.wait('@pools'); + }); + }); + + if (baseModule === 'mempool') { + + it('check first mempool block after skeleton loads', () => { + cy.visit('/'); + cy.waitForSkeletonGone(); + cy.get('#mempool-block-0 > .blockLink').should('exist'); }); - if (baseModule === 'mempool') { + it('loads the status screen', () => { + cy.visit('/status'); + cy.get('#mempool-block-0').should('be.visible'); + cy.get('[id^="bitcoin-block-"]').should('have.length', 8); + cy.get('.footer').should('be.visible'); + cy.get('.row > :nth-child(1)').invoke('text').then((text) => { + expect(text).to.match(/Tx vBytes per second:.* vB\/s/); + }); + cy.get('.row > :nth-child(2)').invoke('text').then((text) => { + expect(text).to.match(/Unconfirmed:(.*)/); + }); + cy.get('.row > :nth-child(3)').invoke('text').then((text) => { + expect(text).to.match(/Mempool size:(.*) (kB|MB) \((\d+) (block|blocks)\)/); + }); + }); - it('check first mempool block after skeleton loads', () => { + //TODO: This test is flaky, refactor later + it.skip('loads dashboard, drop websocket and reconnect', () => { + cy.viewport('macbook-16'); + cy.mockMempoolSocket(); + cy.visit('/'); + cy.get('.badge').should('not.exist'); + dropWebSocket(); + cy.get('.badge').should('be.visible'); + cy.get('.badge', { timeout: 25000 }).should('not.exist'); + emitMempoolInfo({ + 'params': { + command: 'init' + } + }); + cy.get(':nth-child(1) > #bitcoin-block-0').should('not.exist'); + cy.get(':nth-child(2) > #bitcoin-block-0').should('not.exist'); + cy.get(':nth-child(3) > #bitcoin-block-0').should('not.exist'); + }); + + it('loads the dashboard', () => { + cy.visit('/'); + cy.waitForSkeletonGone(); + }); + + it('check op_return tx tooltip', () => { + cy.visit('/block/00000000000000000003c5f542bed265319c6cf64238cf1f1bb9bca3ebf686d2'); + cy.waitForSkeletonGone(); + cy.get('tbody > :nth-child(2) > :nth-child(1) > a').first().trigger('onmouseover'); + cy.get('tbody > :nth-child(2) > :nth-child(1) > a').first().trigger('mouseenter'); + cy.get('.tooltip-inner').should('be.visible'); + }); + + it('check op_return coinbase tooltip', () => { + cy.visit('/block/00000000000000000003c5f542bed265319c6cf64238cf1f1bb9bca3ebf686d2'); + cy.waitForSkeletonGone(); + cy.get('div > a > .badge').first().trigger('onmouseover'); + cy.get('div > a > .badge').first().trigger('mouseenter'); + cy.get('.tooltip-inner').should('be.visible'); + }); + + describe('search', () => { + it('allows searching for partial Bitcoin addresses', () => { + cy.visit('/'); + cy.get('.search-box-container > .form-control').type('1wiz').then(() => { + cy.wait('@search-1wiz'); + cy.get('ngb-typeahead-window button.dropdown-item').should('have.length', 10); + }); + + cy.get('.search-box-container > .form-control').type('S').then(() => { + cy.wait('@search-1wizS'); + cy.get('ngb-typeahead-window button.dropdown-item').should('have.length', 5); + }); + + cy.get('.search-box-container > .form-control').type('A').then(() => { + cy.wait('@search-1wizSA'); + cy.get('ngb-typeahead-window button.dropdown-item').should('have.length', 1) + }); + + cy.get('ngb-typeahead-window button.dropdown-item.active').click().then(() => { + cy.url().should('include', '/address/1wizSAYSbuyXbt9d8JV8ytm5acqq2TorC'); + cy.waitForSkeletonGone(); + cy.get('.text-center').should('not.have.text', 'Invalid Bitcoin address'); + }); + }); + + ['BC1PQYQSZQ', 'bc1PqYqSzQ'].forEach((searchTerm) => { + it(`allows searching for partial case insensitive bech32m addresses: ${searchTerm}`, () => { + cy.visit('/'); + cy.get('.search-box-container > .form-control').type(searchTerm).then(() => { + cy.get('ngb-typeahead-window button.dropdown-item').should('have.length', 1); + cy.get('ngb-typeahead-window button.dropdown-item.active').click().then(() => { + cy.url().should('include', '/address/bc1pqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsyjer9e'); + cy.waitForSkeletonGone(); + cy.get('.text-center').should('not.have.text', 'Invalid Bitcoin address'); + }); + }); + }); + }); + + ['BC1Q000375VXCU', 'bC1q000375vXcU'].forEach((searchTerm) => { + it(`allows searching for partial case insensitive bech32 addresses: ${searchTerm}`, () => { + cy.visit('/'); + cy.get('.search-box-container > .form-control').type(searchTerm).then(() => { + cy.get('ngb-typeahead-window button.dropdown-item').should('have.length', 1); + cy.get('ngb-typeahead-window button.dropdown-item.active').click().then(() => { + cy.url().should('include', '/address/bc1q000375vxcuf5v04lmwy22vy2thvhqkxghgq7dy'); + cy.waitForSkeletonGone(); + cy.get('.text-center').should('not.have.text', 'Invalid Bitcoin address'); + }); + }); + }); + }); + + }); + + describe('blocks navigation', () => { + + describe('keyboard events', () => { + it('loads first blockchain blocks visible and keypress arrow right', () => { + cy.viewport('macbook-16'); cy.visit('/'); cy.waitForSkeletonGone(); - cy.get('#mempool-block-0 > .blockLink').should('exist'); - }); - - it('loads the status screen', () => { - cy.visit('/status'); - cy.get('#mempool-block-0').should('be.visible'); - cy.get('[id^="bitcoin-block-"]').should('have.length', 8); - cy.get('.footer').should('be.visible'); - cy.get('.row > :nth-child(1)').invoke('text').then((text) => { - expect(text).to.match(/Tx vBytes per second:.* vB\/s/); - }); - cy.get('.row > :nth-child(2)').invoke('text').then((text) => { - expect(text).to.match(/Unconfirmed:(.*)/); - }); - cy.get('.row > :nth-child(3)').invoke('text').then((text) => { - expect(text).to.match(/Mempool size:(.*) (kB|MB) \((\d+) (block|blocks)\)/); - }); - }); - - it('loads dashboard, drop websocket and reconnect', () => { - cy.viewport('macbook-16'); - cy.mockMempoolSocket(); - cy.visit('/'); - cy.get('.badge').should('not.exist'); - dropWebSocket(); - cy.get('.badge').should('be.visible'); - cy.get('.badge', {timeout: 25000}).should('not.exist'); - emitMempoolInfo({ - 'params': { - command: 'init' - } - }); - cy.get(':nth-child(1) > #bitcoin-block-0').should('not.exist'); - cy.get(':nth-child(2) > #bitcoin-block-0').should('not.exist'); - cy.get(':nth-child(3) > #bitcoin-block-0').should('not.exist'); - }); - - it('loads the dashboard', () => { - cy.visit('/'); - cy.waitForSkeletonGone(); - }); - - it('check op_return tx tooltip', () => { - cy.visit('/block/00000000000000000003c5f542bed265319c6cf64238cf1f1bb9bca3ebf686d2'); - cy.waitForSkeletonGone(); - cy.get('tbody > :nth-child(2) > :nth-child(1) > a').first().trigger('onmouseover'); - cy.get('tbody > :nth-child(2) > :nth-child(1) > a').first().trigger('mouseenter'); - cy.get('.tooltip-inner').should('be.visible'); - }); - - it('check op_return coinbase tooltip', () => { - cy.visit('/block/00000000000000000003c5f542bed265319c6cf64238cf1f1bb9bca3ebf686d2'); - cy.waitForSkeletonGone(); - cy.get('div > a > .badge').first().trigger('onmouseover'); - cy.get('div > a > .badge').first().trigger('mouseenter'); - cy.get('.tooltip-inner').should('be.visible'); - }); - - describe('search', () => { - it('allows searching for partial Bitcoin addresses', () => { - cy.visit('/'); - cy.get('.search-box-container > .form-control').type('1wiz').then(() => { - cy.wait('@search-1wiz'); - cy.get('ngb-typeahead-window button.dropdown-item').should('have.length', 10); - }); - - cy.get('.search-box-container > .form-control').type('S').then(() => { - cy.wait('@search-1wizS'); - cy.get('ngb-typeahead-window button.dropdown-item').should('have.length', 5); - }); - - cy.get('.search-box-container > .form-control').type('A').then(() => { - cy.wait('@search-1wizSA'); - cy.get('ngb-typeahead-window button.dropdown-item').should('have.length', 1) - }); - - cy.get('ngb-typeahead-window button.dropdown-item.active').click().then(() => { - cy.url().should('include', '/address/1wizSAYSbuyXbt9d8JV8ytm5acqq2TorC'); - cy.waitForSkeletonGone(); - cy.get('.text-center').should('not.have.text', 'Invalid Bitcoin address'); - }); - }); - - ['BC1PQYQSZQ', 'bc1PqYqSzQ'].forEach((searchTerm) => { - it(`allows searching for partial case insensitive bech32m addresses: ${searchTerm}`, () => { - cy.visit('/'); - cy.get('.search-box-container > .form-control').type(searchTerm).then(() => { - cy.get('ngb-typeahead-window button.dropdown-item').should('have.length', 1); - cy.get('ngb-typeahead-window button.dropdown-item.active').click().then(() => { - cy.url().should('include', '/address/bc1pqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsyjer9e'); - cy.waitForSkeletonGone(); - cy.get('.text-center').should('not.have.text', 'Invalid Bitcoin address'); - }); - }); - }); - }); - - ['BC1Q000375VXCU', 'bC1q000375vXcU'].forEach((searchTerm) => { - it(`allows searching for partial case insensitive bech32 addresses: ${searchTerm}`, () => { - cy.visit('/'); - cy.get('.search-box-container > .form-control').type(searchTerm).then(() => { - cy.get('ngb-typeahead-window button.dropdown-item').should('have.length', 1); - cy.get('ngb-typeahead-window button.dropdown-item.active').click().then(() => { - cy.url().should('include', '/address/bc1q000375vxcuf5v04lmwy22vy2thvhqkxghgq7dy'); - cy.waitForSkeletonGone(); - cy.get('.text-center').should('not.have.text', 'Invalid Bitcoin address'); - }); - }); - }); - }); - - }); - - describe('blocks navigation', () => { - - describe('keyboard events', () => { - it('loads first blockchain blocks visible and keypress arrow right', () => { - cy.viewport('macbook-16'); - cy.visit('/'); - cy.waitForSkeletonGone(); - cy.get('.blockchain-blocks-0 > a').click().then(() => { - cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('not.exist'); - cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); - cy.waitForPageIdle(); - cy.document().right(); - cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); - cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); - }); - }); - - it('loads first blockchain blocks visible and keypress arrow left', () => { - cy.viewport('macbook-16'); - cy.visit('/'); - cy.waitForSkeletonGone(); - cy.get('.blockchain-blocks-0 > a').click().then(() => { - cy.waitForPageIdle(); - cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('not.exist'); - cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); - cy.document().left(); - cy.get('.title-block h1').invoke('text').should('equal', 'Next block'); - }); - }); - - it('loads last blockchain blocks and keypress arrow right', () => { - cy.viewport('macbook-16'); - cy.visit('/'); - cy.waitForSkeletonGone(); - cy.get('.blockchain-blocks-4 > a').click().then(() => { - cy.waitForPageIdle(); - - // block 6 - cy.document().right(); - cy.wait(5000); - cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); - cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); - - // block 7 - cy.document().right(); - cy.wait(5000); - cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); - cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); - - // block 8 - last visible block - cy.document().right(); - cy.wait(5000); - cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); - cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); - - // block 9 - not visible at the blochchain blocks visible block - cy.document().right(); - cy.wait(5000); - cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); - cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); - - }); - }); - - it('loads genesis block and keypress arrow right', () => { - cy.viewport('macbook-16'); - cy.visit('/block/0'); - cy.waitForSkeletonGone(); - cy.waitForPageIdle(); - - cy.document().right(); - cy.wait(5000); - cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); - cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('not.exist'); - }); - - it('loads genesis block and keypress arrow left', () => { - cy.viewport('macbook-16'); - cy.visit('/block/0'); - cy.waitForSkeletonGone(); - cy.waitForPageIdle(); - - cy.document().left(); - cy.wait(5000); - cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); - cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); - }); - }); - describe('mouse events', () => { - it('loads first blockchain blocks visible and click on the arrow right', () => { - cy.viewport('macbook-16'); - cy.visit('/'); - cy.waitForSkeletonGone(); - cy.get('.blockchain-blocks-0 > a').click().then(() => { - cy.waitForPageIdle(); - cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('not.exist'); - cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); - cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').click().then(() => { - cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); - cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); - }); - }); - }); - - it('loads genesis block and click on the arrow left', () => { - cy.viewport('macbook-16'); - cy.visit('/block/0'); - cy.waitForSkeletonGone(); - cy.waitForPageIdle(); - cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); - cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('not.exist'); - cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').click().then(() => { - cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); - cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); - }); - }); - }); - }); - - - it('loads skeleton when changes between networks', () => { - cy.visit('/'); - cy.waitForSkeletonGone(); - - cy.changeNetwork("testnet"); - cy.changeNetwork("signet"); - cy.changeNetwork("mainnet"); - }); - - it.skip('loads the dashboard with the skeleton blocks', () => { - cy.mockMempoolSocket(); - cy.visit("/"); - cy.get(':nth-child(1) > #bitcoin-block-0').should('be.visible'); - cy.get(':nth-child(2) > #bitcoin-block-0').should('be.visible'); - cy.get(':nth-child(3) > #bitcoin-block-0').should('be.visible'); - cy.get('#mempool-block-0').should('be.visible'); - cy.get('#mempool-block-1').should('be.visible'); - cy.get('#mempool-block-2').should('be.visible'); - - emitMempoolInfo({ - 'params': { - command: 'init' - } - }); - - cy.get(':nth-child(1) > #bitcoin-block-0').should('not.exist'); - cy.get(':nth-child(2) > #bitcoin-block-0').should('not.exist'); - cy.get(':nth-child(3) > #bitcoin-block-0').should('not.exist'); - }); - - it('loads the blocks screen', () => { - cy.visit('/'); - cy.waitForSkeletonGone(); - cy.get('li:nth-of-type(2) > a').click().then(() => { - cy.waitForPageIdle(); - }); - }); - - it('loads the graphs screen', () => { - cy.visit('/'); - cy.waitForSkeletonGone(); - cy.get('li:nth-of-type(3) > a').click().then(() => { - cy.wait(1000); - }); - }); - - describe('graphs page', () => { - it('check buttons - mobile', () => { - cy.viewport('iphone-6'); - cy.visit('/graphs'); - cy.waitForSkeletonGone(); - cy.get('.small-buttons > :nth-child(2)').should('be.visible'); - cy.get('#dropdownFees').should('be.visible'); - cy.get('.btn-group').should('be.visible'); - }); - it('check buttons - tablet', () => { - cy.viewport('ipad-2'); - cy.visit('/graphs'); - cy.waitForSkeletonGone(); - cy.get('.small-buttons > :nth-child(2)').should('be.visible'); - cy.get('#dropdownFees').should('be.visible'); - cy.get('.btn-group').should('be.visible'); - }); - it('check buttons - desktop', () => { - cy.viewport('macbook-16'); - cy.visit('/graphs'); - cy.waitForSkeletonGone(); - cy.get('.small-buttons > :nth-child(2)').should('be.visible'); - cy.get('#dropdownFees').should('be.visible'); - cy.get('.btn-group').should('be.visible'); + cy.get('.blockchain-blocks-0 > a').click().then(() => { + cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('not.exist'); + cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); + cy.waitForPageIdle(); + cy.document().right(); + cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); + cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); }); }); - it('loads the tv screen - desktop', () => { - cy.viewport('macbook-16'); - cy.visit('/'); + it('loads first blockchain blocks visible and keypress arrow left', () => { + cy.viewport('macbook-16'); + cy.visit('/'); + cy.waitForSkeletonGone(); + cy.get('.blockchain-blocks-0 > a').click().then(() => { + cy.waitForPageIdle(); + cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('not.exist'); + cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); + cy.document().left(); + cy.get('.title-block h1').invoke('text').should('equal', 'Next block'); + }); + }); + + it('loads last blockchain blocks and keypress arrow right', () => { + cy.viewport('macbook-16'); + cy.visit('/'); + cy.waitForSkeletonGone(); + cy.get('.blockchain-blocks-4 > a').click().then(() => { + cy.waitForPageIdle(); + + // block 6 + cy.document().right(); + cy.wait(5000); + cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); + cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); + + // block 7 + cy.document().right(); + cy.wait(5000); + cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); + cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); + + // block 8 - last visible block + cy.document().right(); + cy.wait(5000); + cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); + cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); + + // block 9 - not visible at the blochchain blocks visible block + cy.document().right(); + cy.wait(5000); + cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); + cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); + + }); + }); + + it('loads genesis block and keypress arrow right', () => { + cy.viewport('macbook-16'); + cy.visit('/block/0'); + cy.waitForSkeletonGone(); + cy.waitForPageIdle(); + + cy.document().right(); + cy.wait(5000); + cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); + cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('not.exist'); + }); + + it('loads genesis block and keypress arrow left', () => { + cy.viewport('macbook-16'); + cy.visit('/block/0'); + cy.waitForSkeletonGone(); + cy.waitForPageIdle(); + + cy.document().left(); + cy.wait(5000); + cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); + cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); + }); + }); + describe('mouse events', () => { + it('loads first blockchain blocks visible and click on the arrow right', () => { + cy.viewport('macbook-16'); + cy.visit('/'); + cy.waitForSkeletonGone(); + cy.get('.blockchain-blocks-0 > a').click().then(() => { + cy.waitForPageIdle(); + cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('not.exist'); + cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); + cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').click().then(() => { + cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); + cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); + }); + }); + }); + + it('loads genesis block and click on the arrow left', () => { + cy.viewport('macbook-16'); + cy.visit('/block/0'); + cy.waitForSkeletonGone(); + cy.waitForPageIdle(); + cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); + cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('not.exist'); + cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').click().then(() => { + cy.get('[ngbtooltip="Next Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); + cy.get('[ngbtooltip="Previous Block"] > .ng-fa-icon > .svg-inline--fa').should('be.visible'); + }); + }); + }); + }); + + + it('loads skeleton when changes between networks', () => { + cy.visit('/'); + cy.waitForSkeletonGone(); + + cy.changeNetwork("testnet"); + cy.changeNetwork("signet"); + cy.changeNetwork("mainnet"); + }); + + it.skip('loads the dashboard with the skeleton blocks', () => { + cy.mockMempoolSocket(); + cy.visit("/"); + cy.get(':nth-child(1) > #bitcoin-block-0').should('be.visible'); + cy.get(':nth-child(2) > #bitcoin-block-0').should('be.visible'); + cy.get(':nth-child(3) > #bitcoin-block-0').should('be.visible'); + cy.get('#mempool-block-0').should('be.visible'); + cy.get('#mempool-block-1').should('be.visible'); + cy.get('#mempool-block-2').should('be.visible'); + + emitMempoolInfo({ + 'params': { + command: 'init' + } + }); + + cy.get(':nth-child(1) > #bitcoin-block-0').should('not.exist'); + cy.get(':nth-child(2) > #bitcoin-block-0').should('not.exist'); + cy.get(':nth-child(3) > #bitcoin-block-0').should('not.exist'); + }); + + it('loads the blocks screen', () => { + cy.visit('/'); + cy.waitForSkeletonGone(); + cy.get('#btn-blocks').click().then(() => { + cy.waitForPageIdle(); + }); + }); + + it('loads the graphs screen', () => { + cy.visit('/'); + cy.waitForSkeletonGone(); + cy.get('#btn-graphs').click().then(() => { + cy.wait(1000); + }); + }); + + describe('graphs page', () => { + it('check buttons - mobile', () => { + cy.viewport('iphone-6'); + cy.visit('/graphs'); + cy.waitForSkeletonGone(); + cy.get('.small-buttons > :nth-child(2)').should('be.visible'); + cy.get('#dropdownFees').should('be.visible'); + cy.get('.btn-group').should('be.visible'); + }); + it('check buttons - tablet', () => { + cy.viewport('ipad-2'); + cy.visit('/graphs'); + cy.waitForSkeletonGone(); + cy.get('.small-buttons > :nth-child(2)').should('be.visible'); + cy.get('#dropdownFees').should('be.visible'); + cy.get('.btn-group').should('be.visible'); + }); + it('check buttons - desktop', () => { + cy.viewport('macbook-16'); + cy.visit('/graphs'); + cy.waitForSkeletonGone(); + cy.get('.small-buttons > :nth-child(2)').should('be.visible'); + cy.get('#dropdownFees').should('be.visible'); + cy.get('.btn-group').should('be.visible'); + }); + }); + + it('loads the tv screen - desktop', () => { + cy.viewport('macbook-16'); + cy.visit('/'); + cy.waitForSkeletonGone(); + cy.get('#btn-tv').click().then(() => { + cy.viewport('macbook-16'); + cy.get('.chart-holder'); + cy.get('.blockchain-wrapper').should('be.visible'); + cy.get('#mempool-block-0').should('be.visible'); + }); + }); + + it('loads the tv screen - mobile', () => { + cy.viewport('iphone-6'); + cy.visit('/tv'); + cy.waitForSkeletonGone(); + cy.get('.chart-holder'); + cy.get('.blockchain-wrapper').should('not.visible'); + }); + + it('loads the api screen', () => { + cy.visit('/'); + cy.waitForSkeletonGone(); + cy.get('#btn-docs').click().then(() => { + cy.wait(1000); + }); + }); + + describe('blocks', () => { + it('shows empty blocks properly', () => { + cy.visit('/block/0000000000000000000bd14f744ef2e006e61c32214670de7eb891a5732ee775'); + cy.waitForSkeletonGone(); + cy.waitForPageIdle(); + cy.get('h2').invoke('text').should('equal', '1 transaction'); + }); + + it('expands and collapses the block details', () => { + cy.visit('/block/0'); + cy.waitForSkeletonGone(); + cy.waitForPageIdle(); + cy.get('.btn.btn-outline-info').click().then(() => { + cy.get('#details').should('be.visible'); + }); + + cy.get('.btn.btn-outline-info').click().then(() => { + cy.get('#details').should('not.be.visible'); + }); + }); + it('shows blocks with no pagination', () => { + cy.visit('/block/00000000000000000001ba40caf1ad4cec0ceb77692662315c151953bfd7c4c4'); + cy.waitForSkeletonGone(); + cy.waitForPageIdle(); + cy.get('.block-tx-title h2').invoke('text').should('equal', '19 transactions'); + cy.get('.pagination-container ul.pagination').first().children().should('have.length', 5); + }); + + it('supports pagination on the block screen', () => { + // 41 txs + cy.visit('/block/00000000000000000009f9b7b0f63ad50053ad12ec3b7f5ca951332f134f83d8'); + cy.waitForSkeletonGone(); + cy.get('.pagination-container a').invoke('text').then((text1) => { + cy.get('.active + li').first().click().then(() => { cy.waitForSkeletonGone(); - cy.get('li:nth-of-type(4) > a').click().then(() => { - cy.viewport('macbook-16'); - cy.get('.chart-holder'); - cy.get('.blockchain-wrapper').should('be.visible'); - cy.get('#mempool-block-0').should('be.visible'); + cy.waitForPageIdle(); + cy.get('.header-bg.box > a').invoke('text').then((text2) => { + expect(text1).not.to.eq(text2); }); + }); + }); + }); + + it('shows blocks pagination with 5 pages (desktop)', () => { + cy.viewport(760, 800); + cy.visit('/block/000000000000000000049281946d26fcba7d99fdabc1feac524bc3a7003d69b3').then(() => { + cy.waitForSkeletonGone(); + cy.waitForPageIdle(); }); - it('loads the tv screen - mobile', () => { - cy.viewport('iphone-6'); - cy.visit('/tv'); - cy.waitForSkeletonGone(); - cy.get('.chart-holder'); - cy.get('.blockchain-wrapper').should('not.visible'); + // 5 pages + 4 buttons = 9 buttons + cy.get('.pagination-container ul.pagination').first().children().should('have.length', 9); + }); + + it('shows blocks pagination with 3 pages (mobile)', () => { + cy.viewport(669, 800); + cy.visit('/block/000000000000000000049281946d26fcba7d99fdabc1feac524bc3a7003d69b3').then(() => { + cy.waitForSkeletonGone(); + cy.waitForPageIdle(); }); - it('loads the api screen', () => { - cy.visit('/'); - cy.waitForSkeletonGone(); - cy.get('li:nth-of-type(5) > a').click().then(() => { - cy.wait(1000); - }); + // 3 pages + 4 buttons = 7 buttons + cy.get('.pagination-container ul.pagination').first().children().should('have.length', 7); + }); + }); + + describe('RBF transactions', () => { + it('shows RBF transactions properly (mobile)', () => { + cy.viewport('iphone-xr'); + cy.mockMempoolSocket(); + cy.visit('/tx/f81a08699b62b2070ad8fe0f2a076f8bea0386a2fdcd8124caee42cbc564a0d5'); + + cy.waitForSkeletonGone(); + + emitMempoolInfo({ + 'params': { + command: 'init' + } }); - describe('blocks', () => { - it('shows empty blocks properly', () => { - cy.visit('/block/0000000000000000000bd14f744ef2e006e61c32214670de7eb891a5732ee775'); - cy.waitForSkeletonGone(); - cy.waitForPageIdle(); - cy.get('h2').invoke('text').should('equal', '1 transaction'); - }); + cy.get('#mempool-block-0'); - it('expands and collapses the block details', () => { - cy.visit('/block/0'); - cy.waitForSkeletonGone(); - cy.waitForPageIdle(); - cy.get('.btn.btn-outline-info').click().then(() => { - cy.get('#details').should('be.visible'); - }); - - cy.get('.btn.btn-outline-info').click().then(() => { - cy.get('#details').should('not.be.visible'); - }); - }); - it('shows blocks with no pagination', () => { - cy.visit('/block/00000000000000000001ba40caf1ad4cec0ceb77692662315c151953bfd7c4c4'); - cy.waitForSkeletonGone(); - cy.waitForPageIdle(); - cy.get('.block-tx-title h2').invoke('text').should('equal', '19 transactions'); - cy.get('.pagination-container ul.pagination').first().children().should('have.length', 5); - }); - - it('supports pagination on the block screen', () => { - // 41 txs - cy.visit('/block/00000000000000000009f9b7b0f63ad50053ad12ec3b7f5ca951332f134f83d8'); - cy.waitForSkeletonGone(); - cy.get('.pagination-container a').invoke('text').then((text1) => { - cy.get('.active + li').first().click().then(() => { - cy.waitForSkeletonGone(); - cy.waitForPageIdle(); - cy.get('.header-bg.box > a').invoke('text').then((text2) => { - expect(text1).not.to.eq(text2); - }); - }); - }); - }); - - it('shows blocks pagination with 5 pages (desktop)', () => { - cy.viewport(760, 800); - cy.visit('/block/000000000000000000049281946d26fcba7d99fdabc1feac524bc3a7003d69b3').then(() => { - cy.waitForSkeletonGone(); - cy.waitForPageIdle(); - }); - - // 5 pages + 4 buttons = 9 buttons - cy.get('.pagination-container ul.pagination').first().children().should('have.length', 9); - }); - - it('shows blocks pagination with 3 pages (mobile)', () => { - cy.viewport(669, 800); - cy.visit('/block/000000000000000000049281946d26fcba7d99fdabc1feac524bc3a7003d69b3').then(() => { - cy.waitForSkeletonGone(); - cy.waitForPageIdle(); - }); - - // 3 pages + 4 buttons = 7 buttons - cy.get('.pagination-container ul.pagination').first().children().should('have.length', 7); - }); + emitMempoolInfo({ + 'params': { + command: 'rbfTransaction' + } }); - describe('RBF transactions', () => { - it('shows RBF transactions properly (mobile)', () => { - cy.viewport('iphone-xr'); - cy.mockMempoolSocket(); - cy.visit('/tx/f81a08699b62b2070ad8fe0f2a076f8bea0386a2fdcd8124caee42cbc564a0d5'); - - cy.waitForSkeletonGone(); - - emitMempoolInfo({ - 'params': { - command: 'init' - } - }); - - cy.get('#mempool-block-0'); - - emitMempoolInfo({ - 'params': { - command: 'rbfTransaction' - } - }); - - cy.get('.alert-mempool').should('be.visible'); - cy.get('.alert-mempool').invoke('css', 'width').then((alertWidth) => { - cy.get('.container-xl > :nth-child(3)').invoke('css', 'width').should('equal', alertWidth); - }); - - cy.get('.btn-success').then(getRectangle).then((rectA) => { - cy.get('.alert-mempool').then(getRectangle).then((rectB) => { - expect(areOverlapping(rectA, rectB), 'Confirmations box and RBF alert are overlapping').to.be.false; - }); - }); - }); - - it('shows RBF transactions properly (desktop)', () => { - cy.viewport('macbook-16'); - cy.mockMempoolSocket(); - cy.visit('/tx/f81a08699b62b2070ad8fe0f2a076f8bea0386a2fdcd8124caee42cbc564a0d5'); - - cy.waitForSkeletonGone(); - - emitMempoolInfo({ - 'params': { - command: 'init' - } - }); - - cy.get('#mempool-block-0'); - - emitMempoolInfo({ - 'params': { - command: 'rbfTransaction' - } - }); - - cy.get('.alert-mempool').should('be.visible'); - - const alertLocator = '.alert-mempool'; - const tableLocator = '.container-xl > :nth-child(3)'; - - cy.get(tableLocator).invoke('css', 'width').then((firstWidth) => { - cy.get(alertLocator).invoke('css', 'width').should('equal', firstWidth); - }); - - cy.get('.btn-success').then(getRectangle).then((rectA) => { - cy.get('.alert-mempool').then(getRectangle).then((rectB) => { - expect(areOverlapping(rectA, rectB), 'Confirmations box and RBF alert are overlapping').to.be.false; - }); - }); - }); + cy.get('.alert-mempool').should('be.visible'); + cy.get('.alert-mempool').invoke('css', 'width').then((alertWidth) => { + cy.get('.container-xl > :nth-child(3)').invoke('css', 'width').should('equal', alertWidth); }); - } else { - it.skip(`Tests cannot be run on the selected BASE_MODULE ${baseModule}`); - } + + cy.get('.btn-success').then(getRectangle).then((rectA) => { + cy.get('.alert-mempool').then(getRectangle).then((rectB) => { + expect(areOverlapping(rectA, rectB), 'Confirmations box and RBF alert are overlapping').to.be.false; + }); + }); + }); + + it('shows RBF transactions properly (desktop)', () => { + cy.viewport('macbook-16'); + cy.mockMempoolSocket(); + cy.visit('/tx/f81a08699b62b2070ad8fe0f2a076f8bea0386a2fdcd8124caee42cbc564a0d5'); + + cy.waitForSkeletonGone(); + + emitMempoolInfo({ + 'params': { + command: 'init' + } + }); + + cy.get('#mempool-block-0'); + + emitMempoolInfo({ + 'params': { + command: 'rbfTransaction' + } + }); + + cy.get('.alert-mempool').should('be.visible'); + + const alertLocator = '.alert-mempool'; + const tableLocator = '.container-xl > :nth-child(3)'; + + cy.get(tableLocator).invoke('css', 'width').then((firstWidth) => { + cy.get(alertLocator).invoke('css', 'width').should('equal', firstWidth); + }); + + cy.get('.btn-success').then(getRectangle).then((rectA) => { + cy.get('.alert-mempool').then(getRectangle).then((rectB) => { + expect(areOverlapping(rectA, rectB), 'Confirmations box and RBF alert are overlapping').to.be.false; + }); + }); + }); + }); + } else { + it.skip(`Tests cannot be run on the selected BASE_MODULE ${baseModule}`); + } }); diff --git a/frontend/cypress/integration/signet/signet.spec.ts b/frontend/cypress/integration/signet/signet.spec.ts index 8e40fdc73..9ebf67b81 100644 --- a/frontend/cypress/integration/signet/signet.spec.ts +++ b/frontend/cypress/integration/signet/signet.spec.ts @@ -13,8 +13,8 @@ describe('Signet', () => { if (baseModule === 'mempool') { it('loads the dashboard', () => { - cy.visit('/signet'); - cy.waitForSkeletonGone(); + cy.visit('/signet'); + cy.waitForSkeletonGone(); }); it('check first mempool block after skeleton loads', () => { @@ -24,116 +24,116 @@ describe('Signet', () => { }); it.skip('loads the dashboard with the skeleton blocks', () => { - cy.mockMempoolSocket(); - cy.visit("/signet"); - cy.get(':nth-child(1) > #bitcoin-block-0').should('be.visible'); - cy.get(':nth-child(2) > #bitcoin-block-0').should('be.visible'); - cy.get(':nth-child(3) > #bitcoin-block-0').should('be.visible'); - cy.get('#mempool-block-0').should('be.visible'); - cy.get('#mempool-block-1').should('be.visible'); - cy.get('#mempool-block-2').should('be.visible'); + cy.mockMempoolSocket(); + cy.visit("/signet"); + cy.get(':nth-child(1) > #bitcoin-block-0').should('be.visible'); + cy.get(':nth-child(2) > #bitcoin-block-0').should('be.visible'); + cy.get(':nth-child(3) > #bitcoin-block-0').should('be.visible'); + cy.get('#mempool-block-0').should('be.visible'); + cy.get('#mempool-block-1').should('be.visible'); + cy.get('#mempool-block-2').should('be.visible'); - emitMempoolInfo({ - 'params': { - "network": "signet" - } - }); + emitMempoolInfo({ + 'params': { + "network": "signet" + } + }); - cy.get(':nth-child(1) > #bitcoin-block-0').should('not.exist'); - cy.get(':nth-child(2) > #bitcoin-block-0').should('not.exist'); - cy.get(':nth-child(3) > #bitcoin-block-0').should('not.exist'); + cy.get(':nth-child(1) > #bitcoin-block-0').should('not.exist'); + cy.get(':nth-child(2) > #bitcoin-block-0').should('not.exist'); + cy.get(':nth-child(3) > #bitcoin-block-0').should('not.exist'); }); it('loads the blocks screen', () => { - cy.visit('/signet'); - cy.waitForSkeletonGone(); - cy.get('li:nth-of-type(2) > a').click().then(() => { - cy.wait(1000); - }); + cy.visit('/signet'); + cy.waitForSkeletonGone(); + cy.get('#btn-blocks').click().then(() => { + cy.wait(1000); + }); }); it('loads the graphs screen', () => { - cy.visit('/signet'); - cy.waitForSkeletonGone(); - cy.get('li:nth-of-type(3) > a').click().then(() => { - cy.wait(1000); - }); + cy.visit('/signet'); + cy.waitForSkeletonGone(); + cy.get('#btn-graphs').click().then(() => { + cy.wait(1000); + }); }); describe('tv mode', () => { - it('loads the tv screen - desktop', () => { - cy.viewport('macbook-16'); - cy.visit('/signet'); - cy.waitForSkeletonGone(); - cy.get('li:nth-of-type(4) > a').click().then(() => { - cy.get('.chart-holder').should('be.visible'); - cy.get('#mempool-block-0').should('be.visible'); - cy.get('.tv-only').should('not.exist'); - }); + it('loads the tv screen - desktop', () => { + cy.viewport('macbook-16'); + cy.visit('/signet'); + cy.waitForSkeletonGone(); + cy.get('#btn-tv').click().then(() => { + cy.get('.chart-holder').should('be.visible'); + cy.get('#mempool-block-0').should('be.visible'); + cy.get('.tv-only').should('not.exist'); }); + }); - it('loads the tv screen - mobile', () => { - cy.visit('/signet'); - cy.waitForSkeletonGone(); - cy.get('li:nth-of-type(4) > a').click().then(() => { - cy.viewport('iphone-8'); - cy.get('.chart-holder').should('be.visible'); - //TODO: Remove comment when the bug is fixed - //cy.get('#mempool-block-0').should('be.visible'); - cy.get('.tv-only').should('not.exist'); - }); + it('loads the tv screen - mobile', () => { + cy.visit('/signet'); + cy.waitForSkeletonGone(); + cy.get('#btn-tv').click().then(() => { + cy.viewport('iphone-8'); + cy.get('.chart-holder').should('be.visible'); + cy.get('.tv-only').should('not.exist'); + //TODO: Remove comment when the bug is fixed + //cy.get('#mempool-block-0').should('be.visible'); }); + }); }); it('loads the api screen', () => { - cy.visit('/signet'); - cy.waitForSkeletonGone(); - cy.get('li:nth-of-type(5) > a').click().then(() => { - cy.wait(1000); - }); + cy.visit('/signet'); + cy.waitForSkeletonGone(); + cy.get('#btn-docs').click().then(() => { + cy.wait(1000); + }); }); describe('blocks', () => { - it('shows empty blocks properly', () => { - cy.visit('/signet/block/00000133d54e4589f6436703b067ec23209e0a21b8a9b12f57d0592fd85f7a42'); - cy.waitForSkeletonGone(); - cy.get('h2').invoke('text').should('equal', '1 transaction'); + it('shows empty blocks properly', () => { + cy.visit('/signet/block/00000133d54e4589f6436703b067ec23209e0a21b8a9b12f57d0592fd85f7a42'); + cy.waitForSkeletonGone(); + cy.get('h2').invoke('text').should('equal', '1 transaction'); + }); + + it('expands and collapses the block details', () => { + cy.visit('/signet/block/0'); + cy.waitForSkeletonGone(); + cy.get('.btn.btn-outline-info').click().then(() => { + cy.get('#details').should('be.visible'); }); - it('expands and collapses the block details', () => { - cy.visit('/signet/block/0'); - cy.waitForSkeletonGone(); - cy.get('.btn.btn-outline-info').click().then(() => { - cy.get('#details').should('be.visible'); - }); - - cy.get('.btn.btn-outline-info').click().then(() => { - cy.get('#details').should('not.be.visible'); - }); - }); - - it('shows blocks with no pagination', () => { - cy.visit('/signet/block/00000078f920a96a69089877b934ce7fd009ab55e3170920a021262cb258e7cc'); - cy.waitForSkeletonGone(); - cy.get('h2').invoke('text').should('equal', '13 transactions'); - cy.get('ul.pagination').first().children().should('have.length', 5); - }); - - it('supports pagination on the block screen', () => { - // 43 txs - cy.visit('/signet/block/00000094bd52f73bdbfc4bece3a94c21fec2dc968cd54210496e69e4059d66a6'); - cy.waitForSkeletonGone(); - cy.get('.header-bg.box > a').invoke('text').then((text1) => { - cy.get('.active + li').first().click().then(() => { - cy.get('.header-bg.box > a').invoke('text').then((text2) => { - expect(text1).not.to.eq(text2); - }); - }); + cy.get('.btn.btn-outline-info').click().then(() => { + cy.get('#details').should('not.be.visible'); + }); + }); + + it('shows blocks with no pagination', () => { + cy.visit('/signet/block/00000078f920a96a69089877b934ce7fd009ab55e3170920a021262cb258e7cc'); + cy.waitForSkeletonGone(); + cy.get('h2').invoke('text').should('equal', '13 transactions'); + cy.get('ul.pagination').first().children().should('have.length', 5); + }); + + it('supports pagination on the block screen', () => { + // 43 txs + cy.visit('/signet/block/00000094bd52f73bdbfc4bece3a94c21fec2dc968cd54210496e69e4059d66a6'); + cy.waitForSkeletonGone(); + cy.get('.header-bg.box > a').invoke('text').then((text1) => { + cy.get('.active + li').first().click().then(() => { + cy.get('.header-bg.box > a').invoke('text').then((text2) => { + expect(text1).not.to.eq(text2); }); + }); }); + }); }); - } else { - it.skip(`Tests cannot be run on the selected BASE_MODULE ${baseModule}`); - } - }); + } else { + it.skip(`Tests cannot be run on the selected BASE_MODULE ${baseModule}`); + } +}); diff --git a/frontend/cypress/integration/testnet/testnet.spec.ts b/frontend/cypress/integration/testnet/testnet.spec.ts index e92480eff..6f3264244 100644 --- a/frontend/cypress/integration/testnet/testnet.spec.ts +++ b/frontend/cypress/integration/testnet/testnet.spec.ts @@ -13,8 +13,8 @@ describe('Testnet', () => { if (baseModule === 'mempool') { it('loads the dashboard', () => { - cy.visit('/testnet'); - cy.waitForSkeletonGone(); + cy.visit('/testnet'); + cy.waitForSkeletonGone(); }); it('check first mempool block after skeleton loads', () => { @@ -24,113 +24,115 @@ describe('Testnet', () => { }); it.skip('loads the dashboard with the skeleton blocks', () => { - cy.mockMempoolSocket(); - cy.visit("/testnet"); - cy.get(':nth-child(1) > #bitcoin-block-0').should('be.visible'); - cy.get(':nth-child(2) > #bitcoin-block-0').should('be.visible'); - cy.get(':nth-child(3) > #bitcoin-block-0').should('be.visible'); - cy.get('#mempool-block-0').should('be.visible'); - cy.get('#mempool-block-1').should('be.visible'); - cy.get('#mempool-block-2').should('be.visible'); + cy.mockMempoolSocket(); + cy.visit("/testnet"); + cy.get(':nth-child(1) > #bitcoin-block-0').should('be.visible'); + cy.get(':nth-child(2) > #bitcoin-block-0').should('be.visible'); + cy.get(':nth-child(3) > #bitcoin-block-0').should('be.visible'); + cy.get('#mempool-block-0').should('be.visible'); + cy.get('#mempool-block-1').should('be.visible'); + cy.get('#mempool-block-2').should('be.visible'); - emitMempoolInfo({ - 'params': { - loaded: true - } - }); + emitMempoolInfo({ + 'params': { + loaded: true + } + }); - cy.get(':nth-child(1) > #bitcoin-block-0').should('not.exist'); - cy.get(':nth-child(2) > #bitcoin-block-0').should('not.exist'); - cy.get(':nth-child(3) > #bitcoin-block-0').should('not.exist'); + cy.get(':nth-child(1) > #bitcoin-block-0').should('not.exist'); + cy.get(':nth-child(2) > #bitcoin-block-0').should('not.exist'); + cy.get(':nth-child(3) > #bitcoin-block-0').should('not.exist'); }); it('loads the blocks screen', () => { - cy.visit('/testnet'); - cy.waitForSkeletonGone(); - cy.get('li:nth-of-type(2) > a').click().then(() => { - cy.wait(1000); - }); + cy.visit('/testnet'); + cy.waitForSkeletonGone(); + cy.get('#btn-blocks').click().then(() => { + cy.wait(1000); + }); }); it('loads the graphs screen', () => { - cy.visit('/testnet'); - cy.waitForSkeletonGone(); - cy.get('li:nth-of-type(3) > a').click().then(() => { - cy.wait(1000); - }); + cy.visit('/testnet'); + cy.waitForSkeletonGone(); + cy.get('#btn-graphs').click().then(() => { + cy.wait(1000); + }); }); describe('tv mode', () => { - it('loads the tv screen - desktop', () => { - cy.viewport('macbook-16'); - cy.visit('/testnet'); - cy.waitForSkeletonGone(); - cy.get('li:nth-of-type(4) > a').click().then(() => { - cy.wait(1000); - cy.get('.tv-only').should('not.exist'); - }); + it('loads the tv screen - desktop', () => { + cy.viewport('macbook-16'); + cy.visit('/testnet'); + cy.waitForSkeletonGone(); + cy.get('#btn-tv').click().then(() => { + cy.wait(1000); + cy.get('.tv-only').should('not.exist'); + //TODO: Remove comment when the bug is fixed + //cy.get('#mempool-block-0').should('be.visible'); }); + }); - it('loads the tv screen - mobile', () => { - cy.visit('/testnet'); - cy.waitForSkeletonGone(); - cy.get('li:nth-of-type(4) > a').click().then(() => { - cy.viewport('iphone-6'); - cy.wait(1000); - cy.get('.tv-only').should('not.exist'); - }); + it('loads the tv screen - mobile', () => { + cy.visit('/testnet'); + cy.waitForSkeletonGone(); + cy.get('#btn-tv').click().then(() => { + cy.viewport('iphone-6'); + cy.wait(1000); + cy.get('.tv-only').should('not.exist'); }); + }); }); it('loads the api screen', () => { - cy.visit('/testnet'); - cy.waitForSkeletonGone(); - cy.get('li:nth-of-type(5) > a').click().then(() => { - cy.wait(1000); - }); + cy.visit('/testnet'); + cy.waitForSkeletonGone(); + cy.get('#btn-docs').click().then(() => { + cy.wait(1000); + }); }); describe('blocks', () => { - it('shows empty blocks properly', () => { - cy.visit('/testnet/block/0'); - cy.waitForSkeletonGone(); - cy.get('h2').invoke('text').should('equal', '1 transaction'); + it('shows empty blocks properly', () => { + cy.visit('/testnet/block/0'); + cy.waitForSkeletonGone(); + cy.get('h2').invoke('text').should('equal', '1 transaction'); + }); + + it('expands and collapses the block details', () => { + cy.visit('/testnet/block/0'); + cy.waitForSkeletonGone(); + cy.get('.btn.btn-outline-info').click().then(() => { + cy.get('#details').should('be.visible'); }); - it('expands and collapses the block details', () => { - cy.visit('/testnet/block/0'); - cy.waitForSkeletonGone(); - cy.get('.btn.btn-outline-info').click().then(() => { - cy.get('#details').should('be.visible'); - }); - - cy.get('.btn.btn-outline-info').click().then(() => { - cy.get('#details').should('not.be.visible'); - }); - }); - - it('shows blocks with no pagination', () => { - cy.visit('/testnet/block/000000000000002f8ce27716e74ecc7ad9f7b5101fed12d09e28bb721b9460ea'); - cy.waitForSkeletonGone(); - cy.get('h2').invoke('text').should('equal', '11 transactions'); - cy.get('ul.pagination').first().children().should('have.length', 5); - }); - - it('supports pagination on the block screen', () => { - // 48 txs - cy.visit('/testnet/block/000000000000002ca3878ebd98b313a1c2d531f2e70a6575d232ca7564dea7a9'); - cy.waitForSkeletonGone(); - cy.get('.header-bg.box > a').invoke('text').then((text1) => { - cy.get('.active + li').first().click().then(() => { - cy.get('.header-bg.box > a').invoke('text').then((text2) => { - expect(text1).not.to.eq(text2); - }); - }); + cy.get('.btn.btn-outline-info').click().then(() => { + cy.get('#details').should('not.be.visible'); + }); + }); + + it('shows blocks with no pagination', () => { + cy.visit('/testnet/block/000000000000002f8ce27716e74ecc7ad9f7b5101fed12d09e28bb721b9460ea'); + cy.waitForSkeletonGone(); + cy.get('h2').invoke('text').should('equal', '11 transactions'); + cy.get('ul.pagination').first().children().should('have.length', 5); + }); + + it('supports pagination on the block screen', () => { + // 48 txs + cy.visit('/testnet/block/000000000000002ca3878ebd98b313a1c2d531f2e70a6575d232ca7564dea7a9'); + cy.waitForSkeletonGone(); + cy.get('.header-bg.box > a').invoke('text').then((text1) => { + cy.get('.active + li').first().click().then(() => { + cy.get('.header-bg.box > a').invoke('text').then((text2) => { + expect(text1).not.to.eq(text2); }); + }); }); + }); }); - } else { - it.skip(`Tests cannot be run on the selected BASE_MODULE ${baseModule}`); - } - }); + } else { + it.skip(`Tests cannot be run on the selected BASE_MODULE ${baseModule}`); + } +}); diff --git a/frontend/src/app/bisq/bisq-transactions/bisq-transactions.component.html b/frontend/src/app/bisq/bisq-transactions/bisq-transactions.component.html index f85c29a9b..d1064972e 100644 --- a/frontend/src/app/bisq/bisq-transactions/bisq-transactions.component.html +++ b/frontend/src/app/bisq/bisq-transactions/bisq-transactions.component.html @@ -1,7 +1,7 @@