summaryrefslogtreecommitdiff
path: root/app/infrastructure/__tests__/registry_spec.js
blob: 6343e46b17b7377ebac676f748e30a683881caa8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import Registry from '../registry';

describe("Registry", () => {
  class Item { }
  class Dependent {
    constructor(item) {
      this.item = item;
    }
  }
  class VeryDependent {
    constructor(item, dependent) {
      this.item = item;
      this.dependent = dependent;
    }
  }

  let subject = null;

  beforeEach(() => {
    subject = new Registry();
  });

  describe("#resolve", () => {
    it("resolves an instance", () => {
      subject.register('item', () => { return new Item() })

      expect(subject.resolve('item')).toBeInstanceOf(Item);
    });

    it ("resolves an instance with a dependency", () => {
      subject.register('item', () => { return new Item() });
      subject.register('dependent', (container) => {
        return new Dependent(container.resolve('item'));
      });

      let result = subject.resolve('dependent');
      expect(result).toBeInstanceOf(Dependent);
      expect(result.item).toBeInstanceOf(Item);
    });

    it ("resolves a singleton", () => {
      subject.register('item', () => { return new Item() }).asSingleton();

      let result = subject.resolve('item')
      expect(result).toBe(subject.resolve('item'));
    });

    it ("resolves the constructor dependencies", () => {
      var item = new Item();
      subject.register('item', () => item);
      subject.register('dependent', Dependent);
      subject.register('veryDependent', VeryDependent);

      let result = subject.resolve('veryDependent');
      expect(result).toBeInstanceOf(VeryDependent);
      expect(result.dependent).toBeInstanceOf(Dependent);
      expect(result.item).toEqual(item);
    })

    it ("resolves constructor dependencies for a singleton", () => {
      var item = new Item();
      subject.register('item', () => item);
      subject.register('dependent', Dependent).asSingleton();

      let result = subject.resolve('dependent');
      let other = subject.resolve('dependent');

      expect(result).toBe(other);
    });

    it ("resolves a constructor with zero dependencies", () => {
      subject.register('item', Item);

      expect(subject.resolve('item')).toBeInstanceOf(Item);
    });

    it("raises an error when a component is not registered", () => {
      expect(() => {
        subject.resolve('unknown');
      }).toThrow(/"unknown" is not registered/);
    });
  });

  describe("#resolveAll", () => {
    beforeEach(() => {
      subject.register('item', () => { return "0"; });
      subject.register('item', () => { return "1"; });
    });

    it ("resolves all instances of the given key", () => {
      let results = subject.resolveAll('item');
      expect(results.length).toEqual(2);
      expect(results[0]).toEqual("0");
      expect(results[1]).toEqual("1");
    });
  });
});