Accept trailing /'s on URLs.

The API should accept trailing slashes.  The werkzeug map rule strict
slashes is set to False to allow trailing slashes.  The tests have
been updated using mock methods to verify that the api accepts the
call and then calls central service.
Fixes: bug 1202411
Change-Id: Iedf9d60b24cd835f3f628b90993ca125faa9389b
This commit is contained in:
Vinod Mangalpally 2013-07-18 16:29:49 -05:00
parent a7261226f5
commit 6103e82981
4 changed files with 151 additions and 1 deletions

View File

@ -68,6 +68,9 @@ def factory(global_config, **local_conf):
# Install custom converters (URL param varidators)
app.url_map.converters['uuid'] = UUIDConverter
# disable strict slashes. This allows trailing slashes in the URLS.
app.url_map.strict_slashes = False
# Ensure all error responses are JSON
def _json_error(ex):
code = ex.code if isinstance(ex, wexceptions.HTTPException) else 500

View File

@ -40,6 +40,15 @@ class ApiV1DomainsTest(ApiV1Test):
self.assertIn('name', response.json)
self.assertEqual(response.json['name'], fixture['name'])
@patch.object(central_service.Service, 'create_domain')
def test_create_domain_trailing_slash(self, mock):
# Create a server
self.create_server()
self.post('domains/', data=self.get_domain_fixture(0))
# verify that the central service is called
self.assertTrue(mock.called)
def test_create_domain_junk(self):
# Create a server
self.create_server()
@ -102,6 +111,13 @@ class ApiV1DomainsTest(ApiV1Test):
self.assertIn('domains', response.json)
self.assertEqual(2, len(response.json['domains']))
@patch.object(central_service.Service, 'find_domains')
def test_get_domains_trailing_slash(self, mock):
self.get('domains/')
# verify that the central service is called
self.assertTrue(mock.called)
@patch.object(central_service.Service, 'find_domains',
side_effect=rpc_common.Timeout())
def test_get_domains_timeout(self, _):
@ -156,6 +172,16 @@ class ApiV1DomainsTest(ApiV1Test):
self.assertIn('id', response.json)
self.assertEqual(response.json['id'], domain['id'])
@patch.object(central_service.Service, 'get_domain')
def test_get_domain_trailing_slash(self, mock):
# Create a domain
domain = self.create_domain()
self.get('domains/%s/' % domain['id'])
# verify that the central service is called
self.assertTrue(mock.called)
@patch.object(central_service.Service, 'get_domain',
side_effect=rpc_common.Timeout())
def test_get_domain_timeout(self, _):
@ -189,6 +215,18 @@ class ApiV1DomainsTest(ApiV1Test):
self.assertIn('email', response.json)
self.assertEqual(response.json['email'], 'prefix-%s' % domain['email'])
@patch.object(central_service.Service, 'update_domain')
def test_update_domain_trailing_slash(self, mock):
# Create a domain
domain = self.create_domain()
data = {'email': 'prefix-%s' % domain['email']}
self.put('domains/%s/' % domain['id'], data=data)
# verify that the central service is called
self.assertTrue(mock.called)
def test_update_domain_junk(self):
# Create a domain
domain = self.create_domain()
@ -258,6 +296,16 @@ class ApiV1DomainsTest(ApiV1Test):
# Esnure we can no longer fetch the domain
self.get('domains/%s' % domain['id'], status_code=404)
@patch.object(central_service.Service, 'delete_domain')
def test_delete_domain_trailing_slash(self, mock):
# Create a domain
domain = self.create_domain()
self.delete('domains/%s/' % domain['id'])
# verify that the central service is called
self.assertTrue(mock.called)
@patch.object(central_service.Service, 'delete_domain',
side_effect=rpc_common.Timeout())
def test_delete_domain_timeout(self, _):

View File

