Improved Objects Adapters testing
- Split adapters test into separate file. - Renamed test_yaml_adapters to test_adapters_yaml. - Minor change to code to remove redundant if check. Change-Id: Idabe1930c70d4a304bc0f74b3fe1fc42d6d6e254
This commit is contained in:
parent
e4e09a7c1d
commit
af6469c105
designate
objects/adapters/api_v2
tests/unit/objects
@ -104,10 +104,9 @@ class RecordSetAPIv2Adapter(base.APIv2Adapter):
|
|||||||
new_recordset_records = objects.RecordList()
|
new_recordset_records = objects.RecordList()
|
||||||
|
|
||||||
# Remove deleted records if we have provided a records array
|
# Remove deleted records if we have provided a records array
|
||||||
if record_update:
|
for record in recordset.records:
|
||||||
for record in recordset.records:
|
if record.data not in records_to_rm:
|
||||||
if record.data not in records_to_rm:
|
new_recordset_records.append(record)
|
||||||
new_recordset_records.append(record)
|
|
||||||
|
|
||||||
# Add new records
|
# Add new records
|
||||||
for record in records_to_add:
|
for record in records_to_add:
|
||||||
|
@ -77,7 +77,8 @@ class ZoneAPIv2Adapter(base.APIv2Adapter):
|
|||||||
del values['attributes']
|
del values['attributes']
|
||||||
|
|
||||||
return super(ZoneAPIv2Adapter, cls).parse_object(
|
return super(ZoneAPIv2Adapter, cls).parse_object(
|
||||||
values, obj, *args, **kwargs)
|
values, obj, *args, **kwargs
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class ZoneListAPIv2Adapter(base.APIv2Adapter):
|
class ZoneListAPIv2Adapter(base.APIv2Adapter):
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
import datetime
|
import datetime
|
||||||
from unittest.mock import Mock
|
|
||||||
|
|
||||||
from oslo_log import log as logging
|
from oslo_log import log as logging
|
||||||
from oslo_utils import timeutils
|
from oslo_utils import timeutils
|
||||||
@ -138,15 +137,3 @@ class DesignateAdapterTest(oslotest.base.BaseTestCase):
|
|||||||
),
|
),
|
||||||
test_obj.created_at
|
test_obj.created_at
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class RecordSetAPIv2AdapterTest(oslotest.base.BaseTestCase):
|
|
||||||
def test_get_path(self):
|
|
||||||
request = Mock()
|
|
||||||
request.path = '/v2/recordsets'
|
|
||||||
recordset = Mock()
|
|
||||||
recordset.zone_id = 'a-b-c-d'
|
|
||||||
expected_path = '/v2/zones/a-b-c-d/recordsets'
|
|
||||||
|
|
||||||
path = adapters.RecordSetAPIv2Adapter._get_path(request, recordset)
|
|
||||||
self.assertEqual(expected_path, path)
|
|
||||||
|
424
designate/tests/unit/objects/test_adapters_v2_api.py
Normal file
424
designate/tests/unit/objects/test_adapters_v2_api.py
Normal file
@ -0,0 +1,424 @@
|
|||||||
|
# Copyright 2014 Hewlett-Packard Development Company, L.P.
|
||||||
|
#
|
||||||
|
# Author: Kiall Mac Innes <kiall@hpe.com>
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
from unittest import mock
|
||||||
|
|
||||||
|
from oslo_config import cfg
|
||||||
|
from oslo_config import fixture as cfg_fixture
|
||||||
|
from oslo_log import log as logging
|
||||||
|
import oslotest.base
|
||||||
|
|
||||||
|
from designate import exceptions
|
||||||
|
from designate import objects
|
||||||
|
from designate.objects import adapters
|
||||||
|
from designate.objects.adapters.api_v2 import base
|
||||||
|
|
||||||
|
CONF = cfg.CONF
|
||||||
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class APIv2AdapterTest(oslotest.base.BaseTestCase):
|
||||||
|
def setUp(self):
|
||||||
|
super(APIv2AdapterTest, self).setUp()
|
||||||
|
self.useFixture(cfg_fixture.Config(CONF))
|
||||||
|
|
||||||
|
def test_get_base_url(self):
|
||||||
|
CONF.set_override('enable_host_header', False, 'service:api')
|
||||||
|
|
||||||
|
mock_request = mock.Mock()
|
||||||
|
mock_request.GET = {'foo': 'bar'}
|
||||||
|
mock_request.host_url = 'http://127.0.0.1'
|
||||||
|
mock_request.path = '/v2/zones'
|
||||||
|
|
||||||
|
base_url = base.APIv2Adapter._get_base_url(mock_request)
|
||||||
|
self.assertEqual('http://127.0.0.1:9001', base_url)
|
||||||
|
|
||||||
|
def test_get_base_url_enable_host_header(self):
|
||||||
|
CONF.set_override('enable_host_header', True, 'service:api')
|
||||||
|
|
||||||
|
mock_request = mock.Mock()
|
||||||
|
mock_request.GET = {'foo': 'bar'}
|
||||||
|
mock_request.host_url = 'http://192.0.2.1'
|
||||||
|
mock_request.path = '/v2/zones'
|
||||||
|
|
||||||
|
base_url = base.APIv2Adapter._get_base_url(mock_request)
|
||||||
|
self.assertEqual('http://192.0.2.1', base_url)
|
||||||
|
|
||||||
|
def test_get_base_url_enable_host_header_exception_raised(self):
|
||||||
|
CONF.set_override('enable_host_header', True, 'service:api')
|
||||||
|
|
||||||
|
mock_host_url = mock.PropertyMock(side_effect=Exception)
|
||||||
|
mock_request = mock.Mock()
|
||||||
|
mock_request.GET = {'foo': 'bar'}
|
||||||
|
type(mock_request).host_url = mock_host_url
|
||||||
|
mock_request.path = '/v2/zones'
|
||||||
|
|
||||||
|
base_url = base.APIv2Adapter._get_base_url(mock_request)
|
||||||
|
self.assertEqual('http://127.0.0.1:9001', base_url)
|
||||||
|
|
||||||
|
|
||||||
|
class RecordAPIv2AdapterTest(oslotest.base.BaseTestCase):
|
||||||
|
def test_parse_object(self):
|
||||||
|
values = '192.0.2.1'
|
||||||
|
|
||||||
|
parsed_object = adapters.RecordAPIv2Adapter.parse_object(
|
||||||
|
values, objects.Record()
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual('192.0.2.1', parsed_object.data)
|
||||||
|
|
||||||
|
def test_render_object(self):
|
||||||
|
values = '192.0.2.1'
|
||||||
|
|
||||||
|
parsed_object = adapters.RecordAPIv2Adapter.parse_object(
|
||||||
|
values, objects.Record()
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual('192.0.2.1', parsed_object.data)
|
||||||
|
|
||||||
|
render_object = adapters.RecordAPIv2Adapter.render_object(
|
||||||
|
parsed_object
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(values, render_object)
|
||||||
|
|
||||||
|
|
||||||
|
class RecordSetAPIv2AdapterTest(oslotest.base.BaseTestCase):
|
||||||
|
def test_parse_object(self):
|
||||||
|
values = {'name': 'example.org.'}
|
||||||
|
|
||||||
|
parsed_object = adapters.RecordSetAPIv2Adapter.parse_object(
|
||||||
|
values, objects.RecordSet()
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(values['name'], parsed_object.name)
|
||||||
|
|
||||||
|
def test_parse_object_invalid_records(self):
|
||||||
|
values = {'name': 'example.org.', 'records': {'foo': 'bar'}}
|
||||||
|
|
||||||
|
self.assertRaisesRegex(
|
||||||
|
exceptions.InvalidObject,
|
||||||
|
'Provided object does not match schema',
|
||||||
|
adapters.RecordSetAPIv2Adapter.parse_object, values,
|
||||||
|
objects.RecordSet()
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_render_object(self):
|
||||||
|
values = {'name': 'example.org.', 'records': []}
|
||||||
|
|
||||||
|
parsed_object = adapters.RecordSetAPIv2Adapter.parse_object(
|
||||||
|
values, objects.RecordSet()
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(values['name'], parsed_object.name)
|
||||||
|
|
||||||
|
render_object = adapters.RecordSetAPIv2Adapter.render_object(
|
||||||
|
parsed_object
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertIsInstance(render_object, dict)
|
||||||
|
self.assertEqual(values['name'], parsed_object.name)
|
||||||
|
|
||||||
|
def test_get_path(self):
|
||||||
|
mock_request = mock.Mock()
|
||||||
|
mock_request.path = '/v2/recordsets'
|
||||||
|
mock_recordset = mock.Mock()
|
||||||
|
mock_recordset.zone_id = 'a-b-c-d'
|
||||||
|
expected_path = '/v2/zones/a-b-c-d/recordsets'
|
||||||
|
|
||||||
|
path = adapters.RecordSetAPIv2Adapter._get_path(
|
||||||
|
mock_request, mock_recordset
|
||||||
|
)
|
||||||
|
self.assertEqual(expected_path, path)
|
||||||
|
|
||||||
|
|
||||||
|
class SharedZoneAPIv2AdapterTest(oslotest.base.BaseTestCase):
|
||||||
|
def test_render_object(self):
|
||||||
|
values = {
|
||||||
|
'target_project_id': '60b1dd98-49a7-403b-901a-291ca555da56',
|
||||||
|
}
|
||||||
|
|
||||||
|
parsed_object = adapters.SharedZoneAPIv2Adapter.parse_object(
|
||||||
|
values, objects.SharedZone()
|
||||||
|
)
|
||||||
|
|
||||||
|
render_object = adapters.SharedZoneAPIv2Adapter.render_object(
|
||||||
|
parsed_object,
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertIsInstance(render_object, dict)
|
||||||
|
self.assertEqual(
|
||||||
|
'60b1dd98-49a7-403b-901a-291ca555da56',
|
||||||
|
render_object['target_project_id']
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_render_object_links(self):
|
||||||
|
share_id = '9edbb487-3ca1-4e9c-9503-6dd08a04b8c2'
|
||||||
|
zone_id = '9207ed7d-2094-4622-bce9-1af1886e958a'
|
||||||
|
|
||||||
|
mock_request = mock.Mock()
|
||||||
|
mock_request.host_url = 'http://192.0.2.1'
|
||||||
|
mock_request.path = '/v2/zones/{zone_id}/shares/{zone_share_id}'
|
||||||
|
values = {
|
||||||
|
'target_project_id': '60b1dd98-49a7-403b-901a-291ca555da56',
|
||||||
|
}
|
||||||
|
|
||||||
|
parsed_object = adapters.SharedZoneAPIv2Adapter.parse_object(
|
||||||
|
values, objects.SharedZone()
|
||||||
|
)
|
||||||
|
parsed_object.id = share_id
|
||||||
|
parsed_object.zone_id = zone_id
|
||||||
|
|
||||||
|
render_object = adapters.SharedZoneAPIv2Adapter.render_object(
|
||||||
|
parsed_object, request=mock_request,
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
f'{mock_request.host_url}/v2/zones/{zone_id}/shares/{share_id}',
|
||||||
|
render_object['links']['self']
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
f'{mock_request.host_url}/v2/zones/{zone_id}',
|
||||||
|
render_object['links']['zone']
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class SharedZoneListAPIv2AdapterTest(oslotest.base.BaseTestCase):
|
||||||
|
def test_get_collection_href(self):
|
||||||
|
mock_request = mock.Mock()
|
||||||
|
mock_request.GET = {'foo': 'bar'}
|
||||||
|
mock_request.host_url = 'http://192.0.2.1'
|
||||||
|
mock_request.path = '/v2/zones/{zone_id}/shares'
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
'http://192.0.2.1/v2/zones/{zone_id}/shares?foo=bar',
|
||||||
|
adapters.SharedZoneListAPIv2Adapter._get_collection_href(
|
||||||
|
mock_request, {}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class ZoneAPIv2AdapterTest(oslotest.base.BaseTestCase):
|
||||||
|
def test_parse_object(self):
|
||||||
|
values = {
|
||||||
|
'masters': ['192.0.2.1'],
|
||||||
|
'attributes': {'foo': 'bar'},
|
||||||
|
}
|
||||||
|
|
||||||
|
adapter = adapters.ZoneAPIv2Adapter.parse_object(
|
||||||
|
values, objects.Zone()
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertFalse(values)
|
||||||
|
self.assertEqual(1, len(adapter.attributes))
|
||||||
|
self.assertEqual('foo', adapter.attributes[0].key)
|
||||||
|
self.assertEqual('bar', adapter.attributes[0].value)
|
||||||
|
|
||||||
|
|
||||||
|
class ZoneAttributeAPIv2AdapterTest(oslotest.base.BaseTestCase):
|
||||||
|
def test_parse_object(self):
|
||||||
|
values = {
|
||||||
|
'foo': 'bar'
|
||||||
|
}
|
||||||
|
|
||||||
|
parsed_object = adapters.ZoneAttributeAPIv2Adapter.parse_object(
|
||||||
|
values, objects.ZoneAttribute()
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual('foo', parsed_object.key)
|
||||||
|
self.assertEqual('bar', parsed_object.value)
|
||||||
|
|
||||||
|
def test_render_object(self):
|
||||||
|
values = {
|
||||||
|
'foo': 'bar'
|
||||||
|
}
|
||||||
|
|
||||||
|
parsed_object = adapters.ZoneAttributeAPIv2Adapter.parse_object(
|
||||||
|
values, objects.ZoneAttribute()
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual('foo', parsed_object.key)
|
||||||
|
self.assertEqual('bar', parsed_object.value)
|
||||||
|
|
||||||
|
render_object = adapters.ZoneAttributeAPIv2Adapter.render_object(
|
||||||
|
parsed_object
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertIsInstance(render_object, dict)
|
||||||
|
self.assertEqual(values, render_object)
|
||||||
|
|
||||||
|
|
||||||
|
class ZoneAttributeListAPIv2AdapterTest(oslotest.base.BaseTestCase):
|
||||||
|
def test_parse_list(self):
|
||||||
|
zone_attribute = objects.ZoneAttribute(key='foo', value='bar')
|
||||||
|
|
||||||
|
parsed_object = adapters.ZoneAttributeListAPIv2Adapter.parse_object(
|
||||||
|
{}, objects.ZoneAttributeList(objects=[zone_attribute])
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(1, len(parsed_object))
|
||||||
|
|
||||||
|
def test_render_list(self):
|
||||||
|
zone_attribute = objects.ZoneAttribute(key='foo', value='bar')
|
||||||
|
|
||||||
|
parsed_object = adapters.ZoneAttributeListAPIv2Adapter.parse_object(
|
||||||
|
{}, objects.ZoneAttributeList(objects=[zone_attribute])
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(1, len(parsed_object))
|
||||||
|
|
||||||
|
render_object = adapters.ZoneAttributeListAPIv2Adapter.render_list(
|
||||||
|
parsed_object
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual({'foo': 'bar'}, render_object)
|
||||||
|
|
||||||
|
|
||||||
|
class ZoneExportAPIv2AdapterTest(oslotest.base.BaseTestCase):
|
||||||
|
def test_render_object_links(self):
|
||||||
|
export_id = '51790877-ddb7-4351-b3af-23fb6e53098b'
|
||||||
|
|
||||||
|
mock_request = mock.Mock()
|
||||||
|
mock_request.GET = {'foo': 'bar'}
|
||||||
|
mock_request.host_url = 'designate://192.0.2.1'
|
||||||
|
mock_request.path = '/v2/zones/{zone_id}/tasks/export'
|
||||||
|
|
||||||
|
parsed_object = adapters.ZoneExportAPIv2Adapter.parse_object(
|
||||||
|
{}, objects.ZoneExport()
|
||||||
|
)
|
||||||
|
parsed_object.location = (
|
||||||
|
'designate://192.0.2.1/v2/zones/{zone_id}/tasks/export'
|
||||||
|
)
|
||||||
|
parsed_object.id = export_id
|
||||||
|
render_object = adapters.ZoneExportAPIv2Adapter.render_object(
|
||||||
|
parsed_object, request=mock_request,
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
'designate://192.0.2.1/192.0.2.1/v2/zones/{zone_id}/tasks/export',
|
||||||
|
render_object['links']['export']
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
f'designate://192.0.2.1/v2/zones/tasks/exports/{export_id}',
|
||||||
|
render_object['links']['self']
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class ZoneMasterAPIv2AdapterTest(oslotest.base.BaseTestCase):
|
||||||
|
def test_parse_object(self):
|
||||||
|
value = '192.0.2.1:5353'
|
||||||
|
|
||||||
|
parsed_object = adapters.ZoneMasterAPIv2Adapter.parse_object(
|
||||||
|
value, objects.ZoneMaster()
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual('192.0.2.1', parsed_object.host)
|
||||||
|
self.assertEqual(5353, parsed_object.port)
|
||||||
|
|
||||||
|
def test_render_object(self):
|
||||||
|
value = '192.0.2.1:5353'
|
||||||
|
|
||||||
|
parsed_object = adapters.ZoneMasterAPIv2Adapter.parse_object(
|
||||||
|
value, objects.ZoneMaster()
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual('192.0.2.1', parsed_object.host)
|
||||||
|
self.assertEqual(5353, parsed_object.port)
|
||||||
|
|
||||||
|
render_object = adapters.ZoneMasterAPIv2Adapter.render_object(
|
||||||
|
parsed_object
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual('192.0.2.1:5353', render_object)
|
||||||
|
|
||||||
|
def test_render_object_standard_dns_port(self):
|
||||||
|
value = '192.0.2.1:53'
|
||||||
|
|
||||||
|
parsed_object = adapters.ZoneMasterAPIv2Adapter.parse_object(
|
||||||
|
value, objects.ZoneMaster()
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual('192.0.2.1', parsed_object.host)
|
||||||
|
self.assertEqual(53, parsed_object.port)
|
||||||
|
|
||||||
|
render_object = adapters.ZoneMasterAPIv2Adapter.render_object(
|
||||||
|
parsed_object
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual('192.0.2.1', render_object)
|
||||||
|
|
||||||
|
|
||||||
|
class ZoneTransferRequestAPIv2AdapterTest(oslotest.base.BaseTestCase):
|
||||||
|
def test_parse_object(self):
|
||||||
|
values = {
|
||||||
|
'target_project_id': '60b1dd98-49a7-403b-901a-291ca555da56',
|
||||||
|
}
|
||||||
|
|
||||||
|
parsed_object = adapters.ZoneTransferRequestAPIv2Adapter.parse_object(
|
||||||
|
values, objects.ZoneTransferRequest()
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
'60b1dd98-49a7-403b-901a-291ca555da56',
|
||||||
|
parsed_object.target_tenant_id
|
||||||
|
)
|
||||||
|
|
||||||
|
@mock.patch('designate.policy.check', mock.Mock())
|
||||||
|
def test_render_object(self):
|
||||||
|
mock_context = mock.Mock()
|
||||||
|
values = {
|
||||||
|
'target_project_id': '60b1dd98-49a7-403b-901a-291ca555da56',
|
||||||
|
}
|
||||||
|
|
||||||
|
parsed_object = adapters.ZoneTransferRequestAPIv2Adapter.parse_object(
|
||||||
|
values, objects.ZoneTransferRequest()
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
'60b1dd98-49a7-403b-901a-291ca555da56',
|
||||||
|
parsed_object.target_tenant_id
|
||||||
|
)
|
||||||
|
|
||||||
|
render_object = adapters.ZoneTransferRequestAPIv2Adapter.render_object(
|
||||||
|
parsed_object, context=mock_context
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
'60b1dd98-49a7-403b-901a-291ca555da56',
|
||||||
|
render_object['target_project_id']
|
||||||
|
)
|
||||||
|
|
||||||
|
@mock.patch('designate.policy.check')
|
||||||
|
def test_render_object_forbidden_raised(self, mock_policy_check):
|
||||||
|
mock_policy_check.side_effect = exceptions.Forbidden()
|
||||||
|
mock_context = mock.Mock()
|
||||||
|
values = {
|
||||||
|
'target_project_id': '60b1dd98-49a7-403b-901a-291ca555da56',
|
||||||
|
}
|
||||||
|
|
||||||
|
parsed_object = adapters.ZoneTransferRequestAPIv2Adapter.parse_object(
|
||||||
|
values, objects.ZoneTransferRequest()
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
'60b1dd98-49a7-403b-901a-291ca555da56',
|
||||||
|
parsed_object.target_tenant_id
|
||||||
|
)
|
||||||
|
|
||||||
|
render_object = adapters.ZoneTransferRequestAPIv2Adapter.render_object(
|
||||||
|
parsed_object, context=mock_context
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertNotIn('target_project_id', render_object)
|
Loading…
Reference in New Issue
Block a user