import { By } from "@angular/platform-browser";
import { MatIconModule } from "@angular/material/icon";
import { MatTableModule } from "@angular/material/table";
-import { CUSTOM_ELEMENTS_SCHEMA } from "@angular/core";
+import { CUSTOM_ELEMENTS_SCHEMA, DebugElement } from "@angular/core";
import { of } from "rxjs";
import { PolicyControlComponent } from "./policy-control.component";
import { MockComponent } from "ng-mocks";
import { PolicyTypeComponent } from "./policy-type/policy-type.component";
import { MatButtonHarness } from '@angular/material/button/testing';
+import { MatButtonModule } from '@angular/material/button';
import { HarnessLoader } from '@angular/cdk/testing';
import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
describe("PolicyControlComponent", () => {
- let component: PolicyControlComponent;
- let fixture: ComponentFixture<PolicyControlComponent>;
+ let hostComponent: PolicyControlComponent;
+ let hostFixture: ComponentFixture<PolicyControlComponent>;
let loader: HarnessLoader;
+ let policyServiceSpy: jasmine.SpyObj<PolicyService>;
+ let el: DebugElement;
beforeEach(async(() => {
- const policyServiceSpy = jasmine.createSpyObj("PolicyService", [
+ policyServiceSpy = jasmine.createSpyObj("PolicyService", [
"getPolicyTypes",
]);
- const policyTypes = { policytype_ids: ["type1", "type2"] } as PolicyTypes;
- policyServiceSpy.getPolicyTypes.and.returnValue(of(policyTypes));
TestBed.configureTestingModule({
- imports: [MatIconModule, MatTableModule, BrowserAnimationsModule],
+ imports: [
+ MatIconModule,
+ MatTableModule,
+ BrowserAnimationsModule,
+ MatButtonModule,
+ ],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
declarations: [
PolicyControlComponent,
MockComponent(PolicyTypeComponent),
],
- providers: [{ provide: PolicyService, useValue: policyServiceSpy }],
- }).compileComponents();
+ providers: [
+ { provide: PolicyService, useValue: policyServiceSpy }
+ ],
+ });
}));
- beforeEach(() => {
- fixture = TestBed.createComponent(PolicyControlComponent);
- component = fixture.componentInstance;
- fixture.detectChanges();
- loader = TestbedHarnessEnvironment.loader(fixture);
- });
+ describe("normally functioning", () => {
+ beforeEach(() => {
+ const policyTypes = { policytype_ids: ["type1", "type2"] } as PolicyTypes;
+ policyServiceSpy.getPolicyTypes.and.returnValue(of(policyTypes));
- it("should create", () => {
- expect(component).toBeTruthy();
- });
+ compileAndGetComponents();
+ });
+
+ it("should create", () => {
+ expect(hostComponent).toBeTruthy();
+ });
+
+ it("should contain two PolicyType components instantiated with the correct type", () => {
+ const typeComponents: PolicyTypeComponent[] = hostFixture.debugElement
+ .queryAll(By.directive(PolicyTypeComponent))
+ .map((component) => component.componentInstance);
+
+ expect(typeComponents.length).toEqual(2);
+ expect(typeComponents[0].policyTypeId).toEqual("type1");
+ expect(typeComponents[1].policyTypeId).toEqual("type2");
+ });
+
+ it("should call the refresh button when clicking on it", async () => {
+ let refreshButton: MatButtonHarness = await loader.getHarness(
+ MatButtonHarness.with({ selector: "#refreshButton" })
+ );
+ spyOn(hostComponent, "refreshTables");
+ await refreshButton.click();
+ expect(hostComponent.refreshTables).toHaveBeenCalled();
+ })
+
+ it("should close instance tables when clicking on refresh button", async () => {
+ let refreshButton: MatButtonHarness = await loader.getHarness(
+ MatButtonHarness.with({ selector: "#refreshButton" })
+ );
+ const policyTypeComponent: PolicyTypeComponent = hostFixture.debugElement.query(
+ By.directive(PolicyTypeComponent)
+ ).componentInstance;
+ let booleanTrigger = policyTypeComponent.minimiseTrigger
+ await refreshButton.click();
+ expect(policyTypeComponent.minimiseTrigger).not.toEqual(booleanTrigger);
+ })
+
+ it("should render the types sorted when clicking on refresh button", async () => {
+ const typeComponents: PolicyTypeComponent[] = hostFixture.debugElement
+ .queryAll(By.directive(PolicyTypeComponent))
+ .map((component) => component.componentInstance);
+
+ for(var i= 0; i < typeComponents.length-1; i++){
+ expect(typeComponents[i].policyTypeId<typeComponents[i+1].policyTypeId).toBeTruthy();
+ }
+ })
+ })
+
+ describe("no types", () => {
+ beforeEach(() => {
+ policyServiceSpy.getPolicyTypes.and.returnValue(
+ of({
+ policytype_ids: [],
+ } as PolicyTypes)
+ );
- it("should contain two PolicyType components instantiated with the correct type", () => {
- const typeComponents: PolicyTypeComponent[] = fixture.debugElement
- .queryAll(By.directive(PolicyTypeComponent))
- .map((component) => component.componentInstance);
+ compileAndGetComponents();
+ });
- expect(typeComponents.length).toEqual(2);
- expect(typeComponents[0].policyTypeId).toEqual("type1");
- expect(typeComponents[1].policyTypeId).toEqual("type2");
+ it("should display message of no types", async () => {
+ expect(policyServiceSpy.getPolicyTypes.length).toEqual(0);
+ const content = el.query(By.css('#noInstance')).nativeElement;
+ expect(content.innerText).toBe("There are no policy types to display.");
+ });
});
- /*it("should reload when clicking on refresh button", async () => {
- let refreshButton: MatButtonHarness = await loader.getHarness(
- MatButtonHarness.with({ selector: "#refreshButton" })
- );
+ function compileAndGetComponents() {
+ TestBed.compileComponents();
+ console.log(TestBed);
- })*/
+ hostFixture = TestBed.createComponent(PolicyControlComponent);
+ hostComponent = hostFixture.componentInstance;
+ el = hostFixture.debugElement;
+ hostFixture.detectChanges();
+ loader = TestbedHarnessEnvironment.loader(hostFixture);
+ return { hostFixture, hostComponent, loader };
+ }
});
import { MockComponent } from "ng-mocks";
import { PolicyInstanceComponent } from "../policy-instance/policy-instance.component";
import { By } from "@angular/platform-browser";
+import { Component, SimpleChange, ViewChild } from '@angular/core';
describe("PolicyTypeComponent", () => {
- let component: PolicyTypeComponent;
+ let component: TestPolicyTypeHostComponent;
let policyServiceSpy: jasmine.SpyObj<PolicyService>;
- let fixture: ComponentFixture<PolicyTypeComponent>;
+ let fixture: ComponentFixture<TestPolicyTypeHostComponent>;
beforeEach(async(() => {
policyServiceSpy = jasmine.createSpyObj("PolicyService", ["getPolicyType"]);
declarations: [
PolicyTypeComponent,
MockComponent(PolicyInstanceComponent),
+ TestPolicyTypeHostComponent,
],
providers: [{ provide: PolicyService, useValue: policyServiceSpy }],
}).compileComponents();
}));
beforeEach(() => {
- fixture = TestBed.createComponent(PolicyTypeComponent);
+ fixture = TestBed.createComponent(TestPolicyTypeHostComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it("should not call service when no type, display correct type info and no PolicyInstanceComponent added", () => {
expect(policyServiceSpy.getPolicyType).not.toHaveBeenCalled();
- expect(component.policyType).toEqual("< No Type >");
- expect(component.policyDescription).toEqual("Type with no schema");
+ expect(component.policyTypeComponent.policyType).toEqual("< No Type >");
+ expect(component.policyTypeComponent.policyDescription).toEqual("Type with no schema");
const ele = fixture.debugElement.nativeElement.querySelector("nrcp-policy-instance");
expect(ele).toBeFalsy();
});
it("should call service when type, display correct type info and no PolicyInstanceComponent added", () => {
- component.policyTypeId = "type1";
- component.loadTypeInfo();
+ component.policyTypeComponent.policyTypeId = "type1";
+ component.policyTypeComponent.loadTypeInfo();
expect(policyServiceSpy.getPolicyType).toHaveBeenCalledWith("type1");
- expect(component.policyType).toEqual("type1");
- expect(component.policyDescription).toEqual("Type 1 policy type");
+ expect(component.policyTypeComponent.policyType).toEqual("type1");
+ expect(component.policyTypeComponent.policyDescription).toEqual("Type 1 policy type");
const ele = fixture.debugElement.nativeElement.querySelector("nrcp-policy-instance");
expect(ele).toBeFalsy();
} as PolicyTypeSchema;
expect(policyInstanceComp.policyTypeSchema).toEqual(expectedPolicyType);
});
+
+ it("should call ngOnChanges when minimiseTrigger is changed", async() => {
+ spyOn(component.policyTypeComponent, "ngOnChanges");
+ component.minimiseTrigger = !component.minimiseTrigger;
+ fixture.detectChanges();
+ expect(component.policyTypeComponent.ngOnChanges).toHaveBeenCalled();
+ });
+
+ it("should close all tables when the types are refreshed", async() => {
+ const ele = fixture.debugElement.nativeElement.querySelector("#visible");
+ ele.click();
+ fixture.detectChanges();
+ component.policyTypeComponent.ngOnChanges({
+ minimiseTrigger: new SimpleChange(null, null, component.policyTypeComponent.minimiseTrigger)
+ });
+ fixture.detectChanges();
+ expect(ele.innerText).toEqual("expand_more");
+ });
+
+ @Component({
+ selector: `policy-type-host-component`,
+ template: `<nrcp-policy-type
+ [minimiseTrigger]="this.minimiseTrigger"
+ ></nrcp-policy-type>`,
+ })
+ class TestPolicyTypeHostComponent {
+ @ViewChild(PolicyTypeComponent)
+ policyTypeComponent: PolicyTypeComponent;
+ minimiseTrigger: boolean = false;
+ }
});