Newer
Older
import {select, selectAll} from 'd3-selection';
Bucknell, Mary S.
committed
import sinon from 'sinon';
import * as utils from 'ui/utils';
import config from 'ui/config';
Bucknell, Mary S.
committed
Bucknell, Mary S.
committed
import {configureStore} from 'ml/store';
import {Actions as floodDataActions} from 'ml/store/flood-inundation';
Bucknell, Mary S.
committed
import * as hydrographData from 'ml/store/hydrograph-data';
import * as hydrographParameters from 'ml/store/hydrograph-parameters';
Bucknell, Mary S.
committed
import {attachToNode} from './index';
Bucknell, Mary S.
committed
import {
TEST_CURRENT_TIME_RANGE,
TEST_GW_LEVELS,
TEST_HYDROGRAPH_PARAMETERS, TEST_MEDIAN_DATA,
Bucknell, Mary S.
committed
TEST_PRIMARY_IV_DATA
} from './mock-hydrograph-state';
Naab, Daniel James
committed
Bucknell, Mary S.
committed
describe('monitoring-location/components/hydrograph module', () => {
Bucknell, Mary S.
committed
utils.mediaQuery = jest.fn().mockReturnValue(true);
utils.wrap = jest.fn();
Bucknell, Mary S.
committed
config.locationTimeZone = 'America/Chicago';
Bucknell, Mary S.
committed
config.ivPeriodOfRecord = {
Bucknell, Mary S.
committed
'72019': {
Bucknell, Mary S.
committed
begin_date: '01-02-2001',
end_date: '10-15-2015'
},
'00060': {
begin_date: '04-01-1991',
end_date: '10-15-2007'
},
'00093': {
begin_date: '11-25-2001',
end_date: '03-01-2020'
},
'00067': {
begin_date: '04-01-1990',
end_date: '10-15-2006'
}
};
Bucknell, Mary S.
committed
config.igwPeriodOfRecord = {
'72019': {
begin_date: '01-02-2000',
end_date: '10-15-2015'
}
};
Bucknell, Mary S.
committed
let graphNode;
Bucknell, Mary S.
committed
let fakeServer;
Bucknell, Mary S.
committed
let nodeElem;
const INITIAL_PARAMETERS = {
siteno: '11112222',
agencyCode: 'USGS',
sitename: 'Site name',
parameterCode: '72019'
};
Bucknell, Mary S.
committed
beforeEach(() => {
Bucknell, Mary S.
committed
body.append('a')
.attr('id', 'classic-page-link')
Bucknell, Mary S.
committed
.attr('href', 'https://fakeserver/link');
Bucknell, Mary S.
committed
let component = body.append('div')
Bucknell, Mary S.
committed
.attr('id', 'hydrograph');
Bucknell, Mary S.
committed
component.append('div').attr('id', 'hydrograph-date-controls-container');
component.append('div').attr('id', 'hydrograph-method-picker-container');
component.append('div').attr('class', 'graph-container')
.append('div')
.attr('id', 'hydrograph-loading-indicator-container')
.attr('class', 'loading-indicator-container');
component.append('div').attr('class', 'select-time-series-container');
Bucknell, Mary S.
committed
component.append('div').attr('id', 'iv-data-table-container');
Bucknell, Mary S.
committed
Bucknell, Mary S.
committed
graphNode = document.getElementById('hydrograph');
Bucknell, Mary S.
committed
nodeElem = select(graphNode);
Bucknell, Mary S.
committed
fakeServer = sinon.createFakeServer();
Bucknell, Mary S.
committed
});
afterEach(() => {
Bucknell, Mary S.
committed
fakeServer.restore();
Bucknell, Mary S.
committed
select('#hydrograph').remove();
Bucknell, Mary S.
committed
select('#classic-page-link').remove();
Bucknell, Mary S.
committed
});
Bucknell, Mary S.
committed
describe('Tests for initial data fetching and setting', () => {
let store;
Bucknell, Mary S.
committed
let retrieveHydrographDataSpy, retrieveHydrographParametersSpy, retrieveWaterwatchDataSpy;
beforeEach(() => {
Bucknell, Mary S.
committed
hydrographData: {},
hydrographState: {},
hydrographParameters: {},
floodData: {},
ui: {
width: 1000
Bucknell, Mary S.
committed
retrieveHydrographDataSpy = jest.spyOn(hydrographData, 'retrieveHydrographData');
retrieveHydrographParametersSpy = jest.spyOn(hydrographParameters, 'retrieveHydrographParameters');
retrieveWaterwatchDataSpy = jest.spyOn(floodDataActions, 'retrieveWaterwatchData');
});
Bucknell, Mary S.
committed
it('Loading indicator should be shown', () => {
attachToNode(store, graphNode, INITIAL_PARAMETERS);
expect(nodeElem.select('.loading-indicator').size()).toBe(1);
});
Bucknell, Mary S.
committed
describe('Fetching initial hydrograph data', () => {
it('With just parameter code set', () => {
attachToNode(store, graphNode, INITIAL_PARAMETERS);
expect(retrieveHydrographDataSpy).toHaveBeenCalledWith('11112222', {
parameterCode: '72019',
period: 'P7D',
startTime: null,
endTime: null,
Bucknell, Mary S.
committed
loadMedian: false
});
expect(store.getState().hydrographState).toEqual({
selectedParameterCode: '72019',
selectedDateRange: 'P7D',
Bucknell, Mary S.
committed
selectedIVMethodID: undefined
});
});
Bucknell, Mary S.
committed
it('With custom period', () => {
attachToNode(store, graphNode, {
Bucknell, Mary S.
committed
...INITIAL_PARAMETERS,
period: 'P45D'
});
expect(retrieveHydrographDataSpy).toHaveBeenCalledWith('11112222', {
parameterCode: '72019',
period: 'P45D',
startTime: null,
endTime: null,
Bucknell, Mary S.
committed
loadMedian: false
});
expect(store.getState().hydrographState).toEqual({
selectedParameterCode: '72019',
selectedDateRange: 'P45D',
Bucknell, Mary S.
committed
selectedIVMethodID: undefined
});
});
Bucknell, Mary S.
committed
it('With custom time range', () => {
attachToNode(store, graphNode, {
Bucknell, Mary S.
committed
...INITIAL_PARAMETERS,
startDT: '2020-02-01',
endDT: '2020-02-15'
Bucknell, Mary S.
committed
expect(retrieveHydrographDataSpy).toHaveBeenCalledWith('11112222', {
parameterCode: '72019',
period: null,
startTime: '2020-02-01T00:00:00.000-06:00',
endTime: '2020-02-15T23:59:59.999-06:00',
Bucknell, Mary S.
committed
loadMedian: false
Bucknell, Mary S.
committed
});
Bucknell, Mary S.
committed
expect(store.getState().hydrographState).toEqual({
selectedParameterCode: '72019',
selectedDateRange: 'custom',
selectedCustomDateRange: {
start: '2020-02-01',
end: '2020-02-15'
},
Bucknell, Mary S.
committed
selectedIVMethodID: undefined
Bucknell, Mary S.
committed
});
});
Bucknell, Mary S.
committed
it('With compare enabled', () => {
attachToNode(store, graphNode, {
Bucknell, Mary S.
committed
...INITIAL_PARAMETERS,
compare: true
Bucknell, Mary S.
committed
expect(retrieveHydrographDataSpy).toHaveBeenCalledWith('11112222', {
parameterCode: '72019',
period: 'P7D',
startTime: null,
endTime: null,
loadCompare: true,
loadMedian: false
});
expect(store.getState().hydrographState).toEqual({
selectedParameterCode: '72019',
selectedDateRange: 'P7D',
showCompareIVData: true,
selectedIVMethodID: undefined
});
});
});
Bucknell, Mary S.
committed
Bucknell, Mary S.
committed
it('Should fetch the hydrograph parameters', () => {
attachToNode(store, graphNode, INITIAL_PARAMETERS);
expect(retrieveHydrographParametersSpy).toHaveBeenCalledWith('11112222');
});
Bucknell, Mary S.
committed
it('Should fetch the waterwatch flood levels', () => {
attachToNode(store, graphNode, INITIAL_PARAMETERS);
expect(retrieveWaterwatchDataSpy).toHaveBeenCalledWith('11112222');
});
Bucknell, Mary S.
committed
it('Should fetch the data but not set the hydrograph state or fetch hydrograph parameters when showOnlyGraph is true', () => {
attachToNode(store, graphNode, {
Bucknell, Mary S.
committed
...INITIAL_PARAMETERS,
showOnlyGraph: true
});
Bucknell, Mary S.
committed
expect(retrieveHydrographDataSpy).toHaveBeenCalledWith('11112222', {
parameterCode: '72019',
period: 'P7D',
startTime: null,
endTime: null,
Bucknell, Mary S.
committed
loadMedian: false
Bucknell, Mary S.
committed
expect(store.getState().hydrographState).toEqual({});
expect(retrieveWaterwatchDataSpy).toHaveBeenCalled();
expect(retrieveHydrographParametersSpy).not.toHaveBeenCalled();
});
});
describe('Tests for rendering once fetching is complete when showOnlyGraph is false', () => {
Bucknell, Mary S.
committed
let store;
beforeEach(() => {
Bucknell, Mary S.
committed
store = configureStore({
Bucknell, Mary S.
committed
hydrographData: {
primaryIVData: TEST_PRIMARY_IV_DATA,
currentTimeRange: TEST_CURRENT_TIME_RANGE,
groundwaterLevels: TEST_GW_LEVELS,
medianStatisticsData: TEST_MEDIAN_DATA
Bucknell, Mary S.
committed
},
hydrographState: {
selectedIVMethodID: '90649',
showMedianData: true
Bucknell, Mary S.
committed
hydrographParameters: TEST_HYDROGRAPH_PARAMETERS,
floodData: {},
Bucknell, Mary S.
committed
ui: {
Bucknell, Mary S.
committed
width: 1000
Bucknell, Mary S.
committed
}
});
hydrographData.retrieveHydrographData = jest.fn(() => {
return function() {
return Promise.resolve();
};
});
hydrographParameters.retrieveHydrographParameters = jest.fn(() => {
return function() {
return Promise.resolve();
};
});
attachToNode(store, graphNode, {
...INITIAL_PARAMETERS,
showOnlyGraph: false
Bucknell, Mary S.
committed
it('loading indicator should be hidden', () => {
expect(nodeElem.select('.loading-indicator').size()).toBe(0);
Bucknell, Mary S.
committed
});
it('should render the correct number of svg nodes', () => {
expect(selectAll('svg').size()).toBe(4);
});
Bucknell, Mary S.
committed
it('should have a title div', () => {
const titleDiv = selectAll('.time-series-graph-title');
expect(titleDiv.size()).toBe(1);
expect(titleDiv.select('div').text()).toContain('Depth to water level');
expect(titleDiv.select('.usa-tooltip').text()).toEqual('Depth to water level, feet');
});
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 time series data as a line', () => {
// There should be four segments
expect(selectAll('.hydrograph-svg .line-segment').size()).toBe(4);
});
it('should render a rectangle for masked data', () => {
expect(selectAll('.hydrograph-svg g.iv-mask-group').size()).toBe(1);
});
Bucknell, Mary S.
committed
it('should have a point for the median stat data with a label', () => {
expect(selectAll('#median-points path').size()).toBe(1);
expect(selectAll('#median-points text').size()).toBe(0);
});
Bucknell, Mary S.
committed
it('should have brush element for the hydrograph', () => {
expect(selectAll('.brush').size()).toBe(1);
});
Bucknell, Mary S.
committed
it('should have .cursor-slider-svg element', () => {
expect(selectAll('.cursor-slider-svg').size()).toBe(1);
});
Bucknell, Mary S.
committed
it('should have date control elements', () => {
expect(selectAll('#ts-daterange-select-container').size()).toBe(1);
expect(selectAll('#ts-customdaterange-select-container').size()).toBe(1);
});
Bucknell, Mary S.
committed
it('should have method select element', () => {
expect(selectAll('#ts-method-select-container').size()).toBe(1);
});
it('should have the select time series element', () => {
expect(selectAll('#select-time-series').size()).toBe(1);
});
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
it('should have tooltips for the select series table', () => {
// one for each of the two parameters and the WaterAlert links
expect(selectAll('table .usa-tooltip').size()).toBe(10);
});
it('should have data tables for hydrograph data', () => {
expect(select('#iv-hydrograph-data-table-container').size()).toBe(1);
expect(select('#gw-hydrograph-data-table-container').size()).toBe(1);
});
});
describe('Tests for rendering once fetching is complete when showOnlyGraph is true', () => {
let store;
beforeEach(() => {
store = configureStore({
hydrographData: {
primaryIVData: TEST_PRIMARY_IV_DATA,
currentTimeRange: TEST_CURRENT_TIME_RANGE,
groundwaterLevels: TEST_GW_LEVELS,
medianStatisticsData: TEST_MEDIAN_DATA
},
hydrographState: {
selectedIVMethodID: '90649',
showMedianData: true
},
hydrographParameters: TEST_HYDROGRAPH_PARAMETERS,
floodData: {},
ui: {
width: 1000
}
hydrographData.retrieveHydrographData = jest.fn(() => {
return function() {
return Promise.resolve();
};
});
hydrographParameters.retrieveHydrographParameters = jest.fn(() => {
return function() {
return Promise.resolve();
};
});
attachToNode(store, graphNode, {
...INITIAL_PARAMETERS,
showOnlyGraph: true
});
});
Bucknell, Mary S.
committed
it('loading indicator should be hidden', () => {
expect(nodeElem.select('.loading-indicator').size()).toBe(0);
});
Bucknell, Mary S.
committed
it('should render the correct number of svg nodes', () => {
expect(selectAll('svg').size()).toBe(2);
});
Bucknell, Mary S.
committed
it('should have a title div', () => {
const titleDiv = selectAll('.time-series-graph-title');
expect(titleDiv.size()).toBe(1);
});
Bucknell, Mary S.
committed
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);
});
Bucknell, Mary S.
committed
it('should render time series data as a line', () => {
// There should be four segments
expect(selectAll('.hydrograph-svg .line-segment').size()).toBe(4);
});
Bucknell, Mary S.
committed
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
it('should render a rectangle for masked data', () => {
expect(selectAll('.hydrograph-svg g.iv-mask-group').size()).toBe(1);
});
it('should have a point for the median stat data with a label', () => {
expect(selectAll('#median-points path').size()).toBe(1);
expect(selectAll('#median-points text').size()).toBe(0);
});
it('should not have brush element for the hydrograph', () => {
expect(selectAll('.brush').size()).toBe(0);
});
it('should not have .cursor-slider-svg element', () => {
expect(selectAll('.cursor-slider-svg').size()).toBe(0);
});
it('should not have date control elements', () => {
expect(selectAll('#ts-daterange-select-container').size()).toBe(0);
expect(selectAll('#ts-customdaterange-select-container').size()).toBe(0);
});
it('should not have method select element', () => {
expect(selectAll('#ts-method-select-container').size()).toBe(0);
});
it('should not have the select time series element', () => {
expect(selectAll('#select-time-series').size()).toBe(0);
});
it('should not have data tables for hydrograph data', () => {
expect(select('#iv-hydrograph-data-table-container').size()).toBe(0);
expect(select('#gw-hydrograph-data-table-container').size()).toBe(0);
});