@ -42,6 +42,15 @@ class ApiV1RecordsTest(ApiV1Test):
self.assertIn('name', response.json)
self.assertEqual(response.json['name'], fixture['name'])
@patch.object(central_service.Service, 'create_record')
def test_create_record_trailing_slash(self, mock):
# Create a record with a trailing slash
self.post('domains/%s/records/' % self.domain['id'],
data=self.get_record_fixture(self.domain['name'], 0))
# verify that the central service is called
self.assertTrue(mock.called)
def test_create_record_junk(self):
fixture = self.get_record_fixture(self.domain['name'], 0)
@ -179,6 +188,13 @@ class ApiV1RecordsTest(ApiV1Test):
self.assertIn('records', response.json)
self.assertEqual(2, len(response.json['records']))
@patch.object(central_service.Service, 'find_records')
def test_get_records_trailing_slash(self, mock):
self.get('domains/%s/records/' % self.domain['id'])
# verify that the central service is called
self.assertTrue(mock.called)
@patch.object(central_service.Service, 'find_records',
side_effect=rpc_common.Timeout())
def test_get_records_timeout(self, _):
@ -203,6 +219,17 @@ class ApiV1RecordsTest(ApiV1Test):
self.assertIn('id', response.json)
self.assertEqual(response.json['id'], record['id'])
@patch.object(central_service.Service, 'get_record')
def test_get_record_trailing_slash(self, mock):
# Create a record
record = self.create_record(self.domain)
self.get('domains/%s/records/%s/' % (self.domain['id'],
record['id']))
# verify that the central service is called
self.assertTrue(mock.called)
def test_update_record(self):
# Create a record
record = self.create_record(self.domain)
@ -219,6 +246,20 @@ class ApiV1RecordsTest(ApiV1Test):
self.assertIn('name', response.json)
self.assertEqual(response.json['name'], 'prefix-%s' % record['name'])
@patch.object(central_service.Service, 'update_record')
def test_update_record_trailing_slash(self, mock):
# Create a record
record = self.create_record(self.domain)
data = {'name': 'prefix-%s' % record['name']}
self.put('domains/%s/records/%s/' % (self.domain['id'],
record['id']),
data=data)
# verify that the central service is called
self.assertTrue(mock.called)
def test_update_record_junk(self):
# Create a record
record = self.create_record(self.domain)
@ -292,6 +333,17 @@ class ApiV1RecordsTest(ApiV1Test):
record['id']),
status_code=404)
@patch.object(central_service.Service, 'delete_record')
def test_delete_record_trailing_slash(self, mock):
# Create a record
record = self.create_record(self.domain)
self.delete('domains/%s/records/%s/' % (self.domain['id'],
record['id']))
# verify that the central service is called
self.assertTrue(mock.called)
@patch.object(central_service.Service, 'delete_record',
side_effect=rpc_common.Timeout())
def test_delete_record_timeout(self, _):

View File

@ -37,6 +37,14 @@ class ApiV1ServersTest(ApiV1Test):
self.assertIn('name', response.json)
self.assertEqual(response.json['name'], fixture['name'])
@patch.object(central_service.Service, 'create_server')
def test_create_server_trailing_slash(self, mock):
# Create a server with a trailing slash
self.post('servers/', data=self.get_server_fixture(0))
# verify that the central service is called
self.assertTrue(mock.called)
def test_create_server_junk(self):
# Create a server
fixture = self.get_server_fixture(0)
@ -85,6 +93,13 @@ class ApiV1ServersTest(ApiV1Test):
self.assertIn('servers', response.json)
self.assertEqual(2, len(response.json['servers']))
@patch.object(central_service.Service, 'find_servers')
def test_get_servers_trailing_slash(self, mock):
self.get('servers/')
# verify that the central service is called
self.assertTrue(mock.called)
@patch.object(central_service.Service, 'find_servers',
side_effect=rpc_common.Timeout())
def test_get_servers_timeout(self, _):
@ -99,6 +114,16 @@ class ApiV1ServersTest(ApiV1Test):
self.assertIn('id', response.json)
self.assertEqual(response.json['id'], server['id'])
@patch.object(central_service.Service, 'get_server')
def test_get_server_trailing_slash(self, mock):
# Create a server
server = self.create_server()
self.get('servers/%s/' % server['id'])
# verify that the central service is called
self.assertTrue(mock.called)
@patch.object(central_service.Service, 'get_server',
side_effect=rpc_common.Timeout())
def test_get_server_timeout(self, _):
@ -125,6 +150,18 @@ class ApiV1ServersTest(ApiV1Test):
self.assertIn('name', response.json)
self.assertEqual(response.json['name'], 'test.example.org.')
@patch.object(central_service.Service, 'update_server')
def test_update_server_trailing_slash(self, mock):
# Create a server
server = self.create_server()
data = {'name': 'test.example.org.'}
self.put('servers/%s/' % server['id'], data=data)
# verify that the central service is called
self.assertTrue(mock.called)
def test_update_server_junk(self):
# Create a server
server = self.create_server()
@ -164,9 +201,19 @@ class ApiV1ServersTest(ApiV1Test):
self.delete('servers/%s' % server['id'])
# Esnure we can no longer fetch the server
# Ensure we can no longer fetch the server
self.get('servers/%s' % server['id'], status_code=404)
@patch.object(central_service.Service, 'delete_server')
def test_delete_server_trailing_slash(self, mock):
# Create a server
server = self.create_server()
self.delete('servers/%s/' % server['id'])
# verify that the central service is called
self.assertTrue(mock.called)
@patch.object(central_service.Service, 'delete_server',
side_effect=rpc_common.Timeout())
def test_delete_server_timeout(self, _):