def test_dequeue_next_active_step(self): """The FSM can remove the next step and update Mongo with it""" f = FSM(TEST_PBID, state_id) f.active_step = _active_step_string f.active_sequence = new_active_sequence() f.executed = [] f.execution = new_playbook()['execution'] _update_state = { '$set': { 'active_step': _active_step_string, 'active_sequence': f.active_sequence, 'executed': [], 'execution': new_playbook()['execution'], } } with mock.patch.object(f, 'update_state') as ( us): set_field = mock.MagicMock() filter = mock.MagicMock(return_value=set_field) f.filter = filter f.dequeue_next_active_step() us.assert_called_once_with(_update_state) self.assertEqual(f.active_step, _active_step_string)
def test_step_notification_failed(self, send_notification, move_remaining, setup, updatestate): """Per-step notifications work when a step fails Tests for the case where only one notification transport (irc, email, etc) is defined""" f = FSM(TEST_PBID, state_id) msg_failed = {'status': 'failed'} consume_iter = [ (mock.Mock(name="method_mocked"), mock.Mock(name="properties_mocked"), json.dumps(msg_failed)) ] # Pre-test scaffolding. Hard-code some mocked out # attributes/variables because we're skipping the usual # initialization steps. f.conn = mock.Mock(pika.connection.Connection) f.executed = [] f.execution = [] f.state_coll = {} f.post_deploy_action = [] publish = mock.Mock() channel = mock.Mock() channel.consume.return_value = iter(consume_iter) channel.basic_publish = publish f.ch = channel f.active_sequence = {'hosts': ['localhost']} f.group = 'testgroup' f.dynamic = {} f.active_step = new_notify_step('failed') set_field = mock.MagicMock() filter = mock.MagicMock(return_value=set_field) f.filter = filter # Run the ended method with a body having 'status' as failed f.on_ended(channel, mock.Mock(name="method_mocked"), mock.Mock(name="header_mocked"), json.dumps(msg_failed)) self.assertEqual(send_notification.call_count, 1) self.assertEqual(send_notification.call_args[0][1], 'notify.irc') self.assertEqual(send_notification.call_args[0][2], state_id) self.assertEqual(send_notification.call_args[0][3], ['#achannel']) self.assertEqual(send_notification.call_args[0][4], 'failed')
def test_move_active_to_completed(self): """FSM can update after completing a step""" f = FSM(state_id) f.active_step = _active_step_string f.active_sequence = new_active_sequence() f.active_sequence['completed_steps'] = [] f.executed = [] f.execution = new_playbook()['execution'] f.completed_steps = [] # For .called_once_with() _update_state = { '$set': { 'active_step': None, 'active_sequence': f.active_sequence } } with mock.patch.object(f, 'update_state') as (us): f.move_active_to_completed() us.assert_called_once_with(_update_state)