class FluidityProcessSpec(unittest.TestCase): def setUp(self): self.process = Process() template = LoanProcess() configurator = StateMachineConfigurator(template) configurator.configure(self.process) def it_makes_the_process_respond_to_the_example_state_machine_events(self): self.process |should| respond_to('create_loan_request') self.process |should| respond_to('analyst_select_request') self.process |should| respond_to('loan_refused') self.process |should| respond_to('loan_accepted') self.process |should| respond_to('time_to_transfer_value') def it_runs_the_example_refusal_path(self): self.process.create_loan_request() self.process.current_state() |should| equal_to('request_created') self.process.loan_refused |should| throw(InvalidTransition) self.process.analyst_select_request() self.process.current_state() |should| equal_to('request_analyzed') #loan refused self.process.loan_refused() self.process.current_state() |should| equal_to('refusal_letter_sent') def it_runs_the_example_acceptance_path(self): #process was restarted by setUp() self.process.create_loan_request() self.process.current_state() |should| equal_to('request_created') self.process.loan_refused |should| throw(InvalidTransition) self.process.analyst_select_request() self.process.current_state() |should| equal_to('request_analyzed') #loan accepted self.process.loan_accepted() self.process.current_state() |should| equal_to('loan_created') self.process.time_to_transfer_value() self.process.current_state() |should| equal_to('value_transfered') def it_configures_and_runs_a_process(self): self.a_node = Node() self.another_node = Node() self.a_decorator = FakeDecorator() #process was restarted by setUp() the_movement = self.process.configure_activity_logger(self.a_node, self.another_node, self.process.create_loan_request, FakeDecorator.do_something) #starts running the_movement.context = self.process.run_activity(the_movement, self.a_decorator, 10) the_movement.context['result'] |should| equal_to("this is an operation's return value:10") self.process.current_state() |should| equal_to('request_created') #configures and runs the template's refusal path #should go wrong the_movement = self.process.configure_activity_logger(self.a_node, self.another_node, self.process.loan_refused, FakeDecorator.do_something) (self.process.run_activity, the_movement, self.a_decorator, 10) |should| throw(InvalidTransition) #now doing the right thing the_movement = self.process.configure_activity_logger(self.a_node, self.another_node, self.process.analyst_select_request, FakeDecorator.do_something) the_movement.context = self.process.run_activity(the_movement, self.a_decorator,10) self.process.current_state() |should| equal_to('request_analyzed') the_movement = self.process.configure_activity_logger(self.a_node, self.another_node, self.process.loan_refused, FakeDecorator.do_something) the_movement.context = self.process.run_activity(the_movement, self.a_decorator,15) self.process.current_state() |should| equal_to('refusal_letter_sent')
class ProcessSpec(unittest.TestCase): def setUp(self): self.a_client = Node() self.the_company = Node() self.a_process = Process() self.a_process.set_source(self.the_company) self.a_process.set_destination(self.a_client) def it_inserts_a_movement(self): #should not work non_movement = "I am not a Movement" (self.a_process.insert_movement, 'Ops!',non_movement) |should| throw(AssociationError) #test doubles won't work given type checking rules a_movement = Movement() self.a_process.insert_movement('A movement', a_movement) self.a_process.movements |should| contain('A movement') def it_inserts_a_subprocess(self): a_subprocess = Process() self.a_process.insert_movement('A subprocess', a_subprocess) def an_activity(self): ''' Represents an activity of a workflow engine. A business decorator's method will be attributed to this activity, making the activity a proxy to the decorator's method. ''' pass def it_configures_a_movement_as_an_activity_logger(self): logger = self.a_process.configure_activity_logger(self.the_company, self.a_client, self.an_activity, FakeDecorator.do_something) logger.source |should| be(self.the_company) logger.destination |should| be(self.a_client) logger.activity |should| equal_to(self.an_activity) logger.activity_associated_method |should| equal_to(FakeDecorator.do_something) self.a_process.movements |should| include(self.an_activity.__name__) def it_runs_an_activity_through_a_preconfigured_activity_logger(self): logger = self.a_process.configure_activity_logger(self.the_company, self.a_client, self.an_activity, FakeDecorator.do_something) a_decorator = FakeDecorator() logger.context = self.a_process.run_activity(logger, a_decorator, 100, 200) logger.context['actor'] |should| be(a_decorator) logger.context['arguments'] |should| equal_to([100,200]) logger.context['result'] |should| equal_to(300)
class FluidityProcessSpec(unittest.TestCase): def setUp(self): self.process = Process() template = LoanProcess() configurator = StateMachineConfigurator(template) configurator.configure(self.process) def it_makes_the_process_respond_to_the_example_state_machine_events(self): self.process | should | respond_to('create_loan_request') self.process | should | respond_to('analyst_select_request') self.process | should | respond_to('loan_refused') self.process | should | respond_to('loan_accepted') self.process | should | respond_to('time_to_transfer_value') def it_runs_the_example_refusal_path(self): self.process.create_loan_request() self.process.current_state() | should | equal_to('request_created') self.process.loan_refused | should | throw(InvalidTransition) self.process.analyst_select_request() self.process.current_state() | should | equal_to('request_analyzed') #loan refused self.process.loan_refused() self.process.current_state() | should | equal_to('refusal_letter_sent') def it_runs_the_example_acceptance_path(self): #process was restarted by setUp() self.process.create_loan_request() self.process.current_state() | should | equal_to('request_created') self.process.loan_refused | should | throw(InvalidTransition) self.process.analyst_select_request() self.process.current_state() | should | equal_to('request_analyzed') #loan accepted self.process.loan_accepted() self.process.current_state() | should | equal_to('loan_created') self.process.time_to_transfer_value() self.process.current_state() | should | equal_to('value_transfered') def it_configures_and_runs_a_process(self): self.a_node = Node() self.another_node = Node() self.a_decorator = FakeDecorator() #process was restarted by setUp() the_movement = self.process.configure_activity_logger( self.a_node, self.another_node, self.process.create_loan_request, FakeDecorator.do_something) #starts running the_movement.context = self.process.run_activity( the_movement, self.a_decorator, 10) the_movement.context['result'] | should | equal_to( "this is an operation's return value:10") self.process.current_state() | should | equal_to('request_created') #configures and runs the template's refusal path #should go wrong the_movement = self.process.configure_activity_logger( self.a_node, self.another_node, self.process.loan_refused, FakeDecorator.do_something) (self.process.run_activity, the_movement, self.a_decorator, 10) | should | throw(InvalidTransition) #now doing the right thing the_movement = self.process.configure_activity_logger( self.a_node, self.another_node, self.process.analyst_select_request, FakeDecorator.do_something) the_movement.context = self.process.run_activity( the_movement, self.a_decorator, 10) self.process.current_state() | should | equal_to('request_analyzed') the_movement = self.process.configure_activity_logger( self.a_node, self.another_node, self.process.loan_refused, FakeDecorator.do_something) the_movement.context = self.process.run_activity( the_movement, self.a_decorator, 15) self.process.current_state() | should | equal_to('refusal_letter_sent')