Newer
Older
const { select, selectAll } = require('d3-selection');
const { provide } = require('../../lib/redux');
const { attachToNode, timeSeriesGraph } = require('./index');
const { Actions, configureStore } = require('./store');
describe('Hydrograph charting module', () => {
Bucknell, Mary S.
committed
let graphNode;
Bucknell, Mary S.
committed
beforeEach(() => {
select('body')
.append('div')
.attr('id', 'hydrograph');
Bucknell, Mary S.
committed
graphNode = document.getElementById('hydrograph');
Bucknell, Mary S.
committed
});
afterEach(() => {
select('#hydrograph').remove();
});
it('empty graph displays warning', () => {
attachToNode(graphNode, {});
Bucknell, Mary S.
committed
expect(graphNode.innerHTML).toContain('No data is available');
});
it('single data point renders', () => {
const store = configureStore({
tsData: {
Naab, Daniel James
committed
current: {
'00060': {
values: [{
time: new Date(),
value: 10,
label: 'Label',
qualifiers: ['P'],
approved: false,
estimated: false
Bucknell, Mary S.
committed
}]
Naab, Daniel James
committed
}
},
compare: {
'00060': {
values: []
}
},
medianStatistics: {
'00060': {
values: []
}
}
Naab, Daniel James
committed
},
showSeries: {
current: true,
Naab, Daniel James
committed
compare: false,
medianStatistics: true
},
title: '',
Bucknell, Mary S.
committed
});
select(graphNode)
.call(provide(store))
Naab, Daniel James
committed
.call(timeSeriesGraph);
expect(svgNodes[0].getAttribute('viewBox')).toContain('400 200');
Bucknell, Mary S.
committed
expect(graphNode.innerHTML).toContain('hydrograph-container');
describe('SVG has been made accessibile', () => {
let svg;
beforeEach(() => {
const store = configureStore({
tsData: {
Naab, Daniel James
committed
current: {
'00060': {
values: [{
time: new Date(),
value: 10,
label: 'Label',
qualifiers: ['P'],
approved: false,
estimated: false
Bucknell, Mary S.
committed
}]
}
Naab, Daniel James
committed
},
compare: {
'00060': {
values: []
}
},
medianStatistics: {
'00060': {
values: []
}
Bucknell, Mary S.
committed
}
Naab, Daniel James
committed
},
showSeries: {
current: true,
Naab, Daniel James
committed
compare: false,
Bucknell, Mary S.
committed
medianStatistics: true
title: 'My Title',
desc: 'My Description',
select(graphNode)
.call(provide(store))
Naab, Daniel James
committed
.call(timeSeriesGraph);
svg = select('svg');
});
it('title and desc attributes are present', function() {
expect(svg.attr('title'), 'My Title');
expect(svg.attr('desc'), 'My Description');
Bucknell, Mary S.
committed
expect(svg.attr('aria-labelledby')).toContain('title');
expect(svg.attr('aria-describedby')).toContain('desc');
});
it('svg should be focusable', function() {
expect(svg.attr('tabindex')).toBe('0');
});
});
Bucknell, Mary S.
committed
describe('SVG contains the expected elements', () => {
Bucknell, Mary S.
committed
/* eslint no-use-before-define: 0 */
Bucknell, Mary S.
committed
let store;
beforeEach(() => {
Bucknell, Mary S.
committed
store = configureStore({
Naab, Daniel James
committed
current: {
'00060': {
values: [{
time: new Date(),
value: 10,
label: 'Label',
qualifiers: ['P'],
approved: false,
estimated: false
}, {
time: new Date(),
value: null,
label: 'Masked Data',
qualifiers: ['P', 'FLD'],
approved: false,
estimated: false
Bucknell, Mary S.
committed
}]
}
Naab, Daniel James
committed
},
compare: {
'00060': {
values: []
}
},
medianStatistics: {
'00060': {
values: MOCK_MEDIAN_STAT_DATA
}
}
Naab, Daniel James
committed
},
showSeries: {
current: true,
compare: false,
medianStatistics: true
},
title: 'My Title',
Bucknell, Mary S.
committed
showMedianStatsLabel: false,
width: 400,
currentParameterCode: '00060'
});
select(graphNode)
.call(provide(store))
Naab, Daniel James
committed
.call(timeSeriesGraph);
});
it('should render an svg node', () => {
it('should have a defs node', () => {
expect(selectAll('defs').size()).toBe(1);
expect(selectAll('defs mask').size()).toBe(1);
expect(selectAll('defs pattern').size()).toBe(2);
});
it('should render timeseries data as a line', () => {
// There is not a good way to validate that <path d="..."/>
// has the correct data, but we can validate that tooltips display
// at the correct location.
// First, confirm the chart line exists.
expect(selectAll('svg path.line').size()).toBe(1);
});
it('should render a rectangle for masked data', () => {
expect(selectAll('g.current-mask-group').size()).toBe(1);
});
Naab, Daniel James
committed
it('should have a point for the median stat data with a label', () => {
Bucknell, Mary S.
committed
expect(selectAll('svg #median-points circle.median-data-series').size()).toBe(1);
expect(selectAll('svg #median-points text').size()).toBe(0);
it('should have a legend with three markers', () => {
expect(selectAll('g.legend-marker').size()).toBe(3);
Bucknell, Mary S.
committed
it('show the labels for the median stat data showMedianStatsLabel is true', () => {
Bucknell, Mary S.
committed
store.dispatch(Actions.showMedianStatsLabel(true));
Bucknell, Mary S.
committed
expect(selectAll('svg #median-points text').size()).toBe(1);
Bucknell, Mary S.
committed
});
describe('Adding and removing compare time series', () => {
Bucknell, Mary S.
committed
beforeEach(() => {
store = configureStore({
tsData: {
Naab, Daniel James
committed
current: {
'00060': {
values: [{
time: new Date(),
value: 10,
label: 'Label',
qualifiers: ['P'],
approved: false,
estimated: false
Bucknell, Mary S.
committed
}]
Naab, Daniel James
committed
}
},
compare: {
'00060': {
values: [{
time: new Date(),
value: 10,
label: 'Label',
qualifiers: ['P'],
approved: false,
estimated: false
Bucknell, Mary S.
committed
}]
Naab, Daniel James
committed
}
},
medianStatistics: {
'00060': {
values: []
}
}
Naab, Daniel James
committed
},
showSeries: {
current: true,
Naab, Daniel James
committed
compare: true,
medianStatistics: true
},
title: 'My Title',
desc: 'My Description',
currentParameterCode: '00060'
});
select(graphNode)
.call(provide(store))
Naab, Daniel James
committed
.call(timeSeriesGraph);
Bucknell, Mary S.
committed
});
it('Should render two lines', () => {
expect(selectAll('svg path.line').size()).toBe(2);
});
it('Should have three legend markers', () => {
expect(selectAll('g.legend-marker').size()).toBe(3);
it('Should remove one of the lines when removing the compare time series', () => {
store.dispatch(Actions.toggleTimeseries('compare', false));
Bucknell, Mary S.
committed
expect(selectAll('svg path.line').size()).toBe(1);
});
it('Should have two legend markers after the compare time series is removed', () => {
store.dispatch(Actions.toggleTimeseries('compare', false));
expect(selectAll('g.legend-marker').size()).toBe(2);
//TODO: Consider adding a test which checks that the y axis is rescaled by
// examining the contents of the text labels.
Bucknell, Mary S.
committed
});
});
Bucknell, Mary S.
committed
'label': '18 ft3/s',
'time': '2017-01-03T00:00:00.000Z',
'value': 18