import { module, test } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { click, render } 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 BN from 'bn.js'; import { Safe } from '@cardstack/cardpay-sdk'; import { WorkflowSession } from '@cardstack/web-client/models/workflow'; import { createDepotSafe, createMerchantSafe, createPrepaidCardSafe, createSafeToken, } from '@cardstack/web-client/utils/test-factories'; module( 'Integration | Component | card-pay/withdrawal-workflow/choose-balance', function (hooks) { setupRenderingTest(hooks); let session: WorkflowSession; let layer1AccountAddress = '0xaCD5f5534B756b856ae3B2CAcF54B3321dd6654Fb6'; let layer2AccountAddress = '0x182619c6Ea074C053eF3f1e1eF81Ec8De6Eb6E44'; let depotAddress = '0xB236ca8DbAB0644ffCD32518eBF4924ba8666666'; let merchantAddress = '0xmerchantbAB0644ffCD32518eBF4924ba8666666'; hooks.beforeEach(async function () { session = new WorkflowSession(); this.set('session', session); let layer1Service = this.owner.lookup('service:layer1-network') .strategy as Layer1TestWeb3Strategy; layer1Service.test__simulateAccountsChanged( [layer1AccountAddress], 'metamask' ); layer1Service.test__simulateBalances({ dai: new BN('150500000000000000000'), card: new BN('350000000000000000000'), }); let layer2Service = this.owner.lookup('service:layer2-network') .strategy as Layer2TestWeb3Strategy; layer2Service.test__simulateRemoteAccountSafes(layer2AccountAddress, [ createDepotSafe({ address: depotAddress, tokens: [ createSafeToken('DAI.CPXD', '250000000000000000000'), createSafeToken('CARD.CPXD', '500000000000000000000'), ], }), createMerchantSafe({ address: merchantAddress, merchant: '0xprepaidDbAB0644ffCD32518eBF4924ba8666666', tokens: [ createSafeToken('DAI.CPXD', '125000000000000000000'), createSafeToken('CARD.CPXD', '450000000000000000000'), ], accumulatedSpendValue: 100, }), createPrepaidCardSafe({ address: '0xprepaidDbAB0644ffCD32518eBF4924ba8666666', owners: [layer2AccountAddress], spendFaceValue: 2324, prepaidCardOwner: layer2AccountAddress, issuer: layer2AccountAddress, transferrable: false, }), ]); // Ensure safes have been loaded, as in a workflow context await layer2Service.test__simulateAccountsChanged([layer2AccountAddress]); }); test('It should allow a layer 2 safe and balance to be chosen', async function (assert) { await render(hbs` `); assert .dom('.action-card__title') .containsText('Choose a source and balance to withdraw from'); assert .dom('[data-test-choose-balance-from-wallet]') .containsText('L2 test chain'); assert .dom('[data-test-choose-balance-from-address]') .containsText('0x1826...6E44'); assert .dom('[data-test-choose-balance-from-safe]') .containsText(depotAddress, 'defaults to depot safe source'); assert .dom( '[data-test-balance-chooser-dropdown] [data-test-balance-display-name]' ) .containsText('DAI.CPXD'); await click( '[data-test-balance-chooser-dropdown] .ember-power-select-trigger' ); assert.dom('.ember-power-select-options li').exists({ count: 2 }); assert .dom('.ember-power-select-options li:nth-child(1)') .containsText('250.00 DAI.CPXD'); assert .dom('.ember-power-select-options li:nth-child(2)') .containsText('500.00 CARD.CPXD'); await click('.ember-power-select-options li:nth-child(2)'); assert .dom( '[data-test-balance-chooser-dropdown] [data-test-balance-display-name]' ) .containsText('CARD.CPXD'); await click( '[data-test-safe-chooser-dropdown] .ember-power-select-trigger' ); assert.dom('.ember-power-select-options li').exists({ count: 2 }); assert .dom('.ember-power-select-options li:nth-child(1)') .containsText('DEPOT 0xB236ca8DbAB0644ffCD32518eBF4924ba8666666'); assert .dom('.ember-power-select-options li:nth-child(2)') .containsText(merchantAddress); await click('.ember-power-select-options li:nth-child(2)'); assert .dom('[data-test-balance-chooser-dropdown]') .containsText( '450.00 CARD.CPXD', 'changing the safe updates the balance for the chosen token' ); await click( '[data-test-balance-chooser-dropdown] .ember-power-select-trigger' ); assert.dom('.ember-power-select-options li').exists({ count: 2 }); assert .dom('.ember-power-select-options li:nth-child(1)') .containsText('125.00 DAI.CPXD'); assert .dom('.ember-power-select-options li:nth-child(2)') .containsText('450.00 CARD.CPXD'); await click('.ember-power-select-options li:nth-child(2)'); assert .dom('[data-test-choose-balance-receive] [data-test-account-name]') .containsText('L1 test chain'); assert .dom('[data-test-choose-balance-receive] [data-test-account-address]') .containsText(layer1AccountAddress); assert.dom('[data-test-choose-balance-from-display]').doesNotExist(); await click('[data-test-boxel-action-chin] [data-test-boxel-button]'); assert.equal( session.getValue('withdrawalToken'), 'CARD.CPXD', 'workflow session withdrawal token updated' ); assert.equal( session.getValue('withdrawalSafe'), merchantAddress, 'workflow session withdrawal safe updated' ); }); test('it uses the withdrawal safe from the workflow when it exists', async function (assert) { session.setValue('withdrawalSafe', merchantAddress); await render(hbs` `); assert .dom('[data-test-choose-balance-from-safe]') .containsText(merchantAddress); }); } );