diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/vue-components/cursor-slider.test.js b/assets/src/scripts/monitoring-location/components/hydrograph/vue-components/cursor-slider.test.js index de60f6f9ff95d56b41fea21a48189d2f02290130..de0220ef1ba82d499e9afceb414de881d55eeb6a 100644 --- a/assets/src/scripts/monitoring-location/components/hydrograph/vue-components/cursor-slider.test.js +++ b/assets/src/scripts/monitoring-location/components/hydrograph/vue-components/cursor-slider.test.js @@ -1,6 +1,14 @@ +import {mount} from '@vue/test-utils'; +import {bindActionCreators} from 'redux'; +import ReduxConnectVue from 'redux-connect-vue'; +import {createStructuredSelector} from 'reselect'; +import {configureStore} from 'ml/store'; +import * as utils from 'ui/utils'; +import {TEST_PRIMARY_IV_DATA, TEST_CURRENT_TIME_RANGE} from '../mock-hydrograph-state'; + +import CursorSlider from './cursor-slider.vue'; + describe('monitoring-location/components/hydrograph/cursor-slider', () => { - utils.mediaQuery = jest.fn().mockReturnValue(true); - config.locationTimeZone = 'America/Chicago'; const TEST_STATE = { hydrographData: { primaryIVData: TEST_PRIMARY_IV_DATA, @@ -15,47 +23,34 @@ describe('monitoring-location/components/hydrograph/cursor-slider', () => { } }; + let store; + let wrapper; + describe('drawCursorSlider', () => { - let svg; - let store; + utils.mediaQuery = jest.fn().mockReturnValue(true); beforeEach(() => { - svg = select('body').append('svg'); store = configureStore(TEST_STATE); - }); - afterEach(() => { - svg.remove(); + wrapper = mount(CursorSlider, { + global: { + plugins: [ + [ReduxConnectVue, { + store, + mapDispatchToPropsFactory: (actionCreators) => (dispatch) => bindActionCreators(actionCreators, dispatch), + mapStateToPropsFactory: createStructuredSelector + }] + ], + provide: { + store: store + } + } + }); }); - it('Creates a cursor slider', () => { - drawCursorSlider(svg, store); - - const sliderGroup = svg.selectAll('.cursor-slider-group'); - expect(sliderGroup.size()).toBe(1); - expect(sliderGroup.selectAll('.slider').size()).toBe(1); + it('Creates a cursor slider', async() => { + const sliderGroup = wrapper.findAll('.cursor-slider-group'); + expect(sliderGroup).toHaveLength(1); + expect(wrapper.vm.group.getAttribute('transform')).toContain('translate'); }); }); -}); - -describe('initializeTooltipCursorSlider and drawTooltipCursorSlider', () => { - let div; - beforeEach(() => { - div = select('body').append('div'); - }); - - afterEach(() => { - div.remove(); - }); - - it('should render the cursor slider', () => { - let store = configureStore(TEST_STATE); - initializeTooltipCursorSlider(div, store); - drawTooltipCursorSlider(div, store); - - const sliderSvg = div.selectAll('.cursor-slider-svg'); - const slider = sliderSvg.selectAll('.slider'); - - expect(sliderSvg.size()).toBe(1); - expect(slider.size()).toBe(1); - }); }); \ No newline at end of file diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/vue-components/cursor-slider.vue b/assets/src/scripts/monitoring-location/components/hydrograph/vue-components/cursor-slider.vue index 5bcb99791a690adb300fa7c52a5e826259171644..85e760a96e1abace9a9baa1e0c28dde69d290932 100644 --- a/assets/src/scripts/monitoring-location/components/hydrograph/vue-components/cursor-slider.vue +++ b/assets/src/scripts/monitoring-location/components/hydrograph/vue-components/cursor-slider.vue @@ -5,11 +5,11 @@ :viewBox="viewBox" > <g + ref="group" class="cursor-slider-group" ga-on="click" ga-event-category="hydrograph-interaction" ga-event-action="clickOnSlider" - ref="group" /> </svg> </template> @@ -29,59 +29,61 @@ import {getMainXScale} from '../selectors/scales'; import {getMainLayout} from '../selectors/layout'; export default { -name: 'CursorSlider', -setup() { - const state = useState({ - layout: getMainLayout, - xScale: getMainXScale('current'), - cursorOffset: getGraphCursorOffset - }); - - const actions = useActions({ - setGraphCursorOffset - }); - - const group = ref(null); - - const viewBox = computed(() => { - return `0 0 ${state.layout.value.width + state.layout.value.margin.left + state.layout.value.margin.right} 25`; - }); - - const slider = sliderTop() - .displayValue(false) - .ticks(0); - - watchEffect(() => { - const [startMillis, endMillis] = state.xScale.value.domain(); - const [startX, endX] = state.xScale.value.range(); - - slider - .min(startMillis) - .max(endMillis) - .width(endX - startX); - slider.silentValue(state.cursorOffset.value ? slider.min() + state.cursorOffset.value : slider.max()); - - if(group.value) { - group.value.setAttribute('transform', `translate(${state.layout.value.margin.left},15)`); - select(group.value.className.baseVal).call(slider); - } - - slider.on('onchange', (val) => { - actions.setGraphCursorOffset(val - startMillis); + name: 'CursorSlider', + setup() { + const state = useState({ + layout: getMainLayout, + xScale: getMainXScale('current'), + cursorOffset: getGraphCursorOffset }); - }); - watchEffect(() => { - slider.silentValue(state.cursorOffset.value ? slider.min() + state.cursorOffset.value : slider.max()); - }); + const actions = useActions({ + setGraphCursorOffset + }); - return { - ...state, - viewBox, - group, - slider - } -} + const group = ref(null); -} + const viewBox = computed(() => { + return `0 0 ${state.layout.value.width + state.layout.value.margin.left + state.layout.value.margin.right} 25`; + }); + + const initializeCursorSlider = function() { + const slider = sliderTop() + .displayValue(false) + .ticks(0); + + watchEffect(() => { + const [startMillis, endMillis] = state.xScale.value.domain(); + const [startX, endX] = state.xScale.value.range(); + + slider + .min(startMillis) + .max(endMillis) + .width(endX - startX); + slider.silentValue(state.cursorOffset.value ? slider.min() + state.cursorOffset.value : slider.max()); + + if (group.value) { + group.value.setAttribute('transform', `translate(${state.layout.value.margin.left},15)`); + select(`.${group.value.className.baseVal}`).call(slider); + } + + slider.on('onchange', (val) => { + actions.setGraphCursorOffset(val - startMillis); + }); + }); + + watchEffect(() => { + slider.silentValue(state.cursorOffset.value ? slider.min() + state.cursorOffset.value : slider.max()); + }); + }; + + initializeCursorSlider(); + + return { + ...state, + viewBox, + group + }; + } +}; </script> \ No newline at end of file