Skip to content

Commit

Permalink
feat(ComponentRenderer): Added unit tests for component renderer service
Browse files Browse the repository at this point in the history
  • Loading branch information
Brandon Roberts committed Mar 31, 2016
1 parent a74f38d commit 10c31cc
Showing 1 changed file with 125 additions and 0 deletions.
125 changes: 125 additions & 0 deletions spec/component-renderer.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
import 'rxjs/add/operator/toPromise';
import { Subject } from 'rxjs/Subject';
import { Observable } from 'rxjs/Observable';
import { Injector, provide, DynamicComponentLoader, ElementRef } from 'angular2/core';
import { Location } from '../lib/location';
import { ComponentRenderer, RENDER_MIDDLEWARE, useRenderMiddleware } from '../lib/component-renderer';
import { Route } from '../lib/route';
import { createMiddleware } from '../lib/middleware';

class MockDCL {
loadNextToLocation: Function = jasmine.createSpy('loadNextToLocation').and.returnValue(Observable.of(true).toPromise())
}

class TestComponent{}

describe('Component Renderer', function() {
let route: Route,
renderer: ComponentRenderer,
injector: Injector,
loader: any;

describe('Rendering', () => {
let route;
let elementRef = {};
let providers = [];

beforeEach(() => {
injector = Injector.resolveAndCreate([
ComponentRenderer,
provide(RENDER_MIDDLEWARE, { useValue: [] }),
provide(DynamicComponentLoader, {useClass: MockDCL})
]);

renderer = injector.get(ComponentRenderer);
loader = injector.get(DynamicComponentLoader);
});

it('should render a component', (done) => {
route = { component: TestComponent };
let render = renderer.render(route, injector, <ElementRef>elementRef, loader, providers);

render.subscribe(() => {
expect(loader.loadNextToLocation).toHaveBeenCalledWith(route.component, elementRef, providers);
done();
});
});

it('should render a loaded component', (done) => {
route = {
loadComponent(cb) {
cb(TestComponent);
}
};
let render = renderer.render(route, injector, <ElementRef>elementRef, loader, providers);

render.subscribe(() => {
expect(loader.loadNextToLocation).toHaveBeenCalledWith(TestComponent, elementRef, providers);
done();
});
});
});

describe('Middleware', () => {
let route: Route = { component: TestComponent };
let providers = [];
let elementRef = {};
let middlewareProviders = [
provide('test', {useValue: 'tester'})
];
let middlewareSpy = jasmine.createSpy('middleware');
let renderMiddleware;
let render;

beforeEach(() => {
renderMiddleware = createMiddleware(function(instruction$) {
return (instruction$) => instruction$.map((ins) => {
middlewareSpy();

return {
component: 'newComponent',
injector: injector,
providers: middlewareProviders
};
});
}, []);

injector = Injector.resolveAndCreate([
ComponentRenderer,
useRenderMiddleware(renderMiddleware),
provide(DynamicComponentLoader, {useClass: MockDCL})
]);

renderer = injector.get(ComponentRenderer);
loader = injector.get(DynamicComponentLoader);
});

beforeEach(() => {
render = renderer.render(route, injector, <ElementRef>elementRef, loader, providers);
});

it('should execute before rendering', (done) => {
render.subscribe(() => {
expect(middlewareSpy).toHaveBeenCalled();
expect(loader.loadNextToLocation).toHaveBeenCalled();
done();
});
});

it('can modify the providers', (done) => {
render.subscribe(() => {
expect(loader.loadNextToLocation).toHaveBeenCalled();
expect(loader.loadNextToLocation.calls.mostRecent().args[2]).not.toEqual(providers);
done();
});
});

it('can modify the component', (done) => {
render.subscribe(() => {
expect(loader.loadNextToLocation).toHaveBeenCalled();
expect(loader.loadNextToLocation.calls.mostRecent().args[0]).toEqual('newComponent');
done();
});
});
});
});

0 comments on commit 10c31cc

Please sign in to comment.