aboutsummaryrefslogtreecommitdiffstats
path: root/test/features/utils/FeatureStore.test.ts
blob: de40d257eef1cd174353ddf6254b5818a229204d (plain) (blame)
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
import PropTypes from 'prop-types';
import { observable } from 'mobx';
import FeatureStore from '../../../src/features/utils/FeatureStore';
import { createActionsFromDefinitions } from '../../../src/actions/lib/actions';
import { createActionBindings } from '../../../src/features/utils/ActionBinding';
import { createReactions } from '../../../src/stores/lib/Reaction';

const actions: any = createActionsFromDefinitions(
  {
    countUp: {},
  },
  PropTypes.checkPropTypes,
);

class TestFeatureStore extends FeatureStore {
  @observable count = 0;

  reactionInvokedCount = 0;

  start() {
    this._registerActions(
      createActionBindings([[actions.countUp, this._countUp]]),
    );
    this._registerReactions(createReactions([this._countReaction]));
  }

  _countUp = () => {
    this.count += 1;
  };

  _countReaction = () => {
    this.reactionInvokedCount += 1;
  };
}

describe('FeatureStore', () => {
  let store: any = null;

  beforeEach(() => {
    store = new TestFeatureStore();
  });

  describe('registering actions', () => {
    it('starts the actions', () => {
      store.start();
      actions.countUp();
      expect(store.count).toBe(1);
    });
    it('starts the reactions', () => {
      store.start();
      actions.countUp();
      expect(store.reactionInvokedCount).toBe(1);
    });
  });

  describe('stopping the store', () => {
    it('stops the actions', () => {
      store.start();
      actions.countUp();
      store.stop();
      actions.countUp();
      expect(store.count).toBe(1);
    });
    it('stops the reactions', () => {
      store.start();
      actions.countUp();
      store.stop();
      store.count += 1;
      expect(store.reactionInvokedCount).toBe(1);
    });
  });

  describe('toggling the store', () => {
    it('restarts the actions correctly', () => {
      store.start();
      actions.countUp();
      store.stop();
      actions.countUp();
      store.start();
      actions.countUp();
      expect(store.count).toBe(2);
    });
    it('restarts the reactions correctly', () => {
      store.start();
      actions.countUp();
      store.stop();
      actions.countUp();
      store.start();
      actions.countUp();
      expect(store.count).toBe(2);
    });
  });
});