From ce0284c7c8c7d3297d4299520913b94bf4b37c13 Mon Sep 17 00:00:00 2001 From: Tifenn Guillas <tifenn.guillas@gmail.com> Date: Tue, 21 Sep 2021 16:17:16 +0200 Subject: [PATCH] Tests on search multiple => DONE --- .../effects/search-multiple.effects.spec.ts | 679 +++++++----------- 1 file changed, 277 insertions(+), 402 deletions(-) diff --git a/client/src/app/instance/store/effects/search-multiple.effects.spec.ts b/client/src/app/instance/store/effects/search-multiple.effects.spec.ts index 320dd803..ed415dad 100644 --- a/client/src/app/instance/store/effects/search-multiple.effects.spec.ts +++ b/client/src/app/instance/store/effects/search-multiple.effects.spec.ts @@ -22,7 +22,7 @@ import * as outputCategoryActions from '../../../metamodel/actions/output-catego import * as attributeSelector from '../../../metamodel/selectors/attribute.selector'; import * as coneSearchSelector from '../selectors/cone-search.selector'; import * as coneSearchActions from '../actions/cone-search.actions'; -import { Criterion, PaginationOrder } from '../models'; +import { ConeSearch, Criterion, PaginationOrder, SearchMultipleDatasetLength } from '../models'; import * as searchMultipleSelector from '../selectors/search-multiple.selector'; import * as instanceSelector from '../../../metamodel/selectors/instance.selector'; import * as searchMultipleActions from '../actions/search-multiple.actions'; @@ -43,7 +43,9 @@ describe('SearchMultipleEffects', () => { }; let mockSearchMultipleSelectorSelectPristine; let mockSearchMultipleSelectorSelectSelectedDatasetsByRoute; + let mockSearchMultipleSelectorSelectSelectedDatasets; let mockConeSearchSelectorSelectConeSearchByRoute; + let mockConeSearchSelectorSelectConeSearch; let mockInstanceSelectorSelectorSelectInstanceByRouteName; let mockDatasetSelectorSelectAllConeSearchDatasets; @@ -68,44 +70,15 @@ describe('SearchMultipleEffects', () => { mockSearchMultipleSelectorSelectSelectedDatasetsByRoute = store.overrideSelector( searchMultipleSelector.selectSelectedDatasetsByRoute,'' ); + mockSearchMultipleSelectorSelectSelectedDatasets = store.overrideSelector( + searchMultipleSelector.selectSelectedDatasets, [] + ); mockConeSearchSelectorSelectConeSearchByRoute = store.overrideSelector( coneSearchSelector.selectConeSearchByRoute,'' ); - // mockInstanceSelectorSelectorSelectInstanceByRouteName = store.overrideSelector( - // instanceSelector.selectInstanceByRouteName,{ - // name: 'myInstance', - // label: 'My Instance', - // data_path: 'data/path', - // config: { - // design: { - // design_color: 'green', - // design_background_color: 'darker green', - // design_logo: 'path/to/logo', - // design_favicon: 'path/to/favicon' - // }, - // home: { - // home_component: 'HomeComponent', - // home_config: { - // home_component_text: 'Description', - // home_component_logo: 'path/to/logo' - // } - // }, - // search: { - // search_by_criteria_allowed: true, - // search_by_criteria_label: 'Search', - // search_multiple_allowed: true, - // search_multiple_label: 'Search multiple', - // search_multiple_all_datasets_selected: true - // }, - // documentation: { - // documentation_allowed: true, - // documentation_label: 'Documentation' - // } - // }, - // nb_dataset_families: 1, - // nb_datasets: 2 - // } - // ); + mockConeSearchSelectorSelectConeSearch = store.overrideSelector( + coneSearchSelector.selectConeSearch,undefined + ); mockInstanceSelectorSelectorSelectInstanceByRouteName = store.overrideSelector( instanceSelector.selectInstanceByRouteName,undefined ); @@ -118,7 +91,7 @@ describe('SearchMultipleEffects', () => { expect(effects).toBeTruthy(); }); - describe.only('initSearch$ effect', () => { + describe('initSearch$ effect', () => { it('should dispatch the restartSearch action when dataset or cone search changed', () => { mockSearchMultipleSelectorSelectPristine = store.overrideSelector( searchMultipleSelector.selectPristine,false @@ -152,30 +125,204 @@ describe('SearchMultipleEffects', () => { expect(effects.initSearch$).toBeObservable(expected); }); - // it('should dispatch a bunch of actions when a dataset is selected or a page is reloaded', () => { - // mockDatasetSelectorSelectDatasetNameByRoute = store.overrideSelector( - // datasetSelector.selectDatasetNameByRoute, 'myDatasetName' - // ); - // mockSearchSelectorSelectPristine = store.overrideSelector( - // searchSelector.selectPristine,true - // ); - // mockSearchSelectorSelectCurrentDataset = store.overrideSelector( - // searchSelector.selectCurrentDataset,'myDatasetName' - // ); - // - // const action = searchActions.initSearch(); - // actions = hot('-a', { a: action }); - // const expected = cold('-(bcdef)', { - // b: searchActions.changeCurrentDataset({ currentDataset: 'myDatasetName' }), - // c: attributeActions.loadAttributeList(), - // d: criteriaFamilyActions.loadCriteriaFamilyList(), - // e: outputFamilyActions.loadOutputFamilyList(), - // f: outputCategoryActions.loadOutputCategoryList() - // }); - // - // expect(effects.initSearch$).toBeObservable(expected); - // }); - // + it('should dispatch a bunch of actions when page is reloaded with cone search in it', () => { + mockSearchMultipleSelectorSelectPristine = store.overrideSelector( + searchMultipleSelector.selectPristine,true + ); + mockConeSearchSelectorSelectConeSearchByRoute = store.overrideSelector( + coneSearchSelector.selectConeSearchByRoute,'1:2:3' + ); + mockSearchMultipleSelectorSelectSelectedDatasetsByRoute = store.overrideSelector( + searchMultipleSelector.selectSelectedDatasetsByRoute,'' + ); + mockInstanceSelectorSelectorSelectInstanceByRouteName = store.overrideSelector( + instanceSelector.selectInstanceByRouteName, { + name: 'myInstance', + label: 'My Instance', + data_path: 'data/path', + config: { + design: { + design_color: 'green', + design_background_color: 'darker green', + design_logo: 'path/to/logo', + design_favicon: 'path/to/favicon' + }, + home: { + home_component: 'HomeComponent', + home_config: { + home_component_text: 'Description', + home_component_logo: 'path/to/logo' + } + }, + search: { + search_by_criteria_allowed: true, + search_by_criteria_label: 'Search', + search_multiple_allowed: true, + search_multiple_label: 'Search multiple', + search_multiple_all_datasets_selected: false + }, + documentation: { + documentation_allowed: true, + documentation_label: 'Documentation' + } + }, + nb_dataset_families: 1, + nb_datasets: 2 + } + ); + + const coneSearch: ConeSearch = { ra: 1, dec: 2, radius: 3 }; + + const action = searchMultipleActions.initSearch(); + actions = hot('-a', { a: action }); + const expected = cold('-(bc)', { + b: searchMultipleActions.markAsDirty(), + c: coneSearchActions.addConeSearch({ coneSearch }) + }); + + expect(effects.initSearch$).toBeObservable(expected); + }); + + it('should dispatch a bunch of actions when page is reloaded with selected datasets in it', () => { + mockSearchMultipleSelectorSelectPristine = store.overrideSelector( + searchMultipleSelector.selectPristine,true + ); + mockConeSearchSelectorSelectConeSearchByRoute = store.overrideSelector( + coneSearchSelector.selectConeSearchByRoute,'' + ); + mockSearchMultipleSelectorSelectSelectedDatasetsByRoute = store.overrideSelector( + searchMultipleSelector.selectSelectedDatasetsByRoute,'d1;d2' + ); + + const selectedDatasets: string[] = ['d1', 'd2']; + + const action = searchMultipleActions.initSearch(); + actions = hot('-a', { a: action }); + const expected = cold('-(bcd)', { + b: searchMultipleActions.markAsDirty(), + c: searchMultipleActions.updateSelectedDatasets({ selectedDatasets }), + d: searchMultipleActions.checkDatasets() + }); + + expect(effects.initSearch$).toBeObservable(expected); + }); + + it('should dispatch a bunch of actions when page is reloaded with default selected datasets', () => { + mockSearchMultipleSelectorSelectPristine = store.overrideSelector( + searchMultipleSelector.selectPristine,true + ); + mockConeSearchSelectorSelectConeSearchByRoute = store.overrideSelector( + coneSearchSelector.selectConeSearchByRoute,'' + ); + mockSearchMultipleSelectorSelectSelectedDatasetsByRoute = store.overrideSelector( + searchMultipleSelector.selectSelectedDatasetsByRoute,'' + ); + mockInstanceSelectorSelectorSelectInstanceByRouteName = store.overrideSelector( + instanceSelector.selectInstanceByRouteName, { + name: 'myInstance', + label: 'My Instance', + data_path: 'data/path', + config: { + design: { + design_color: 'green', + design_background_color: 'darker green', + design_logo: 'path/to/logo', + design_favicon: 'path/to/favicon' + }, + home: { + home_component: 'HomeComponent', + home_config: { + home_component_text: 'Description', + home_component_logo: 'path/to/logo' + } + }, + search: { + search_by_criteria_allowed: true, + search_by_criteria_label: 'Search', + search_multiple_allowed: true, + search_multiple_label: 'Search multiple', + search_multiple_all_datasets_selected: true + }, + documentation: { + documentation_allowed: true, + documentation_label: 'Documentation' + } + }, + nb_dataset_families: 1, + nb_datasets: 2 + } + ); + mockDatasetSelectorSelectAllConeSearchDatasets = store.overrideSelector( + datasetSelector.selectAllConeSearchDatasets, [ + { + name: 'myDataset', + table_ref: '', + label: '', + description: '', + display: 1, + data_path: '', + survey_name: '', + id_dataset_family: 1, + public: true, + full_data_path: '', + config: { + images: [], + survey: { + survey_enabled: true, + survey_label: '' + }, + cone_search: { + cone_search_enabled: true, + cone_search_opened: true, + cone_search_column_ra: 1, + cone_search_column_dec: 2, + cone_search_plot_enabled: true, + cone_search_sdss_enabled: true, + cone_search_sdss_display: 1, + cone_search_background: [] + }, + download: { + download_enabled: true, + download_opened: true, + download_csv: true, + download_ascii: true, + download_vo: true, + download_archive: true + }, + summary: { + summary_enabled: true, + summary_opened: true + }, + server_link: { + server_link_enabled: true, + server_link_opened: true + }, + samp: { + samp_enabled: true, + samp_opened: true + }, + datatable: { + datatable_enabled: true, + datatable_opened: true, + datatable_selectable_rows: true + } + } + } + ] + ); + + const selectedDatasets: string[] = ['myDataset']; + + const action = searchMultipleActions.initSearch(); + actions = hot('-a', { a: action }); + const expected = cold('-(bc)', { + b: searchMultipleActions.markAsDirty(), + c: searchMultipleActions.updateSelectedDatasets({ selectedDatasets }) + }); + + expect(effects.initSearch$).toBeObservable(expected); + }); + // it('should dispatch a bunch of actions when a dataset is selected or a page is reloaded with steps checked', () => { // mockDatasetSelectorSelectDatasetNameByRoute = store.overrideSelector( // datasetSelector.selectDatasetNameByRoute, 'myDatasetName' @@ -250,348 +397,76 @@ describe('SearchMultipleEffects', () => { }); }); - // describe('loadDefaultFormParameters$ effect', () => { - // it('should not dispatch action if params already loaded', () => { - // mockSearchSelectorSelectPristine = store.overrideSelector( - // searchSelector.selectPristine, false - // ); - // mockSearchSelectorSelectCurrentDataset = store.overrideSelector( - // searchSelector.selectCurrentDataset, 'myDataset' - // ); - // - // const action = searchActions.loadDefaultFormParameters(); - // const outcome = { type: '[No Action] Load Default Form Parameters' }; - // - // actions = hot('-a', { a: action }); - // const expected = cold('-b', { b: outcome }); - // - // expect(effects.loadDefaultFormParameters$).toBeObservable(expected); - // }); - // - // it('should not dispatch action if no dataset selected', () => { - // const action = searchActions.loadDefaultFormParameters(); - // const outcome = { type: '[No Action] Load Default Form Parameters' }; - // - // actions = hot('-a', { a: action }); - // const expected = cold('-b', { b: outcome }); - // - // expect(effects.loadDefaultFormParameters$).toBeObservable(expected); - // }); - // - // it('should dispatch a bunch of actions to update search', () => { - // mockSearchSelectorSelectPristine = store.overrideSelector( - // searchSelector.selectPristine, true - // ); - // mockSearchSelectorSelectCurrentDataset = store.overrideSelector( - // searchSelector.selectCurrentDataset, 'myDataset' - // ); - // - // const action = searchActions.loadDefaultFormParameters(); - // actions = hot('-a', { a: action }); - // - // const defaultCriteriaList = []; - // const defaultConeSearch = null; - // const defaultOutputList = []; - // const expected = cold('-(bcde)', { - // b: searchActions.updateCriteriaList({ criteriaList: defaultCriteriaList }), - // c: coneSearchActions.addConeSearch({ coneSearch: defaultConeSearch }), - // d: searchActions.updateOutputList({ outputList: defaultOutputList }), - // e: searchActions.markAsDirty() - // }); - // - // expect(effects.loadDefaultFormParameters$).toBeObservable(expected); - // }); - // - // it('should set a default criteria list', () => { - // mockSearchSelectorSelectPristine = store.overrideSelector( - // searchSelector.selectPristine, true - // ); - // mockSearchSelectorSelectCurrentDataset = store.overrideSelector( - // searchSelector.selectCurrentDataset, 'myDataset' - // ); - // mockAttributeSelectorSelectAllAttributes = store.overrideSelector( - // attributeSelector.selectAllAttributes, [ - // { - // id: 1, - // name: 'att1', - // label: 'attribute1', - // form_label: 'Attribute 1', - // output_display: 1, - // criteria_display: 1, - // search_type: 'field', - // operator: 'eq', - // type: 'string', - // min: 'one', - // display_detail: 1, - // id_criteria_family: 1, - // id_output_category: 1 - // }, - // { - // id: 2, - // name: 'att2', - // label: 'attribute2', - // form_label: 'Attribute 2', - // output_display: 1, - // criteria_display: 1, - // search_type: 'field', - // operator: 'eq', - // type: 'string', - // min: 'two', - // display_detail: 1, - // id_criteria_family: 2, - // id_output_category: 1 - // } - // ] - // ); - // - // const action = searchActions.loadDefaultFormParameters(); - // actions = hot('-a', { a: action }); - // - // const defaultCriteriaList = [ - // {'id':1,'type':'field','operator':'eq','value':'one'}, - // {'id':2,'type':'field','operator':'eq','value':'two'} - // ]; - // const defaultConeSearch = null; - // const defaultOutputList = []; - // const expected = cold('-(bcde)', { - // b: searchActions.updateCriteriaList({ criteriaList: defaultCriteriaList }), - // c: coneSearchActions.addConeSearch({ coneSearch: defaultConeSearch }), - // d: searchActions.updateOutputList({ outputList: defaultOutputList }), - // e: searchActions.markAsDirty() - // }); - // - // expect(effects.loadDefaultFormParameters$).toBeObservable(expected); - // }); - // - // it('should set criteria list from URL', () => { - // mockSearchSelectorSelectPristine = store.overrideSelector( - // searchSelector.selectPristine, true - // ); - // mockSearchSelectorSelectCurrentDataset = store.overrideSelector( - // searchSelector.selectCurrentDataset, 'myDataset' - // ); - // mockAttributeSelectorSelectAllAttributes = store.overrideSelector( - // attributeSelector.selectAllAttributes, [ - // { - // id: 1, - // name: 'att1', - // label: 'attribute1', - // form_label: 'Attribute 1', - // output_display: 1, - // criteria_display: 1, - // search_type: 'field', - // operator: 'eq', - // type: 'string', - // min: 'one', - // display_detail: 1, - // id_criteria_family: 1, - // id_output_category: 1 - // }, - // { - // id: 2, - // name: 'att2', - // label: 'attribute2', - // form_label: 'Attribute 2', - // output_display: 1, - // criteria_display: 1, - // search_type: 'field', - // operator: 'eq', - // type: 'string', - // min: 'two', - // display_detail: 1, - // id_criteria_family: 2, - // id_output_category: 1 - // } - // ] - // ); - // mockSearchSelectorSelectCriteriaListByRoute = store.overrideSelector( - // searchSelector.selectCriteriaListByRoute, '1::eq::un;2::eq::deux' - // ); - // - // const action = searchActions.loadDefaultFormParameters(); - // actions = hot('-a', { a: action }); - // - // const criteriaList = [ - // {'id':1,'type':'field','operator':'eq','value':'un'}, - // {'id':2,'type':'field','operator':'eq','value':'deux'} - // ]; - // const defaultConeSearch = null; - // const defaultOutputList = []; - // const expected = cold('-(bcde)', { - // b: searchActions.updateCriteriaList({ criteriaList: criteriaList }), - // c: coneSearchActions.addConeSearch({ coneSearch: defaultConeSearch }), - // d: searchActions.updateOutputList({ outputList: defaultOutputList }), - // e: searchActions.markAsDirty() - // }); - // - // expect(effects.loadDefaultFormParameters$).toBeObservable(expected); - // }); - // - // it('should set cone search from URL', () => { - // mockSearchSelectorSelectPristine = store.overrideSelector( - // searchSelector.selectPristine, true - // ); - // mockSearchSelectorSelectCurrentDataset = store.overrideSelector( - // searchSelector.selectCurrentDataset, 'myDataset' - // ); - // mockConeSearchSelectorSelectConeSearchByRoute = store.overrideSelector( - // coneSearchSelector.selectConeSearchByRoute, '1:2:3' - // ); - // - // const action = searchActions.loadDefaultFormParameters(); - // actions = hot('-a', { a: action }); - // - // const defaultCriteriaList = []; - // const coneSearch = { ra: 1, dec: 2, radius: 3 }; - // const defaultOutputList = []; - // const expected = cold('-(bcde)', { - // b: searchActions.updateCriteriaList({ criteriaList: defaultCriteriaList }), - // c: coneSearchActions.addConeSearch({ coneSearch: coneSearch }), - // d: searchActions.updateOutputList({ outputList: defaultOutputList }), - // e: searchActions.markAsDirty() - // }); - // - // expect(effects.loadDefaultFormParameters$).toBeObservable(expected); - // }); - // - // it('should set a default output list', () => { - // mockSearchSelectorSelectPristine = store.overrideSelector( - // searchSelector.selectPristine, true - // ); - // mockSearchSelectorSelectCurrentDataset = store.overrideSelector( - // searchSelector.selectCurrentDataset, 'myDataset' - // ); - // mockAttributeSelectorSelectAllAttributes = store.overrideSelector( - // attributeSelector.selectAllAttributes, [ - // { - // id: 1, - // name: 'att1', - // label: 'attribute1', - // form_label: 'Attribute 1', - // output_display: 1, - // criteria_display: 1, - // search_type: 'field', - // operator: 'eq', - // type: 'string', - // display_detail: 1, - // selected: true, - // id_criteria_family: 1, - // id_output_category: 1 - // }, - // { - // id: 2, - // name: 'att2', - // label: 'attribute2', - // form_label: 'Attribute 2', - // output_display: 1, - // criteria_display: 1, - // search_type: 'field', - // operator: 'eq', - // type: 'string', - // display_detail: 1, - // selected: true, - // id_criteria_family: 2, - // id_output_category: 1 - // } - // ] - // ); - // - // const action = searchActions.loadDefaultFormParameters(); - // actions = hot('-a', { a: action }); - // - // const defaultCriteriaList = []; - // const defaultConeSearch = null; - // const defaultOutputList = [1, 2]; - // const expected = cold('-(bcde)', { - // b: searchActions.updateCriteriaList({ criteriaList: defaultCriteriaList }), - // c: coneSearchActions.addConeSearch({ coneSearch: defaultConeSearch }), - // d: searchActions.updateOutputList({ outputList: defaultOutputList }), - // e: searchActions.markAsDirty() - // }); - // - // expect(effects.loadDefaultFormParameters$).toBeObservable(expected); - // }); - // - // it('should set output list from URL', () => { - // mockSearchSelectorSelectPristine = store.overrideSelector( - // searchSelector.selectPristine, true - // ); - // mockSearchSelectorSelectCurrentDataset = store.overrideSelector( - // searchSelector.selectCurrentDataset, 'myDataset' - // ); - // mockSearchSelectorSelectOutputListByRoute = store.overrideSelector( - // searchSelector.selectOutputListByRoute, '1;2;3' - // ); - // - // const action = searchActions.loadDefaultFormParameters(); - // actions = hot('-a', { a: action }); - // - // const defaultCriteriaList = []; - // const defaultConeSearch = null; - // const outputList = [1, 2, 3]; - // const expected = cold('-(bcde)', { - // b: searchActions.updateCriteriaList({ criteriaList: defaultCriteriaList }), - // c: coneSearchActions.addConeSearch({ coneSearch: defaultConeSearch }), - // d: searchActions.updateOutputList({ outputList: outputList }), - // e: searchActions.markAsDirty() - // }); - // - // expect(effects.loadDefaultFormParameters$).toBeObservable(expected); - // }); - // }); + describe('retrieveDataLength$ effect', () => { + it('should dispatch the retrieveDataLengthSuccess action on success', () => { + mockSearchMultipleSelectorSelectSelectedDatasets = store.overrideSelector( + searchMultipleSelector.selectSelectedDatasets, ['myDataset'] + ); + mockConeSearchSelectorSelectConeSearch = store.overrideSelector( + coneSearchSelector.selectConeSearch, { ra: 1, dec: 2, radius: 3 } + ); - // describe('retrieveDataLength$ effect', () => { - // it('should dispatch the retrieveDataLengthSuccess action on success', () => { - // const action = searchActions.retrieveDataLength(); - // const outcome = searchActions.retrieveDataLengthSuccess({ length: 5 }); - // - // actions = hot('-a', { a: action }); - // const response = cold('-b|', { b: [{ nb: 5 }] }); - // const expected = cold('--c', { c: outcome }); - // searchService.retrieveDataLength = jest.fn(() => response); - // - // expect(effects.retrieveDataLength$).toBeObservable(expected); - // }); - // - // it('should dispatch the retrieveDataLengthFail action on failure', () => { - // const action = searchActions.retrieveDataLength(); - // const error = new Error(); - // const outcome = searchActions.retrieveDataLengthFail(); - // - // actions = hot('-a', { a: action }); - // const response = cold('-#|', {}, error); - // const expected = cold('--b', { b: outcome }); - // searchService.retrieveDataLength = jest.fn(() => response); - // - // expect(effects.retrieveDataLength$).toBeObservable(expected); - // }); - // - // it('should pass correct query to the service', () => { - // mockDatasetSelectorSelectDatasetNameByRoute = store.overrideSelector( - // datasetSelector.selectDatasetNameByRoute, 'myDataset' - // ); - // mockSearchSelectorSelectCriteriaList = store.overrideSelector( - // searchSelector.selectCriteriaList, [{'id':1,'type':'field','operator':'eq','value':'one'} as Criterion] - // ); - // mockConeSearchSelectorSelectConeSearch = store.overrideSelector( - // coneSearchSelector.selectConeSearch, { ra: 1, dec: 2, radius: 3 } - // ); - // - // jest.spyOn(searchService, 'retrieveDataLength'); - // - // const action = searchActions.retrieveDataLength(); - // const outcome = searchActions.retrieveDataLengthSuccess({ length: 5 }); - // - // actions = hot('-a', { a: action }); - // const response = cold('-b|', { b: [{ nb: 5 }] }); - // const expected = cold('--c', { c: outcome }); - // searchService.retrieveDataLength = jest.fn(() => response); - // - // expect(effects.retrieveDataLength$).toBeObservable(expected); - // expect(searchService.retrieveDataLength).toHaveBeenCalledTimes(1); - // expect(searchService.retrieveDataLength).toHaveBeenCalledWith('myDataset?a=count&c=1::eq::one&cs=1:2:3'); - // }); - // }); + const dataLength: SearchMultipleDatasetLength[] = [{ datasetName: 'myDataset', length: 1 }]; + const action = searchMultipleActions.retrieveDataLength(); + const outcome = searchMultipleActions.retrieveDataLengthSuccess({ dataLength }); + + actions = hot('-a', { a: action }); + const response = cold('-b|', { b: [{ nb: 1 }] }); + const expected = cold('---c', { c: outcome }); + searchService.retrieveDataLength = jest.fn(() => response); + + expect(effects.retrieveDataLength$).toBeObservable(expected); + }); + + it('should dispatch the retrieveDataLengthFail action on failure', () => { + mockSearchMultipleSelectorSelectSelectedDatasets = store.overrideSelector( + searchMultipleSelector.selectSelectedDatasets, ['myDataset'] + ); + mockConeSearchSelectorSelectConeSearch = store.overrideSelector( + coneSearchSelector.selectConeSearch, { ra: 1, dec: 2, radius: 3 } + ); + + const action = searchMultipleActions.retrieveDataLength(); + const error = new Error(); + const outcome = searchMultipleActions.retrieveDataLengthFail(); + + actions = hot('-a', { a: action }); + const response = cold('-#|', {}, error); + const expected = cold('--b', { b: outcome }); + searchService.retrieveDataLength = jest.fn(() => response); + + expect(effects.retrieveDataLength$).toBeObservable(expected); + }); + + it('should pass correct query to the service', () => { + mockSearchMultipleSelectorSelectSelectedDatasets = store.overrideSelector( + searchMultipleSelector.selectSelectedDatasets, ['myDataset', 'myOtherDataset'] + ); + mockConeSearchSelectorSelectConeSearch = store.overrideSelector( + coneSearchSelector.selectConeSearch, { ra: 1, dec: 2, radius: 3 } + ); + + const dataLength: SearchMultipleDatasetLength[] = [ + { datasetName: 'myDataset', length: 1 }, + { datasetName: 'myOtherDataset', length: 1 } + ]; + + jest.spyOn(searchService, 'retrieveDataLength'); + + const action = searchMultipleActions.retrieveDataLength(); + const outcome = searchMultipleActions.retrieveDataLengthSuccess({ dataLength }); + + actions = hot('-a', { a: action }); + const response = cold('-b|', { b: [{ nb: 1 }] }); + const expected = cold('---c', { c: outcome }); + searchService.retrieveDataLength = jest.fn(() => response); + + expect(effects.retrieveDataLength$).toBeObservable(expected); + expect(searchService.retrieveDataLength).toHaveBeenCalledTimes(2); + expect(searchService.retrieveDataLength).toHaveBeenCalledWith('myDataset?a=count&cs=1:2:3'); + expect(searchService.retrieveDataLength).toHaveBeenCalledWith('myOtherDataset?a=count&cs=1:2:3'); + }); + }); describe('retrieveDataLengthFail$ effect', () => { it('should not dispatch', () => { -- GitLab