import { module, test } from 'qunit';
import { setupRenderingTest } from 'ember-qunit';
import { render, waitFor, waitUntil } from '@ember/test-helpers';
import hbs from 'htmlbars-inline-precompile';
import Layer2TestWeb3Strategy from '@cardstack/web-client/utils/web3-strategies/test-layer2';
import { WorkflowSession } from '@cardstack/web-client/models/workflow';
import {
createDepotSafe,
createSafeToken,
generateMockAddress,
} from '@cardstack/web-client/utils/test-factories';
let layer2Service: Layer2TestWeb3Strategy;
let session: WorkflowSession;
module('Integration | Component | layer-two-connect-card', function (hooks) {
setupRenderingTest(hooks);
hooks.beforeEach(function () {
session = new WorkflowSession();
this.setProperties({
session,
});
});
test('It should show nonzero token balances, and an appropriate message if there are none', async function (assert) {
let depotAddress = generateMockAddress();
layer2Service = this.owner.lookup('service:layer2-network').strategy;
layer2Service.test__simulateRemoteAccountSafes('address', [
createDepotSafe({
address: depotAddress,
tokens: [
createSafeToken('DAI.CPXD', '2141100000000000000'),
createSafeToken('CARD.CPXD', '0'),
],
}),
]);
await layer2Service.test__simulateAccountsChanged(['address']);
await render(hbs`
`);
assert.dom('[data-test-balance="DAI.CPXD"]').containsText('2.14');
assert.dom('[data-test-balance="CARD.CPXD"]').doesNotExist();
layer2Service.test__simulateRemoteAccountSafes('address', [
createDepotSafe({
address: depotAddress,
tokens: [
createSafeToken('DAI.CPXD', '2141100000000000000'),
createSafeToken('CARD.CPXD', '2990000000000000000'),
],
}),
]);
await layer2Service.safes.fetch();
await waitFor('[data-test-balance="CARD.CPXD"]');
assert.dom('[data-test-balance="DAI.CPXD"]').containsText('2.14');
assert.dom('[data-test-balance="CARD.CPXD"]').containsText('2.99');
layer2Service.test__simulateRemoteAccountSafes('address', [
createDepotSafe({
address: depotAddress,
tokens: [
createSafeToken('DAI.CPXD', '0'),
createSafeToken('CARD.CPXD', '0'),
],
}),
]);
await layer2Service.safes.fetch();
await waitUntil(() => {
return (
document.querySelector('[data-test-balance="DAI.CPXD"]') === null &&
document.querySelector('[data-test-balance-container-loading]') === null
);
});
assert.dom('[data-test-balance="DAI.CPXD"]').doesNotExist();
assert.dom('[data-test-balance-container]').containsText('None');
});
test('the layer 2 wallet address is persisted if the wallet is already connected', async function (assert) {
layer2Service = this.owner.lookup('service:layer2-network').strategy;
layer2Service.test__simulateRemoteAccountSafes('address', [
createDepotSafe({
tokens: [
createSafeToken('DAI.CPXD', '2141100000000000000'),
createSafeToken('CARD.CPXD', '2990000000000000000'),
],
}),
]);
await layer2Service.test__simulateAccountsChanged(['address']);
await render(hbs`
`);
assert.equal(session.getValue('layer2WalletAddress'), 'address');
});
test('It should show a loading state if still fetching a depot', async function (assert) {
layer2Service = this.owner.lookup('service:layer2-network').strategy;
layer2Service.test__autoResolveViewSafes = false;
layer2Service.test__simulateAccountsChanged(['address']);
await render(hbs`
`);
assert.dom('[data-test-balance-container-loading]').isVisible();
});
test('the layer 2 wallet address is persisted after the wallet is connected', async function (assert) {
layer2Service = this.owner.lookup('service:layer2-network').strategy;
layer2Service.test__autoResolveViewSafes = false;
layer2Service.test__simulateAccountsChanged(['address-connected']);
await render(hbs`
`);
assert.equal(
session.getValue('layer2WalletAddress'),
'address-connected'
);
});
test('It shows the connect prompt by default', async function (assert) {
await render(hbs`
`);
assert
.dom('[data-test-layer-2-connect-prompt]')
.containsText('Install the Card Wallet app on your mobile phone');
});
test('It does not show the connect prompt when workflow is completed and wallet is disconnected', async function (assert) {
await render(hbs`
`);
assert.dom('[data-test-layer-2-connect-prompt]').doesNotExist();
assert.dom('[data-test-layer-2-wallet-disconnect-button]').doesNotExist();
assert.dom('[data-test-layer-2-wallet-summary]').exists();
assert
.dom('[data-test-layer-2-wallet-connected-status]')
.includesText('Disconnected');
});
});