Skip to content
This repository has been archived by the owner on May 8, 2020. It is now read-only.

Commit

Permalink
feat(middleware): Add tests for all middleware classes and decorators
Browse files Browse the repository at this point in the history
  • Loading branch information
zakhenry committed Jun 16, 2016
1 parent 12a7393 commit 4e51451
Show file tree
Hide file tree
Showing 16 changed files with 313 additions and 32 deletions.
10 changes: 2 additions & 8 deletions src/common/models/collection.spec.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,5 @@
import {
it, xit,
inject,
describe, xdescribe, fdescribe,
beforeEachProviders,
expect
} from '@angular/core/testing';
import { UUID, Model, primary } from './model';
import { it, describe, beforeEach, expect } from '@angular/core/testing';
import { Model, primary } from './model';
import { Collection } from './collection';

class BasicModel extends Model {
Expand Down
2 changes: 1 addition & 1 deletion src/common/models/model.spec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { it, describe, expect } from '@angular/core/testing';
import { it, describe, expect, beforeEach } from '@angular/core/testing';
import { UUID, Model, primary } from './model';
import { castDate } from '../types/date.decorator';
import * as moment from 'moment';
Expand Down
3 changes: 3 additions & 0 deletions src/common/services/consoleLogger.service.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import { Logger, LogLevel } from './logger.service';
import { yellow, red, bgRed, magenta, gray, blue, bgYellow } from 'chalk';
import { inspect } from 'util';
import { Injectable } from '@angular/core';
import * as moment from 'moment';

@Injectable()
export class ConsoleLogger extends Logger {

constructor() {
Expand Down
15 changes: 15 additions & 0 deletions src/common/services/logger.service.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { Logger, LogLevel } from './logger.service';
import { Injectable } from '@angular/core';

@Injectable()
export class LoggerMock extends Logger {

constructor() {
super(LoggerMock);
}

public persistLog(logLevel: LogLevel, messages: any[]): Promise<this>|this {
return this;
}

}
3 changes: 3 additions & 0 deletions src/common/services/logger.service.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { Injectable } from '@angular/core';

const tableModule = require('table');
const table: Table = tableModule.default;

Expand Down Expand Up @@ -69,6 +71,7 @@ export interface Table {
(data: any[][], config?: TableConfig): string;
}

@Injectable()
export abstract class Logger {

protected sourceName: string;
Expand Down
20 changes: 10 additions & 10 deletions src/server/controllers/abstract.controller.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Server } from '../servers/abstract.server';
import { Injectable, ReflectiveInjector } from '@angular/core';
import { Injectable, Injector } from '@angular/core';
import { Logger } from '../../common/services/logger.service';
import { InjectableMiddlewareFactory, MiddlewareFactory } from '../middleware/index';
import { PromiseFactory } from '../../common/util/serialPromise';
Expand Down Expand Up @@ -39,7 +39,7 @@ export abstract class AbstractController {

protected routeBase: string;
protected logger: Logger;
private injector: ReflectiveInjector;
private injector: Injector;

constructor(protected server: Server, logger: Logger) {
this.logger = logger.source('controller');
Expand All @@ -52,7 +52,7 @@ export abstract class AbstractController {
* @param injector
* @returns {AbstractController}
*/
public registerInjector(injector: ReflectiveInjector) {
public registerInjector(injector: Injector) {
this.injector = injector;
return this;
}
Expand Down Expand Up @@ -99,7 +99,6 @@ export abstract class AbstractController {
}

return this;

}

/**
Expand All @@ -116,18 +115,19 @@ export abstract class AbstractController {

if (this.registeredMiddleware){
const methodMiddlewareFactories = this.registeredMiddleware.methods.get(methodSignature);
//wrap method registered factories with the class defined ones
methodMiddlewareFactories.before.unshift(...this.registeredMiddleware.all.before);
methodMiddlewareFactories.after.push(...this.registeredMiddleware.all.after);

//wrap method registered factories with the class defined ones [beforeAll, before, after, afterAll]
const beforeMiddleware = this.registeredMiddleware.all.before.concat(methodMiddlewareFactories.before);
const afterMiddleware = methodMiddlewareFactories.after.concat(this.registeredMiddleware.all.after);

if (methodMiddlewareFactories) {
callStack.unshift(...methodMiddlewareFactories.before.map((middleware: MiddlewareFactory) => middleware(this.injector)));
callStack.push(...methodMiddlewareFactories.after.map((middleware: MiddlewareFactory) => middleware(this.injector)));
callStack.unshift(...beforeMiddleware.map((middleware: MiddlewareFactory) => middleware(this.injector)));
callStack.push(...afterMiddleware.map((middleware: MiddlewareFactory) => middleware(this.injector)));
}
}


this.server.register({
methodName: methodSignature,
method: methodDefinition.method,
path: `/api/${this.routeBase}${methodDefinition.route}`,
callStack: callStack,
Expand Down
96 changes: 96 additions & 0 deletions src/server/middleware/debugLog.middleware.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import {
it,
inject,
beforeEachProviders,
expect,
describe,
fdescribe
} from '@angular/core/testing';
import { IsolatedMiddlewareFactory } from './index';
import { Request } from '../controllers/request';
import { Response } from '../controllers/response';
import { Action } from '../controllers/action.decorator';
import { AfterAll, BeforeAll, Before, After } from './middleware.decorator';
import { AbstractController } from '../controllers/abstract.controller';
import { Injectable, Injector, Provider, provide } from '@angular/core';
import { Logger } from '../../common/services/logger.service';
import { Server, RouteConfig } from '../servers/abstract.server';
import { LoggerMock } from '../../common/services/logger.service.spec';
import { ServerMock } from '../servers/abstract.server.spec';
import { RemoteCli } from '../services/remoteCli.service';
import { RemoteCliMock } from '../services/remoteCli.service.spec';
import { PromiseFactory } from '../../common/util/serialPromise';
import { debugLog, DebugLogMiddleware } from './debugLog.middleware';

@Injectable()
class MiddlewareController extends AbstractController {

constructor(server: Server, logger: Logger) {
super(server, logger);
}

@Action('GET', '/test')
@Before(debugLog('test log input'))
public testMethod(request: Request, response: Response): Response {
return response;
}

}

let source: string, logs: any[] = [];

let mockLogger = {
source: (input: string) => {
source = input;
return mockLogger;
},
debug: (input: string) => {
logs.push(input);
}
};

const providers = [
MiddlewareController,
provide(Server, {useClass: ServerMock}),
provide(Logger, {useClass: LoggerMock}),
provide(RemoteCli, {useClass: RemoteCliMock}),
provide(DebugLogMiddleware, {
deps: [],
useFactory: () => {
return new DebugLogMiddleware(<Logger>mockLogger)
},
})
];

describe('debugLog middleware', () => {

let controller: MiddlewareController;

beforeEachProviders(() => providers);

it('Calls debug.log on the passed value to the middleware decorator',
inject([MiddlewareController, Injector, Server],
(c: MiddlewareController, i: Injector, s: Server) => {

controller = c.registerInjector(i)
.registerRoutes();

const callStackHandler: any = s.getRoutes()
.find((route: RouteConfig) => route.methodName == 'testMethod').callStackHandler;

let request = new Request();
let response = new Response();

return callStackHandler(request, response)
.then(() => {

expect(source)
.toEqual('debugLog');
expect(logs)
.toEqual(['test log input']);

});

}));

});
8 changes: 4 additions & 4 deletions src/server/middleware/debugLog.middleware.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,24 +9,24 @@ export class DebugLogMiddleware implements InjectableMiddleware {
protected logger: Logger;

constructor(loggerBase: Logger) {
console.log('initialized log middleware', loggerBase);
this.logger = loggerBase.source('Log middleware');
this.logger = loggerBase.source('debugLog');
}

public middlewareFactory(messages: string[]): Middleware {

return function debugLog(request: Request, response: Response): Response {
this.logger.debug(...messages);
return response;
}
}.bind(this);

}
}

export function debugLog(...messages: string[]): InjectableMiddlewareFactory {

return (injector: ReflectiveInjector): Middleware => {
return injector.get(DebugLogMiddleware)
.middlewareFactory(messages)
.middlewareFactory(messages);
}

}
6 changes: 3 additions & 3 deletions src/server/middleware/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ReflectiveInjector } from '@angular/core';
import { Injector } from '@angular/core';
import { Response } from '../controllers/response';
import { Request } from '../controllers/request';

Expand All @@ -11,11 +11,11 @@ export interface InjectableMiddleware {
}

export interface InjectableMiddlewareFactory {
(injector: ReflectiveInjector): Middleware;
(injector: Injector): Middleware;
}

export interface IsolatedMiddlewareFactory {
(injector?: ReflectiveInjector): Middleware;
(injector?: Injector): Middleware;
}

export type MiddlewareFactory = InjectableMiddlewareFactory | IsolatedMiddlewareFactory;
Expand Down
5 changes: 2 additions & 3 deletions src/server/middleware/middleware.decorator.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { AbstractController, MiddlewareRegistry } from '../controllers/abstract.controller';
import { MiddlewareFactory } from './index';
import { initializeRelationMap } from '../../common/relations/index';

/**
* Decorator for assigning before middleware method in a controller
Expand Down Expand Up @@ -51,7 +50,7 @@ export function initializeMiddlewareRegister(target: AbstractController): void {
export function BeforeAll(...middlewareFactories: MiddlewareFactory[]): ClassDecorator {
return function (target: Function): void {
initializeMiddlewareRegister(target.prototype);
target.prototype.registeredMiddleware.all.before.push(...middlewareFactories);
target.prototype.registeredMiddleware.all.before = middlewareFactories;
}
}

Expand All @@ -64,6 +63,6 @@ export function BeforeAll(...middlewareFactories: MiddlewareFactory[]): ClassDec
export function AfterAll(...middlewareFactories: MiddlewareFactory[]): ClassDecorator {
return function (target: Function): void {
initializeMiddlewareRegister(target.prototype);
target.prototype.registeredMiddleware.all.after.push(...middlewareFactories);
target.prototype.registeredMiddleware.all.after = middlewareFactories;
}
}
Loading

0 comments on commit 4e51451

Please sign in to comment.