diff --git a/ui/src/app/metadata/configuration/component/metadata-configuration.component.spec.ts b/ui/src/app/metadata/configuration/component/metadata-configuration.component.spec.ts
index e69de29bb..f26c8d65c 100644
--- a/ui/src/app/metadata/configuration/component/metadata-configuration.component.spec.ts
+++ b/ui/src/app/metadata/configuration/component/metadata-configuration.component.spec.ts
@@ -0,0 +1,60 @@
+import { Component, ViewChild, Input } from '@angular/core';
+import { TestBed, async, ComponentFixture } from '@angular/core/testing';
+import { RouterTestingModule } from '@angular/router/testing';
+import { MetadataConfigurationComponent } from './metadata-configuration.component';
+
+import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap';
+import { MetadataConfiguration } from '../model/metadata-configuration';
+import { Property } from '../../domain/model/property';
+import { MockI18nModule } from '../../../../testing/i18n.stub';
+
+@Component({
+ selector: 'object-property',
+ template: ``
+})
+class ObjectPropertyComponent {
+ @Input() property: Property;
+}
+
+@Component({
+ template: `
+
+ `
+})
+class TestHostComponent {
+ @ViewChild(MetadataConfigurationComponent)
+ public componentUnderTest: MetadataConfigurationComponent;
+
+ configuration: MetadataConfiguration = {sections: []};
+}
+
+describe('Metadata Configuration Component', () => {
+
+ let fixture: ComponentFixture;
+ let instance: TestHostComponent;
+ let app: MetadataConfigurationComponent;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ imports: [
+ NgbDropdownModule,
+ MockI18nModule,
+ RouterTestingModule
+ ],
+ declarations: [
+ MetadataConfigurationComponent,
+ ObjectPropertyComponent,
+ TestHostComponent
+ ],
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(TestHostComponent);
+ instance = fixture.componentInstance;
+ app = instance.componentUnderTest;
+ fixture.detectChanges();
+ }));
+
+ it('should accept a configuration input', async(() => {
+ expect(app).toBeTruthy();
+ }));
+});
diff --git a/ui/src/app/metadata/configuration/component/metadata-configuration.component.ts b/ui/src/app/metadata/configuration/component/metadata-configuration.component.ts
index 6b3089f78..732b920d3 100644
--- a/ui/src/app/metadata/configuration/component/metadata-configuration.component.ts
+++ b/ui/src/app/metadata/configuration/component/metadata-configuration.component.ts
@@ -1,7 +1,5 @@
import { Component, ChangeDetectionStrategy, Input } from '@angular/core';
import { MetadataConfiguration } from '../model/metadata-configuration';
-import { Property } from '../../domain/model/property';
-import Section from '../model/section';
@Component({
selector: 'metadata-configuration',
@@ -13,8 +11,4 @@ export class MetadataConfigurationComponent {
@Input() configuration: MetadataConfiguration;
constructor() { }
-
- edit(section: Section): void {
- console.log(section);
- }
}
diff --git a/ui/src/app/metadata/configuration/container/configuration.component.spec.ts b/ui/src/app/metadata/configuration/container/configuration.component.spec.ts
index e69de29bb..a61db7b7c 100644
--- a/ui/src/app/metadata/configuration/container/configuration.component.spec.ts
+++ b/ui/src/app/metadata/configuration/container/configuration.component.spec.ts
@@ -0,0 +1,64 @@
+import { Component, ViewChild, Input } from '@angular/core';
+import { TestBed, async, ComponentFixture } from '@angular/core/testing';
+import { RouterTestingModule } from '@angular/router/testing';
+import { StoreModule, combineReducers } from '@ngrx/store';
+import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap';
+
+import { MetadataConfiguration } from '../model/metadata-configuration';
+import { ConfigurationComponent } from './configuration.component';
+import * as fromConfiguration from '../reducer';
+import { MockI18nModule } from '../../../../testing/i18n.stub';
+
+@Component({
+ selector: 'metadata-configuration',
+ template: ``
+})
+class MetadataConfigurationComponent {
+ @Input() configuration: MetadataConfiguration;
+}
+
+@Component({
+ template: `
+
+ `
+})
+class TestHostComponent {
+ @ViewChild(ConfigurationComponent)
+ public componentUnderTest: ConfigurationComponent;
+
+ configuration: MetadataConfiguration = { sections: [] };
+}
+
+describe('Metadata Configuration Page Component', () => {
+
+ let fixture: ComponentFixture;
+ let instance: TestHostComponent;
+ let app: ConfigurationComponent;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ imports: [
+ NgbDropdownModule,
+ StoreModule.forRoot({
+ 'metadata-configuration': combineReducers(fromConfiguration.reducers),
+ }),
+ MockI18nModule,
+ RouterTestingModule
+ ],
+ declarations: [
+ ConfigurationComponent,
+ MetadataConfigurationComponent,
+ TestHostComponent
+ ],
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(TestHostComponent);
+ instance = fixture.componentInstance;
+ app = instance.componentUnderTest;
+ fixture.detectChanges();
+ }));
+
+ it('should load metadata objects', async(() => {
+ expect(app).toBeTruthy();
+ }));
+});
diff --git a/ui/src/app/metadata/configuration/container/configuration.component.ts b/ui/src/app/metadata/configuration/container/configuration.component.ts
index eb52f60ba..e22f23861 100644
--- a/ui/src/app/metadata/configuration/container/configuration.component.ts
+++ b/ui/src/app/metadata/configuration/container/configuration.component.ts
@@ -5,7 +5,6 @@ import { ActivatedRoute } from '@angular/router';
import * as fromConfiguration from '../reducer';
import { MetadataConfiguration } from '../model/metadata-configuration';
-import { METADATA_SOURCE_EDITOR } from '../../resolver/wizard-definition';
import { takeUntil, map } from 'rxjs/operators';
import { LoadMetadataRequest, ClearConfiguration } from '../action/configuration.action';
@@ -30,8 +29,6 @@ export class ConfigurationComponent implements OnDestroy {
takeUntil(this.ngUnsubscribe),
map(params => new LoadMetadataRequest({id: params.id, type: params.type}))
).subscribe(store);
-
- this.configuration$.subscribe(c => console.log(c));
}
ngOnDestroy() {
diff --git a/ui/src/app/metadata/configuration/reducer/configuration.reducer.spec.ts b/ui/src/app/metadata/configuration/reducer/configuration.reducer.spec.ts
new file mode 100644
index 000000000..b4d485fd0
--- /dev/null
+++ b/ui/src/app/metadata/configuration/reducer/configuration.reducer.spec.ts
@@ -0,0 +1,51 @@
+import { reducer } from './configuration.reducer';
+import * as fromConfig from './configuration.reducer';
+import * as actions from '../action/configuration.action';
+import { MetadataSourceEditor } from '../../domain/model/wizards/metadata-source-editor';
+import { SCHEMA } from '../../../../testing/form-schema.stub';
+import { MetadataResolver } from '../../domain/model';
+
+describe('Configuration Reducer', () => {
+ const initialState: fromConfig.State = { ...fromConfig.initialState };
+
+ describe('undefined action', () => {
+ it('should return the default state', () => {
+ const result = reducer(undefined, {} as any);
+
+ expect(result).toEqual(initialState);
+ });
+ });
+
+ describe('SET_DEFINITION action', () => {
+ it('should set the state definition', () => {
+ const definition = new MetadataSourceEditor();
+ const action = new actions.SetDefinition(definition);
+ const result = reducer(initialState, action);
+
+ expect(result).toEqual({ ...initialState, definition });
+ });
+ });
+
+ describe('SET_SCHEMA action', () => {
+ it('should set the state schema', () => {
+ const action = new actions.SetSchema(SCHEMA);
+ const result = reducer(initialState, action);
+
+ expect(result).toEqual({ ...initialState, schema: SCHEMA });
+ });
+ });
+
+ describe('SET_METADATA action', () => {
+ it('should set the state metadata model', () => {
+ const model: MetadataResolver = {
+ id: 'foo',
+ serviceProviderName: 'foo',
+ '@type': 'MetadataResolver'
+ };
+ const action = new actions.SetMetadata(model as MetadataResolver);
+ const result = reducer(initialState, action);
+
+ expect(result).toEqual({ ...initialState, model });
+ });
+ });
+});
diff --git a/ui/src/app/metadata/configuration/reducer/index.spec.ts b/ui/src/app/metadata/configuration/reducer/index.spec.ts
new file mode 100644
index 000000000..5a675621c
--- /dev/null
+++ b/ui/src/app/metadata/configuration/reducer/index.spec.ts
@@ -0,0 +1,19 @@
+import { getConfigurationSectionsFn } from './index';
+import { SCHEMA as schema } from '../../../../testing/form-schema.stub';
+import { MetadataSourceEditor } from '../../domain/model/wizards/metadata-source-editor';
+
+describe('Configuration Reducer', () => {
+ const model = {
+ name: 'foo',
+ '@type': 'MetadataResolver'
+ };
+
+ const definition = new MetadataSourceEditor();
+
+ describe('getConfigurationSectionsFn', () => {
+ it('should parse the schema, definition, and model into a MetadataConfiguration', () => {
+ const config = getConfigurationSectionsFn(model, definition, schema);
+ expect(config.sections).toBeDefined();
+ });
+ });
+});
diff --git a/ui/src/app/metadata/domain/model/metadata-resolver.ts b/ui/src/app/metadata/domain/model/metadata-resolver.ts
index 01505cff5..e97c08d07 100644
--- a/ui/src/app/metadata/domain/model/metadata-resolver.ts
+++ b/ui/src/app/metadata/domain/model/metadata-resolver.ts
@@ -25,4 +25,6 @@ export interface MetadataResolver extends MetadataBase {
serviceEnabled?: boolean;
relyingPartyOverrides?: RelyingPartyOverrides;
attributeRelease?: string[];
+
+ [property: string]: unknown;
}