From 364d1cdea2c2ae548348573dd214d4eec5895f26 Mon Sep 17 00:00:00 2001
From: Tifenn GUILLAS <tifenn.guillas@lam.fr>
Date: Fri, 25 Oct 2019 11:32:35 +0200
Subject: [PATCH] Add tests for radio component

---
 .../criteria-by-family.component.html         |  4 +-
 .../search-type/json.component.spec.ts        |  2 +-
 .../criteria/search-type/radio.component.html |  4 +-
 .../search-type/radio.component.spec.ts       | 61 +++++++++++++++++++
 .../criteria/search-type/radio.component.ts   | 14 ++---
 5 files changed, 73 insertions(+), 12 deletions(-)
 create mode 100644 src/app/search/components/criteria/search-type/radio.component.spec.ts

diff --git a/src/app/search/components/criteria/criteria-by-family.component.html b/src/app/search/components/criteria/criteria-by-family.component.html
index 4f5db76e..46eff1b5 100644
--- a/src/app/search/components/criteria/criteria-by-family.component.html
+++ b/src/app/search/components/criteria/criteria-by-family.component.html
@@ -63,8 +63,8 @@
                 [label]="attribute.form_label" 
                 [options]="getOptions(attribute.id)"
                 [criterion]="getCriterion(attribute.id)" 
-                (add)="add($event)" 
-                (delete)="delete($event)">
+                (addCriterion)="add($event)" 
+                (deleteCriterion)="delete($event)">
             </app-radio>
         </div>
         <div *ngSwitchCase="'checkbox'">
diff --git a/src/app/search/components/criteria/search-type/json.component.spec.ts b/src/app/search/components/criteria/search-type/json.component.spec.ts
index 6fd31b2d..d59e21a2 100644
--- a/src/app/search/components/criteria/search-type/json.component.spec.ts
+++ b/src/app/search/components/criteria/search-type/json.component.spec.ts
@@ -1,6 +1,6 @@
 import { async, ComponentFixture, TestBed } from '@angular/core/testing';
 
-import { FormsModule, ReactiveFormsModule, FormControl } from '@angular/forms';
+import { FormsModule, ReactiveFormsModule } from '@angular/forms';
 
 import { JsonComponent } from './json.component';
 import { JsonCriterion } from '../../../store/model';
diff --git a/src/app/search/components/criteria/search-type/radio.component.html b/src/app/search/components/criteria/search-type/radio.component.html
index 1fd251b5..c2bf1ec0 100644
--- a/src/app/search/components/criteria/search-type/radio.component.html
+++ b/src/app/search/components/criteria/search-type/radio.component.html
@@ -9,10 +9,10 @@
     </div>
     <div class="col-2 text-center">
         <button class="btn btn-outline-success" *ngIf="!radio.disabled" [hidden]="!radio.value"
-            (click)="addCriterion()">
+            (click)="emitAdd()">
             <span class="fas fa-plus fa-fw"></span>
         </button>
-        <button class="btn btn-outline-danger" *ngIf="radio.disabled" (click)="deleteCriterion()">
+        <button class="btn btn-outline-danger" *ngIf="radio.disabled" (click)="emitDelete()">
             <span class="fa fa-times fa-fw"></span>
         </button>
     </div>
diff --git a/src/app/search/components/criteria/search-type/radio.component.spec.ts b/src/app/search/components/criteria/search-type/radio.component.spec.ts
new file mode 100644
index 00000000..65e11b40
--- /dev/null
+++ b/src/app/search/components/criteria/search-type/radio.component.spec.ts
@@ -0,0 +1,61 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { FormsModule, ReactiveFormsModule, FormControl } from '@angular/forms';
+
+import { RadioComponent } from './radio.component';
+import { FieldCriterion } from '../../../store/model';
+
+describe('[Search][Criteria][SearchType] Component: RadioComponent', () => {
+    let component: RadioComponent;
+    let fixture: ComponentFixture<RadioComponent>;
+
+    beforeEach(() => {
+        TestBed.configureTestingModule({
+            declarations: [RadioComponent],
+            imports: [FormsModule, ReactiveFormsModule]
+        });
+        fixture = TestBed.createComponent(RadioComponent);
+        component = fixture.componentInstance;
+    });
+
+    it('should create the component', () => {
+        expect(component).toBeTruthy();
+    });
+
+    it('#getDefault() should enable and not fill form if criterion not defined', () => {
+        component.getDefault(undefined);
+        expect(component.radio.value).toBeNull();
+        expect(component.radio.enabled).toBeTruthy();
+    });
+
+    it('#getDefault() should fill and disable form if criterion is defined', () => {
+        const operator = '=';
+        const value = 'test';
+        const criterion = new FieldCriterion(1, operator, value);
+        component.getDefault(criterion);
+        expect(component.radio.value).toEqual(value);
+        expect(component.radio.disabled).toBeTruthy();
+    });
+
+    it('raises the add criterion event when clicked', () => {
+        component.id = 1;
+        const operator = '=';
+        component.operator = operator;
+        const value = 'three';
+        component.radio = new FormControl(value);
+        component.options = [
+            { label: 'One', value: 'one', display: 1 },
+            { label: 'Two', value: 'two', display: 2 },
+            { label: 'Three', value: 'three', display: 3 }
+        ];
+        const expectedCriterion = new FieldCriterion(component.id, operator, value);
+        component.addCriterion.subscribe((event: FieldCriterion) => expect(event).toEqual(expectedCriterion));
+        component.emitAdd();
+    });
+
+    it('raises the delete criterion event when clicked', () => {
+        component.id = 1;
+        component.deleteCriterion.subscribe((event: number) => expect(event).toEqual(1));
+        component.emitDelete();
+    });
+});
diff --git a/src/app/search/components/criteria/search-type/radio.component.ts b/src/app/search/components/criteria/search-type/radio.component.ts
index 0f41461a..6c24feaa 100644
--- a/src/app/search/components/criteria/search-type/radio.component.ts
+++ b/src/app/search/components/criteria/search-type/radio.component.ts
@@ -18,24 +18,24 @@ export class RadioComponent {
     set criterion(criterion: Criterion) {
         this.getDefault(criterion);
     }
-    @Output() add: EventEmitter<FieldCriterion> = new EventEmitter();
-    @Output() delete: EventEmitter<number> = new EventEmitter();
+    @Output() addCriterion: EventEmitter<FieldCriterion> = new EventEmitter();
+    @Output() deleteCriterion: EventEmitter<number> = new EventEmitter();
 
     radio = new FormControl('');
 
-    addCriterion() {
+    emitAdd() {
         const option = this.options.find(o => o.value === this.radio.value);
         const cb = new FieldCriterion(this.id, this.operator, option.value);
-        this.add.emit(cb);
+        this.addCriterion.emit(cb);
     }
 
-    deleteCriterion() {
-        this.delete.emit(this.id);
+    emitDelete() {
+        this.deleteCriterion.emit(this.id);
     }
 
     getDefault(criterion: Criterion): void {
         if (!criterion) {
-            this.radio.setValue('');
+            this.radio.reset();
             this.radio.enable();
         } else {
             const c = criterion as FieldCriterion;
-- 
GitLab