diff --git a/ui/src/app/metadata-provider/component/forms/finish-form.component.spec.ts b/ui/src/app/metadata-provider/component/forms/finish-form.component.spec.ts index b007e6d8a..7b9f3e95f 100644 --- a/ui/src/app/metadata-provider/component/forms/finish-form.component.spec.ts +++ b/ui/src/app/metadata-provider/component/forms/finish-form.component.spec.ts @@ -1,3 +1,4 @@ +import { Component, ViewChild } from '@angular/core'; import { TestBed, ComponentFixture } from '@angular/core/testing'; import { ReactiveFormsModule } from '@angular/forms'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; @@ -12,10 +13,31 @@ import { FinishFormComponent } from './finish-form.component'; import { RouterStub, RouterLinkStubDirective } from '../../../../testing/router.stub'; import { ActivatedRouteStub } from '../../../../testing/activated-route.stub'; +import * as stubs from '../../../../testing/provider.stub'; +import { InputDefaultsDirective } from '../../directive/input-defaults.directive'; +import { I18nTextComponent } from '../i18n-text.component'; + +@Component({ + template: `` +}) +class TestHostComponent { + provider = new EntityDescriptor({ + ...stubs.provider + }); + + @ViewChild(FinishFormComponent) + public formUnderTest: FinishFormComponent; + + changeProvider(opts: any): void { + this.provider = Object.assign({}, this.provider, opts); + } +} + describe('Finished Form Component', () => { - let fixture: ComponentFixture; - let instance: FinishFormComponent; + let fixture: ComponentFixture; + let instance: TestHostComponent; let store: Store; + let form: FinishFormComponent; beforeEach(() => { TestBed.configureTestingModule({ @@ -37,19 +59,40 @@ describe('Finished Form Component', () => { ], declarations: [ FinishFormComponent, - RouterLinkStubDirective + RouterLinkStubDirective, + I18nTextComponent, + InputDefaultsDirective, + TestHostComponent ], }); store = TestBed.get(Store); spyOn(store, 'dispatch').and.callThrough(); - fixture = TestBed.createComponent(FinishFormComponent); + fixture = TestBed.createComponent(TestHostComponent); instance = fixture.componentInstance; - instance.provider = new EntityDescriptor({ entityId: 'foo', serviceProviderName: 'bar' }); + form = instance.formUnderTest; fixture.detectChanges(); }); it('should compile', () => { expect(fixture).toBeDefined(); }); + + describe('ngOnChanges lifecycle event', () => { + it('should reset the form', () => { + spyOn(form.form, 'reset').and.callThrough(); + instance.changeProvider({ + serviceEnabled: true + }); + fixture.detectChanges(); + expect(form.form.reset).toHaveBeenCalled(); + }); + + xit('should reset the form with serviceEnabled = false if no provider', () => { + spyOn(form.form, 'reset').and.callThrough(); + delete instance.provider; + fixture.detectChanges(); + expect(form.form.reset).toHaveBeenCalled(); + }); + }); }); diff --git a/ui/src/app/metadata-provider/component/forms/key-info-form.component.spec.ts b/ui/src/app/metadata-provider/component/forms/key-info-form.component.spec.ts index 0c502dff3..ab6087c89 100644 --- a/ui/src/app/metadata-provider/component/forms/key-info-form.component.spec.ts +++ b/ui/src/app/metadata-provider/component/forms/key-info-form.component.spec.ts @@ -119,4 +119,23 @@ describe('Security (Key) Info Form Component', () => { expect(form.x509Certificates.length).toBe(0); }); }); + + describe('createGroup method', () => { + it('should return a FormGroup with the correct attributes', () => { + let group = form.createGroup(); + expect(Object.keys(group.controls)).toEqual(['name', 'type', 'value']); + }); + + it('should return a FormGroup with the provided attributes', () => { + let group = form.createGroup({ + name: 'foo', + type: 'signing', + value: 'bar' + }); + let controls = group.controls; + expect(controls.name.value).toEqual('foo'); + expect(controls.type.value).toEqual('signing'); + expect(controls.value.value).toEqual('bar'); + }); + }); }); diff --git a/ui/src/app/metadata-provider/component/forms/key-info-form.component.ts b/ui/src/app/metadata-provider/component/forms/key-info-form.component.ts index a3e3376d6..afcf57868 100644 --- a/ui/src/app/metadata-provider/component/forms/key-info-form.component.ts +++ b/ui/src/app/metadata-provider/component/forms/key-info-form.component.ts @@ -48,19 +48,23 @@ export class KeyInfoFormComponent extends ProviderFormFragmentComponent implemen return this.form.get('securityInfo.x509Certificates') as FormArray; } + createGroup(values: Certificate = {name: '', type: 'both', value: ''}): FormGroup { + return this.fb.group({ + name: [values.name || '', Validators.required], + type: [values.type || 'both', Validators.required], + value: [values.value || '', Validators.required] + }); + } + setCertificates(certs: Certificate[] = []): void { - let fgs = certs.map(ep => this.fb.group(ep)), + let fgs = certs.map(ep => this.createGroup(ep)), list = this.fb.array(fgs, Validators.minLength(1)), group = this.form.get('securityInfo') as FormGroup; group.setControl('x509Certificates', list); } addCert(): void { - this.x509Certificates.push(this.fb.group({ - name: ['', Validators.required], - type: ['both', Validators.required], - value: ['', Validators.required] - })); + this.x509Certificates.push(this.createGroup()); } removeCert(index: number): void { diff --git a/ui/src/app/metadata-provider/component/forms/logout-form.component.spec.ts b/ui/src/app/metadata-provider/component/forms/logout-form.component.spec.ts index 1993f4e62..dcfab2c02 100644 --- a/ui/src/app/metadata-provider/component/forms/logout-form.component.spec.ts +++ b/ui/src/app/metadata-provider/component/forms/logout-form.component.spec.ts @@ -1,3 +1,4 @@ +import { ViewChild, Component } from '@angular/core'; import { TestBed, ComponentFixture } from '@angular/core/testing'; import { ReactiveFormsModule } from '@angular/forms'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; @@ -9,10 +10,32 @@ import { ListValuesService } from '../../service/list-values.service'; import { EntityDescriptor } from '../../model/entity-descriptor'; import { LogoutFormComponent } from './logout-form.component'; +import * as stubs from '../../../../testing/provider.stub'; +import { InputDefaultsDirective } from '../../directive/input-defaults.directive'; +import { I18nTextComponent } from '../i18n-text.component'; + +@Component({ + template: `` +}) +class TestHostComponent { + provider = new EntityDescriptor({ + ...stubs.provider, + logoutEndpoints: [stubs.logoutEndpoint] + }); + + @ViewChild(LogoutFormComponent) + public formUnderTest: LogoutFormComponent; + + changeProvider(opts: any): void { + this.provider = Object.assign({}, this.provider, opts); + } +} + describe('Logout Endpoints Form Component', () => { - let fixture: ComponentFixture; - let instance: LogoutFormComponent; + let fixture: ComponentFixture; + let instance: TestHostComponent; let store: Store; + let form: LogoutFormComponent; beforeEach(() => { TestBed.configureTestingModule({ @@ -31,19 +54,91 @@ describe('Logout Endpoints Form Component', () => { NgbPopoverModule ], declarations: [ - LogoutFormComponent + LogoutFormComponent, + TestHostComponent, + InputDefaultsDirective, + I18nTextComponent ], }); store = TestBed.get(Store); spyOn(store, 'dispatch').and.callThrough(); - fixture = TestBed.createComponent(LogoutFormComponent); + fixture = TestBed.createComponent(TestHostComponent); instance = fixture.componentInstance; - instance.provider = new EntityDescriptor({ entityId: 'foo', serviceProviderName: 'bar' }); + form = instance.formUnderTest; fixture.detectChanges(); }); it('should compile', () => { expect(fixture).toBeDefined(); }); + + describe('ngOnInit method', () => { + it('should remove endpoints if there are none available', () => { + instance.changeProvider({ + logoutEndpoints: [] + }); + fixture.detectChanges(); + expect(form.logoutEndpoints.length).toBe(0); + }); + }); + + describe('ngOnChanges method', () => { + it('should add endpoints if provided', () => { + instance.provider = new EntityDescriptor({ + ...stubs.provider + }); + fixture.detectChanges(); + expect(form.logoutEndpoints.length).toBe(0); + }); + }); + + describe('setEndpoints method', () => { + it('should add endpoints if provided', () => { + form.setEndpoints(); + fixture.detectChanges(); + expect(form.form.get('logoutEndpoints')).toBeDefined(); + }); + }); + + describe('removeCert method', () => { + it('should remove the endpoint at the given index', () => { + instance.changeProvider({ + logoutEndpoints: [stubs.endpoint] + }); + fixture.detectChanges(); + form.removeEndpoint(0); + fixture.detectChanges(); + expect(form.logoutEndpoints.length).toBe(0); + }); + }); + + describe('addCert method', () => { + it('should remove the endpoint at the given index', () => { + instance.changeProvider({ + logoutEndpoints: [] + }); + fixture.detectChanges(); + form.addEndpoint(); + fixture.detectChanges(); + expect(form.logoutEndpoints.length).toBe(1); + }); + }); + + describe('createGroup method', () => { + it('should return a FormGroup with the correct attributes', () => { + let group = form.createGroup(); + expect(Object.keys(group.controls)).toEqual(['url', 'bindingType']); + }); + + it('should return a FormGroup with the provided attributes', () => { + let group = form.createGroup({ + url: 'foo', + bindingType: 'bar' + }); + let controls = group.controls; + expect(controls.url.value).toEqual('foo'); + expect(controls.bindingType.value).toEqual('bar'); + }); + }); }); diff --git a/ui/src/app/metadata-provider/component/forms/logout-form.component.ts b/ui/src/app/metadata-provider/component/forms/logout-form.component.ts index d0ebd9f2e..ffcfd760c 100644 --- a/ui/src/app/metadata-provider/component/forms/logout-form.component.ts +++ b/ui/src/app/metadata-provider/component/forms/logout-form.component.ts @@ -37,21 +37,25 @@ export class LogoutFormComponent extends ProviderFormFragmentComponent implement }); } + createGroup(ep: LogoutEndpoint = { url: '', bindingType: null }): FormGroup { + return this.fb.group({ + url: [ep.url || '', Validators.required], + bindingType: [ep.bindingType || null, Validators.required] + }); + } + get logoutEndpoints(): FormArray { return this.form.get('logoutEndpoints') as FormArray; } setEndpoints(endpoints: LogoutEndpoint[] = []): void { - let fgs = endpoints.map(ep => this.fb.group(ep)), - list = this.fb.array(fgs); + let fgs = endpoints.map(ep => this.createGroup(ep)), + list = this.fb.array(fgs); this.form.setControl('logoutEndpoints', list); } addEndpoint(): void { - this.logoutEndpoints.push(this.fb.group({ - url: ['', Validators.required], - bindingType: [null, Validators.required] - })); + this.logoutEndpoints.push(this.createGroup()); } removeEndpoint(index: number): void { diff --git a/ui/src/testing/provider.stub.ts b/ui/src/testing/provider.stub.ts index 095eaea71..41fd4110e 100644 --- a/ui/src/testing/provider.stub.ts +++ b/ui/src/testing/provider.stub.ts @@ -3,7 +3,8 @@ import { Contact, SsoService, Certificate, - SecurityInfo + SecurityInfo, + LogoutEndpoint } from '../app/metadata-provider/model/metadata-provider'; export const draft = { @@ -40,3 +41,8 @@ export const secInfo = { wantAssertionsSigned: true, x509Certificates: [] } as SecurityInfo; + +export const logoutEndpoint = { + url: 'foo', + bindingType: 'bar' +} as LogoutEndpoint;