def test_update_rule_schedule(): eventbridge_boto3_client = boto3.client('events') stubber = Stubber(eventbridge_boto3_client) stubber.add_response('put_rule', {'RuleArn': 'theArn'}, { 'Name': 'theName', 'ScheduleExpression': 'foo' }) stubber.activate() service = EventBridgeService(eventbridge_boto3_client) tags = service.update_rule_schedule('theName', 'foo')
def test_get_rule_tags(): eventbridge_boto3_client = boto3.client('events') stubber = Stubber(eventbridge_boto3_client) stubber.add_response('list_tags_for_resource', {'Tags': [{ 'Key': 'foo', 'Value': 'bar' }]}, {'ResourceARN': 'theArn'}) stubber.activate() service = EventBridgeService(eventbridge_boto3_client) tags = service.get_rule_tags('theArn') assert tags == [{'Key': 'foo', 'Value': 'bar'}]
def test_process_resources_updates_schedule_when_recurrences_are_different(mocker): rules = [{'Name': 'ruleName', 'Arn': 'ruleArn', 'ScheduleExpression': 'cron(foo)'}] tags = [ {'Key': 'foo:bar:enabled', 'Value': ''}, {'Key': 'foo:bar:local-timezone', 'Value': 'Europe/Madrid'}, {'Key': 'foo:bar:local-time', 'Value': '10:00'} ] eb_svc = EventBridgeService() rec_calc = RecurrenceCalculator() processor = EventBridgeProcessor('foo:bar', eb_svc, rec_calc) mocker.patch.object(eb_svc, 'get_scheduled_rules', return_value=rules) mocker.patch.object(eb_svc, 'get_rule_tags', return_value=tags) mocker.patch.object(eb_svc, 'update_rule_schedule', return_value=None) mocker.patch.object(rec_calc, 'calculate_recurrence', return_value='bar') changes = processor.process_resources() eb_svc.get_rule_tags.assert_called_once_with('ruleArn') rec_calc.calculate_recurrence.assert_called_once_with('foo', '10:00', 'Europe/Madrid') eb_svc.update_rule_schedule.assert_called_once_with('ruleName', 'cron(bar)') assert len(changes) == 1 assert changes[0] == { 'Type': 'EventBridgeRule', 'ResourceName': 'ruleName', 'ResourceArn': 'ruleArn', 'OriginalRecurrence': 'foo', 'NewRecurrence': 'bar', 'LocalTime': '10:00', 'LocalTimezone': 'Europe/Madrid' }
def test_get_scheduled_rules(): eventbridge_boto3_client = boto3.client('events') stubber = Stubber(eventbridge_boto3_client) pattern_based_rule = { 'Name': 'EventBasedRule', 'EventPattern': '{"foo":"bar"}' } scheduled_rule = { 'Name': 'ScheduledRule', 'ScheduleExpression': '* * * * * *' } response = {'Rules': [pattern_based_rule, scheduled_rule]} stubber.add_response('list_rules', response, {'EventBusName': 'default'}) stubber.activate() service = EventBridgeService(eventbridge_boto3_client) rules = service.get_scheduled_rules() assert len(rules) == 1 assert rules[0] == scheduled_rule
def test_process_resources_without_timezone_tag(mocker): rules = [{'Name': 'ruleName', 'Arn': 'ruleArn'}] tags = [{'Key': 'foo:bar:enabled', 'Value': ''}] eb_svc = EventBridgeService() rec_calc = RecurrenceCalculator() processor = EventBridgeProcessor('foo:bar', eb_svc, rec_calc) mocker.patch.object(eb_svc, 'get_scheduled_rules', return_value=rules) mocker.patch.object(eb_svc, 'get_rule_tags', return_value=tags) changes = processor.process_resources() eb_svc.get_rule_tags.assert_called_once_with('ruleArn') assert len(changes) == 0
def test_process_resources_with_same_recurrence(mocker): rules = [{'Name': 'ruleName', 'Arn': 'ruleArn', 'ScheduleExpression': 'cron(foo)'}] tags = [ {'Key': 'foo:bar:enabled', 'Value': ''}, {'Key': 'foo:bar:local-timezone', 'Value': 'Europe/Madrid'} ] eb_svc = EventBridgeService() rec_calc = RecurrenceCalculator() processor = EventBridgeProcessor('foo:bar', eb_svc, rec_calc) mocker.patch.object(eb_svc, 'get_scheduled_rules', return_value=rules) mocker.patch.object(eb_svc, 'get_rule_tags', return_value=tags) mocker.patch.object(rec_calc, 'calculate_recurrence', return_value='foo') changes = processor.process_resources() eb_svc.get_rule_tags.assert_called_once_with('ruleArn') assert len(changes) == 0
def test_process_resources_skips_update_when_an_exception_is_thrown_when_updating_schedule(mocker): rules = [{'Name': 'ruleName', 'Arn': 'ruleArn', 'ScheduleExpression': 'cron(foo)'}] tags = [ {'Key': 'foo:bar:enabled', 'Value': ''}, {'Key': 'foo:bar:local-timezone', 'Value': 'Europe/Madrid'}, {'Key': 'foo:bar:local-time', 'Value': '10:00'} ] eb_svc = EventBridgeService() rec_calc = RecurrenceCalculator() processor = EventBridgeProcessor('foo:bar', eb_svc, rec_calc) mocker.patch.object(eb_svc, 'get_scheduled_rules', return_value=rules) mocker.patch.object(eb_svc, 'get_rule_tags', return_value=tags) mocker.patch.object(eb_svc, 'update_rule_schedule', side_effect=Exception('mocked exception')) mocker.patch.object(rec_calc, 'calculate_recurrence', return_value='bar') changes = processor.process_resources() eb_svc.get_rule_tags.assert_called_once_with('ruleArn') eb_svc.update_rule_schedule.assert_called_once_with('ruleName', 'cron(bar)') assert len(changes) == 0
def test_default_client_is_eventbridge_client(): service = EventBridgeService() client = service.get_client() assert client.__module__ + '.' + client.__class__.__qualname__ == 'botocore.client.EventBridge'