1
0
mirror of https://github.com/twirl/The-API-Book.git synced 2025-05-13 21:26:26 +02:00

189 lines
5.7 KiB
TypeScript
Raw Normal View History

2023-07-30 15:25:21 +03:00
/**
* @jest-environment jsdom
*/
import { OfferListComponent } from '../src/OfferListComponent';
import { $ } from '../src/util/html';
import {
CAFEE_CHAMOMILE_LUNGO_OFFER_PREVIEW,
DUMMY_PREVIEWS
} from './fixtures/dummyCoffeeApi';
import { mockComposer } from './fixtures/mocks';
import { waitForEvents } from './util';
const FAKE_OFFER_ID = 'fakeOfferId';
class TestOfferListComponent extends OfferListComponent {
public isShown() {
return this.shown;
}
public generateOfferHtml(offer: any) {
return super.generateOfferHtml(offer);
}
}
describe('OfferListComponent', () => {
beforeEach(() => {
jest.resetAllMocks();
document.body.innerHTML = '';
});
test('OfferListComponent instantiates hidden if the list of offers is null', () => {
const offerList = new TestOfferListComponent(
mockComposer,
document.body,
null,
{}
);
expect(offerList.isShown()).toEqual(false);
offerList.destroy();
});
test('OfferListComponent instantiates shown if the list of offers is not null', () => {
const offerList = new TestOfferListComponent(
mockComposer,
document.body,
DUMMY_PREVIEWS,
{}
);
expect(offerList.isShown()).toEqual(true);
offerList.destroy();
});
test('OfferListComponent emits a "selectOffer" event on click', async () => {
const offerList = new TestOfferListComponent(
mockComposer,
document.body,
[CAFEE_CHAMOMILE_LUNGO_OFFER_PREVIEW],
{}
);
const item = $<HTMLElement>(document.body, 'h3');
const events = await waitForEvents(
offerList.events,
'offerSelect',
() => {
item.click();
}
);
expect(events).toEqual([
{
offerId: CAFEE_CHAMOMILE_LUNGO_OFFER_PREVIEW.offerId
}
]);
offerList.destroy();
});
test('OfferListComponent.selectOffer emits a "selectOffer" event', async () => {
const offerList = new TestOfferListComponent(
mockComposer,
document.body,
DUMMY_PREVIEWS,
{}
);
const events = await waitForEvents(
offerList.events,
'offerSelect',
() => {
offerList.selectOffer(
CAFEE_CHAMOMILE_LUNGO_OFFER_PREVIEW.offerId
);
}
);
expect(events).toEqual([
{
offerId: CAFEE_CHAMOMILE_LUNGO_OFFER_PREVIEW.offerId
}
]);
offerList.destroy();
});
test('OfferListComponent.selectOffer translates any offer, even an unknown one', async () => {
const offerList = new TestOfferListComponent(
mockComposer,
document.body,
DUMMY_PREVIEWS,
{}
);
const events = await waitForEvents(
offerList.events,
'offerSelect',
() => {
offerList.selectOffer(FAKE_OFFER_ID);
}
);
expect(events).toEqual([
{
offerId: FAKE_OFFER_ID
}
]);
offerList.destroy();
});
test('OfferListComponents hides when receive a null "offerListChange" event', () => {
const offerList = new TestOfferListComponent(
mockComposer,
document.body,
DUMMY_PREVIEWS,
{}
);
const generateItemMock = jest.spyOn(offerList, 'generateOfferHtml');
mockComposer.events.emit('offerPreviewListChange', {
offerList: null
});
expect(offerList.isShown()).toEqual(false);
expect(generateItemMock).toBeCalledTimes(0);
offerList.destroy();
});
test('OfferListComponents re-renders when receive a "offerListChange" event while being shown', () => {
const offerList = new TestOfferListComponent(
mockComposer,
document.body,
DUMMY_PREVIEWS,
{}
);
const generateItemMock = jest.spyOn(offerList, 'generateOfferHtml');
mockComposer.events.emit('offerPreviewListChange', {
offerList: [CAFEE_CHAMOMILE_LUNGO_OFFER_PREVIEW]
});
expect(offerList.isShown()).toEqual(true);
expect(generateItemMock).toBeCalledTimes(1);
offerList.destroy();
});
test('OfferListComponents shows when receive a "offerListChange" event while being hidden', () => {
const offerList = new TestOfferListComponent(
mockComposer,
document.body,
null,
{}
);
const generateItemMock = jest.spyOn(offerList, 'generateOfferHtml');
mockComposer.events.emit('offerPreviewListChange', {
offerList: [CAFEE_CHAMOMILE_LUNGO_OFFER_PREVIEW]
});
expect(offerList.isShown()).toEqual(true);
expect(generateItemMock).toBeCalledTimes(1);
offerList.destroy();
});
test('OfferListComponent destroys and no longer reacts on events', async () => {
const offerList = new TestOfferListComponent(
mockComposer,
document.body,
[CAFEE_CHAMOMILE_LUNGO_OFFER_PREVIEW],
{}
);
const events = [];
const item = $<HTMLElement>(document.body, 'h3');
offerList.events.on('offerSelect', (e) => {
events.push(e);
});
offerList.destroy();
item.click();
expect(document.body.innerHTML).toEqual('');
expect(events).toEqual([]);
offerList.destroy();
});
});