import { module, test } from 'qunit';
import { setupRenderingTest } from 'ember-qunit';
import { find, render, waitFor, waitUntil } from '@ember/test-helpers';
import hbs from 'htmlbars-inline-precompile';
import { setupMirage } from 'ember-cli-mirage/test-support';
import { MirageTestContext } from 'ember-cli-mirage/test-support';
import { Response as MirageResponse } from 'ember-cli-mirage';
import { createPrepaidCardSafe } from '@cardstack/web-client/utils/test-factories';
interface Context extends MirageTestContext {}
module(
'Integration | Component | card-pay/prepaid-card-safe',
function (hooks) {
setupRenderingTest(hooks);
setupMirage(hooks);
const PREPAID_CARD_SAFE = createPrepaidCardSafe({
address: '0xF848D5873Df8FFaedae778f9F090140B667A2aD7',
createdAt: 1627981520,
owners: [
'0xc9Cdb5EeD1c27fCc64DA096CA3b0bcc02c1d45C2',
'0xEba6d63dDf30174B87272D5cF566D63547e60119',
],
customizationDID:
'did:cardstack:1ph2NRppy5eeszY4j8H9Tud520052ce6211bd3a9',
spendFaceValue: 500,
prepaidCardOwner: '0xc9Cdb5EeD1c27fCc64DA096CA3b0bcc02c1d45C2',
issuer: '0xc9Cdb5EeD1c27fCc64DA096CA3b0bcc02c1d45C2',
});
const JSON_API = {
data: {
id: '81d2d5f4-ec30-4ccc-9a6e-dc728c0d0784',
type: 'prepaid-card-customizations',
attributes: {
did: 'did:cardstack:1ph2NRppy5eeszY4j8H9Tud520052ce6211bd3a9',
'issuer-name': 'Luke and Michael',
'owner-address': '0xc9Cdb5EeD1c27fCc64DA096CA3b0bcc02c1d45C2',
},
relationships: {
pattern: {
data: {
id: '7b93fae4-843d-409a-87e0-b065b63c1156',
type: 'prepaid-card-patterns',
},
},
'color-scheme': {
data: {
id: '5c2276be-fddd-49dd-9693-d7b3b3e91a1f',
type: 'prepaid-card-color-schemes',
},
},
},
},
included: [
{
id: '5c2276be-fddd-49dd-9693-d7b3b3e91a1f',
type: 'prepaid-card-color-schemes',
attributes: {
background: 'linear-gradient(139.27deg, #c3fc33 16%, #0069f9 100%)',
'pattern-color': 'white',
'text-color': 'black',
description: 'Green to Blue Gradient',
},
},
{
id: '7b93fae4-843d-409a-87e0-b065b63c1156',
type: 'prepaid-card-patterns',
attributes: {
'pattern-url': '/images/backgrounds/mock-theme-1.svg',
description: 'Overlapping Dots',
},
},
],
};
test('it displays the correct data', async function (this: Context, assert) {
this.server.get(
'https://storage.cardstack.com/prepaid-card-customization/h2NRppy5eeszY4j8H9Tud5.json',
() => {
return JSON_API;
}
);
this.set('prepaidCardSafe', PREPAID_CARD_SAFE);
await render(hbs`
`);
await waitUntil(() => {
let issuerNameEl = find('[data-test-prepaid-card-issuer-name]');
return (
issuerNameEl && issuerNameEl.textContent!.includes('Luke and Michael')
);
});
assert.dom('.prepaid-card__address').containsText('0xF848...2aD7');
assert.dom('[data-test-prepaid-card-balance]').containsText('§500');
assert
.dom('[data-test-prepaid-card-usd-balance]')
.containsText('$5.00 USD');
assert
.dom(
'[data-test-prepaid-card-pattern="/images/backgrounds/mock-theme-1.svg"]'
)
.exists();
assert
.dom(
'[data-test-prepaid-card-background="linear-gradient(139.27deg, #c3fc33 16%, #0069f9 100%)"]'
)
.exists();
});
test('it retries the card customization service if it fails when @waitForCustomization is true', async function (this: Context, assert) {
let attemptNum = 0;
this.server.get(
'https://storage.cardstack.com/prepaid-card-customization/h2NRppy5eeszY4j8H9Tud5.json',
() => {
attemptNum++;
if (attemptNum < 3) {
return new MirageResponse(404, {}, 'Not found');
}
return JSON_API;
}
);
this.set('prepaidCardSafe', PREPAID_CARD_SAFE);
await render(hbs`
`);
await waitUntil(() => {
let issuerNameEl = find('[data-test-prepaid-card-issuer-name]');
return (
issuerNameEl && issuerNameEl.textContent!.includes('Luke and Michael')
);
});
assert
.dom('[data-test-prepaid-card-issuer-name]')
.containsText('Luke and Michael');
assert.dom('.prepaid-card__address').containsText('0xF848...2aD7');
assert.dom('[data-test-prepaid-card-balance]').containsText('§500');
assert
.dom('[data-test-prepaid-card-usd-balance]')
.containsText('$5.00 USD');
assert
.dom(
'[data-test-prepaid-card-pattern="/images/backgrounds/mock-theme-1.svg"]'
)
.exists();
assert
.dom(
'[data-test-prepaid-card-background="linear-gradient(139.27deg, #c3fc33 16%, #0069f9 100%)"]'
)
.exists();
});
test('it displays a warning icon when encountering a 403 from storage', async function (this: Context, assert) {
this.server.get(
'https://storage.cardstack.com/prepaid-card-customization/h2NRppy5eeszY4j8H9Tud5.json',
() => {
return new MirageResponse(403, {}, 'Access denied');
}
);
this.set('prepaidCardSafe', PREPAID_CARD_SAFE);
await render(hbs`
`);
await waitFor('[data-test-prepaid-card-load-warning]');
assert.dom('[data-test-prepaid-card-load-warning]').exists();
});
}
);