import PropTypes from 'prop-types';
import { observable } from 'mobx';
import { FeatureStore } from './FeatureStore';
import { createActionsFromDefinitions } from '../../actions/lib/actions';

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

class TestFeatureStore extends FeatureStore {
  @observable count = 0;

  reactionInvokedCount = 0;

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

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

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

describe('FeatureStore', () => {
  let store = 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);
    });
  });
});

@@ -184,16 +184,133 @@
 ctions';
+%0Aimport %7B createActionBindings %7D from './ActionBinding';%0Aimport %7B createReactions %7D from '../../stores/lib/Reaction';
 %0A%0Aconst 
@@ -531,24 +531,45 @@
 sterActions(
+createActionBindings(
 %5B%0A      %5Bact
@@ -600,24 +600,25 @@
 tUp%5D,%0A    %5D)
+)
 ;%0A    this._
@@ -635,16 +635,32 @@
 actions(
+createReactions(
 %5B%0A      
@@ -686,16 +686,17 @@
 ,%0A    %5D)
+)
 ;%0A  %7D%0A%0A 

fix feature store test