From b25ba3fe64667d07fd3aed6be38c279415ecb756 Mon Sep 17 00:00:00 2001
From: Tifenn Guillas <tifenn.guillas@gmail.com>
Date: Wed, 8 Sep 2021 17:00:13 +0200
Subject: [PATCH] WIP: Tests on criterion functions

---
 .../store/models/criterion.model.spec.ts      | 193 ++++++++++++++++++
 .../instance/store/models/criterion.model.ts  |  11 +
 2 files changed, 204 insertions(+)
 create mode 100644 client/src/app/instance/store/models/criterion.model.spec.ts

diff --git a/client/src/app/instance/store/models/criterion.model.spec.ts b/client/src/app/instance/store/models/criterion.model.spec.ts
new file mode 100644
index 00000000..8a4153f1
--- /dev/null
+++ b/client/src/app/instance/store/models/criterion.model.spec.ts
@@ -0,0 +1,193 @@
+import { Observable } from 'rxjs';
+import { ConeSearchEffects } from '../effects/cone-search.effects';
+import { EffectsMetadata, getEffectsMetadata } from '@ngrx/effects';
+import { ConeSearchService } from '../services/cone-search.service';
+import { ToastrService } from 'ngx-toastr';
+import { TestBed } from '@angular/core/testing';
+import { provideMockActions } from '@ngrx/effects/testing';
+import { criterionToString, stringToCriterion } from './';
+// import { criterionToString, getCriterionStr, getHost } from './criterion.model';
+import {
+    FieldCriterion,
+    JsonCriterion,
+    SelectMultipleCriterion,
+    BetweenCriterion,
+    Criterion,
+    ListCriterion
+} from '.';
+import { Attribute, Option, RendererConfig } from '../../../metamodel/models';
+// import {
+//     BetweenCriterion,
+//     FieldCriterion,
+//     JsonCriterion,
+//     SelectMultipleCriterion,
+//     ListCriterion
+// } from './criterion';
+
+
+describe('CriterionModel', () => {
+    it('#criterionToString should convert criterion object to string', () => {
+        let betweenCriterion: BetweenCriterion = { id: 1, type: 'between', min: 'un', max: null };
+        let expected = '1::gte::un';
+        expect(criterionToString(betweenCriterion)).toEqual(expected);
+        betweenCriterion = { id: 1, type: 'between', min: null, max: 'deux' };
+        expected = '1::lte::deux';
+        expect(criterionToString(betweenCriterion)).toEqual(expected);
+        betweenCriterion = { id: 1, type: 'between', min: 'un', max: 'deux' };
+        expected = '1::bw::un|deux';
+        expect(criterionToString(betweenCriterion)).toEqual(expected);
+        const fieldCriterion = { id: 1, type: 'field', operator: 'eq', value: 'value' } as FieldCriterion;
+        expected = '1::eq::value';
+        expect(criterionToString(fieldCriterion)).toEqual(expected);
+        const listCriterion = { id: 1, type: 'list', values: ['un', 'deux'] } as ListCriterion;
+        expected = '1::in::un|deux';
+        expect(criterionToString(listCriterion)).toEqual(expected);
+        const jsonCriterion = { id: 1, type: 'json', path: 'path', operator: 'eq', value: 'value' } as JsonCriterion;
+        expected = '1::js::path|eq|value';
+        expect(criterionToString(jsonCriterion)).toEqual(expected);
+        const selectMultipleCriterion = { id: 1, type: 'multiple', options: [{ label: 'un', value: '1', display: 1 }, { label: 'deux', value: '2', display: 2 }] } as SelectMultipleCriterion;
+        expected = '1::in::1|2';
+        expect(criterionToString(selectMultipleCriterion)).toEqual(expected);
+    });
+
+        // id: 1,
+        // name: 'myAttribute',
+        // label: 'my attribute',
+        // form_label: 'My Attribute',
+        // output_display: 1,
+        // criteria_display: 1,
+        // search_type: 'field',
+        // operator: 'eq',
+        // type: 'field',
+        // min: 'one', // optional
+        // max: 'two', // optional
+        // display_detail: 1,
+        // options: [{ label: 'option1', value: 'one', display: 1 }, { label: 'option2', value: 'two', display: 2 }] // optional
+    it.only('#stringToCriterion should convert string criterion into object', () => {
+        let attribute: Attribute = {
+            id: 1,
+            name: 'myAttribute',
+            label: 'my attribute',
+            form_label: 'My Attribute',
+            output_display: 1,
+            criteria_display: 1,
+            search_type: 'field',
+            operator: 'eq',
+            type: 'field',
+            display_detail: 1
+        };
+        let expected: Criterion = { id: 1, type: 'field', operator: 'neq', value: 'otherValue' } as FieldCriterion;
+        expect(stringToCriterion(attribute, ['', 'neq', 'otherValue'])).toEqual(expected);
+        attribute = {
+            id: 1,
+            name: 'myAttribute',
+            label: 'my attribute',
+            form_label: 'My Attribute',
+            output_display: 1,
+            criteria_display: 1,
+            search_type: 'field',
+            operator: 'eq',
+            type: 'field',
+            min: 'value',
+            display_detail: 1
+        };
+        expected = { id: 1, type: 'field', operator: 'eq', value: 'value' } as FieldCriterion;
+        expect(stringToCriterion(attribute)).toEqual(expected);
+        attribute = {
+            id: 1,
+            name: 'myAttribute',
+            label: 'my attribute',
+            form_label: 'My Attribute',
+            output_display: 1,
+            criteria_display: 1,
+            search_type: 'list',
+            operator: 'eq',
+            type: 'field',
+            display_detail: 1
+        };
+        expected = { id: 1, type: 'list', values: ['one', 'two'] } as ListCriterion;
+        expect(stringToCriterion(attribute, ['', '', 'one|two'])).toEqual(expected);
+        attribute = {
+            id: 1,
+            name: 'myAttribute',
+            label: 'my attribute',
+            form_label: 'My Attribute',
+            output_display: 1,
+            criteria_display: 1,
+            search_type: 'list',
+            operator: 'eq',
+            type: 'field',
+            min: 'valueA|valueB',
+            display_detail: 1
+        };
+        expected = { id: 1, type: 'list', values: ['valueA', 'valueB'] } as ListCriterion;
+        expect(stringToCriterion(attribute)).toEqual(expected);
+        attribute = {
+            id: 1,
+            name: 'myAttribute',
+            label: 'my attribute',
+            form_label: 'My Attribute',
+            output_display: 1,
+            criteria_display: 1,
+            search_type: 'between',
+            operator: 'eq',
+            type: 'field',
+            min: 'one',
+            max: 'two',
+            display_detail: 1
+        };
+        expected = { id: 1, type: 'between', min: 'valueA', max: 'valueB' } as BetweenCriterion;
+        expect(stringToCriterion(attribute, ['', 'bw', 'valueA|valueB'])).toEqual(expected);
+        expected = { id: 1, type: 'between', min: 'valueA', max: null } as BetweenCriterion;
+        expect(stringToCriterion(attribute, ['', 'gte', 'valueA'])).toEqual(expected);
+        expected = { id: 1, type: 'between', min: null, max: 'valueB' } as BetweenCriterion;
+        expect(stringToCriterion(attribute, ['', 'lte', 'valueB'])).toEqual(expected);
+        expected = { id: 1, type: 'between', min: 'one', max: 'two' } as BetweenCriterion;
+        expect(stringToCriterion(attribute)).toEqual(expected);
+        attribute = {
+            id: 1,
+            name: 'myAttribute',
+            label: 'my attribute',
+            form_label: 'My Attribute',
+            output_display: 1,
+            criteria_display: 1,
+            search_type: 'select-multiple',
+            operator: 'eq',
+            type: 'field',
+            min: 'one|two',
+            display_detail: 1,
+            options: [{ label: 'one', value: '1', display: 1 }, { label: 'two', value: '2', display: 2 }, { label: 'three', value: '3', display: 3 }]
+        };
+        expected = { id: 1, type: 'multiple', options: [{ label: 'one', value: '1', display: 1 }, { label: 'two', value: '2', display: 2 }] } as SelectMultipleCriterion;
+        expect(stringToCriterion(attribute)).toEqual(expected);
+    });
+
+    // it('#getPrettyCriterion should print criterion correctly', () => {
+    //     const fieldCriterion = { id: 1, type: 'field', operator: 'eq', value: 'value' } as FieldCriterion;
+    //     let expectedPrintedCriterion = '= value';
+    //     expect(getPrettyCriterion(fieldCriterion)).toEqual(expectedPrintedCriterion);
+    //     const jsonCriterion = { id: 1, type: 'json', path: 'path', operator: 'eq', value: 'value' } as JsonCriterion;
+    //     expectedPrintedCriterion = 'path eq value';
+    //     expect(getPrettyCriterion(jsonCriterion)).toEqual(expectedPrintedCriterion);
+    //     const selectMultipleCriterion = { id: 1, type: 'multiple', options: [{label: 'un', value: '1', display: 1}, {label: 'deux', value: '2', display: 2}] } as SelectMultipleCriterion;
+    //     expectedPrintedCriterion = '[un,deux]';
+    //     expect(getPrettyCriterion(selectMultipleCriterion)).toEqual(expectedPrintedCriterion);
+    //     let betweenCriterion = { id: 1, type: 'between', min: 'un', max: null } as BetweenCriterion;
+    //     expectedPrintedCriterion = '>= un';
+    //     expect(getPrettyCriterion(betweenCriterion)).toEqual(expectedPrintedCriterion);
+    //     betweenCriterion = { id: 1, type: 'between', min: null, max: 'deux' } as BetweenCriterion;
+    //     expectedPrintedCriterion = '<= deux';
+    //     expect(getPrettyCriterion(betweenCriterion)).toEqual(expectedPrintedCriterion);
+    //     betweenCriterion = { id: 1, type: 'between', min: 'un', max: 'deux' } as BetweenCriterion;
+    //     expectedPrintedCriterion = '∈ [un;deux]';
+    //     expect(getPrettyCriterion(betweenCriterion)).toEqual(expectedPrintedCriterion);
+    //     const listCriterion = { id: 1, type: 'list', values: ['un', 'deux'] } as ListCriterion;
+    //     expectedPrintedCriterion = '= [un,deux]';
+    //     expect(getPrettyCriterion(listCriterion)).toEqual(expectedPrintedCriterion);
+    //     const notCriterion = {id: 1, type: null} as Criterion;
+    //     expectedPrintedCriterion = 'Criterion type not valid!';
+    //     expect(getPrettyCriterion(notCriterion)).toEqual(expectedPrintedCriterion);
+    // });
+
+
+});
diff --git a/client/src/app/instance/store/models/criterion.model.ts b/client/src/app/instance/store/models/criterion.model.ts
index 81d6161c..a6118e88 100644
--- a/client/src/app/instance/store/models/criterion.model.ts
+++ b/client/src/app/instance/store/models/criterion.model.ts
@@ -66,6 +66,17 @@ export const criterionToString = (criterion: Criterion): string => {
     return str;
 }
 
+/**
+ * Returns criterion object from serialized criterion notation.
+ *
+ * @param  {Attribute} attribute - The criterion to transform.
+ * @param  {string[]} params - The criterion parameters.
+ *
+ * @return Criterion
+ *
+ * @example
+ * stringToCriterion(myAttribute, ['firstParameter', 'secondParameter'])
+ */
 export const stringToCriterion = (attribute: Attribute, params: string[] = null): Criterion => {
     switch (attribute.search_type) {
         case 'field':
-- 
GitLab