import { module, test } from 'qunit';
import { setupRenderingTest } from 'ember-qunit';
import { click, render, settled } from '@ember/test-helpers';
import hbs from 'htmlbars-inline-precompile';
import { Safe } from '@cardstack/cardpay-sdk';
import { setupMirage } from 'ember-cli-mirage/test-support';
import { MirageTestContext } from 'ember-cli-mirage/test-support';
import { TinyColor } from '@ctrl/tinycolor';
import {
createDepotSafe,
createMerchantSafe,
createSafeToken,
getFilenameFromDid,
} from '@cardstack/web-client/utils/test-factories';
interface Context extends MirageTestContext {
safes: Safe[];
}
let chosenSafe: Safe | null = null;
const EXAMPLE_DID = 'did:cardstack:1moVYMRNGv6E5Ca3t7aXVD2Yb11e4e91103f084a';
module(
'Integration | Component | card-pay/safe-chooser-dropdown',
function (hooks) {
setupRenderingTest(hooks);
setupMirage(hooks);
hooks.beforeEach(async function (this: Context) {
this.server.create('merchant-info', {
id: await getFilenameFromDid(EXAMPLE_DID),
name: 'Mandello',
slug: 'mandello1',
did: EXAMPLE_DID,
color: '#00ffcc',
'text-color': '#000000',
'owner-address': '0x182619c6Ea074C053eF3f1e1eF81Ec8De6Eb6E44',
});
this.setProperties({
safes: [
createDepotSafe({
address: '0xB236ca8DbAB0644ffCD32518eBF4924ba8666666',
tokens: [
createSafeToken('CARD.CPXD', '500000000000000000000'),
createSafeToken('DAI.CPXD', '250000000000000000000'),
],
}),
createMerchantSafe({
address: '0xmerchantbAB0644ffCD32518eBF4924ba8666666',
merchant: '0xprepaidDbAB0644ffCD32518eBF4924ba8666666',
tokens: [
createSafeToken('DAI.CPXD', '125000000000000000000'),
createSafeToken('CARD.CPXD', '450000000000000000000'),
],
accumulatedSpendValue: 100,
infoDID: EXAMPLE_DID,
}),
],
chooseSafe: (safe: Safe) => (chosenSafe = safe),
});
});
test('it renders choices for each passed-in safe', async function (assert) {
await render(hbs`
`);
await click('.ember-power-select-trigger');
assert.dom('.ember-power-select-options li').exists({ count: 2 });
await settled();
assert
.dom('.ember-power-select-options li:nth-child(1)')
.containsText('DEPOT 0xB236ca8DbAB0644ffCD32518eBF4924ba8666666');
assert
.dom('.ember-power-select-options li:nth-child(2)')
.containsText('Mandello')
.containsText('Business account')
.containsText('0xmerchantbAB0644ffCD32518eBF4924ba8666666');
assert
.dom(
'.ember-power-select-options li:nth-child(2) [data-test-merchant-logo]'
)
.containsText('M')
.hasStyle({
'background-color': new TinyColor('#00ffcc').toRgbString(),
color: new TinyColor('#000000').toRgbString(),
});
});
test('it returns the chosen safe to the handler', async function (this: Context, assert) {
await render(hbs`
`);
await click('.ember-power-select-trigger');
await click('.ember-power-select-options li:nth-child(2)');
assert.equal(chosenSafe, this.safes[1]);
});
test('it renders with @selectedSafe chosen', async function (this: Context, assert) {
this.set('selectedSafe', this.safes[1]);
await render(hbs`
`);
assert
.dom('[data-test-safe-chooser-dropdown]')
.containsText(this.safes[1].address);
await click('.ember-power-select-trigger');
assert
.dom(
'.ember-power-select-options li:nth-child(2) .safe-chooser-dropdown__option--selected'
)
.exists();
this.set('selectedSafe', this.safes[0]);
await settled();
assert
.dom('[data-test-safe-chooser-dropdown]')
.containsText(this.safes[0].address);
});
test('it renders the first safe as chosen by default', async function (this: Context, assert) {
await render(hbs`
`);
assert
.dom('[data-test-safe-chooser-dropdown]')
.containsText(this.safes[0].address);
await click('.ember-power-select-trigger');
assert
.dom(
'.ember-power-select-options li:nth-child(1) .safe-chooser-dropdown__option--selected'
)
.exists();
});
}
);