ohayolibs
Version:
Ohayo is a set of essential modules for ohayojp.
175 lines (163 loc) • 5.69 kB
text/typescript
import { HttpClient, HTTP_INTERCEPTORS } from '@angular/common/http';
import { HttpClientTestingModule, HttpTestingController, TestRequest } from '@angular/common/http/testing';
import { Type } from '@angular/core';
import { TestBed } from '@angular/core/testing';
import { DefaultUrlSerializer, Router } from '@angular/router';
import { RouterTestingModule } from '@angular/router/testing';
import { OhayoAuthConfig, OHAYO_CONFIG } from '@ohayo/util';
import { Observable } from 'rxjs';
import { OhayoAuthModule } from '../../auth.module';
import { DA_SERVICE_TOKEN, ITokenModel, ITokenService } from '../interface';
import { SimpleInterceptor } from './simple.interceptor';
import { SimpleTokenModel } from './simple.model';
function genModel(token: string = `123`): SimpleTokenModel {
const model = new SimpleTokenModel();
model.token = token;
model.uid = 1;
return model;
}
class MockTokenService implements ITokenService {
[key: string]: any;
_data: any;
options: any;
refresh: Observable<ITokenModel>;
set(data: ITokenModel): boolean {
this._data = data;
return true;
}
get(): ITokenModel {
return this._data;
}
change(): any {
return null;
}
clear(): void {
this._data = null;
}
get login_url(): string {
return '/login';
}
}
describe('auth: simple.interceptor', () => {
let http: HttpClient;
let httpBed: HttpTestingController;
const mockRouter = {
navigate: jasmine.createSpy('navigate'),
parseUrl: jasmine.createSpy('parseUrl').and.callFake((value: any) => {
return new DefaultUrlSerializer().parse(value);
}),
};
function genModule(options: OhayoAuthConfig, tokenData?: SimpleTokenModel): void {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule, RouterTestingModule.withRoutes([]), OhayoAuthModule],
providers: [
{ provide: OHAYO_CONFIG, useValue: { auth: options } },
{ provide: Router, useValue: mockRouter },
{
provide: HTTP_INTERCEPTORS,
useClass: SimpleInterceptor,
multi: true,
},
{ provide: DA_SERVICE_TOKEN, useClass: MockTokenService },
],
});
if (tokenData) TestBed.inject(DA_SERVICE_TOKEN).set(tokenData);
http = TestBed.inject<HttpClient>(HttpClient);
httpBed = TestBed.inject(HttpTestingController as Type<HttpTestingController>);
}
describe('[token position]', () => {
it(`in headers`, (done: () => void) => {
const basicModel = genModel();
genModule({}, basicModel);
http.get('/test', { responseType: 'text' }).subscribe(() => {
done();
});
const req = httpBed.expectOne('/test') as TestRequest;
expect(req.request.headers.get('token')).toBe(basicModel.token);
req.flush('ok!');
});
it(`in body`, (done: () => void) => {
genModule(
{
token_send_place: 'body',
},
genModel('123'),
);
http.get('/test', { responseType: 'text' }).subscribe(() => {
done();
});
const req = httpBed.expectOne('/test') as TestRequest;
expect(req.request.body.token).toBe('123');
req.flush('ok!');
});
it(`in url`, (done: () => void) => {
genModule(
{
token_send_place: 'url',
},
genModel('123'),
);
http.get('/test', { responseType: 'text' }).subscribe(() => {
done();
});
const req = httpBed.expectOne(() => true) as TestRequest;
expect(req.request.params.has('token')).toBe(true);
expect(req.request.params.get('token')).toBe('123');
req.flush('ok!');
});
it(`in url via full-domain`, (done: () => void) => {
genModule(
{
token_send_place: 'url',
},
genModel('123'),
);
http.get('https://ohayojp.com/test', { responseType: 'text' }).subscribe(() => {
done();
});
const req = httpBed.expectOne(() => true) as TestRequest;
expect(req.request.params.has('token')).toBe(true);
expect(req.request.params.get('token')).toBe('123');
req.flush('ok!');
});
});
describe('[token template]', () => {
const basicModel = genModel();
// tslint:disable-next-line:no-invalid-template-strings
it('should be [Bearer ${token}]', (done: () => void) => {
genModule(
{
token_send_place: 'header',
token_send_key: 'Authorization',
// tslint:disable-next-line:no-invalid-template-strings
token_send_template: 'Bearer ${token}',
},
basicModel,
);
http.get('/test', { responseType: 'text' }).subscribe(() => {
done();
});
const ret = httpBed.expectOne(r => r.method === 'GET' && (r.url as string).startsWith('/test')) as TestRequest;
expect(ret.request.headers.get('Authorization')).toBe(`Bearer ${basicModel.token}`);
ret.flush('ok!');
});
// tslint:disable-next-line:no-invalid-template-strings
it('should be [Bearer ${uid}-${token}]', (done: () => void) => {
genModule(
{
token_send_place: 'header',
token_send_key: 'Authorization',
// tslint:disable-next-line:no-invalid-template-strings
token_send_template: 'Bearer ${uid}-${token}',
},
basicModel,
);
http.get('/test', { responseType: 'text' }).subscribe(() => {
done();
});
const ret = httpBed.expectOne(r => r.method === 'GET' && (r.url as string).startsWith('/test')) as TestRequest;
expect(ret.request.headers.get('Authorization')).toBe(`Bearer ${basicModel.uid}-${basicModel.token}`);
ret.flush('ok!');
});
});
});