From 8fc121a33bd0c489f01c063a17ec4d9af26887a4 Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Wed, 23 Oct 2019 08:37:43 -0700 Subject: [PATCH] SHIBUI-1528 Updated tests --- .../access-request.component.spec.ts | 65 +++++++++++++++++++ .../delete-user-dialog.component.spec.ts | 55 ++++++++++++++++ .../component/enable-metadata.component.html | 17 ----- .../enable-metadata.component.spec.ts | 65 +++++++++++++++++++ .../user-management.component.spec.ts | 64 ++++++++++++++++++ .../effect/admin-collection.effect.spec.ts | 10 +-- ui/src/app/i18n/effect/message.effect.spec.ts | 7 +- .../wizards/metadata-source-base.spec.ts | 48 ++++++++++++++ .../model/wizards/metadata-source-base.ts | 8 +-- .../component/delete-dialog.component.spec.ts | 55 ++++++++++++++++ .../component/delete-filter.component.spec.ts | 55 ++++++++++++++++ .../file-backed-http.provider.form.spec.ts | 9 +++ .../component/finish-form.component.html | 2 +- .../component/finish-form.component.spec.ts | 2 +- 14 files changed, 427 insertions(+), 35 deletions(-) create mode 100644 ui/src/app/admin/component/access-request.component.spec.ts create mode 100644 ui/src/app/admin/component/delete-user-dialog.component.spec.ts create mode 100644 ui/src/app/admin/component/enable-metadata.component.spec.ts create mode 100644 ui/src/app/admin/component/user-management.component.spec.ts create mode 100644 ui/src/app/metadata/manager/component/delete-dialog.component.spec.ts create mode 100644 ui/src/app/metadata/provider/component/delete-filter.component.spec.ts diff --git a/ui/src/app/admin/component/access-request.component.spec.ts b/ui/src/app/admin/component/access-request.component.spec.ts new file mode 100644 index 000000000..5c236e63c --- /dev/null +++ b/ui/src/app/admin/component/access-request.component.spec.ts @@ -0,0 +1,65 @@ +import { Component, ViewChild } from '@angular/core'; +import { TestBed, async, ComponentFixture } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { NgbDropdownModule, NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { Store, StoreModule, combineReducers } from '@ngrx/store'; +import { FormsModule } from '@angular/forms'; + +import { NgbModalStub } from '../../../testing/modal.stub'; +import { AccessRequestComponent } from './access-request.component'; +import * as fromAdmin from '../reducer'; +import * as fromCore from '../../core/reducer'; + +@Component({ + template: ` + + ` +}) +class TestHostComponent { + @ViewChild(AccessRequestComponent, { static: true }) + public componentUnderTest: AccessRequestComponent; +} + +describe('Access Request Component', () => { + + let app: AccessRequestComponent; + let fixture: ComponentFixture; + let instance: TestHostComponent; + let store: Store; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + FormsModule, + NgbDropdownModule, + RouterTestingModule, + StoreModule.forRoot({ + admin: combineReducers(fromAdmin.reducers), + core: combineReducers(fromCore.reducers) + }) + ], + declarations: [ + AccessRequestComponent, + TestHostComponent + ], + providers: [ + { + provide: NgbModal, + useClass: NgbModalStub + } + ] + }).compileComponents(); + + store = TestBed.get(Store); + spyOn(store, 'dispatch'); + + fixture = TestBed.createComponent(TestHostComponent); + instance = fixture.componentInstance; + app = instance.componentUnderTest; + fixture.detectChanges(); + })); + + it('should compile without error', async(() => { + expect(app).toBeTruthy(); + })); +}); diff --git a/ui/src/app/admin/component/delete-user-dialog.component.spec.ts b/ui/src/app/admin/component/delete-user-dialog.component.spec.ts new file mode 100644 index 000000000..50acb6d54 --- /dev/null +++ b/ui/src/app/admin/component/delete-user-dialog.component.spec.ts @@ -0,0 +1,55 @@ +import { Component, ViewChild } from '@angular/core'; +import { TestBed, async, ComponentFixture } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; + +import { NgbDropdownModule, NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { DeleteUserDialogComponent } from './delete-user-dialog.component'; + +@Component({ + template: ` + + ` +}) +class TestHostComponent { + @ViewChild(DeleteUserDialogComponent, { static: true }) + public componentUnderTest: DeleteUserDialogComponent; +} + +describe('Delete Dialog (modal) Component', () => { + + let app: DeleteUserDialogComponent; + let fixture: ComponentFixture; + let instance: TestHostComponent; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + NgbDropdownModule, + RouterTestingModule + ], + declarations: [ + DeleteUserDialogComponent, + TestHostComponent + ], + providers: [ + { + provide: NgbActiveModal, + useValue: jasmine.createSpyObj('activeModal', [ + 'close', + 'dismiss' + ]) + } + ] + }).compileComponents(); + + fixture = TestBed.createComponent(TestHostComponent); + instance = fixture.componentInstance; + app = instance.componentUnderTest; + fixture.detectChanges(); + })); + + it('should compile without error', async(() => { + expect(app).toBeTruthy(); + })); +}); diff --git a/ui/src/app/admin/component/enable-metadata.component.html b/ui/src/app/admin/component/enable-metadata.component.html index 7d3558e09..dfe16220c 100644 --- a/ui/src/app/admin/component/enable-metadata.component.html +++ b/ui/src/app/admin/component/enable-metadata.component.html @@ -2,20 +2,3 @@ [entities]="resolvers$ | async" (delete)="deleteResolver($event)" (toggleEnabled)="toggleResolverEnabled($event)"> - - \ No newline at end of file diff --git a/ui/src/app/admin/component/enable-metadata.component.spec.ts b/ui/src/app/admin/component/enable-metadata.component.spec.ts new file mode 100644 index 000000000..3d3132edb --- /dev/null +++ b/ui/src/app/admin/component/enable-metadata.component.spec.ts @@ -0,0 +1,65 @@ +import { Component, ViewChild } from '@angular/core'; +import { TestBed, async, ComponentFixture } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; + +import { NgbDropdownModule, NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap'; + +import { EnableMetadataComponent } from './enable-metadata.component'; + +import * as fromAdmin from '../reducer'; +import { Store, StoreModule, combineReducers } from '@ngrx/store'; +import { NgbModalStub } from '../../../testing/modal.stub'; +import { MockResolversListComponent } from '../../../testing/resolvers-list.component.stub'; + +@Component({ + template: ` + + ` +}) +class TestHostComponent { + @ViewChild(EnableMetadataComponent, { static: true }) + public componentUnderTest: EnableMetadataComponent; +} + +describe('Enable Metadata (modal) Component', () => { + + let app: EnableMetadataComponent; + let fixture: ComponentFixture; + let instance: TestHostComponent; + let store: Store; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + NgbDropdownModule, + RouterTestingModule, + StoreModule.forRoot({ + admin: combineReducers(fromAdmin.reducers) + }) + ], + declarations: [ + EnableMetadataComponent, + TestHostComponent, + MockResolversListComponent + ], + providers: [ + { + provide: NgbModal, + useClass: NgbModalStub + } + ] + }).compileComponents(); + + store = TestBed.get(Store); + spyOn(store, 'dispatch'); + + fixture = TestBed.createComponent(TestHostComponent); + instance = fixture.componentInstance; + app = instance.componentUnderTest; + fixture.detectChanges(); + })); + + it('should compile without error', async(() => { + expect(app).toBeTruthy(); + })); +}); diff --git a/ui/src/app/admin/component/user-management.component.spec.ts b/ui/src/app/admin/component/user-management.component.spec.ts new file mode 100644 index 000000000..53eab38c9 --- /dev/null +++ b/ui/src/app/admin/component/user-management.component.spec.ts @@ -0,0 +1,64 @@ +import { Component, ViewChild } from '@angular/core'; +import { TestBed, async, ComponentFixture } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { Store, StoreModule, combineReducers } from '@ngrx/store'; +import { NgbDropdownModule, NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { FormsModule } from '@angular/forms'; +import { UserManagementComponent } from './user-management.component'; +import { NgbModalStub } from '../../../testing/modal.stub'; +import * as fromAdmin from '../reducer'; +import * as fromCore from '../../core/reducer'; + +@Component({ + template: ` + + ` +}) +class TestHostComponent { + @ViewChild(UserManagementComponent, { static: true }) + public componentUnderTest: UserManagementComponent; +} + +describe('User Management Component', () => { + + let app: UserManagementComponent; + let fixture: ComponentFixture; + let instance: TestHostComponent; + let store: Store; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + FormsModule, + NgbDropdownModule, + RouterTestingModule, + StoreModule.forRoot({ + admin: combineReducers(fromAdmin.reducers), + core: combineReducers(fromCore.reducers) + }) + ], + declarations: [ + UserManagementComponent, + TestHostComponent + ], + providers: [ + { + provide: NgbModal, + useClass: NgbModalStub + } + ] + }).compileComponents(); + + store = TestBed.get(Store); + spyOn(store, 'dispatch'); + + fixture = TestBed.createComponent(TestHostComponent); + instance = fixture.componentInstance; + app = instance.componentUnderTest; + fixture.detectChanges(); + })); + + it('should compile without error', async(() => { + expect(app).toBeTruthy(); + })); +}); diff --git a/ui/src/app/admin/effect/admin-collection.effect.spec.ts b/ui/src/app/admin/effect/admin-collection.effect.spec.ts index 313c4e312..20159f7b8 100644 --- a/ui/src/app/admin/effect/admin-collection.effect.spec.ts +++ b/ui/src/app/admin/effect/admin-collection.effect.spec.ts @@ -6,7 +6,7 @@ import { AdminCollectionEffects } from './admin-collection.effect'; import { AdminService } from '../service/admin.service'; import { Admin } from '../model/admin'; import { LoadAdminRequest, LoadAdminSuccess, UpdateAdminSuccess } from '../action/admin-collection.action'; -import { AddNotification } from '../../notification/action/notification.action'; +import { AddNotification, ADD_NOTIFICATION } from '../../notification/action/notification.action'; import { NotificationType, Notification } from '../../notification/model/notification'; describe('Admin Collection Effects', () => { @@ -77,13 +77,7 @@ describe('Admin Collection Effects', () => { actions.next(new UpdateAdminSuccess(payload)); effects.updateAdminRoleSuccess$.subscribe(result => { - expect(result).toEqual(new AddNotification( - new Notification( - NotificationType.Success, - `User update successful for ${payload.changes.username}`, - 5000 - ) - )); + expect(result.type).toEqual(ADD_NOTIFICATION); }); }); }); diff --git a/ui/src/app/i18n/effect/message.effect.spec.ts b/ui/src/app/i18n/effect/message.effect.spec.ts index a0b628e6f..5f03b662c 100644 --- a/ui/src/app/i18n/effect/message.effect.spec.ts +++ b/ui/src/app/i18n/effect/message.effect.spec.ts @@ -10,7 +10,7 @@ import { I18nService } from '../service/i18n.service'; import { StoreModule, combineReducers, Store } from '@ngrx/store'; import * as fromI18n from '../reducer'; -xdescribe('I18n Message Effects', () => { +describe('I18n Message Effects', () => { let effects: MessageEffects; let actions: Subject; let i18nService: I18nService; @@ -20,7 +20,7 @@ xdescribe('I18n Message Effects', () => { TestBed.configureTestingModule({ imports: [ StoreModule.forRoot({ - core: combineReducers(fromI18n.reducers, { + i18n: combineReducers(fromI18n.reducers, { messages: { fetching: false, messages: null, @@ -32,7 +32,8 @@ xdescribe('I18n Message Effects', () => { ], providers: [ { - provide: I18nService, useValue: { + provide: I18nService, + useValue: { get: (locale: string) => of({}) } }, diff --git a/ui/src/app/metadata/domain/model/wizards/metadata-source-base.spec.ts b/ui/src/app/metadata/domain/model/wizards/metadata-source-base.spec.ts index f9d614c2e..0e4c84e6c 100644 --- a/ui/src/app/metadata/domain/model/wizards/metadata-source-base.spec.ts +++ b/ui/src/app/metadata/domain/model/wizards/metadata-source-base.spec.ts @@ -44,5 +44,53 @@ describe('Metadata Source Base class', () => { '/relyingPartyOverrides' ]); }); + + describe('root validator', () => { + it('should check for child errors', () => { + const validators = getValidators([]); + const validator = validators['/']; + const getPropertySpy = jasmine.createSpy('getProperty'); + const relyingPartyOverrides = { foo: 'bar', baz: 'foo' }; + const value = { relyingPartyOverrides }; + const error = { + code: 'INVALID_SIGNING', + path: `#/relyingPartyOverrides`, + message: 'message.invalid-signing', + params: [relyingPartyOverrides] + }; + spyOn(validators, '/relyingPartyOverrides').and.returnValue(error); + + const validated = validator(value, null, { getProperty: getPropertySpy }); + + expect(validated).toEqual([error]); + }); + }); + + describe('relying party validator', () => { + it('should check for child errors', () => { + const validators = getValidators([]); + const validator = validators['/relyingPartyOverrides']; + const relyingPartyOverrides = { signAssertion: false, dontSignResponse: true }; + const error = { + code: 'INVALID_SIGNING', + path: `#/relyingPartyOverrides`, + message: 'message.invalid-signing', + params: [relyingPartyOverrides] + }; + + const validated = validator(relyingPartyOverrides, {path: '/relyingPartyOverrides'}); + + expect(validated).toEqual(error); + }); + + it('should return null if no error detected', () => { + const validators = getValidators([]); + const validator = validators['/relyingPartyOverrides']; + + expect(validator({ signAssertion: true, dontSignResponse: true }, { path: '/relyingPartyOverrides' })).toEqual(null); + expect(validator({ signAssertion: true, dontSignResponse: false }, { path: '/relyingPartyOverrides' })).toEqual(null); + expect(validator({ signAssertion: false, dontSignResponse: false }, { path: '/relyingPartyOverrides' })).toEqual(null); + }); + }); }); }); diff --git a/ui/src/app/metadata/domain/model/wizards/metadata-source-base.ts b/ui/src/app/metadata/domain/model/wizards/metadata-source-base.ts index 0e8a0c209..360979782 100644 --- a/ui/src/app/metadata/domain/model/wizards/metadata-source-base.ts +++ b/ui/src/app/metadata/domain/model/wizards/metadata-source-base.ts @@ -90,17 +90,15 @@ export class MetadataSourceBase implements Wizard { return err; }, '/relyingPartyOverrides': (value, property, form) => { - let errors; if (!value.signAssertion && value.dontSignResponse) { - errors = []; - errors.push({ + return { code: 'INVALID_SIGNING', path: `#${property.path}`, message: 'message.invalid-signing', params: [value] - }); + }; } - return errors; + return null; } }; return validators; diff --git a/ui/src/app/metadata/manager/component/delete-dialog.component.spec.ts b/ui/src/app/metadata/manager/component/delete-dialog.component.spec.ts new file mode 100644 index 000000000..ec8fdc665 --- /dev/null +++ b/ui/src/app/metadata/manager/component/delete-dialog.component.spec.ts @@ -0,0 +1,55 @@ +import { Component, ViewChild } from '@angular/core'; +import { TestBed, async, ComponentFixture } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; + +import { NgbDropdownModule, NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { DeleteDialogComponent } from './delete-dialog.component'; + +@Component({ + template: ` + + ` +}) +class TestHostComponent { + @ViewChild(DeleteDialogComponent, { static: true }) + public componentUnderTest: DeleteDialogComponent; +} + +describe('Delete Dialog (modal) Component', () => { + + let app: DeleteDialogComponent; + let fixture: ComponentFixture; + let instance: TestHostComponent; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + NgbDropdownModule, + RouterTestingModule + ], + declarations: [ + DeleteDialogComponent, + TestHostComponent + ], + providers: [ + { + provide: NgbActiveModal, + useValue: jasmine.createSpyObj('activeModal', [ + 'close', + 'dismiss' + ]) + } + ] + }).compileComponents(); + + fixture = TestBed.createComponent(TestHostComponent); + instance = fixture.componentInstance; + app = instance.componentUnderTest; + fixture.detectChanges(); + })); + + it('should compile without error', async(() => { + expect(app).toBeTruthy(); + })); +}); diff --git a/ui/src/app/metadata/provider/component/delete-filter.component.spec.ts b/ui/src/app/metadata/provider/component/delete-filter.component.spec.ts new file mode 100644 index 000000000..08b4007cc --- /dev/null +++ b/ui/src/app/metadata/provider/component/delete-filter.component.spec.ts @@ -0,0 +1,55 @@ +import { Component, ViewChild } from '@angular/core'; +import { TestBed, async, ComponentFixture } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; + +import { NgbDropdownModule, NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { DeleteFilterComponent } from './delete-filter.component'; + +@Component({ + template: ` + + ` +}) +class TestHostComponent { + @ViewChild(DeleteFilterComponent, { static: true }) + public componentUnderTest: DeleteFilterComponent; +} + +describe('Delete Filter (modal) Component', () => { + + let app: DeleteFilterComponent; + let fixture: ComponentFixture; + let instance: TestHostComponent; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + NgbDropdownModule, + RouterTestingModule + ], + declarations: [ + DeleteFilterComponent, + TestHostComponent + ], + providers: [ + { + provide: NgbActiveModal, + useValue: jasmine.createSpyObj('activeModal', [ + 'close', + 'dismiss' + ]) + } + ] + }).compileComponents(); + + fixture = TestBed.createComponent(TestHostComponent); + instance = fixture.componentInstance; + app = instance.componentUnderTest; + fixture.detectChanges(); + })); + + it('should compile without error', async(() => { + expect(app).toBeTruthy(); + })); +}); diff --git a/ui/src/app/metadata/provider/model/file-backed-http.provider.form.spec.ts b/ui/src/app/metadata/provider/model/file-backed-http.provider.form.spec.ts index 68e19359b..4176905de 100644 --- a/ui/src/app/metadata/provider/model/file-backed-http.provider.form.spec.ts +++ b/ui/src/app/metadata/provider/model/file-backed-http.provider.form.spec.ts @@ -117,5 +117,14 @@ describe('FileBackedHttpMetadataProviderWizard', () => { '/metadataURL' ]); }); + + it('should validate the metadataUrl format', () => { + const validators = getValidators(); + const path = '/metadataURL'; + const validator = validators[path]; + + expect(validator('foo', { path })).toBeDefined(); + expect(validator('http://foo.com', { path })).toBeNull(); + }); }); }); diff --git a/ui/src/app/metadata/resolver/component/finish-form.component.html b/ui/src/app/metadata/resolver/component/finish-form.component.html index 881c68206..8a3388f3f 100644 --- a/ui/src/app/metadata/resolver/component/finish-form.component.html +++ b/ui/src/app/metadata/resolver/component/finish-form.component.html @@ -1,5 +1,5 @@
-
+
diff --git a/ui/src/app/metadata/resolver/component/finish-form.component.spec.ts b/ui/src/app/metadata/resolver/component/finish-form.component.spec.ts index 4bf37267c..31cd48302 100644 --- a/ui/src/app/metadata/resolver/component/finish-form.component.spec.ts +++ b/ui/src/app/metadata/resolver/component/finish-form.component.spec.ts @@ -83,7 +83,7 @@ describe('Finished Form Component', () => { expect(form.form.reset).toHaveBeenCalled(); }); - xit('should reset the form with serviceEnabled = false if no resolver', () => { + it('should reset the form with serviceEnabled = false if no resolver', () => { spyOn(form.form, 'reset').and.callThrough(); delete instance.resolver; fixture.detectChanges();