import { module, test } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { render, click, settled, waitUntil } from '@ember/test-helpers'; import hbs from 'htmlbars-inline-precompile'; import Layer1TestWeb3Strategy from '@cardstack/web-client/utils/web3-strategies/test-layer1'; import BN from 'bn.js'; import { currentNetworkDisplayInfo as c } from '@cardstack/web-client/utils/web3-strategies/network-display-info'; import { WorkflowSession } from '@cardstack/web-client/models/workflow'; const HEADER_SELECTOR = '[data-test-action-card-title="layer-one-connect"]'; const CONNECT_BUTTON_SELECTOR = '[data-test-mainnet-connect-button]'; const DISCONNECT_BUTTON_SELECTOR = '[data-test-mainnet-disconnect-button]'; const WALLET_SELECTION_SELECTOR = '[data-test-wallet-selection]'; module('Integration | Component | layer-one-connect-card', function (hooks) { setupRenderingTest(hooks); test('It should show a selection UI if layer 1 is not connected', async function (assert) { await render(hbs` `); assert .dom(HEADER_SELECTOR) .containsText(`Connect your ${c.layer1.fullName} wallet`); assert.dom(WALLET_SELECTION_SELECTOR).isVisible(); }); test('It should show card summary if card is completed and user disconnects the wallet', async function (assert) { await render(hbs` `); assert.dom('[data-test-layer-1-wallet-summary]').exists(); }); test("It should render the wallet provider's name if it is connected before rendering", async function (assert) { let layer1Service = this.owner.lookup('service:layer1-network') .strategy as Layer1TestWeb3Strategy; layer1Service.test__simulateAccountsChanged(['address'], 'metamask'); await render(hbs` `); assert.dom(HEADER_SELECTOR).containsText('MetaMask'); }); test('It should show all nonzero token balances, and an appropriate message if there are none', async function (assert) { let layer1Service = this.owner.lookup('service:layer1-network') .strategy as Layer1TestWeb3Strategy; layer1Service.test__simulateAccountsChanged(['address'], 'metamask'); layer1Service.test__simulateBalances({ defaultToken: new BN('2141100000000000000'), dai: new BN('500000000000000000'), card: new BN('10000000000000000000000'), }); await render(hbs` `); assert.dom('[data-test-balance="ETH"]').containsText('2.14'); assert.dom('[data-test-balance="DAI"]').containsText('0.50'); assert.dom('[data-test-balance="CARD"]').containsText('10,000.00'); layer1Service.test__simulateBalances({ defaultToken: new BN('0'), dai: new BN('0'), card: new BN('10000000000000000000000'), }); await waitUntil(() => { return document.querySelector('[data-test-balance="ETH"]') === null; }); assert.dom('[data-test-balance="ETH"]').doesNotExist(); assert.dom('[data-test-balance="DAI"]').doesNotExist(); assert.dom('[data-test-balance="CARD"]').containsText('10,000.00'); layer1Service.test__simulateBalances({ defaultToken: new BN('0'), dai: new BN('0'), card: new BN('0'), }); await waitUntil(() => { return document.querySelector('[data-test-balance="CARD"]') === null; }); assert.dom('[data-test-balance="ETH"]').doesNotExist(); assert.dom('[data-test-balance="DAI"]').doesNotExist(); assert.dom('[data-test-balance="CARD"]').doesNotExist(); assert.dom('[data-test-balance-container]').containsText('None'); }); test('It should be able to move between default (unconnected), loading, and connected states', async function (assert) { let layer1Service = this.owner.lookup('service:layer1-network') .strategy as Layer1TestWeb3Strategy; await render(hbs` `); await click('[data-test-wallet-option="metamask"]'); await click(CONNECT_BUTTON_SELECTOR); // the card should not be assuming it is connected to metamask before connection is completed assert .dom('[data-test-boxel-action-chin-action-status-area]') .containsText('Waiting for you to connect'); assert .dom(HEADER_SELECTOR) .containsText(`Connect your ${c.layer1.fullName} wallet`); layer1Service.test__simulateAccountsChanged(['address'], 'metamask'); // waiting for the downstream effects of resolving a promise in test__simulateAccountsChanged await settled(); assert.dom(HEADER_SELECTOR).containsText('MetaMask'); assert.dom(CONNECT_BUTTON_SELECTOR).doesNotExist(); assert.dom(DISCONNECT_BUTTON_SELECTOR).isVisible(); await click(DISCONNECT_BUTTON_SELECTOR); assert .dom(HEADER_SELECTOR) .containsText(`Connect your ${c.layer1.fullName} wallet`); assert.dom(CONNECT_BUTTON_SELECTOR).isVisible(); }); test('It should persist L1 address in workflow session if the wallet is already connected', async function (assert) { let layer1Service = this.owner.lookup('service:layer1-network').strategy; layer1Service.test__simulateAccountsChanged(['address'], 'metamask'); let session = new WorkflowSession(); this.setProperties({ session }); await render(hbs` `); assert.equal(session.getValue('layer1WalletAddress'), 'address'); }); test('It should persist L1 address in workflow session after the wallet is connected', async function (assert) { let layer1Service = this.owner.lookup('service:layer1-network').strategy; let session = new WorkflowSession(); this.setProperties({ session }); await render(hbs` `); await click(CONNECT_BUTTON_SELECTOR); layer1Service.test__simulateAccountsChanged(['address'], 'metamask'); await settled(); assert.equal(session.getValue('layer1WalletAddress'), 'address'); }); });