def test_podman_fallback(assible_test, docker_images, subprocess_error, mocker): '''Test podman >2 && <2.2 fallback''' cmd = ['docker', 'images', 'quay.io/assible/centos7-test-container', '--format', '{{json .}}'] docker_command_results = [ subprocess_error(cmd, status=1, stderr='function "json" not defined'), (PODMAN_OUTPUT, ''), ] mocker.patch( 'assible_test._internal.docker_util.docker_command', side_effect=docker_command_results) ret = docker_images('', 'quay.io/assible/centos7-test-container') calls = [ call( '', ['images', 'quay.io/assible/centos7-test-container', '--format', '{{json .}}'], capture=True, always=True), call( '', ['images', 'quay.io/assible/centos7-test-container', '--format', 'json'], capture=True, always=True), ] assible_test._internal.docker_util.docker_command.assert_has_calls(calls) assert len(ret) == 2
def test_iterate_over_pageable_resource_should_pass_with_string_offset_and_limit( self): resource_func = mock.Mock(side_effect=[ { 'items': ['foo'] }, { 'items': [] }, ]) items = iterate_over_pageable_resource( resource_func, {'query_params': { 'offset': '1', 'limit': '1' }}) assert ['foo'] == list(items) resource_func.assert_has_calls([ call(params={'query_params': { 'offset': '1', 'limit': '1' }}), call(params={'query_params': { 'offset': 2, 'limit': '1' }}) ])
def test_get_resources_with_same_credential_names(self, client_mock, display_mock): expected_result = [{ 'RESOURCE_TOKEN_1': 'token-5', 'RESOURCE_TOKEN_2': 'token-6' }] client_mock.return_value.get_resources.return_value = API_FIXTURES[ 'https://api.marketplace.manifold.co/v1/resources?project_id=pid-2'] client_mock.return_value.get_projects.return_value = API_FIXTURES[ 'https://api.marketplace.manifold.co/v1/projects?label=project-2'] client_mock.return_value.get_credentials.side_effect = lambda x: API_FIXTURES[ 'https://api.marketplace.manifold.co/v1/' 'credentials?resource_id={0}'.format(x)] self.assertListEqual( expected_result, self.lookup.run([], api_token='token-123', project='project-2')) client_mock.assert_called_with('token-123') display_mock.warning.assert_has_calls([ call( "'RESOURCE_TOKEN_1' with label 'resource-1' was replaced by resource data with label 'resource-3'" ), call( "'RESOURCE_TOKEN_2' with label 'resource-1' was replaced by resource data with label 'resource-3'" ) ], any_order=True) client_mock.return_value.get_resources.assert_called_with( team_id=None, project_id='pid-2')
def test_edit_upserted_object(self, _set_default_mock, copy_properties_mock, edit_object_mock, get_operation_mock): model_operations = mock.MagicMock() existing_object = mock.MagicMock() params = { 'path_params': {}, 'data': {} } result = self._resource._edit_upserted_object(model_operations, existing_object, params) assert result == edit_object_mock.return_value _set_default_mock.assert_has_calls([ mock.call(params, 'path_params', {}), mock.call(params, 'data', {}) ]) get_operation_mock.assert_called_once_with( self._resource._operation_checker.is_edit_operation, model_operations ) copy_properties_mock.assert_called_once_with( existing_object, params['data'] ) edit_object_mock.assert_called_once_with( get_operation_mock.return_value, params )
def test_get_objects_by_filter_with_multiple_responses(self, send_request_mock, connection_mock): send_request_mock.side_effect = [ {'items': [ {'name': 'obj1', 'type': 'foo'}, {'name': 'obj2', 'type': 'bar'} ]}, {'items': [ {'name': 'obj3', 'type': 'foo'} ]}, {'items': []} ] connection_mock.get_operation_spec.return_value = { 'method': HTTPMethod.GET, 'url': '/object/' } resource = BaseConfigurationResource(connection_mock, False) assert [{'name': 'obj1', 'type': 'foo'}] == list(resource.get_objects_by_filter( 'test', {ParamName.FILTERS: {'type': 'foo'}})) send_request_mock.assert_has_calls( [ mock.call('/object/', 'get', {}, {}, {QueryParams.FILTER: "type:foo", 'limit': 10, 'offset': 0}) ] ) send_request_mock.reset_mock() send_request_mock.side_effect = [ {'items': [ {'name': 'obj1', 'type': 'foo'}, {'name': 'obj2', 'type': 'bar'} ]}, {'items': [ {'name': 'obj3', 'type': 'foo'} ]}, {'items': []} ] resp = list(resource.get_objects_by_filter( 'test', { ParamName.FILTERS: {'type': 'foo'}, ParamName.QUERY_PARAMS: {'limit': 2} })) assert [{'name': 'obj1', 'type': 'foo'}, {'name': 'obj3', 'type': 'foo'}] == resp send_request_mock.assert_has_calls( [ mock.call('/object/', 'get', {}, {}, {QueryParams.FILTER: "type:foo", 'limit': 2, 'offset': 0}), mock.call('/object/', 'get', {}, {}, {QueryParams.FILTER: "type:foo", 'limit': 2, 'offset': 2}) ] )
def test_iterate_over_pageable_resource_should_preserve_offset(self): resource_func = mock.Mock(side_effect=[ {'items': ['foo']}, {'items': []}, ]) items = iterate_over_pageable_resource(resource_func, {'offset': 3}) assert ['foo'] == list(items) resource_func.assert_has_calls([ call(query_params={'offset': 3, 'limit': 10}), call(query_params={'offset': 13, 'limit': 10}) ])
def test_iterate_over_pageable_resource_with_one_page(self): resource_func = mock.Mock(side_effect=[ {'items': ['foo', 'bar']}, {'items': []}, ]) items = iterate_over_pageable_resource(resource_func) assert ['foo', 'bar'] == list(items) resource_func.assert_has_calls([ call(query_params={'offset': 0, 'limit': 10}), call(query_params={'offset': 10, 'limit': 10}) ])
def test_iterate_over_pageable_resource_raises_exception_when_server_returned_more_items_than_requested( self): resource_func = mock.Mock(side_effect=[ { 'items': ['foo', 'redundant_bar'] }, { 'items': [] }, ]) with pytest.raises(FtdUnexpectedResponse): list( iterate_over_pageable_resource( resource_func, {'query_params': { 'offset': '1', 'limit': '1' }})) resource_func.assert_has_calls( [call(params={'query_params': { 'offset': '1', 'limit': '1' }})])
def test__argument_spec(self, ansible_mod_cls, _execute_module, _setup_conn, setup_module): expected_arguments_spec = dict( login_user=dict(required=True), login_password=dict(required=True, no_log=True), command_options=dict(default='nodes', choices=[ 'nodes', 'nodes_by_uuid', 'nodes_by_chassis_uuid', 'nodes_status_managed', 'nodes_status_unmanaged' ]), auth_url=dict(required=True), uuid=dict(default=None), chassis=dict(default=None), ) _setup_conn.return_value = "Fake connection" _execute_module.return_value = [] mod_obj = ansible_mod_cls.return_value args = { "auth_url": "https://10.243.30.195", "login_user": "******", "login_password": "******", "command_options": "nodes", } mod_obj.params = args lxca_nodes.main() assert (mock.call( argument_spec=expected_arguments_spec, supports_check_mode=False) == ansible_mod_cls.call_args)
def test_get_objects_by_filter_with_multiple_filters(self, send_request_mock, connection_mock): objects = [ {'name': 'obj1', 'type': 1, 'foo': {'bar': 'buzz'}}, {'name': 'obj2', 'type': 1, 'foo': {'bar': 'buz'}}, {'name': 'obj3', 'type': 2, 'foo': {'bar': 'buzz'}} ] connection_mock.get_operation_spec.return_value = { 'method': HTTPMethod.GET, 'url': '/object/' } resource = BaseConfigurationResource(connection_mock, False) send_request_mock.side_effect = [{'items': objects}, {'items': []}] # resource.get_objects_by_filter returns generator so to be able compare generated list with expected list # we need evaluate it. assert objects == list(resource.get_objects_by_filter('test', {})) send_request_mock.assert_has_calls( [ mock.call('/object/', 'get', {}, {}, {'limit': 10, 'offset': 0}) ] ) send_request_mock.reset_mock() send_request_mock.side_effect = [{'items': objects}, {'items': []}] # resource.get_objects_by_filter returns generator so to be able compare generated list with expected list # we need evaluate it. assert [objects[0]] == list(resource.get_objects_by_filter('test', {ParamName.FILTERS: {'name': 'obj1'}})) send_request_mock.assert_has_calls( [ mock.call('/object/', 'get', {}, {}, {QueryParams.FILTER: 'name:obj1', 'limit': 10, 'offset': 0}) ] ) send_request_mock.reset_mock() send_request_mock.side_effect = [{'items': objects}, {'items': []}] # resource.get_objects_by_filter returns generator so to be able compare generated list with expected list # we need evaluate it. assert [objects[1]] == list(resource.get_objects_by_filter( 'test', {ParamName.FILTERS: {'type': 1, 'foo': {'bar': 'buz'}}})) send_request_mock.assert_has_calls( [ mock.call('/object/', 'get', {}, {}, {QueryParams.FILTER: "foo:{'bar': 'buz'};type:1", 'limit': 10, 'offset': 0}) ] )
def test_release_unset(self): # test that the module attempts to change the release when the current # release is not the same as the user-specific target release set_module_args({'release': None}) self.module_main_command.side_effect = [ # first call, get_release: returns version so set_release is called (0, '7.5', ''), # second call, set_release: just needs to exit with 0 rc (0, '', ''), ] result = self.module_main(AnsibleExitJson) self.assertTrue(result['changed']) self.assertIsNone(result['current_release']) self.module_main_command.assert_has_calls([ call('/testbin/subscription-manager release --show', check_rc=True), call('/testbin/subscription-manager release --unset', check_rc=True), ])
def run_parse_common(self, galaxycli_obj, action): with patch.object(ansible.cli.SortedOptParser, "set_usage") as mocked_usage: galaxycli_obj.parse() # checking that the common results of parse() for all possible actions have been created/called self.assertIsInstance(galaxycli_obj.parser, ansible.cli.SortedOptParser) self.assertIsInstance(galaxycli_obj.galaxy, ansible.galaxy.Galaxy) formatted_call = { 'import': 'usage: %prog import [options] github_user github_repo', 'delete': 'usage: %prog delete [options] github_user github_repo', 'info': 'usage: %prog info [options] role_name[,version]', 'init': 'usage: %prog init [options] role_name', 'install': 'usage: %prog install [options] [-r FILE | role_name(s)[,version] | scm+role_repo_url[,version] | tar_file(s)]', 'list': 'usage: %prog list [role_name]', 'login': '******', 'remove': 'usage: %prog remove role1 role2 ...', 'search': ('usage: %prog search [searchterm1 searchterm2] [--galaxy-tags galaxy_tag1,galaxy_tag2] [--platforms platform1,platform2] ' '[--author username]'), 'setup': 'usage: %prog setup [options] source github_user github_repo secret', } first_call = 'usage: %prog [delete|import|info|init|install|list|login|remove|search|setup] [--help] [options] ...' second_call = formatted_call[action] calls = [call(first_call), call(second_call)] mocked_usage.assert_has_calls(calls)
def test_ensure_feature_is_enabled_called(self): self.set_module_state('present') from ansible.modules.network.netscaler import netscaler_cs_policy client_mock = Mock() ensure_feature_is_enabled_mock = Mock() with patch.multiple( 'ansible.modules.network.netscaler.netscaler_cs_policy', get_nitro_client=Mock(return_value=client_mock), policy_exists=Mock(side_effect=[True, True]), nitro_exception=self.MockException, ensure_feature_is_enabled=ensure_feature_is_enabled_mock, ): self.module = netscaler_cs_policy result = self.exited() ensure_feature_is_enabled_mock.assert_has_calls([call(client_mock, 'CS')])
def test_release_set_idempotent(self): # test that the module does not attempt to change the release when # the current release matches the user-specified target release set_module_args({'release': '7.5'}) self.module_main_command.side_effect = [ # first call, get_release: returns same version, set_release is not called (0, '7.5', ''), ] result = self.module_main(AnsibleExitJson) self.assertFalse(result['changed']) self.assertEqual('7.5', result['current_release']) self.module_main_command.assert_has_calls([ call('/testbin/subscription-manager release --show', check_rc=True), ])
def test_release_unset_idempotent(self): # test that the module attempts to change the release when the current # release is not the same as the user-specific target release set_module_args({'release': None}) self.module_main_command.side_effect = [ # first call, get_release: returns no version, set_release is not called (0, 'Release not set', ''), ] result = self.module_main(AnsibleExitJson) self.assertFalse(result['changed']) self.assertIsNone(result['current_release']) self.module_main_command.assert_has_calls([ call('/testbin/subscription-manager release --show', check_rc=True), ])
def test__nodes_empty_list(self, ansible_mod_cls, _get_nodes, _setup_conn, setup_module): mod_obj = ansible_mod_cls.return_value args = { "auth_url": "https://10.243.30.195", "login_user": "******", "login_password": "******", "uuid": "3C737AA5E31640CE949B10C129A8B01F", "command_options": "nodes_by_uuid", } mod_obj.params = args _setup_conn.return_value = "Fake connection" empty_nodes_list = [] _get_nodes.return_value = empty_nodes_list ret_nodes = _get_nodes(mod_obj, args) assert mock.call(mod_obj, mod_obj.params) == _get_nodes.call_args assert _get_nodes.return_value == ret_nodes
class TestRoute53Module(ModuleTestCase): def test_mutually_exclusive(self, *args): with self.assertRaises(AnsibleFailJson) as exec_info: set_module_args({ 'secret_key': 'SECRET_KEY', 'access_key': 'ACCESS_KEY', 'region': 'eu-central-1', 'zone': 'example.com', 'vpc_id': 'vpc-94ccc2ff', 'vpc_region': 'eu-central-1', 'comment': 'foobar', 'delegation_set_id': 'A1BCDEF2GHIJKL', 'state': 'present', }) route53_zone.main() self.assertEqual( exec_info.exception.args[0]['msg'], 'parameters are mutually exclusive: delegation_set_id|vpc_id, delegation_set_id|vpc_region', ) @parameterized([{ 'check_mode': False, 'response': { 'private_zone': False, 'vpc_id': None, 'vpc_region': None, 'comment': 'foobar', 'name': 'example.com.', 'delegation_set_id': '', 'zone_id': 'ZONE_ID', }, }, { 'check_mode': True, 'response': { 'private_zone': False, 'vpc_id': None, 'vpc_region': None, 'comment': 'foobar', 'name': 'example.com.', 'delegation_set_id': None, 'zone_id': None, }, }]) @patch.object(route53_zone, 'find_zones', return_value=[]) def test_create_public_zone(self, find_zones_mock, time_mock, client_mock, check_mode, response): client_mock.return_value.create_hosted_zone.return_value = { 'HostedZone': { 'Id': '/hostedzone/ZONE_ID', 'Name': 'example.com.', 'Config': { 'Comment': 'foobar', 'PrivateZone': False, }, }, } with self.assertRaises(AnsibleExitJson) as exec_info: set_module_args({ 'secret_key': 'SECRET_KEY', 'access_key': 'ACCESS_KEY', 'region': 'eu-central-1', 'zone': 'example.com', 'comment': 'foobar', 'state': 'present', '_ansible_check_mode': check_mode, }) route53_zone.main() if check_mode: client_mock.return_value.create_hosted_zone.assert_not_called() else: client_mock.return_value.create_hosted_zone.assert_called_once_with( **{ 'HostedZoneConfig': { 'Comment': 'foobar', 'PrivateZone': False, }, 'Name': 'example.com.', 'CallerReference': 'example.com.-1', }) self.assertEqual(exec_info.exception.args[0]['changed'], True) self.assertTrue(is_subdict(response, exec_info.exception.args[0])) @parameterized([{ 'check_mode': False, 'response': { 'private_zone': True, 'vpc_id': 'vpc-1', 'vpc_region': 'eu-central-1', 'comment': 'foobar', 'name': 'example.com.', 'delegation_set_id': None, 'zone_id': 'ZONE_ID', }, }, { 'check_mode': True, 'response': { 'private_zone': True, 'vpc_id': 'vpc-1', 'vpc_region': 'eu-central-1', 'comment': 'foobar', 'name': 'example.com.', 'delegation_set_id': None, 'zone_id': None, }, }]) @patch.object(route53_zone, 'find_zones', return_value=[]) def test_create_private_zone(self, find_zones_mock, time_mock, client_mock, check_mode, response): client_mock.return_value.create_hosted_zone.return_value = { 'HostedZone': { 'Id': '/hostedzone/ZONE_ID', 'Name': 'example.com.', 'Config': { 'Comment': 'foobar', 'PrivateZone': True }, }, } with self.assertRaises(AnsibleExitJson) as exec_info: set_module_args({ 'secret_key': 'SECRET_KEY', 'access_key': 'ACCESS_KEY', 'region': 'eu-central-1', 'zone': 'example.com', 'comment': 'foobar', 'vpc_id': 'vpc-1', 'vpc_region': 'eu-central-1', 'state': 'present', '_ansible_check_mode': check_mode, }) route53_zone.main() if check_mode: client_mock.return_value.create_hosted_zone.assert_not_called() else: client_mock.return_value.create_hosted_zone.assert_called_once_with( **{ 'HostedZoneConfig': { 'Comment': 'foobar', 'PrivateZone': True, }, 'Name': 'example.com.', 'CallerReference': 'example.com.-1', 'VPC': { 'VPCRegion': 'eu-central-1', 'VPCId': 'vpc-1', }, }) self.assertEqual(exec_info.exception.args[0]['changed'], True) self.assertTrue(is_subdict(response, exec_info.exception.args[0])) @parameterized([{ 'check_mode': False, 'response': { 'private_zone': False, 'vpc_id': None, 'vpc_region': None, 'comment': 'new', 'name': 'example.com.', 'delegation_set_id': '', 'zone_id': 'ZONE_ID', }, }, { 'check_mode': True, 'response': { 'private_zone': False, 'vpc_id': None, 'vpc_region': None, 'comment': 'new', 'name': 'example.com.', 'delegation_set_id': None, 'zone_id': 'ZONE_ID', }, }]) @patch.object(route53_zone, 'find_zones', return_value=[{ 'Id': '/hostedzone/ZONE_ID', 'Name': 'example.com.', 'Config': { 'Comment': '', 'PrivateZone': False }, }]) def test_update_comment_public_zone(self, find_zones_mock, time_mock, client_mock, check_mode, response): client_mock.return_value.get_hosted_zone.return_value = { 'HostedZone': { 'Id': '/hostedzone/ZONE_ID', 'Name': 'example.com.', 'Config': { 'Comment': '', 'PrivateZone': False }, }, } with self.assertRaises(AnsibleExitJson) as exec_info: set_module_args({ 'secret_key': 'SECRET_KEY', 'access_key': 'ACCESS_KEY', 'region': 'eu-central-1', 'zone': 'example.com', 'comment': 'new', 'state': 'present', '_ansible_check_mode': check_mode, }) route53_zone.main() if check_mode: client_mock.return_value.update_hosted_zone_comment.assert_not_called( ) else: client_mock.return_value.update_hosted_zone_comment.assert_called_once_with( **{ 'Id': '/hostedzone/ZONE_ID', 'Comment': 'new', }) self.assertEqual(exec_info.exception.args[0]['changed'], True) self.assertTrue(is_subdict(response, exec_info.exception.args[0])) @patch.object(route53_zone, 'find_zones', return_value=[{ 'Id': '/hostedzone/Z22OU4IUOVYM30', 'Name': 'example.com.', 'Config': { 'Comment': '', 'PrivateZone': False }, }]) def test_update_public_zone_no_changes(self, find_zones_mock, time_mock, client_mock): client_mock.return_value.get_hosted_zone.return_value = { 'HostedZone': { 'Id': '/hostedzone/ZONE_ID', 'Name': 'example.com.', 'Config': { 'Comment': '', 'PrivateZone': False }, }, } with self.assertRaises(AnsibleExitJson) as exec_info: set_module_args({ 'secret_key': 'SECRET_KEY', 'access_key': 'ACCESS_KEY', 'region': 'eu-central-1', 'zone': 'example.com', 'comment': '', 'state': 'present', }) route53_zone.main() client_mock.return_value.update_hosted_zone_comment.assert_not_called() self.assertEqual(exec_info.exception.args[0]['changed'], False) @parameterized([{ 'check_mode': False, 'response': { 'private_zone': True, 'vpc_id': 'vpc-1', 'vpc_region': 'eu-central-1', 'comment': 'new', 'name': 'example.com.', 'delegation_set_id': None, 'zone_id': 'ZONE_ID', }, }, { 'check_mode': True, 'response': { 'private_zone': True, 'vpc_id': 'vpc-1', 'vpc_region': 'eu-central-1', 'comment': 'new', 'name': 'example.com.', 'delegation_set_id': None, 'zone_id': 'ZONE_ID', }, }]) @patch.object(route53_zone, 'find_zones', return_value=[{ 'Id': '/hostedzone/ZONE_ID', 'Name': 'example.com.', 'Config': { 'Comment': 'foobar', 'PrivateZone': True }, }]) def test_update_comment_private_zone(self, find_zones_mock, time_mock, client_mock, check_mode, response): client_mock.return_value.get_hosted_zone.return_value = { 'HostedZone': { 'Id': '/hostedzone/ZONE_ID', 'Name': 'example.com.', 'Config': { 'Comment': 'foobar', 'PrivateZone': True }, }, 'VPCs': [{ 'VPCRegion': 'eu-central-1', 'VPCId': 'vpc-1' }], } with self.assertRaises(AnsibleExitJson) as exec_info: set_module_args({ 'secret_key': 'SECRET_KEY', 'access_key': 'ACCESS_KEY', 'region': 'eu-central-1', 'zone': 'example.com', 'comment': 'new', 'vpc_id': 'vpc-1', 'vpc_region': 'eu-central-1', 'state': 'present', '_ansible_check_mode': check_mode, }) route53_zone.main() if check_mode: client_mock.return_value.update_hosted_zone_comment.assert_not_called( ) else: client_mock.return_value.update_hosted_zone_comment.assert_called_once_with( **{ 'Id': '/hostedzone/ZONE_ID', 'Comment': 'new', }) self.assertEqual(exec_info.exception.args[0]['changed'], True) self.assertTrue(is_subdict(response, exec_info.exception.args[0])) @parameterized([{ 'check_mode': False, 'response': { 'private_zone': True, 'vpc_id': 'vpc-2', 'vpc_region': 'us-east-2', 'comment': 'foobar', 'name': 'example.com.', 'delegation_set_id': None, 'zone_id': 'ZONE_ID_2', }, }, { 'check_mode': True, 'response': { 'private_zone': True, 'vpc_id': 'vpc-2', 'vpc_region': 'us-east-2', 'comment': 'foobar', 'name': 'example.com.', 'delegation_set_id': None, 'zone_id': None, }, }]) @patch.object(route53_zone, 'find_zones', return_value=[{ 'Id': '/hostedzone/ZONE_ID', 'Name': 'example.com.', 'Config': { 'Comment': 'foobar', 'PrivateZone': True }, }]) def test_update_vpc_private_zone(self, find_zones_mock, time_mock, client_mock, check_mode, response): client_mock.return_value.get_hosted_zone.return_value = { 'HostedZone': { 'Id': '/hostedzone/ZONE_ID', 'Name': 'example.com.', 'Config': { 'Comment': 'foobar', 'PrivateZone': True }, }, 'VPCs': [{ 'VPCRegion': 'eu-central-1', 'VPCId': 'vpc-1' }], } client_mock.return_value.create_hosted_zone.return_value = { 'HostedZone': { 'Id': '/hostedzone/ZONE_ID_2', 'Name': 'example.com.', 'Config': { 'Comment': 'foobar', 'PrivateZone': True }, }, } with self.assertRaises(AnsibleExitJson) as exec_info: set_module_args({ 'secret_key': 'SECRET_KEY', 'access_key': 'ACCESS_KEY', 'region': 'us-east-2', 'zone': 'example.com', 'comment': 'foobar', 'vpc_id': 'vpc-2', 'vpc_region': 'us-east-2', 'state': 'present', '_ansible_check_mode': check_mode, }) route53_zone.main() if check_mode: client_mock.return_value.create_hosted_zone.assert_not_called() else: client_mock.return_value.create_hosted_zone.assert_called_once_with( **{ 'HostedZoneConfig': { 'Comment': 'foobar', 'PrivateZone': True, }, 'Name': 'example.com.', 'CallerReference': 'example.com.-1', 'VPC': { 'VPCRegion': 'us-east-2', 'VPCId': 'vpc-2', }, }) self.assertEqual(exec_info.exception.args[0]['changed'], True) self.assertTrue(is_subdict(response, exec_info.exception.args[0])) @patch.object(route53_zone, 'find_zones', return_value=[{ 'Id': '/hostedzone/ZONE_ID', 'Name': 'example.com.', 'Config': { 'Comment': 'foobar', 'PrivateZone': True }, }]) def test_update_private_zone_no_changes(self, find_zones_mock, time_mock, client_mock): client_mock.return_value.get_hosted_zone.return_value = { 'HostedZone': { 'Id': '/hostedzone/ZONE_ID', 'Name': 'example.com.', 'Config': { 'Comment': 'foobar', 'PrivateZone': True }, }, 'VPCs': [{ 'VPCRegion': 'eu-central-1', 'VPCId': 'vpc-1' }], } with self.assertRaises(AnsibleExitJson) as exec_info: set_module_args({ 'secret_key': 'SECRET_KEY', 'access_key': 'ACCESS_KEY', 'region': 'eu-central-1', 'zone': 'example.com', 'comment': 'foobar', 'vpc_id': 'vpc-1', 'vpc_region': 'eu-central-1', 'state': 'present', }) route53_zone.main() client_mock.return_value.update_hosted_zone_comment.assert_not_called() self.assertEqual(exec_info.exception.args[0]['changed'], False) response = { 'private_zone': True, 'vpc_id': 'vpc-1', 'vpc_region': 'eu-central-1', 'comment': 'foobar', 'name': 'example.com.', 'delegation_set_id': None, 'zone_id': 'ZONE_ID', } self.assertTrue(is_subdict(response, exec_info.exception.args[0])) @parameterized([{'check_mode': False}, {'check_mode': True}]) @patch.object(route53_zone, 'find_zones', return_value=[{ 'Id': '/hostedzone/ZONE_ID', 'Name': 'example.com.', 'Config': { 'Comment': '', 'PrivateZone': False }, }]) def test_delete_public_zone(self, find_zones_mock, time_mock, client_mock, check_mode): with self.assertRaises(AnsibleExitJson) as exec_info: set_module_args({ 'secret_key': 'SECRET_KEY', 'access_key': 'ACCESS_KEY', 'region': 'eu-central-1', 'zone': 'example.com', 'state': 'absent', '_ansible_check_mode': check_mode, }) route53_zone.main() if check_mode: client_mock.return_value.delete_hosted_zone.assert_not_called() else: client_mock.return_value.delete_hosted_zone.assert_called_once_with( **{ 'Id': '/hostedzone/ZONE_ID', }) self.assertEqual(exec_info.exception.args[0]['changed'], True) @parameterized([{'check_mode': False}, {'check_mode': True}]) @patch.object(route53_zone, 'find_zones', return_value=[{ 'Id': '/hostedzone/ZONE_ID', 'Name': 'example.com.', 'Config': { 'Comment': 'foobar', 'PrivateZone': True }, }]) def test_delete_private_zone(self, find_zones_mock, time_mock, client_mock, check_mode): client_mock.return_value.get_hosted_zone.return_value = { 'HostedZone': { 'Id': '/hostedzone/ZONE_ID', 'Name': 'example.com.', 'Config': { 'Comment': 'foobar', 'PrivateZone': True }, }, 'VPCs': [{ 'VPCRegion': 'eu-central-1', 'VPCId': 'vpc-1' }], } with self.assertRaises(AnsibleExitJson) as exec_info: set_module_args({ 'secret_key': 'SECRET_KEY', 'access_key': 'ACCESS_KEY', 'region': 'eu-central-1', 'zone': 'example.com', 'vpc_id': 'vpc-1', 'vpc_region': 'eu-central-1', 'state': 'absent', '_ansible_check_mode': check_mode, }) route53_zone.main() if check_mode: client_mock.return_value.delete_hosted_zone.assert_not_called() else: client_mock.return_value.delete_hosted_zone.assert_called_once_with( **{ 'Id': '/hostedzone/ZONE_ID', }) self.assertEqual(exec_info.exception.args[0]['changed'], True) @parameterized([{'check_mode': False}, {'check_mode': True}]) @parameterized([{ 'hosted_zone_id': 'PRIVATE_ZONE_ID', 'call_params': [call(**{ 'Id': 'PRIVATE_ZONE_ID', })], }, { 'hosted_zone_id': 'all', 'call_params': [ call(**{ 'Id': '/hostedzone/PUBLIC_ZONE_ID', }), call(**{ 'Id': '/hostedzone/PRIVATE_ZONE_ID', }) ], }]) @patch.object(route53_zone, 'find_zones', return_value=[{ 'Id': '/hostedzone/PUBLIC_ZONE_ID', 'Name': 'example.com.', 'Config': { 'Comment': '', 'PrivateZone': False }, }, { 'Id': '/hostedzone/PRIVATE_ZONE_ID', 'Name': 'example.com.', 'Config': { 'Comment': 'foobar', 'PrivateZone': True }, }]) def test_delete_by_zone_id(self, find_zones_mock, time_mock, client_mock, hosted_zone_id, call_params, check_mode): with self.assertRaises(AnsibleExitJson) as exec_info: set_module_args({ 'secret_key': 'SECRET_KEY', 'access_key': 'ACCESS_KEY', 'region': 'eu-central-1', 'zone': 'example.com', 'hosted_zone_id': hosted_zone_id, 'state': 'absent', '_ansible_check_mode': check_mode, }) route53_zone.main() if check_mode: client_mock.return_value.delete_hosted_zone.assert_not_called() else: client_mock.return_value.delete_hosted_zone.assert_has_calls( call_params) self.assertEqual(exec_info.exception.args[0]['changed'], True) @patch.object(route53_zone, 'find_zones', return_value=[]) def test_delete_absent_zone(self, find_zones_mock, time_mock, client_mock): with self.assertRaises(AnsibleExitJson) as exec_info: set_module_args({ 'secret_key': 'SECRET_KEY', 'access_key': 'ACCESS_KEY', 'region': 'eu-central-1', 'zone': 'example.com', 'state': 'absent', }) route53_zone.main() client_mock.return_value.delete_hosted_zone.assert_not_called() self.assertEqual(exec_info.exception.args[0]['changed'], False)
def test_Request_fallback(urlopen_mock, install_opener_mock, mocker): cookies = cookiejar.CookieJar() request = Request( headers={'foo': 'bar'}, use_proxy=False, force=True, timeout=100, validate_certs=False, url_username='******', url_password='******', http_agent='ansible-tests', force_basic_auth=True, follow_redirects='all', client_cert='/tmp/client.pem', client_key='/tmp/client.key', cookies=cookies, unix_socket='/foo/bar/baz.sock', ca_path='/foo/bar/baz.pem', ) fallback_mock = mocker.spy(request, '_fallback') r = request.open('GET', 'https://ansible.com') calls = [ call(None, False), # use_proxy call(None, True), # force call(None, 100), # timeout call(None, False), # validate_certs call(None, 'user'), # url_username call(None, 'passwd'), # url_password call(None, 'ansible-tests'), # http_agent call(None, True), # force_basic_auth call(None, 'all'), # follow_redirects call(None, '/tmp/client.pem'), # client_cert call(None, '/tmp/client.key'), # client_key call(None, cookies), # cookies call(None, '/foo/bar/baz.sock'), # unix_socket call(None, '/foo/bar/baz.pem'), # ca_path ] fallback_mock.assert_has_calls(calls) assert fallback_mock.call_count == 14 # All but headers use fallback args = urlopen_mock.call_args[0] assert args[1] is None # data, this is handled in the Request not urlopen assert args[2] == 100 # timeout req = args[0] assert req.headers == { 'Authorization': b'Basic dXNlcjpwYXNzd2Q=', 'Cache-control': 'no-cache', 'Foo': 'bar', 'User-agent': 'ansible-tests' } assert req.data is None assert req.get_method() == 'GET'