Skip to content

Commit

Permalink
fix(DI): alias registration param order and tests (#202)
Browse files Browse the repository at this point in the history
There was a small bug in the alias registration fluent API for InterfaceSymbol as well as a number of incorrect tests.
  • Loading branch information
EisenbergEffect committed Sep 28, 2018
1 parent 48c4151 commit 1683135
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 36 deletions.
11 changes: 6 additions & 5 deletions packages/kernel/src/di.ts
Original file line number Diff line number Diff line change
Expand Up @@ -129,21 +129,22 @@ export const DI = {
};

Key.register = function(container: IContainer, key?: Key<T>): IResolver<T> {
const trueKey = key || Key;
return configure({
instance(value: T): IResolver {
return container.registerResolver(Key, new Resolver(key || Key, ResolverStrategy.instance, value));
return container.registerResolver(trueKey, new Resolver(trueKey, ResolverStrategy.instance, value));
},
singleton(value: Function): IResolver {
return container.registerResolver(Key, new Resolver(key || Key, ResolverStrategy.singleton, value));
return container.registerResolver(trueKey, new Resolver(trueKey, ResolverStrategy.singleton, value));
},
transient(value: Function): IResolver {
return container.registerResolver(Key, new Resolver(key || Key, ResolverStrategy.transient, value));
return container.registerResolver(trueKey, new Resolver(trueKey, ResolverStrategy.transient, value));
},
callback(value: ResolveCallback): IResolver {
return container.registerResolver(Key, new Resolver(key || Key, ResolverStrategy.callback, value));
return container.registerResolver(trueKey, new Resolver(trueKey, ResolverStrategy.callback, value));
},
aliasTo(destinationKey: T): IResolver {
return container.registerResolver(destinationKey, new Resolver(key || Key, ResolverStrategy.alias, Key));
return container.registerResolver(trueKey, new Resolver(trueKey, ResolverStrategy.alias, destinationKey));
},
});
};
Expand Down
35 changes: 12 additions & 23 deletions packages/kernel/test/unit/di.integration.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,6 @@ import { inject, DI, Registration, InterfaceSymbol, IContainer, Container } from
import { expect } from "chai";
import { spy } from "sinon";






describe('DI.createInterface() -> container.get()', () => {
let container: IContainer;

Expand Down Expand Up @@ -97,8 +92,7 @@ describe('DI.createInterface() -> container.get()', () => {
expect(get.getCalls().length).to.equal(2);
});

// TODO: make test work
xit(`InterfaceSymbol alias to transient registration returns a new instance each time`, () => {
it(`InterfaceSymbol alias to transient registration returns a new instance each time`, () => {
interface IAlias{}
const IAlias = DI.createInterface<IAlias>().withDefault(x => x.aliasTo(ITransient));

Expand All @@ -111,8 +105,7 @@ describe('DI.createInterface() -> container.get()', () => {
expect(actual1).not.to.equal(actual2);
});

// TODO: make test work
xit(`InterfaceSymbol alias to singleton registration returns the same instance each time`, () => {
it(`InterfaceSymbol alias to singleton registration returns the same instance each time`, () => {
interface IAlias{}
const IAlias = DI.createInterface<IAlias>().withDefault(x => x.aliasTo(ISingleton));

Expand All @@ -125,8 +118,7 @@ describe('DI.createInterface() -> container.get()', () => {
expect(actual1).to.equal(actual2);
});

// TODO: make test work
xit(`InterfaceSymbol alias to instance registration returns the same instance each time`, () => {
it(`InterfaceSymbol alias to instance registration returns the same instance each time`, () => {
interface IAlias{}
const IAlias = DI.createInterface<IAlias>().withDefault(x => x.aliasTo(IInstance));

Expand All @@ -141,7 +133,7 @@ describe('DI.createInterface() -> container.get()', () => {
});

// TODO: make test work
xit(`InterfaceSymbol alias to callback registration is invoked each time`, () => {
it(`InterfaceSymbol alias to callback registration is invoked each time`, () => {
interface IAlias{}
const IAlias = DI.createInterface<IAlias>().withDefault(x => x.aliasTo(ICallback));

Expand All @@ -151,7 +143,7 @@ describe('DI.createInterface() -> container.get()', () => {
const actual2 = container.get(IAlias);
expect(actual2).to.be.instanceof(Callback);

expect(callback.getCalls().length).to.equal(3);
expect(callback.getCalls().length).to.equal(2);

expect(actual1).not.to.equal(actual2);
});
Expand All @@ -168,9 +160,8 @@ describe('DI.createInterface() -> container.get()', () => {
expect(actual1).not.to.equal(actual2);
});

// TODO: make test work
xit(`string alias to singleton registration returns the same instance each time`, () => {
container.register(Registration.alias(ITransient, 'alias'))
it(`string alias to singleton registration returns the same instance each time`, () => {
container.register(Registration.alias(ISingleton, 'alias'))

const actual1 = container.get('alias');
expect(actual1).to.be.instanceof(Singleton);
Expand All @@ -181,9 +172,8 @@ describe('DI.createInterface() -> container.get()', () => {
expect(actual1).to.equal(actual2);
});

// TODO: make test work
xit(`string alias to instance registration returns the same instance each time`, () => {
container.register(Registration.alias(ITransient, 'alias'))
it(`string alias to instance registration returns the same instance each time`, () => {
container.register(Registration.alias(IInstance, 'alias'))

const actual1 = container.get('alias');
expect(actual1).to.be.instanceof(Instance);
Expand All @@ -195,17 +185,16 @@ describe('DI.createInterface() -> container.get()', () => {
expect(actual2).to.equal(instance);
});

// TODO: make test work
xit(`string alias to callback registration is invoked each time`, () => {
container.register(Registration.alias(ITransient, 'alias'))
it(`string alias to callback registration is invoked each time`, () => {
container.register(Registration.alias(ICallback, 'alias'))

const actual1 = container.get('alias');
expect(actual1).to.be.instanceof(Callback);

const actual2 = container.get('alias');
expect(actual2).to.be.instanceof(Callback);

expect(callback.getCalls().length).to.equal(3);
expect(callback.getCalls().length).to.equal(2);

expect(actual1).not.to.equal(actual2);
});
Expand Down
15 changes: 7 additions & 8 deletions packages/kernel/test/unit/di.spec.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import { Resolver, Factory, fallbackInvoker } from './../../src/di';
import { spy } from 'sinon';
import { DI, Container, PLATFORM, IContainer, InterfaceSymbol, IDefaultableInterfaceSymbol, ResolverStrategy, inject, all, invokeWithDynamicDependencies, lazy, classInvokers, Registration } from "../../src";
import { DI, Container, PLATFORM, IContainer, IDefaultableInterfaceSymbol, ResolverStrategy, inject, invokeWithDynamicDependencies, classInvokers, Registration } from "../../src";
import { expect } from "chai";
import { _ } from "./util";
import * as sinon from 'sinon';
import { lazyProduct } from '../../../../scripts/test-lib';

function assertIsMutableArray(arr: any[], length: number): void {
expect(Array.isArray(arr)).to.be.true;
Expand Down Expand Up @@ -457,7 +456,7 @@ describe(`The DI object`, () => {
const value = {};
sut.withDefault(builder => builder.instance(value));
(<any>sut).register(container, 'key');
expect(registerResolver).to.have.been.calledWith(sut, matchResolver('key', ResolverStrategy.instance, value));
expect(registerResolver).to.have.been.calledWith('key', matchResolver('key', ResolverStrategy.instance, value));
});

it(`singleton without key`, () => {
Expand All @@ -471,7 +470,7 @@ describe(`The DI object`, () => {
class Foo {}
sut.withDefault(builder => builder.singleton(Foo));
(<any>sut).register(container, 'key');
expect(registerResolver).to.have.been.calledWith(sut, matchResolver('key', ResolverStrategy.singleton, Foo));
expect(registerResolver).to.have.been.calledWith('key', matchResolver('key', ResolverStrategy.singleton, Foo));
});

it(`transient without key`, () => {
Expand All @@ -485,7 +484,7 @@ describe(`The DI object`, () => {
class Foo {}
sut.withDefault(builder => builder.transient(Foo));
(<any>sut).register(container, 'key');
expect(registerResolver).to.have.been.calledWith(sut, matchResolver('key', ResolverStrategy.transient, Foo));
expect(registerResolver).to.have.been.calledWith('key', matchResolver('key', ResolverStrategy.transient, Foo));
});

it(`callback without key`, () => {
Expand All @@ -499,19 +498,19 @@ describe(`The DI object`, () => {
const callback = () => {};
sut.withDefault(builder => builder.callback(callback));
(<any>sut).register(container, 'key');
expect(registerResolver).to.have.been.calledWith(sut, matchResolver('key', ResolverStrategy.callback, callback));
expect(registerResolver).to.have.been.calledWith('key', matchResolver('key', ResolverStrategy.callback, callback));
});

it(`aliasTo without key`, () => {
sut.withDefault(builder => builder.aliasTo('key2'));
(<any>sut).register(container);
expect(registerResolver).to.have.been.calledWith('key2', matchResolver(sut, ResolverStrategy.alias, sut));
expect(registerResolver).to.have.been.calledWith(sut, matchResolver(sut, ResolverStrategy.alias, 'key2'));
});

it(`aliasTo with key`, () => {
sut.withDefault(builder => builder.aliasTo('key2'));
(<any>sut).register(container, 'key1');
expect(registerResolver).to.have.been.calledWith('key2', matchResolver('key1', ResolverStrategy.alias, sut));
expect(registerResolver).to.have.been.calledWith('key1', matchResolver('key1', ResolverStrategy.alias, 'key2'));
});
});
});
Expand Down

0 comments on commit 1683135

Please sign in to comment.