import { module, test } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { render, click } from '@ember/test-helpers'; import hbs from 'htmlbars-inline-precompile'; import Layer1TestWeb3Strategy from '@cardstack/web-client/utils/web3-strategies/test-layer1'; import Layer2TestWeb3Strategy from '@cardstack/web-client/utils/web3-strategies/test-layer2'; import { WorkflowSession } from '@cardstack/web-client/models/workflow'; import { currentNetworkDisplayInfo as c } from '@cardstack/web-client/utils/web3-strategies/network-display-info'; import BN from 'bn.js'; module( 'Integration | Component | card-pay/deposit-workflow/transaction-setup', function (hooks) { setupRenderingTest(hooks); hooks.beforeEach(function () { let layer2Service = this.owner.lookup('service:layer2-network'); let layer2Strategy = layer2Service.strategy as Layer2TestWeb3Strategy; // Simulate being connected on layer 2 -- prereq to converting to USD let layer2AccountAddress = '0x182619c6Ea074C053eF3f1e1eF81Ec8De6Eb6E44'; layer2Strategy.test__simulateAccountsChanged([layer2AccountAddress]); }); test('incomplete card displays the correct data', async function (assert) { const session = new WorkflowSession(); const layer1AccountAddress = '0xaCD5f5534B756b856ae3B2CAcF54B3321dd6654Fb6'; const layer1Service = this.owner.lookup('service:layer1-network') .strategy as Layer1TestWeb3Strategy; layer1Service.test__simulateAccountsChanged( [layer1AccountAddress], 'metamask' ); layer1Service.test__simulateBalances({ defaultToken: new BN('2141100000000000000'), dai: new BN('250500000000000000000'), card: new BN('10000000000000000000000'), }); this.setProperties({ session, }); await render(hbs` `); assert .dom('[data-test-deposit-transaction-setup-is-complete]') .doesNotExist(); assert .dom(`[data-test-deposit-transaction-setup-from-option]`) .exists({ count: 2 }); assert .dom( `[data-test-deposit-transaction-setup-from-address] [data-test-account-name]` ) .hasText(`${c.layer1.fullName} wallet`); assert .dom( `[data-test-deposit-transaction-setup-from-address] [data-test-account-address]` ) .hasText(layer1AccountAddress); assert.dom(`[data-test-balance="DAI"]`).hasText('250.50 DAI'); assert.dom(`[data-test-usd-balance="DAI"]`).hasText('$50.10 USD'); assert.dom(`[data-test-balance="CARD"]`).hasText('10,000.00 CARD'); assert.dom(`[data-test-usd-balance="CARD"]`).hasText('$2,000.00 USD'); assert .dom(`[data-test-deposit-transaction-setup-to-wallet]`) .hasText(`${c.layer2.fullName} wallet`); assert .dom( `[data-test-deposit-transaction-setup-to-address] [data-test-account-address]` ) .hasText('0x1826...6E44'); assert .dom( `[data-test-deposit-transaction-setup-depot-address] [data-test-account-text]` ) .hasText('New Depot'); }); test('zero balance tokens should not show loading indicator for USD balance', async function (assert) { const session = new WorkflowSession(); const layer1AccountAddress = '0xaCD5f5534B756b856ae3B2CAcF54B3321dd6654Fb6'; const layer1Service = this.owner.lookup('service:layer1-network') .strategy as Layer1TestWeb3Strategy; layer1Service.test__simulateAccountsChanged( [layer1AccountAddress], 'metamask' ); layer1Service.test__simulateBalances({ defaultToken: new BN('2141100000000000000'), dai: new BN('0'), card: new BN('0'), }); this.setProperties({ session, }); await render(hbs` `); assert.dom(`[data-test-balance="DAI"]`).hasText('0.00 DAI'); assert .dom(`[data-test-usd-balance="DAI"] [data-test-usd-balance-loading]`) .doesNotExist(); assert.dom(`[data-test-usd-balance="DAI"]`).containsText('$0.00 USD'); assert.dom(`[data-test-balance="CARD"]`).hasText('0.00 CARD'); assert .dom(`[data-test-usd-balance="CARD"] [data-test-usd-balance-loading]`) .doesNotExist(); assert.dom(`[data-test-usd-balance="CARD"]`).containsText('$0.00 USD'); }); test('completed card displays the correct data', async function (assert) { const session = new WorkflowSession(); const layer1AccountAddress = '0xaCD5f5534B756b856ae3B2CAcF54B3321dd6654Fb6'; const layer1Service = this.owner.lookup('service:layer1-network') .strategy as Layer1TestWeb3Strategy; layer1Service.test__simulateAccountsChanged( [layer1AccountAddress], 'metamask' ); layer1Service.test__simulateBalances({ defaultToken: new BN('2141100000000000000'), dai: new BN('250500000000000000000'), card: new BN('10000000000000000000000'), }); session.setValue('depositSourceToken', 'DAI'); this.setProperties({ session, isComplete: true, }); await render(hbs` `); assert.dom('[data-test-deposit-transaction-setup-is-complete]').exists(); assert .dom(`[data-test-deposit-transaction-setup-from-option]`) .doesNotExist(); assert .dom( `[data-test-deposit-transaction-setup-from-address] [data-test-account-name]` ) .hasText(`${c.layer1.fullName} wallet`); assert .dom( `[data-test-deposit-transaction-setup-from-address] [data-test-account-address]` ) .hasText(layer1AccountAddress); assert .dom( '[data-test-deposit-transaction-setup-from-balance="DAI"] [data-test-balance-display-amount]' ) .hasText('250.50 DAI'); assert .dom( '[data-test-deposit-transaction-setup-from-balance="DAI"] [data-test-balance-display-usd-amount]' ) .hasText('$50.10 USD'); assert .dom(`[data-test-deposit-transaction-setup-to-wallet]`) .hasText(`${c.layer2.fullName} wallet`); assert .dom( `[data-test-deposit-transaction-setup-to-address] [data-test-account-address]` ) .hasText('0x1826...6E44'); assert .dom( `[data-test-deposit-transaction-setup-depot-address] [data-test-account-text]` ) .hasText('New Depot'); }); test('interacting with the card', async function (assert) { const session = new WorkflowSession(); const layer1Service = this.owner.lookup('service:layer1-network') .strategy as Layer1TestWeb3Strategy; layer1Service.test__simulateBalances({ defaultToken: new BN('2141100000000000000'), dai: new BN('250500000000000000000'), card: new BN('10000000000000000000000'), }); this.setProperties({ onComplete: () => { this.set('isComplete', true); }, onIncomplete: () => { this.set('isComplete', false); }, isComplete: false, session, }); await render(hbs` `); assert .dom('[data-test-deposit-transaction-setup-is-complete]') .doesNotExist(); assert .dom(`[data-test-deposit-transaction-setup-from-option="DAI"]`) .hasClass('radio-option--checked'); assert .dom(`[data-test-deposit-transaction-setup-from-option="CARD"]`) .doesNotHaveClass('radio-option--checked'); assert .dom('[data-test-deposit-transaction-setup] [data-test-boxel-button]') .hasText('Continue'); assert .dom('[data-test-deposit-transaction-setup] [data-test-boxel-button]') .isNotDisabled(); await click( `[data-test-deposit-transaction-setup] [data-test-boxel-button]` ); assert .dom('[data-test-deposit-transaction-setup-from-balance="DAI"]') .containsText('250.50 DAI'); assert .dom('[data-test-deposit-transaction-setup-from-balance="CARD"]') .doesNotExist(); await click( `[data-test-deposit-transaction-setup] [data-test-boxel-button]` ); assert .dom('[data-test-deposit-transaction-setup-is-complete]') .doesNotExist(); assert .dom(`[data-test-deposit-transaction-setup-from-option]`) .exists({ count: 2 }); await click(`[data-test-deposit-transaction-setup-from-option="CARD"]`); assert .dom(`[data-test-deposit-transaction-setup-from-option="CARD"]`) .hasClass('radio-option--checked'); assert .dom(`[data-test-deposit-transaction-setup-from-option="DAI"]`) .doesNotHaveClass('radio-option--checked'); await click( `[data-test-deposit-transaction-setup] [data-test-boxel-button]` ); assert .dom('[data-test-deposit-transaction-setup-from-balance="CARD"]') .containsText('10,000.00 CARD'); assert .dom('[data-test-deposit-transaction-setup-from-balance="DAI"]') .doesNotExist(); }); test('it displays validation message if user has 0 card and dai balances', async function (assert) { const session = new WorkflowSession(); const layer1Service = this.owner.lookup('service:layer1-network') .strategy as Layer1TestWeb3Strategy; layer1Service.test__simulateBalances({ defaultToken: new BN('2141100000000000000'), dai: new BN('0'), card: new BN('0'), }); this.setProperties({ session, }); await render(hbs` `); assert .dom('[data-test-deposit-transaction-setup-from-option="DAI"] input') .isDisabled(); assert .dom('[data-test-deposit-transaction-setup-from-option="CARD"] input') .isDisabled(); assert .dom('[data-test-deposit-transaction-setup-validation]') .containsText('You need DAI or CARD tokens'); assert .dom('[data-test-deposit-transaction-setup] [data-test-boxel-button]') .isDisabled(); }); test('it displays validation message if funds are undefined and 0', async function (assert) { const session = new WorkflowSession(); const layer1Service = this.owner.lookup('service:layer1-network') .strategy as Layer1TestWeb3Strategy; layer1Service.test__simulateBalances({ defaultToken: undefined, dai: undefined, card: new BN('0'), }); this.setProperties({ session, }); await render(hbs` `); assert .dom('[data-test-deposit-transaction-setup-from-option="DAI"] input') .isDisabled(); assert .dom('[data-test-deposit-transaction-setup-from-option="CARD"] input') .isDisabled(); assert.dom('[data-test-deposit-transaction-setup-validation]').exists(); assert .dom('[data-test-deposit-transaction-setup] [data-test-boxel-button]') .isDisabled(); }); test('it disables radio option with undefined balance', async function (assert) { const session = new WorkflowSession(); const layer1Service = this.owner.lookup('service:layer1-network') .strategy as Layer1TestWeb3Strategy; layer1Service.test__simulateBalances({ defaultToken: new BN('2141100000000000000'), dai: undefined, card: new BN('10000000000000000000000'), }); this.setProperties({ session, }); await render(hbs` `); assert .dom('[data-test-deposit-transaction-setup-from-option="DAI"] input') .isDisabled(); assert .dom('[data-test-deposit-transaction-setup-from-option="DAI"]') .doesNotHaveClass('radio-option--checked'); assert .dom('[data-test-deposit-transaction-setup-from-option="CARD"] input') .isNotDisabled(); assert .dom('[data-test-deposit-transaction-setup-from-option="CARD"]') .hasClass('radio-option--checked'); assert .dom('[data-test-deposit-transaction-setup-validation]') .doesNotExist(); assert .dom('[data-test-deposit-transaction-setup] [data-test-boxel-button]') .isNotDisabled(); }); } );