/spec/one_event_multiple_transitions_spec.py

http://github.com/nsi-iff/fluidity · Python · 53 lines · 38 code · 14 blank · 1 comment · 3 complexity · af4b3c8e48d2f60a13b407ba3ae30fce MD5 · raw file

  1. import unittest
  2. from should_dsl import should, should_not
  3. from fluidity import StateMachine, state, transition, ForkedTransition
  4. class LoanRequest(StateMachine):
  5. state('pending')
  6. state('analyzing')
  7. state('refused')
  8. state('accepted')
  9. initial_state = 'pending'
  10. transition(from_='pending', event='analyze', to='analyzing', action='input_data')
  11. transition(from_='analyzing', event='forward_analysis_result',
  12. guard='was_loan_accepted', to='accepted')
  13. transition(from_='analyzing', event='forward_analysis_result',
  14. guard='was_loan_refused', to='refused')
  15. def input_data(self, accepted=True):
  16. self.accepted = accepted
  17. def was_loan_accepted(self):
  18. return self.accepted or getattr(self, 'truify', False)
  19. def was_loan_refused(self):
  20. return not self.accepted or getattr(self, 'truify', False)
  21. class FluidityEventSupportsMultipleTransitions(unittest.TestCase):
  22. '''Event chooses one of multiple transitions, based in their guards'''
  23. def test_it_selects_the_transition_having_a_passing_guard(self):
  24. request = LoanRequest()
  25. request.analyze()
  26. request.forward_analysis_result()
  27. request.current_state |should| equal_to('accepted')
  28. request = LoanRequest()
  29. request.analyze(accepted=False)
  30. request.forward_analysis_result()
  31. request.current_state |should| equal_to('refused')
  32. def test_it_raises_error_if_more_than_one_guard_passes(self):
  33. request = LoanRequest()
  34. request.analyze()
  35. request.truify = True
  36. request.forward_analysis_result |should| throw(
  37. ForkedTransition, message="More than one transition was allowed for this event")
  38. if __name__ == '__main__':
  39. unittest.main()