Skip to content
Snippets Groups Projects
criteria-tabs.component.spec.ts 3.61 KiB
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';

import { AccordionModule } from 'ngx-bootstrap';
import { CriteriaTabsComponent } from './criteria-tabs.component';
import { Attribute, Family } from '../../../metamodel/model';
import { Criterion, FieldCriterion } from '../../store/model';
import { CRITERIA_FAMILY_LIST, ATTRIBUTE_LIST, CRITERIA_LIST } from '../../../../settings/test-data';

describe('[Search][Criteria] Component: CriteriaTabsComponent', () => {
    @Component({
        selector: `app-host`,
        template: `
            <app-criteria-tabs
                [criteriaFamilyList]="criteriaFamilyList"
                [datasetAttributeList]="datasetAttributeList"
                [criteriaList]="criteriaList">
            </app-criteria-tabs>
        `
    })
    class TestHostComponent {
        @ViewChild(CriteriaTabsComponent, { static: false })
        public testedComponent: CriteriaTabsComponent;
        private criteriaFamilyList: Family[] = CRITERIA_FAMILY_LIST;
        private datasetAttributeList: Attribute[] = ATTRIBUTE_LIST;
        private criteriaList: Criterion[] = CRITERIA_LIST;
    }

    @Component({ selector: 'app-criteria-by-family', template: '' })
    class CriteriaByFamilyStubComponent {
        @Input() attributeList: Attribute[];
        @Input() criteriaList: Criterion[];
        @Output() addCriterion: EventEmitter<Criterion> = new EventEmitter();
        @Output() deleteCriterion: EventEmitter<number> = new EventEmitter();
    }

    let testHostComponent: TestHostComponent;
    let testHostFixture: ComponentFixture<TestHostComponent>;
    let testedComponent: CriteriaTabsComponent;

    beforeEach(async(() => {
        TestBed.configureTestingModule({
            declarations: [
                CriteriaTabsComponent,
                TestHostComponent,
                CriteriaByFamilyStubComponent
            ],
            imports: [AccordionModule.forRoot(), BrowserAnimationsModule]
        });
        testHostFixture = TestBed.createComponent(TestHostComponent);
        testHostComponent = testHostFixture.componentInstance;
        testHostFixture.detectChanges();
        testedComponent = testHostComponent.testedComponent;
    }));

    it('should create the component', () => {
        expect(testedComponent).toBeTruthy();
    });

    it('#getAttributeByFamily(idFamily) should filter attibutes by idFamily', () => {
        const filteredAttributeList: Attribute[] = testedComponent.getAttributeByFamily(1);
        expect(filteredAttributeList.length).toBe(1);
        expect(filteredAttributeList[0].id).toBe(1);
    });

    it('#getCriteriaFamilyListSortedByDisplay() should sort criteria family by display', () => {
        const sortedcriteriaFamily = testedComponent.getCriteriaFamilyListSortedByDisplay();
        expect(sortedcriteriaFamily.length).toBe(3);
        expect(sortedcriteriaFamily[0].id).toBe(1);
        expect(sortedcriteriaFamily[2].id).toBe(3);
    });

    it('raises the add criterion event when clicked', () => {
        const criterion = new FieldCriterion(1, 'eq', 'test');
        testedComponent.addCriterion.subscribe((event: FieldCriterion) => expect(event).toEqual(criterion));
        testedComponent.emitAdd(criterion);
    });

    it('raises the delete criterion event when clicked', () => {
        const criterionId = 1;
        testedComponent.deleteCriterion.subscribe((event: number) => expect(event).toEqual(1));
        testedComponent.emitDelete(criterionId);
    });
});