shlink-web-client/test/visits/helpers/LineChartCard.test.tsx

100 lines
3.7 KiB
TypeScript
Raw Normal View History

2020-05-30 11:41:46 +03:00
import React from 'react';
import { shallow, ShallowWrapper } from 'enzyme';
2020-05-30 11:41:46 +03:00
import { CardHeader, DropdownItem } from 'reactstrap';
import { Line } from 'react-chartjs-2';
import moment from 'moment';
import { Mock } from 'ts-mockery';
2020-05-30 11:41:46 +03:00
import LineChartCard from '../../../src/visits/helpers/LineChartCard';
2020-07-14 17:05:00 +03:00
import ToggleSwitch from '../../../src/utils/ToggleSwitch';
2020-09-17 19:05:26 +03:00
import { NormalizedVisit } from '../../../src/visits/types';
import { prettify } from '../../../src/utils/helpers/numbers';
2020-05-30 11:41:46 +03:00
2020-05-30 18:39:08 +03:00
describe('<LineChartCard />', () => {
let wrapper: ShallowWrapper;
2020-09-17 19:05:26 +03:00
const createWrapper = (visits: NormalizedVisit[] = [], highlightedVisits: NormalizedVisit[] = []) => {
2020-05-30 11:41:46 +03:00
wrapper = shallow(<LineChartCard title="Cool title" visits={visits} highlightedVisits={highlightedVisits} />);
return wrapper;
};
afterEach(() => wrapper?.unmount());
2020-05-30 11:41:46 +03:00
it('renders provided title', () => {
const wrapper = createWrapper();
const header = wrapper.find(CardHeader);
expect(header.html()).toContain('Cool title');
});
it.each([
[[], 'monthly' ],
[[{ date: moment().subtract(1, 'day').format() }], 'hourly' ],
[[{ date: moment().subtract(3, 'day').format() }], 'daily' ],
[[{ date: moment().subtract(2, 'month').format() }], 'weekly' ],
[[{ date: moment().subtract(6, 'month').format() }], 'weekly' ],
[[{ date: moment().subtract(7, 'month').format() }], 'monthly' ],
[[{ date: moment().subtract(1, 'year').format() }], 'monthly' ],
])('renders group menu and selects proper grouping item based on visits dates', (visits, expectedActiveItem) => {
2020-09-17 19:05:26 +03:00
const wrapper = createWrapper(visits.map((visit) => Mock.of<NormalizedVisit>(visit)));
2020-05-30 11:41:46 +03:00
const items = wrapper.find(DropdownItem);
expect(items).toHaveLength(4);
expect(items.at(0).prop('children')).toEqual('Month');
expect(items.at(0).prop('active')).toEqual(expectedActiveItem === 'monthly');
2020-05-30 11:41:46 +03:00
expect(items.at(1).prop('children')).toEqual('Week');
expect(items.at(1).prop('active')).toEqual(expectedActiveItem === 'weekly');
2020-05-30 11:41:46 +03:00
expect(items.at(2).prop('children')).toEqual('Day');
expect(items.at(2).prop('active')).toEqual(expectedActiveItem === 'daily');
2020-05-30 11:41:46 +03:00
expect(items.at(3).prop('children')).toEqual('Hour');
expect(items.at(3).prop('active')).toEqual(expectedActiveItem === 'hourly');
2020-05-30 11:41:46 +03:00
});
it('renders chart with expected options', () => {
const wrapper = createWrapper();
const chart = wrapper.find(Line);
expect(chart.prop('options')).toEqual({
maintainAspectRatio: false,
legend: { display: false },
scales: {
yAxes: [
{
2020-09-17 19:05:26 +03:00
ticks: { beginAtZero: true, precision: 0, callback: prettify },
2020-05-30 11:41:46 +03:00
},
],
2020-05-30 18:39:08 +03:00
xAxes: [
{
scaleLabel: { display: true, labelString: 'Month' },
},
],
},
2020-09-17 19:05:26 +03:00
tooltips: expect.objectContaining({
2020-05-30 18:39:08 +03:00
intersect: false,
axis: 'x',
2020-09-17 19:05:26 +03:00
}),
2020-05-30 11:41:46 +03:00
});
});
it.each([
2020-09-17 19:05:26 +03:00
[[ Mock.of<NormalizedVisit>({}) ], [], 1 ],
[[ Mock.of<NormalizedVisit>({}) ], [ Mock.of<NormalizedVisit>({}) ], 2 ],
2020-05-30 11:41:46 +03:00
])('renders chart with expected data', (visits, highlightedVisits, expectedLines) => {
const wrapper = createWrapper(visits, highlightedVisits);
const chart = wrapper.find(Line);
const { datasets } = chart.prop('data') as any;
2020-05-30 11:41:46 +03:00
expect(datasets).toHaveLength(expectedLines);
});
2020-05-30 18:39:08 +03:00
it('includes stats for visits with no dates if selected', () => {
const wrapper = createWrapper([
2020-09-17 19:05:26 +03:00
Mock.of<NormalizedVisit>({ date: '2016-04-01' }),
Mock.of<NormalizedVisit>({ date: '2016-01-01' }),
2020-05-30 18:39:08 +03:00
]);
expect((wrapper.find(Line).prop('data') as any).labels).toHaveLength(2);
2020-07-14 17:05:00 +03:00
wrapper.find(ToggleSwitch).simulate('change');
expect((wrapper.find(Line).prop('data') as any).labels).toHaveLength(4);
2020-05-30 18:39:08 +03:00
});
2020-05-30 11:41:46 +03:00
});