initial_state = 0 class ActionTypes(object): SET_STATE = 'counter/SET_STATE' INCREMENT = 'counter/INCREMENT' DECREMENT = 'counter/DECREMENT' class ActionCreators(object): @staticmethod def set_state(value): return dict( type=ActionTypes.SET_STATE, value=value ) @staticmethod def increment(): return dict( type=ActionTypes.INCREMENT ) @staticmethod def decrement(): return dict( type=ActionTypes.DECREMENT ) def reducer(state=None, action=None): if state is None: state = initial_state if not (isinstance(action, dict) and 'type' in action): return state if action['type'] == ActionTypes.SET_STATE: state = action['value'] elif action['type'] == ActionTypes.INCREMENT: state += 1 elif action['type'] == ActionTypes.DECREMENT: state -= 1 return state if __name__ == '__main__': import unittest class TestSuite(unittest.TestCase): def test_action_creators(self): self.assertEqual(ActionCreators.set_state(12), {'type': 'counter/SET_STATE', 'value': 12}) self.assertEqual(ActionCreators.increment(), {'type': 'counter/INCREMENT'}) self.assertEqual(ActionCreators.decrement(), {'type': 'counter/DECREMENT'}) def test_reducer(self): self.assertEqual(reducer(67, None), 67) self.assertEqual(reducer(None, None), 0) self.assertEqual(reducer(None, ActionCreators.set_state(13)), 13) self.assertEqual(reducer(452, ActionCreators.set_state(13)), 13) self.assertEqual(reducer(None, ActionCreators.increment()), 1) self.assertEqual(reducer(341, ActionCreators.increment()), 342) self.assertEqual(reducer(None, ActionCreators.decrement()), -1) self.assertEqual(reducer(251, ActionCreators.decrement()), 250) unittest.main()