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;