def test_transition_next(self):
        _get = Mock()
        _get.side_effect = [
            ContractStage(stage=self.stage1),
            ContractStage(stage=self.stage2)
        ]
        ContractStage.get_one = _get
        _fix = Mock(return_value=[])
        ContractStage._fix_start_time = _fix

        self.active_contract.current_stage_id = self.stage1.id
        self.active_contract.current_stage = self.stage1

        action = self.active_contract.transition(self.user)
        self.assertEquals(len(action), 2)
        self.assertTrue(_get.called)
        self.assertTrue(_fix.called_once)
        self.assertEquals(action[0].action_type, 'exited')
        self.assertEquals(action[0].action_detail['stage_name'],
                          self.stage1.name)
        self.assertEquals(action[1].action_type, 'entered')
        self.assertEquals(action[1].action_detail['stage_name'],
                          self.stage2.name)
        self.assertEquals(self.active_contract.current_stage_id,
                          self.stage2.id)
    def test_transition_backward(self):
        _get = Mock(return_value=[ContractStage(stage=self.stage1), ContractStage(stage=self.stage2)])
        ContractStage.get_multiple = _get

        self.active_contract.current_stage_id = self.stage2.id
        self.active_contract.current_stage = self.stage2

        action = self.active_contract.transition(self.user, destination=self.stage1.id)
        self.assertEquals(_get.call_count, 1)
        self.assertEquals(len(action), 1)
        self.assertEquals(action[0].action_type, 'reversion')
        self.assertTrue(_get.called_once)
        self.assertEquals(self.active_contract.current_stage_id, self.stage1.id)
    def test_transition_start(self):
        _get = Mock(return_value=ContractStage(stage=self.stage1))
        ContractStage.get_one = _get

        self.assertTrue(self.active_contract.current_stage_id is None)
        action = self.active_contract.transition(self.user)
        self.assertEquals(_get.call_count, 1)
        self.assertEquals(len(action), 1)
        self.assertEquals(action[0].action_type, 'entered')
        self.assertEquals(self.active_contract.current_stage_id, self.stage1.id)
    def test_transition_last(self, complete):
        _get = Mock(return_value=ContractStage(stage=self.stage1))
        ContractStage.get_one = _get

        self.active_contract.parent = ContractBaseFactory.build(description='test')
        self.active_contract.current_stage_id = self.stage3.id
        self.active_contract.current_stage = self.stage3

        action = self.active_contract.transition(self.user)
        self.assertEquals(_get.call_count, 1)
        self.assertEquals(len(action), 1)
        self.assertEquals(action[0].action_type, 'exited')
        self.assertTrue(complete.called_once)