import React from 'react';
import mockDate from 'mockdate';
import { cleanup, fireEvent, render } from '@testing-library/react';
import { Timelines } from '../Timelines';
import { useFetch } from '../../../helpers/fetch/FetchProvider';
import { TrackingContextProvider } from '../../../helpers/tracking/TrackingContextProvider';
import FakeIntersectionObserver from '../../../test-utils/FakeIntersectionObserver';
import '@testing-library/jest-dom';
import 'regenerator-runtime';
jest.mock('@times-components/image', () => ({
Placeholder: () =>
Placeholder
}));
jest.mock('../../../helpers/fetch/FetchProvider', () => ({
useFetch: jest.fn()
}));
const deckApiPayloadWrapper = () => ({
data: testDataBullet
});
const deckApiPayloadWrapperCircle = () => ({
data: testDataCircle
});
const testDataBullet = {
deck_id: 45060,
deck_name: '[TEST] Timeline with Bullet Points - 25/08/2021 11:04:10',
deck_type: 'Timeline with Bullet Points',
version: 2,
updated_at: {
date: '2021-08-16 12:48:43.000000',
timezone_type: 3,
timezone: 'UTC'
},
fields: {
label: 'Venezuelan Politics',
headline: 'A history of injury troubles'
},
body: {
data: [
{
type: 'event',
data: {
date: '9 June 2018',
eventHeading: 'Event Heading 1',
copy:
'Parturient mi dictumst suspendisse torquent primis potenti donec in parturient aliquam adipiscing bibendum bibendum magna nisi bibendum dignissim in dis a. Scelerisque a ullamcorper id maecenas tempor convallis ac cras. 1'
}
},
{
type: 'event',
data: {
date: '10 June 2018',
eventHeading: 'Event Heading 2',
copy:
'Parturient mi dictumst suspendisse torquent primis potenti donec in parturient aliquam adipiscing bibendum bibendum magna nisi bibendum dignissim in dis a. Scelerisque a ullamcorper id maecenas tempor convallis ac cras. 1'
}
},
{
type: 'event',
data: {
date: '11 June 2018',
eventHeading: 'Event Heading 3',
copy:
'Parturient mi dictumst suspendisse torquent primis potenti donec in parturient aliquam adipiscing bibendum bibendum magna nisi bibendum dignissim in dis a. Scelerisque a ullamcorper id maecenas tempor convallis ac cras. 1'
}
},
{
type: 'event',
data: {
date: '12 June 2018',
eventHeading: 'Event Heading 4',
copy:
'Parturient mi dictumst suspendisse torquent primis potenti donec in parturient aliquam adipiscing bibendum bibendum magna nisi bibendum dignissim in dis a. Scelerisque a ullamcorper id maecenas tempor convallis ac cras. 1'
}
},
{
type: 'event',
data: {
date: '13 June 2018',
eventHeading: 'Event Heading 5',
copy:
'Parturient mi dictumst suspendisse torquent primis potenti donec in parturient aliquam adipiscing bibendum bibendum magna nisi bibendum dignissim in dis a. Scelerisque a ullamcorper id maecenas tempor convallis ac cras. 1'
}
},
{
type: 'event',
data: {
date: '14 June 2018',
eventHeading: 'Event Heading 6',
copy:
'Parturient mi dictumst suspendisse torquent primis potenti donec in parturient aliquam adipiscing bibendum bibendum magna nisi bibendum dignissim in dis a. Scelerisque a ullamcorper id maecenas tempor convallis ac cras. 1'
}
},
{
type: 'event',
data: {
date: '15 June 2018',
eventHeading: 'Event Heading 7',
copy:
'Parturient mi dictumst suspendisse torquent primis potenti donec in parturient aliquam adipiscing bibendum bibendum magna nisi bibendum dignissim in dis a. Scelerisque a ullamcorper id maecenas tempor convallis ac cras. 1'
}
}
]
},
html:
'The Times - In Article Timeline with Bullet Points'
};
const testDataCircle = {
deck_id: 45061,
deck_name: '[TEST] Timeline with Images - 25/08/2021 11:11:38',
deck_type: 'Timeline with Circle Images',
version: 2,
updated_at: {
date: '2021-08-16 12:48:43.000000',
timezone_type: 3,
timezone: 'UTC'
},
fields: {
label: 'Venezuelan Politics',
headline: 'A history of injury troubles'
},
body: {
data: [
{
type: 'event',
data: {
date: '9 June 2018',
eventHeading: 'Event Heading 1',
image:
'https://www.thetimes.co.uk/imageserver/image/%2Fmethode%2Ftimes%2Fprod%2Fweb%2Fbin%2Ffee23bf0-04d7-11ec-89b3-29a9a04e8645.jpg?crop=1500%2C844%2C0%2C78&resize=1200',
copy:
'Parturient mi dictumst suspendisse torquent primis potenti donec in parturient aliquam adipiscing bibendum bibendum magna nisi bibendum dignissim in dis a. Scelerisque a ullamcorper id maecenas tempor convallis ac cras. 1'
}
},
{
type: 'event',
data: {
date: '10 June 2018',
eventHeading: 'Event Heading 2',
image:
'https://www.thetimes.co.uk/imageserver/image/%2Fmethode%2Ftimes%2Fprod%2Fweb%2Fbin%2Ffee23bf0-04d7-11ec-89b3-29a9a04e8645.jpg?crop=1500%2C844%2C0%2C78&resize=1200',
copy:
'Parturient mi dictumst suspendisse torquent primis potenti donec in parturient aliquam adipiscing bibendum bibendum magna nisi bibendum dignissim in dis a. Scelerisque a ullamcorper id maecenas tempor convallis ac cras. 1'
}
},
{
type: 'event',
data: {
date: '11 June 2018',
eventHeading: 'Event Heading 3',
image:
'https://www.thetimes.co.uk/imageserver/image/%2Fmethode%2Ftimes%2Fprod%2Fweb%2Fbin%2Ffee23bf0-04d7-11ec-89b3-29a9a04e8645.jpg?crop=1500%2C844%2C0%2C78&resize=1200',
copy:
'Parturient mi dictumst suspendisse torquent primis potenti donec in parturient aliquam adipiscing bibendum bibendum magna nisi bibendum dignissim in dis a. Scelerisque a ullamcorper id maecenas tempor convallis ac cras. 1'
}
},
{
type: 'event',
data: {
date: '12 June 2018',
eventHeading: 'Event Heading 4',
image:
'https://www.thetimes.co.uk/imageserver/image/%2Fmethode%2Ftimes%2Fprod%2Fweb%2Fbin%2Ffee23bf0-04d7-11ec-89b3-29a9a04e8645.jpg?crop=1500%2C844%2C0%2C78&resize=1200',
copy:
'Parturient mi dictumst suspendisse torquent primis potenti donec in parturient aliquam adipiscing bibendum bibendum magna nisi bibendum dignissim in dis a. Scelerisque a ullamcorper id maecenas tempor convallis ac cras. 1'
}
},
{
type: 'event',
data: {
date: '13 June 2018',
eventHeading: 'Event Heading 5',
image:
'https://www.thetimes.co.uk/imageserver/image/%2Fmethode%2Ftimes%2Fprod%2Fweb%2Fbin%2Ffee23bf0-04d7-11ec-89b3-29a9a04e8645.jpg?crop=1500%2C844%2C0%2C78&resize=1200',
copy:
'Parturient mi dictumst suspendisse torquent primis potenti donec in parturient aliquam adipiscing bibendum bibendum magna nisi bibendum dignissim in dis a. Scelerisque a ullamcorper id maecenas tempor convallis ac cras. 1'
}
},
{
type: 'event',
data: {
date: '14 June 2018',
eventHeading: 'Event Heading 6',
copy:
'Parturient mi dictumst suspendisse torquent primis potenti donec in parturient aliquam adipiscing bibendum bibendum magna nisi bibendum dignissim in dis a. Scelerisque a ullamcorper id maecenas tempor convallis ac cras. 1'
}
},
{
type: 'event',
data: {
date: '15 June 2018',
eventHeading: 'Event Heading 7',
image:
'https://www.thetimes.co.uk/imageserver/image/%2Fmethode%2Ftimes%2Fprod%2Fweb%2Fbin%2Ffee23bf0-04d7-11ec-89b3-29a9a04e8645.jpg?crop=1500%2C844%2C0%2C78&resize=1200',
copy:
'Parturient mi dictumst suspendisse torquent primis potenti donec in parturient aliquam adipiscing bibendum bibendum magna nisi bibendum dignissim in dis a. Scelerisque a ullamcorper id maecenas tempor convallis ac cras. 1'
}
}
]
},
html:
'The Times - In Article Timeline with Circle Images'
};
const renderTimelines = () => render();
describe('Timelines', () => {
beforeEach(() => {
mockDate.set(1620000000000);
});
afterEach(() => {
mockDate.reset();
jest.clearAllMocks();
cleanup();
});
it('should render the initial loading state correctly', async () => {
(useFetch as jest.Mock).mockReturnValue({ loading: true });
const { asFragment, findByText } = render(
);
await findByText('Placeholder');
expect(asFragment()).toMatchSnapshot();
});
it('should render the bullet points component', () => {
(useFetch as jest.Mock).mockReturnValue(deckApiPayloadWrapper());
const { asFragment } = renderTimelines();
expect(asFragment()).toMatchSnapshot();
});
it('should render the circle images component', () => {
(useFetch as jest.Mock).mockReturnValue(deckApiPayloadWrapperCircle());
const { asFragment, getAllByRole } = renderTimelines();
expect(getAllByRole('img')[0]).toHaveAttribute(
'src',
'https://www.thetimes.co.uk/imageserver/image/%2Fmethode%2Ftimes%2Fprod%2Fweb%2Fbin%2Ffee23bf0-04d7-11ec-89b3-29a9a04e8645.jpg?crop=1500%2C844%2C0%2C78&resize=1200'
);
expect(asFragment()).toMatchSnapshot();
});
it('click show all', async () => {
const { asFragment, getByText, findByText } = render(
);
fireEvent.click(getByText('Show all'));
await findByText('Collapse');
expect(asFragment()).toMatchSnapshot();
});
describe('tracking', () => {
(useFetch as jest.Mock).mockReturnValue(deckApiPayloadWrapper());
let oldIntersectionObserver: typeof IntersectionObserver;
const analyticsStream = jest.fn();
beforeEach(() => {
oldIntersectionObserver = window.IntersectionObserver;
// @ts-ignore
window.IntersectionObserver = FakeIntersectionObserver;
});
afterEach(() => {
window.IntersectionObserver = oldIntersectionObserver;
jest.resetAllMocks();
});
it('fires scroll event when viewed', () => {
(useFetch as jest.Mock).mockReturnValue(deckApiPayloadWrapper());
render(
);
FakeIntersectionObserver.intersect();
expect(analyticsStream).toHaveBeenCalledTimes(1);
expect(analyticsStream).toHaveBeenCalledWith({
action: 'Scrolled',
component: 'ArticleSkeleton',
object: 'InArticleTimelines',
attrs: {
articleHeadline: 'articleHeadline',
component_name: 'A history of injury troubles',
component_type: 'in-article component : timelines: static',
eventTime: '2021-05-03T00:00:00.000Z',
event_navigation_action: 'navigation',
event_navigation_browsing_method: 'scroll',
event_navigation_name: 'in-article component displayed : timelines',
section: 'section'
}
});
});
});
});