def test__setup_failed_pre_deploy_check(self, send_notification, move_remaining, amqp_conf): """Setup fails with an existing state document and a failed pre-deploy check""" f = FSM(TEST_PBID, state_id) # An AMQP connection hasn't been made yet amqp_conf.get.return_value = PRE_DEPLOY_CONF['PRE_DEPLOY_CHECK'] msg_started = {'status': 'completed', 'data': {'exists': False}} consume_iter = [ (mock.Mock(name="method_mocked"), mock.Mock(name="properties_mocked"), json.dumps(msg_started)) ] f.conn = mock.Mock(pika.connection.Connection) publish = mock.Mock() channel = mock.Mock() channel.consume.return_value = iter(consume_iter) channel.basic_publish = publish f.ch = channel with mock.patch('recore.mongo.database') as ( mongo.database): mongo.database = mock.MagicMock(pymongo.database.Database) mongo.database.__getitem__.return_value = mock.MagicMock(pymongo.collection.Collection) with mock.patch('recore.mongo.lookup_state') as ( mongo.lookup_state): mongo.lookup_state.return_value = _state with mock.patch('recore.amqp.MQ_CONF') as mq_conf: mq_conf = MQ_CONF set_field = mock.MagicMock() filter = mock.MagicMock(return_value=set_field) f.filter = filter f._setup() assert f.group == _state['group'] # No matter where a release fails, 'move_remaining_to_skipped' will be called move_remaining.assert_called_once_with() # the first run/pre-deploy steps will record the failed state assert f.initialized == False # The starting phase notification will be sent assert send_notification.call_count == 1 assert send_notification.call_args[0][4] == 'started' # After first_run finishes self.failed should be True with mock.patch('recore.amqp.MQ_CONF') as mq_conf: mq_conf = MQ_CONF f._cleanup() assert send_notification.call_count == 2 assert send_notification.call_args[0][4] == 'failed' assert f.failed == True
def test__setup_lookup_state_none(self): """if lookup_state returns None then a LookupError is raised""" f = FSM(state_id) with mock.patch('recore.mongo.database') as ( mongo.database): mongo.database = mock.MagicMock(pymongo.database.Database) mongo.database.__getitem__.return_value = mock.MagicMock(pymongo.collection.Collection) with mock.patch('recore.mongo.lookup_state') as ( mongo.lookup_state): # Didn't find the state document in MongoDB mongo.lookup_state.return_value = None with self.assertRaises(LookupError): f._setup()
def test__setup_amqp_connect_fails(self): """_setup raises exception if amqp connection can't be made""" f = FSM(state_id) f._connect_mq = mock.MagicMock(side_effect=pika.exceptions.AMQPError("Couldn't connect to AMQP")) with mock.patch('recore.mongo.database') as ( mongo.database): mongo.database = mock.MagicMock(pymongo.database.Database) mongo.database.__getitem__.return_value = mock.MagicMock(pymongo.collection.Collection) with mock.patch('recore.mongo.lookup_state') as ( mongo.lookup_state): # Found the state document in MongoDB mongo.lookup_state.return_value = _state with self.assertRaises(pika.exceptions.AMQPError): f._setup()
def test__setup(self): """Setup works with an existing state document""" f = FSM(state_id) # An AMQP connection hasn't been made yet f._connect_mq = mock.MagicMock(return_value=(mock.Mock(pika.channel.Channel), mock.Mock(pika.connection.Connection))) with mock.patch('recore.mongo.database') as ( mongo.database): mongo.database = mock.MagicMock(pymongo.database.Database) mongo.database.__getitem__.return_value = mock.MagicMock(pymongo.collection.Collection) with mock.patch('recore.mongo.lookup_state') as ( mongo.lookup_state): mongo.lookup_state.return_value = _state f._setup() assert f.project == _state['project']
def test_on_started(self, ended, pdc): """Once started, the FSM waits for a response, and then calls on_ended""" pdc.return_value = True with nested( mock.patch('recore.mongo.lookup_state'), mock.patch('recore.mongo.database') ) as (lookup_state, database): lookup_state.return_value = _state.copy() # { # 'group': 'PROJECT', # 'dynamic': {}, # 'completed_steps': [], # 'active_step': 'active_step', # 'remaining_steps': [], # } f = FSM(TEST_PBID, state_id) f.reply_queue = temp_queue f.group = 'GROUP' consume_iter = [ (mock.Mock(name="method_mocked"), mock.Mock(name="properties_mocked"), json.dumps(msg_started)) ] publish = mock.Mock() channel = mock.Mock() channel.consume.return_value = iter(consume_iter) channel.basic_publish = publish f.ch = channel f.conn = mock.Mock(pika.connection.Connection) set_field = mock.MagicMock() filter = mock.MagicMock(return_value=set_field) f.filter = filter f._setup() f.on_started(f.ch, *consume_iter[0]) f.ch.basic_ack.assert_called_once_with(consume_iter[0][0].delivery_tag) f.ch.cancel.assert_called_once_with() f.on_ended.assert_called_once_with(f.ch, *consume_iter[0])
def test__setup(self, send_notification): """Setup works with an existing state document""" f = FSM(TEST_PBID, state_id) # An AMQP connection hasn't been made yet msg_started = {'status': 'completed', 'data': {'exists': True}} consume_iter = [ (mock.Mock(name="method_mocked"), mock.Mock(name="properties_mocked"), json.dumps(msg_started)) ] f.conn = mock.Mock(pika.connection.Connection) publish = mock.Mock() channel = mock.Mock() channel.consume.return_value = iter(consume_iter) channel.basic_publish = publish f.ch = channel with mock.patch('recore.mongo.database') as ( mongo.database): mongo.database = mock.MagicMock(pymongo.database.Database) mongo.database.__getitem__.return_value = mock.MagicMock(pymongo.collection.Collection) with mock.patch('recore.mongo.lookup_state') as ( mongo.lookup_state): mongo.lookup_state.return_value = _state with mock.patch('recore.amqp.CONF') as notif_conf: notif_conf = NOTIFICATION_CONF set_field = mock.MagicMock() filter = mock.MagicMock(return_value=set_field) f.filter = filter f._setup() assert f.group == _state['group'] # At the very end a notification should go out no matter what assert send_notification.call_count == 1 assert send_notification.call_args[0][4] == 'started'