Newer
Older
const { select, selectAll } = require('d3-selection');
Bucknell, Mary S.
committed
const { provide } = require('../../lib/redux');
const { attachToNode, timeSeriesGraph, timeSeriesLegend } = require('./index');
Bucknell, Mary S.
committed
const { Actions, configureStore } = require('../../store');
Naab, Daniel James
committed
const TEST_STATE = {
series: {
timeSeries: {
'00010:current': {
points: [{
dateTime: new Date('2018-01-02T15:00:00.000-06:00'),
value: 4,
qualifiers: ['P']
}],
method: 'method1',
tsKey: 'current',
variable: '45807190'
},
Naab, Daniel James
committed
'00060:current': {
points: [{
dateTime: new Date('2018-01-02T15:00:00.000-06:00'),
value: 10,
qualifiers: ['P']
}],
method: 'method1',
Naab, Daniel James
committed
tsKey: 'current',
variable: '45807197'
Naab, Daniel James
committed
},
'00060:compare': {
points: [{
dateTime: new Date('2018-01-02T15:00:00.000-06:00'),
value: 10,
qualifiers: ['P']
}],
method: 'method1',
Naab, Daniel James
committed
tsKey: 'compare',
variable: '45807197'
},
'00060:median': {
points: [{
dateTime: new Date('2018-01-02T15:00:00.000-06:00'),
value: 10
}],
metadata: {
beginYear: '2010',
endYear: '2015'
},
method: 'method1',
Naab, Daniel James
committed
tsKey: 'median',
variable: '45807197'
Naab, Daniel James
committed
}
},
timeSeriesCollections: {
'coll1': {
variable: '45807197',
Naab, Daniel James
committed
timeSeries: ['00060:current']
},
'coll2': {
variable: '45807197',
Naab, Daniel James
committed
timeSeries: ['00060:compare']
},
'coll3': {
variable: '45807197',
timeSeries: ['00060:median']
},
'coll4': {
variable: '45807190',
timeSeries: ['00010:current']
Naab, Daniel James
committed
}
},
Bucknell, Mary S.
committed
queryInfo: {
current: {
notes: {
'filter:timeRange': {
mode: 'PERIOD',
periodDays: 7
},
requestDT: new Date('2018-03-30 11:00:00')
}
}
},
Naab, Daniel James
committed
requests: {
current: {
timeSeriesCollections: ['coll1']
},
compare: {
timeSeriesCollections: ['coll2', 'col4']
},
median: {
timeSeriesCollections: ['coll3']
Naab, Daniel James
committed
}
},
variables: {
'45807197': {
variableCode: {
value: '00060'
},
oid: '45807197',
variableDescription: 'Test description for 00060',
Naab, Daniel James
committed
unit: {
unitCode: 'unitCode'
}
},
'45807190': {
variableCode: {
value: '00010'
},
oid: '45807190',
unit: {
unitCode: 'unitCode'
}
Naab, Daniel James
committed
}
},
methods: {
'method1': {
methodDescription: 'method description'
}
Naab, Daniel James
committed
}
},
currentVariableID: '45807197',
showSeries: {
current: true,
Bucknell, Mary S.
committed
compare: true,
median: true
Naab, Daniel James
committed
},
width: 400
};
describe('Hydrograph charting module', () => {
Bucknell, Mary S.
committed
let graphNode;
Bucknell, Mary S.
committed
beforeEach(() => {
let body = select('body');
Bucknell, Mary S.
committed
body.append('div')
Bucknell, Mary S.
committed
.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', () => {
Naab, Daniel James
committed
const store = configureStore(TEST_STATE);
select(graphNode)
.call(provide(store))
Naab, Daniel James
committed
.call(timeSeriesGraph);
expect(svgNodes.length).toBe(3);
Bucknell, Mary S.
committed
expect(graphNode.innerHTML).toContain('hydrograph-container');
describe('container display', () => {
it('should not be hidden tag if there is data', () => {
const store = configureStore(TEST_STATE);
select(graphNode)
.call(provide(store))
.call(timeSeriesGraph);
expect(select('#hydrograph').attr('hidden')).toBeNull();
});
it('should have a style tag if there is no data', () => {
const store = configureStore({series: {timeseries: {}}});
select(graphNode)
.call(provide(store))
.call(timeSeriesGraph);
});
});
describe('SVG has been made accessibile', () => {
let svg;
beforeEach(() => {
Naab, Daniel James
committed
const store = configureStore(TEST_STATE);
select(graphNode)
.call(provide(store))
Naab, Daniel James
committed
.call(timeSeriesGraph);
svg = select('svg');
});
it('title and desc attributes are present', function() {
Bucknell, Mary S.
committed
const descText = svg.select('desc').text();
expect(svg.select('title').text()).toEqual('Test title for 00060');
expect(descText).toContain('Test description for 00060');
expect(descText).toContain('3/23/2018');
expect(descText).toContain('3/30/2018');
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');
it('should have an accessibility table for each time series', function() {
expect(selectAll('table.usa-sr-only').size()).toBe(3);
it('should have a div for each type of time series', function() {
expect(selectAll('div#sr-only-median').size()).toBe(1);
expect(selectAll('div#sr-only-compare').size()).toBe(1);
expect(selectAll('div#sr-only-current').size()).toBe(1);
Bucknell, Mary S.
committed
});
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
...TEST_STATE,
series: {
...TEST_STATE.series,
timeSeries: {
...TEST_STATE.series.timeSeries,
'00060:current': {
...TEST_STATE.series.timeSeries['00060:current'],
startTime: new Date('2018-01-02T15:00:00.000-06:00'),
endTime: new Date('2018-01-02T16:00:00.000-06:00'),
points: [{
dateTime: new Date('2018-01-02T15:00:00.000-06:00'),
Naab, Daniel James
committed
value: 10,
Naab, Daniel James
committed
qualifiers: ['P']
Naab, Daniel James
committed
dateTime: new Date('2018-01-02T16:00:00.000-06:00'),
Naab, Daniel James
committed
qualifiers: ['P', 'FLD']
Bucknell, Mary S.
committed
}]
}
Naab, Daniel James
committed
}
Naab, Daniel James
committed
},
showSeries: {
current: true,
Bucknell, Mary S.
committed
compare: true,
},
title: 'My Title',
Bucknell, Mary S.
committed
showMedianStatsLabel: false,
width: 400,
currentVariableID: '45807197'
});
select(graphNode)
.call(provide(store))
Naab, Daniel James
committed
.call(timeSeriesGraph);
it('should render the correct number svg nodes', () => {
// one main hydrograph and two sparklines
expect(selectAll('svg').size()).toBe(3);
it('should have a title div', () => {
const titleDiv = selectAll('.timeseries-graph-title');
expect(titleDiv.size()).toBe(1);
expect(titleDiv.text()).toEqual('Test title for 00060');
});
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', () => {
Naab, Daniel James
committed
// There should be one segment per time-series. Each is a single
// point, so should be a circle.
expect(selectAll('svg .line-segment').size()).toBe(2);
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('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);
});
it('should have tooltips for the select series table', () => {
// one for each of the two parameters
expect(selectAll('table .tooltip-item').size()).toBe(2);
Bucknell, Mary S.
committed
it('should not have tooltips for the select series table when the screen is large', () => {
store.dispatch(Actions.resizeUI(800, 800));
expect(selectAll('table .tooltip-table').size()).toBe(0);
Bucknell, Mary S.
committed
});
//TODO: Consider adding a test which checks that the y axis is rescaled by
// examining the contents of the text labels.
describe('legends should render', () => {
let store;
beforeEach(() => {
store = configureStore(TEST_STATE);
select(graphNode)
.call(provide(store))
.call(timeSeriesLegend);
});
it('Should have three legend markers', () => {
expect(selectAll('g.legend-marker').size()).toBe(3);
});
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);
it('Should have one legend marker after the compare and median time series are removed', () => {
store.dispatch(Actions.toggleTimeseries('compare', false));
store.dispatch(Actions.toggleTimeseries('median', false));
expect(selectAll('g.legend-marker').size()).toBe(1);
});
Bucknell, Mary S.
committed
});
describe('last year checkbox', () => {
let store;
beforeEach(() => {
store = configureStore(TEST_STATE);
Bucknell, Mary S.
committed
attachToNode(store, graphNode, {siteno: '12345678'});
});
it('Should render the compare toggle checked', () => {
const checkbox = select('#last-year-checkbox');
expect(checkbox.size()).toBe(1);
expect(checkbox.property('checked')).toBe(true);
});
it('Should render the compare toggle unchecked', () => {
store.dispatch(Actions.toggleTimeseries('compare', false));
const checkbox = select('#last-year-checkbox');
expect(checkbox.size()).toBe(1);
expect(checkbox.property('checked')).toBe(false);
});
it('should be enabled if there are last year data', () => {
Bucknell, Mary S.
committed
expect(select('#last-year-checkbox').property('disabled')).toBeFalsy();
});
it('should be disabled if there are no last year data', () => {
store.dispatch(Actions.setCurrentParameterCode('00010', '45807190'));
Bucknell, Mary S.
committed
expect(select('#last-year-checkbox').property('disabled')).toBeTruthy();
});
it('Should render one lines', () => {
expect(selectAll('#ts-compare-group .line-segment').size()).toBe(1);
});
it('Should remove the lines when removing the compare time series', () => {
store.dispatch(Actions.toggleTimeseries('compare', false));
expect(selectAll('#ts-compare-group .line-segment').size()).toBe(0);