From 1d3e3f8c9a4d84bdcc7b48c350818ba0464763d6 Mon Sep 17 00:00:00 2001
From: Tifenn Guillas <tifenn.guillas@gmail.com>
Date: Thu, 2 Sep 2021 13:24:11 +0200
Subject: [PATCH] WIP: Testing on search effects

---
 .../store/effects/search.effects.spec.ts      | 327 ++++++++++++++++--
 .../instance/store/effects/search.effects.ts  |   3 +-
 2 files changed, 290 insertions(+), 40 deletions(-)

diff --git a/client/src/app/instance/store/effects/search.effects.spec.ts b/client/src/app/instance/store/effects/search.effects.spec.ts
index 451caf9a..f9a5b3e6 100644
--- a/client/src/app/instance/store/effects/search.effects.spec.ts
+++ b/client/src/app/instance/store/effects/search.effects.spec.ts
@@ -19,6 +19,9 @@ import * as outputFamilyActions from '../../../metamodel/actions/output-family.a
 import * as outputCategoryActions from '../../../metamodel/actions/output-category.actions';
 import * as attributeSelector from '../../../metamodel/selectors/attribute.selector';
 import * as coneSearchSelector from '../selectors/cone-search.selector';
+import { RendererConfig } from '../../../metamodel/models/renderers';
+import { Option } from '../../../metamodel/models';
+import * as coneSearchActions from '../actions/cone-search.actions';
 
 describe('SearchEffects', () => {
     let actions = new Observable();
@@ -229,46 +232,294 @@ describe('SearchEffects', () => {
             expect(effects.loadDefaultFormParameters$).toBeObservable(expected);
         });
 
-    //     it('should dispatch the registerFail action on failure', () => {
-    //         const action = sampActions.register();
-    //         const error = new Error();
-    //         const outcome = sampActions.registerFail();
-    //
-    //         actions = hot('-a', { a: action });
-    //         const response = cold('-#|', {}, error);
-    //         const expected = cold('--b', { b: outcome });
-    //         sampService.register = jest.fn(() => response);
-    //
-    //         expect(effects.register$).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 registerSuccess action on success', () => {
-    //         const action = sampActions.register();
-    //         const outcome = sampActions.registerSuccess();
-    //
-    //         actions = hot('-a', { a: action });
-    //         const response = cold('-a|', { a: action });
-    //         const expected = cold('--b', { b: outcome });
-    //         sampService.register = jest.fn(() => response);
-    //
-    //         expect(effects.register$).toBeObservable(expected);
-    //     });
-    //
-    //     it('should dispatch the registerFail action on failure', () => {
-    //         const action = sampActions.register();
-    //         const error = new Error();
-    //         const outcome = sampActions.registerFail();
-    //
-    //         actions = hot('-a', { a: action });
-    //         const response = cold('-#|', {}, error);
-    //         const expected = cold('--b', { b: outcome });
-    //         sampService.register = jest.fn(() => response);
-    //
-    //         expect(effects.register$).toBeObservable(expected);
-    //     });
-    // });
+    describe('retrieveDataLength$ effect', () => {
+        // it('should dispatch the retrieveDataLengthSuccess action on success', () => {
+        //     const action = searchActions.retrieveDataLength();
+        //     const outcome = searchActions.retrieveDataLengthSuccess({ length: 1 });
+        //
+        //     actions = hot('-a', { a: action });
+        //     const response = cold('-a|', { a: action });
+        //     const expected = cold('--b', { b: outcome });
+        //     searchService.retrieveDataLength = jest.fn(() => response);
+        //
+        //     expect(effects.retrieveDataLength$).toBeObservable(expected);
+        // });
+
+        // it('should dispatch the registerFail 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);
+        // });
+    });
 
     describe('retrieveDataLengthFail$ effect', () => {
         it('should not dispatch', () => {
diff --git a/client/src/app/instance/store/effects/search.effects.ts b/client/src/app/instance/store/effects/search.effects.ts
index b1f6e8d2..42fe0926 100644
--- a/client/src/app/instance/store/effects/search.effects.ts
+++ b/client/src/app/instance/store/effects/search.effects.ts
@@ -49,8 +49,7 @@ export class SearchEffects {
             ]),
             mergeMap(([action, datasetName, currentDataset, pristine, steps]) => {
                 // User has changed dataset: reload initial state + init search
-                // if (datasetName && currentDataset && datasetName !== currentDataset) {
-                if (datasetName !== currentDataset) {
+                if (datasetName && currentDataset && datasetName !== currentDataset) {
                     return of(searchActions.restartSearch());
                 }
 
-- 
GitLab