UNPKG

bixi

Version:

企业级中后台前端解决方案

178 lines (161 loc) 5.84 kB
import { DOCUMENT } from '@angular/common'; import { HttpClientTestingModule } from '@angular/common/http/testing'; import { discardPeriodicTasks, fakeAsync, TestBed, tick } from '@angular/core/testing'; import { DefaultUrlSerializer, Router } from '@angular/router'; import { RouterTestingModule } from '@angular/router/testing'; import { BixiAuthModule } from '../auth.module'; import { BIXI_SERVICE_TOKEN, ITokenModel } from '../token/interface'; import { SimpleTokenModel } from '../token/simple/simple.model'; import { SocialService } from './social.service'; const mockRouter = { url: '', navigate: jasmine.createSpy('navigate'), navigateByUrl: jasmine.createSpy('navigateByUrl'), // tslint:disable-next-line:no-any parseUrl: jasmine.createSpy('parseUrl').and.callFake((value: any) => { return new DefaultUrlSerializer().parse(value); }) }; class MockDocument { location = new MockLocation(); } class MockLocation { private url: string; get href(): string { return this.url; } set href(url: string) { this.url = url; } } const MockAuth0 = { type: 'auth0', url: `//datagrand.auth0.com/login?client=8gcNydIDzGBYxzqV0Vm1CX_RXH-wsWo5&redirect_uri=${ decodeURIComponent( 'http://localhost:4200/#/login/callback' ) }`, be: { client: '8gcNydIDzGBYxzqV0Vm1CX_RXH-wsWo5' }, model: { client: '8gcNydIDzGBYxzqV0Vm1CX_RXH-wsWo5', token: '123' } }; describe('auth: social.service', () => { let srv: SocialService; function genModule(tokenData?: SimpleTokenModel) { TestBed.configureTestingModule({ imports: [HttpClientTestingModule, RouterTestingModule.withRoutes([]), BixiAuthModule], providers: [SocialService, { provide: DOCUMENT, useClass: MockDocument }, { provide: Router, useValue: mockRouter }] }); if (tokenData) TestBed.inject(BIXI_SERVICE_TOKEN).set(tokenData); srv = TestBed.inject<SocialService>(SocialService); } beforeEach(() => { genModule(); }); afterEach(() => srv.ngOnDestroy()); describe('#login', () => { // tslint:disable-next-line:no-any [MockAuth0].forEach((item: any) => { it(`${ item.type } via href`, () => { srv.login(item.url, '/', { type: 'href' }); const ret = TestBed.inject(DOCUMENT).location.href; Object.keys(item.be).forEach(key => { const expected = `${ key }=${ item.be[key] }`; expect(ret).toContain(expected, `muse contain "${ expected }"`); }); }); it(`${ item.type } via window`, fakeAsync(() => { const mockWindowOpen = () => { TestBed.inject(BIXI_SERVICE_TOKEN).set(item.model); return { closed: true }; }; // tslint:disable-next-line:no-any spyOn(window, 'open').and.callFake(mockWindowOpen as any); srv.login(item.url).subscribe(() => { }); tick(130); expect(window.open).toHaveBeenCalled(); const token = TestBed.inject(BIXI_SERVICE_TOKEN).get()!; Object.keys(item.be).forEach(key => { expect(token[key]).toContain(item.be[key]); }); discardPeriodicTasks(); })); }); it(`should be return null model if set a null in window`, fakeAsync(() => { const mockWindowOpen = () => { TestBed.inject(BIXI_SERVICE_TOKEN).set(null); return { closed: true }; }; // tslint:disable-next-line:no-any spyOn(window, 'open').and.callFake(mockWindowOpen as any); srv.login(MockAuth0.url).subscribe(() => { }); tick(130); expect(window.open).toHaveBeenCalled(); discardPeriodicTasks(); })); it(`can't get model until closed`, fakeAsync(() => { spyOn(srv, 'ngOnDestroy'); const mockWindowOpen = () => { TestBed.inject(BIXI_SERVICE_TOKEN).set(null); return { closed: false }; }; // tslint:disable-next-line:no-any spyOn(window, 'open').and.callFake(mockWindowOpen as any); srv.login(MockAuth0.url).subscribe(() => { }); tick(130); expect(window.open).toHaveBeenCalled(); expect(srv.ngOnDestroy).not.toHaveBeenCalled(); discardPeriodicTasks(); })); }); describe('#callback', () => { const jwtToken = `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwibmFtZSI6ImNpcGNoayIsImFkbWluIjp0cnVlLCJleHAiOjE1MTQ2NDk2MDB9.nocpzY3UnRLJXg6I7unzvH4JUzcBRYBtf_xQ41xCcTw`; const swtData: ITokenModel = { token: '1234567890-34567890', user: 'datagrand', uid: 1, role: 'admin', permission: [1, 2, 3, 4] }; [ { summary: 'swt via url', url: 'http://localhost:4200/login/callback?token=40SOJV-L8oOwwUIs&name=datagrand&uid=1', be: { token: '40SOJV-L8oOwwUIs', name: 'datagrand', uid: '1' } }, { summary: 'jwt via url', url: `http://localhost:4200/login/callback?token=${ jwtToken }`, be: { token: jwtToken } }, { summary: 'url muse contain a ?', url: 'http://localhost:4200/callback', be: 'throw' }, { summary: 'invalide token data', url: 'http://localhost:4200/?code=40SOJV-L8oOwwUIs#/login/callback', be: 'throw' }, { summary: 'via ITokenModel', url: swtData, be: swtData } // tslint:disable-next-line:no-any ].forEach((item: any) => { it(`${ item.summary }`, () => { if (item.be === 'throw') { // tslint:disable-next-line:no-any const router = TestBed.inject<Router>(Router) as any; router.url = item.url; expect(() => { srv.callback(null); }).toThrow(); return; } const ret = srv.callback(item.url); Object.keys(item.be).forEach(key => { expect(ret[key]).toBe(item.be[key]); }); }); }); }); });