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});