From f4c6c8309c2ce4e6ca009add002cc33c765a956a Mon Sep 17 00:00:00 2001
From: mbucknell <mbucknell@usgs.gov>
Date: Mon, 24 Feb 2020 15:51:24 -0600
Subject: [PATCH] All tests pass again. Still need to add setting url
 parameters.

---
 .../hydrograph/date-controls.spec.js          |   6 +-
 .../scripts/components/hydrograph/index.js    |  16 +-
 .../components/hydrograph/index.spec.js       | 325 ++++++++++++------
 assets/src/scripts/polyfills.js               |   2 +-
 assets/src/scripts/store/index.js             |   3 +-
 assets/src/scripts/store/index.spec.js        |  18 +-
 assets/tests/scripts/global-config.js         |   6 +-
 7 files changed, 253 insertions(+), 123 deletions(-)

diff --git a/assets/src/scripts/components/hydrograph/date-controls.spec.js b/assets/src/scripts/components/hydrograph/date-controls.spec.js
index 63081913a..68db5a9ef 100644
--- a/assets/src/scripts/components/hydrograph/date-controls.spec.js
+++ b/assets/src/scripts/components/hydrograph/date-controls.spec.js
@@ -176,15 +176,15 @@ describe('date-controls', () => {
 
     it('Expects to retrieve the extended time series when the radio buttons are change', () => {
         spyOn(Actions, 'retrieveExtendedTimeSeries').and.callThrough();
-        let lastRadio = select('#one-year');
+        let lastRadio = select('#P1Y-input');
         lastRadio.attr('checked', true);
         lastRadio.dispatch('change');
 
         expect(Actions.retrieveExtendedTimeSeries).toHaveBeenCalledWith('12345678', 'P1Y');
     });
 
-    it('Expects to show the date range from when the Custom radio is selected', () => {
-        let customRadio = select('#custom-date-range');
+    it('Expects to show the date range form when the Custom radio is selected', () => {
+        let customRadio = select('#custom-input');
         customRadio.attr('checked', true);
         customRadio.dispatch('change');
 
diff --git a/assets/src/scripts/components/hydrograph/index.js b/assets/src/scripts/components/hydrograph/index.js
index 09f6a4562..b02ac0cfd 100644
--- a/assets/src/scripts/components/hydrograph/index.js
+++ b/assets/src/scripts/components/hydrograph/index.js
@@ -60,10 +60,7 @@ export const attachToNode = function (store,
     store.dispatch(Actions.resizeUI(window.innerWidth, node.offsetWidth));
     nodeElem
         .select('.loading-indicator-container')
-        .call(link(store, drawLoadingIndicator, createStructuredSelector({
-            showLoadingIndicator: isLoadingTS('current', 'P7D'),
-            sizeClass: () => 'fa-3x'
-        })));
+        .call(drawLoadingIndicator, {showLoadingIndicator: true, sizeClass: 'fa-3x'});
 
     // Fetch time zone
     const fetchTimeZonePromise = store.dispatch(Actions.retrieveLocationTimeZone(config.siteLocation.latitude, config.siteLocation.longitude));
@@ -89,9 +86,7 @@ export const attachToNode = function (store,
                 if (period === 'P30D' || period === 'P1Y') {
                     store.dispatch(Actions.retrieveExtendedTimeSeries(siteno, period, currentParamCode));
                 } else if (startDT && endDT) {
-                    console.log('Waiting for time zone promise');
                     fetchTimeZonePromise.then(() => {
-                        console.log('time zone retrieved. Retrieving custom date range');
                         store.dispatch(Actions.retrieveDataForDateRange(siteno, startDT, endDT, currentParamCode));
                     });
                 }
@@ -99,7 +94,10 @@ export const attachToNode = function (store,
         store.dispatch(Actions.retrieveMedianStatistics(siteno));
     }
     fetchDataPromise.then(() => {
-        console.log('fetchDataPromise then is bein processed');
+        // Hide the loading indocatr
+        nodeElem
+            .select('.loading-indicator-container')
+            .call(drawLoadingIndicator, {showLoadingIndicator: false, sizeClass: 'fa-3x'});
         if (!hasAnyTimeSeries(store.getState())) {
             drawInfoAlert(nodeElem, {body: 'No time series data available for this site'});
         } else {
@@ -147,9 +145,7 @@ export const attachToNode = function (store,
                         timeSeriesScalesByParmCd: timeSeriesScalesByParmCdSelector('current', 'P7D', SPARK_LINE_DIM)
                     }), store));
                 nodeElem.select('.provisional-data-alert')
-                    .call(link(store, function (elem, allTimeSeries) {
-                        elem.attr('hidden', Object.keys(allTimeSeries).length ? null : true);
-                    }, getTimeSeries));
+                    .attr('hidden', null);
             }
         }
     });
diff --git a/assets/src/scripts/components/hydrograph/index.spec.js b/assets/src/scripts/components/hydrograph/index.spec.js
index 83845467f..4b7f60f4b 100644
--- a/assets/src/scripts/components/hydrograph/index.spec.js
+++ b/assets/src/scripts/components/hydrograph/index.spec.js
@@ -171,15 +171,232 @@ describe('Hydrograph charting and Loading indicators and data alerts', () => {
         select('#hydrograph').remove();
     });
 
-    it('empty graph displays warning', () => {
+    it('expect alert if no siteno defined', () => {
         attachToNode({}, graphNode, {});
         expect(graphNode.innerHTML).toContain('No data is available');
     });
 
+    describe('Tests for initial data fetching when showOnlyGraph is false (the default)', () => {
+        let store;
+
+        beforeEach(() => {
+            store = configureStore({});
+        });
+
+        it('loading-indicator is shown until initial data has been retrieved', () => {
+            attachToNode(store, graphNode, {
+                siteno: '1234568'
+            });
+
+            expect(select(graphNode).select('.loading-indicator').size()).toBe(1);
+        });
+
+        it('Expects retrieveLocationTimeZone to be called', () => {
+            spyOn(Actions, 'retrieveLocationTimeZone').and.callThrough();
+            attachToNode(store, graphNode, {
+                siteno: '12345678'
+            });
+
+            expect(Actions.retrieveLocationTimeZone).toHaveBeenCalled();
+        });
+
+        describe('Always retrieve the 7 day data and median statistics', () => {
+
+            beforeEach(() => {
+                spyOn(Actions, 'retrieveTimeSeries').and.callThrough();
+                spyOn(Actions, 'retrieveMedianStatistics').and.callThrough();
+            });
+
+            it('Retrieve if no date parameters are used', () => {
+                attachToNode(store, graphNode, {
+                    siteno: '12345678',
+                    parameterCode: '00065'
+                });
+
+                expect(Actions.retrieveTimeSeries).toHaveBeenCalledWith('12345678');
+                expect(Actions.retrieveMedianStatistics).toHaveBeenCalledWith('12345678');
+            });
+
+            it('Retrieve if period parameters is used', () => {
+                attachToNode(store, graphNode, {
+                    siteno: '12345678',
+                    parameterCode: '00065',
+                    period: 'P30D'
+                });
+
+                expect(Actions.retrieveTimeSeries).toHaveBeenCalledWith('12345678');
+                expect(Actions.retrieveMedianStatistics).toHaveBeenCalledWith('12345678');
+            });
+
+            it('Retrieve if startDT and endDT parameters are used', () => {
+                attachToNode(store, graphNode, {
+                    siteno: '12345678',
+                    parameterCode: '00065',
+                    startDT: '2010-01-01',
+                    endDT: '2010-03-01'
+                });
+
+                expect(Actions.retrieveTimeSeries).toHaveBeenCalledWith('12345678');
+                expect(Actions.retrieveMedianStatistics).toHaveBeenCalledWith('12345678');
+            });
+        });
+
+        describe('Retrieve additional data if indicated', () => {
+            beforeEach(() => {
+                spyOn(Actions, 'retrieveTimeSeries').and.returnValue(function() {
+                    return Promise.resolve({});
+                });
+                spyOn(Actions, 'retrieveExtendedTimeSeries').and.callThrough();
+                spyOn(Actions, 'retrieveDataForDateRange').and.callThrough();
+            });
+
+            it('Expect to not retrieve additional time series if not indicated', (done) => {
+                attachToNode(store, graphNode, {
+                    siteno: '12345678',
+                    parameterCode: '00065'
+                });
+
+                window.requestAnimationFrame(() => {
+                    expect(Actions.retrieveExtendedTimeSeries).not.toHaveBeenCalled();
+                    expect(Actions.retrieveDataForDateRange).not.toHaveBeenCalled();
+                    done();
+                });
+            });
+            it('should retrieve extend time series if period set', (done) => {
+                attachToNode(store, graphNode, {
+                    siteno: '12345678',
+                    parameterCode: '00065',
+                    period: 'P30D'
+                });
+
+                window.requestAnimationFrame(() => {
+                    expect(Actions.retrieveExtendedTimeSeries).toHaveBeenCalledWith('12345678', 'P30D', '00065');
+                    expect(Actions.retrieveDataForDateRange).not.toHaveBeenCalled();
+                    done();
+                });
+            });
+
+            it('should not retrieve data for date range if  time zone has not been fetched', (done) => {
+                attachToNode(store, graphNode, {
+                    siteno: '12345678',
+                    parameterCode: '00065',
+                    startDT: '2010-01-01',
+                    endDT: '2010-03-01'
+                });
+
+                window.requestAnimationFrame(() => {
+                    expect(Actions.retrieveExtendedTimeSeries).not. toHaveBeenCalled();
+                    expect(Actions.retrieveDataForDateRange).not.toHaveBeenCalled();
+                    done();
+                });
+            });
+
+            it('should retrieve data for date range if  time zone has  been fetched', (done) => {
+                spyOn(Actions, 'retrieveLocationTimeZone').and.returnValue(function() {
+                    return Promise.resolve({});
+                });
+                attachToNode(store, graphNode, {
+                    siteno: '12345678',
+                    parameterCode: '00065',
+                    startDT: '2010-01-01',
+                    endDT: '2010-03-01'
+                });
+
+                window.requestAnimationFrame(() => {
+                    expect(Actions.retrieveExtendedTimeSeries).not. toHaveBeenCalled();
+                    expect(Actions.retrieveDataForDateRange).toHaveBeenCalledWith('12345678', '2010-01-01', '2010-03-01', '00065');
+                    done();
+                });
+            });
+        });
+    });
+
+    describe('Tests for initial data fetching when showOnlyGraph is true ', () => {
+        let store;
+
+        beforeEach(() => {
+            store = configureStore({});
+            spyOn(Actions, 'retrieveTimeSeries').and.callThrough();
+            spyOn(Actions, 'retrieveCustomTimePeriodTimeSeries').and.callThrough();
+            spyOn(Actions, 'retrieveDataForDateRange');
+        });
+
+        it('should retrieve custom time period if period is specificed', (done) => {
+            attachToNode(store, graphNode, {
+                siteno: '12345678',
+                parameterCode: '00065',
+                period: 'P20D',
+                showOnlyGraph: true
+            });
+
+            window.requestAnimationFrame(() => {
+                expect(Actions.retrieveTimeSeries).not.toHaveBeenCalled();
+                expect(Actions.retrieveCustomTimePeriodTimeSeries).toHaveBeenCalledWith('12345678', '00065', 'P20D');
+                expect(Actions.retrieveDataForDateRange).not.toHaveBeenCalled();
+                done();
+            });
+        });
+
+        it('should not retrieve date range for date range parameters if time zone has not been fetched', (done) => {
+            attachToNode(store, graphNode, {
+                siteno: '12345678',
+                parameterCode: '00065',
+                startDT: '2010-01-01',
+                endDT: '2010-03-01',
+                showOnlyGraph: true
+            });
+
+            window.requestAnimationFrame(() => {
+                expect(Actions.retrieveTimeSeries).not.toHaveBeenCalled();
+                expect(Actions.retrieveCustomTimePeriodTimeSeries).not.toHaveBeenCalled();
+                expect(Actions.retrieveDataForDateRange).not.toHaveBeenCalled();
+                done();
+            });
+        });
+
+        it('should  retrieve date range for date range parameters if time zone has been fetched', (done) => {
+            spyOn(Actions, 'retrieveLocationTimeZone').and.returnValue(function() {
+                return Promise.resolve({});
+            });
+            attachToNode(store, graphNode, {
+                siteno: '12345678',
+                parameterCode: '00065',
+                startDT: '2010-01-01',
+                endDT: '2010-03-01',
+                showOnlyGraph: true
+            });
+
+            window.requestAnimationFrame(() => {
+                expect(Actions.retrieveTimeSeries).not.toHaveBeenCalled();
+                expect(Actions.retrieveCustomTimePeriodTimeSeries).not.toHaveBeenCalled();
+                expect(Actions.retrieveDataForDateRange).toHaveBeenCalledWith('12345678', '2010-01-01', '2010-03-01', '00065');
+                done();
+            });
+        });
+
+        it('should retrieve time series if no custom period or date range', (done) => {
+            attachToNode(store, graphNode, {
+                siteno: '12345678',
+                parameterCode: '00065',
+                showOnlyGraph: true
+            });
+
+            window.requestAnimationFrame(() => {
+                expect(Actions.retrieveTimeSeries).toHaveBeenCalledWith('12345678', ['00065']);
+                expect(Actions.retrieveCustomTimePeriodTimeSeries).not.toHaveBeenCalled();
+                expect(Actions.retrieveDataForDateRange).not.toHaveBeenCalled();
+                done();
+            });
+        });
+    });
+
     describe('graphNode contains the expected elements when showOnlyGraph is false', () => {
         /* eslint no-use-before-define: 0 */
         let store;
-        beforeEach(() => {
+        beforeEach((done) => {
+            spyOn(Actions, 'retrieveTimeSeries').and.returnValue(function() {
+                return Promise.resolve({});
+            });
             store = configureStore({
                 ...TEST_STATE,
                 series: {
@@ -222,6 +439,9 @@ describe('Hydrograph charting and Loading indicators and data alerts', () => {
             });
 
             attachToNode(store, graphNode, {siteno: '123456788'});
+            window.requestAnimationFrame(() => {
+                done();
+            });
         });
 
         it('should render the correct number of svg nodes', () => {
@@ -294,6 +514,9 @@ describe('Hydrograph charting and Loading indicators and data alerts', () => {
     describe('hide elements when showOnlyGraph is set to true', () => {
         let store;
         beforeEach(() => {
+            spyOn(Actions, 'retrieveTimeSeries').and.returnValue(function() {
+                return Promise.resolve({});
+            });
             store = configureStore({
                 ...TEST_STATE,
                 series: {
@@ -359,100 +582,4 @@ describe('Hydrograph charting and Loading indicators and data alerts', () => {
             expect(selectAll('#select-time-series').size()).toBe(0);
         });
     });
-
-    describe('hiding/showing provisional alert', () => {
-
-        it('Expects the provisional alert to be visible when time series data is provided', () => {
-            let store = configureStore(TEST_STATE);
-            attachToNode(store, graphNode, {siteno: '12345678'});
-
-            expect(select(graphNode).select('.provisional-data-alert').attr('hidden')).toBeNull();
-        });
-
-        it('Expects the provisional alert to be hidden when no time series data is provided', () => {
-            let store = configureStore({
-                ...TEST_STATE,
-                series: {},
-                timeSeriesState: {
-                    ...TEST_STATE.timeSeriesState,
-                    currentVariableID: ''
-                }
-            });
-            attachToNode(store, graphNode, {siteno: '12345678'});
-
-            expect(select(graphNode).select('.provisional-data-alert').attr('hidden')).toBe('true');
-        });
-    });
-
-    describe('Tests for loading indicators', () => {
-
-        it('Expects the graph loading indicator to be visible if the current 7 day data is being loaded', () => {
-            const newTestState = {
-                ...TEST_STATE,
-                timeSeriesState: {
-                    ...TEST_STATE.timeSeriesState,
-                    currentDateRange: 'P7D',
-                    loadingTSKeys: ['current:P7D']
-                }
-            };
-            let store = configureStore(newTestState);
-            spyOn(store, 'dispatch').and.callThrough();
-            attachToNode(store, graphNode, {siteno: '12345678'});
-
-            expect(select(graphNode).select('.loading-indicator-container').select('.loading-indicator').size()).toBe(1);
-        });
-
-        it('Expects the graph loading indicator to not be visible if the current 7 day data is not being loaded', () => {
-            const newTestState = {
-                ...TEST_STATE,
-                timeSeriesState: {
-                    ...TEST_STATE.timeSeriesState,
-                    currentDateRange: 'P7D'
-                }
-            };
-            let store = configureStore(newTestState);
-            spyOn(store, 'dispatch').and.callThrough();
-            attachToNode(store, graphNode, {siteno: '12345678'});
-            store.dispatch(Actions.removeTimeSeriesLoading(['current:P7D']));
-
-            expect(select(graphNode).select('.loading-indicator-container').select('.loading-indicator').size()).toBe(0);
-        });
-
-        it('Expects the date range control loading indicator to be visible if loading is in progress for the selected date range', () => {
-            const newTestState = {
-                ...TEST_STATE,
-                timeSeriesState: {
-                    ...TEST_STATE.timeSeriesState,
-                    currentDateRange: 'P30D',
-                    loadingTSKeys: ['current:P30D:00060']
-                }
-            };
-            let store = configureStore(newTestState);
-            attachToNode(store, graphNode, {siteno: '12345678'});
-
-            expect(select(graphNode).select('#ts-daterange-select-container').select('.loading-indicator').size()).toBe(1);
-        });
-
-        it('Expects the date range control loading indicator to not be visible if not loading for the selected date range', () => {
-            const newTestState = {
-                ...TEST_STATE,
-                timeSeriesState: {
-                    ...TEST_STATE.timeSeriesState,
-                    currentDateRange: 'P30D',
-                    loadingTSKeys: ['compare:P30D:00060']
-                }
-            };
-            let store = configureStore(newTestState);
-            attachToNode(store, graphNode, {siteno: '12345678'});
-
-            expect(select(graphNode).select('#ts-daterange-select-container').select('.loading-indicator').size()).toBe(0);
-        });
-
-        it('Expects that the no data alert will not be shown if there is data', () => {
-            let store = configureStore(TEST_STATE);
-            attachToNode(store, graphNode, {siteno: '12345678'});
-
-            expect(select(graphNode).select('#no-data-message').size()).toBe(0);
-        });
-    });
-});
+});
\ No newline at end of file
diff --git a/assets/src/scripts/polyfills.js b/assets/src/scripts/polyfills.js
index 63e8f539f..f8229177e 100644
--- a/assets/src/scripts/polyfills.js
+++ b/assets/src/scripts/polyfills.js
@@ -11,7 +11,7 @@ import 'core-js/features/math/sign';
 import 'core-js/features/math/trunc';
 import 'core-js/features/number/is-integer';
 import 'core-js/features/number/is-nan';
-import 'core-js/features/from-entries';
+import 'core-js/features/object/from-entries';
 import 'core-js/features/object/values';
 import 'core-js/features/promise';
 import 'core-js/features/string/repeat';
diff --git a/assets/src/scripts/store/index.js b/assets/src/scripts/store/index.js
index 32bad7cfe..1a70c744a 100644
--- a/assets/src/scripts/store/index.js
+++ b/assets/src/scripts/store/index.js
@@ -101,8 +101,7 @@ export const Actions = {
                     // Update the application state
                     dispatch(Actions.toggleTimeSeries('current', true));
                     const variable = getCurrentVariableId(collection.timeSeries || {}, collection.variables || {});
-                    const action = Actions.setCurrentVariable(variable);
-                    dispatch(action);
+                    dispatch(Actions.setCurrentVariable(variable));
                     dispatch(Actions.setGageHeight(getLatestValue(collection, GAGE_HEIGHT_CD)));
                 },
                 () => {
diff --git a/assets/src/scripts/store/index.spec.js b/assets/src/scripts/store/index.spec.js
index 51452d634..81d7761c8 100644
--- a/assets/src/scripts/store/index.spec.js
+++ b/assets/src/scripts/store/index.spec.js
@@ -164,18 +164,18 @@ describe('Redux store', () => {
 
             it('should fetch the times series, retrieve the compare time series once the time series is fetched and fetch the statistics', (done) => {
                 spyOn(Actions, 'addSeriesCollection');
-                spyOn(Actions, 'retrieveLocationTimeZone');
                 spyOn(Actions, 'retrieveCompareTimeSeries');
                 spyOn(Actions, 'toggleTimeSeries');
                 spyOn(Actions, 'setCurrentVariable');
+                spyOn(Actions, 'setGageHeight');
                 let p = Actions.retrieveTimeSeries(SITE_NO)(mockDispatch, mockGetState);
 
+                expect(Actions.addTimeSeriesLoading.calls.count()).toBe(1);
+                expect(Actions.addTimeSeriesLoading.calls.argsFor(0)[0]).toEqual(['current:P7D']);
                 p.then(() => {
-                    expect(mockDispatch.calls.count()).toBe(8);
+                    expect(mockDispatch.calls.count()).toBe(7);
                     expect(Actions.addSeriesCollection.calls.count()).toBe(1);
                     expect(Actions.addSeriesCollection.calls.argsFor(0)[0]).toBe('current');
-                    expect(Actions.retrieveLocationTimeZone.calls.count()).toBe(1);
-                    expect(Actions.retrieveLocationTimeZone.calls.argsFor(0)).toEqual([42.72027778, -90.8191667]);
                     expect(Actions.removeTimeSeriesLoading.calls.count()).toBe(1);
                     expect(Actions.removeTimeSeriesLoading.calls.argsFor(0)[0]).toEqual(['current:P7D']);
                     expect(Actions.retrieveCompareTimeSeries.calls.count()).toBe(1);
@@ -184,7 +184,7 @@ describe('Redux store', () => {
                     expect(Actions.toggleTimeSeries.calls.argsFor(0)).toEqual(['current', true]);
                     expect(Actions.setCurrentVariable.calls.count()).toBe(1);
                     expect(Actions.setCurrentVariable.calls.argsFor(0)).toEqual(['45807197']);
-
+                    expect(Actions.setGageHeight.calls.count()).toBe(1);
                     done();
                 });
             });
@@ -636,20 +636,24 @@ describe('Redux store', () => {
                 mockGetState.and.returnValue(TEST_STATE);
                 spyOn(Actions, 'retrieveCompareTimeSeries');
                 spyOn(Actions, 'addSeriesCollection');
+                spyOn(Actions, 'setCurrentDateRange');
                 let p = Actions.retrieveExtendedTimeSeries('12345678', 'P30D')(mockDispatch, mockGetState);
                 request = jasmine.Ajax.requests.mostRecent();
                 request.respondWith({
                     responseText: MOCK_DATA,
                     status: 200
                 });
+                expect(Actions.addTimeSeriesLoading.calls.count()).toBe(1);
+                expect(Actions.addTimeSeriesLoading.calls.argsFor(0)[0]).toEqual(['current:P30D:00060']);
+                expect(Actions.setCurrentDateRange.calls.count()).toBe(1);
+                expect(Actions.setCurrentDateRange.calls.argsFor(0)[0], 'P30D');
                 p.then(() => {
-                    expect(mockDispatch.calls.count()).toBe(6);
+                    expect(mockDispatch.calls.count()).toBe(5);
                     expect(Actions.addSeriesCollection).toHaveBeenCalled();
                     expect(Actions.addSeriesCollection.calls.argsFor(0)[0]).toEqual('current:P30D:00060');
                     expect(Actions.retrieveCompareTimeSeries).toHaveBeenCalled();
                     expect(Actions.retrieveCompareTimeSeries.calls.argsFor(0)[1]).toEqual('P30D');
                     expect(Actions.removeTimeSeriesLoading).toHaveBeenCalledWith(['current:P30D:00060']);
-                    expect(Actions.toggleTimeSeries).toHaveBeenCalledWith('median', true);
                     done();
                 });
             });
diff --git a/assets/tests/scripts/global-config.js b/assets/tests/scripts/global-config.js
index b8fe1b79f..6fb291e6f 100644
--- a/assets/tests/scripts/global-config.js
+++ b/assets/tests/scripts/global-config.js
@@ -1,7 +1,11 @@
 var CONFIG = {
     TIMESERIES_AUDIO_ENABLED: true,
     MULTIPLE_TIME_SERIES_METADATA_SELECTOR_ENABLED: true,
-    FIM_GIS_ENDPOINT: 'https:/fakelegendservice.com'
+    FIM_GIS_ENDPOINT: 'https:/fakelegendservice.com',
+    siteLocation: {
+        latitude: 43.5,
+        longitude: -100.0
+    }
 };
 
 var mockOscillator = function() {
-- 
GitLab