master
1import Registry from '../registry';
2
3describe("Registry", () => {
4 class Item { }
5 class Dependent {
6 constructor(item) {
7 this.item = item;
8 }
9 }
10 class VeryDependent {
11 constructor(item, dependent) {
12 this.item = item;
13 this.dependent = dependent;
14 }
15 }
16
17 let subject = null;
18
19 beforeEach(() => {
20 subject = new Registry();
21 });
22
23 describe("#resolve", () => {
24 it("resolves an instance", () => {
25 subject.register('item', () => { return new Item() })
26
27 expect(subject.resolve('item')).toBeInstanceOf(Item);
28 });
29
30 it ("resolves an instance with a dependency", () => {
31 subject.register('item', () => { return new Item() });
32 subject.register('dependent', (container) => {
33 return new Dependent(container.resolve('item'));
34 });
35
36 let result = subject.resolve('dependent');
37 expect(result).toBeInstanceOf(Dependent);
38 expect(result.item).toBeInstanceOf(Item);
39 });
40
41 it ("resolves a singleton", () => {
42 subject.register('item', () => { return new Item() }).asSingleton();
43
44 let result = subject.resolve('item')
45 expect(result).toBe(subject.resolve('item'));
46 });
47
48 it ("resolves the constructor dependencies", () => {
49 var item = new Item();
50 subject.register('item', () => item);
51 subject.register('dependent', Dependent);
52 subject.register('veryDependent', VeryDependent);
53
54 let result = subject.resolve('veryDependent');
55 expect(result).toBeInstanceOf(VeryDependent);
56 expect(result.dependent).toBeInstanceOf(Dependent);
57 expect(result.item).toEqual(item);
58 })
59
60 it ("resolves constructor dependencies for a singleton", () => {
61 var item = new Item();
62 subject.register('item', () => item);
63 subject.register('dependent', Dependent).asSingleton();
64
65 let result = subject.resolve('dependent');
66 let other = subject.resolve('dependent');
67
68 expect(result).toBe(other);
69 });
70
71 it ("resolves a constructor with zero dependencies", () => {
72 subject.register('item', Item);
73
74 expect(subject.resolve('item')).toBeInstanceOf(Item);
75 });
76
77 it("raises an error when a component is not registered", () => {
78 expect(() => {
79 subject.resolve('unknown');
80 }).toThrow(/"unknown" is not registered/);
81 });
82 });
83
84 describe("#resolveAll", () => {
85 beforeEach(() => {
86 subject.register('item', () => { return "0"; });
87 subject.register('item', () => { return "1"; });
88 });
89
90 it ("resolves all instances of the given key", () => {
91 let results = subject.resolveAll('item');
92 expect(results.length).toEqual(2);
93 expect(results[0]).toEqual("0");
94 expect(results[1]).toEqual("1");
95 });
96 });
97});