Remove trailing slashes from URL

This has been annoying me way too much.

(╯°□°)╯︵ ┻━┻

Depends-On: https://review.openstack.org/#/c/577632/
Change-Id: I0d66f3e37027151e8d9d418db30a9c725372a396
This commit is contained in:
David Moreau Simard 2018-06-22 23:58:19 -04:00
parent 9a7e22c2fa
commit 369df59435
No known key found for this signature in database
GPG Key ID: 33A07694CBB71ECC
11 changed files with 71 additions and 70 deletions

View File

@ -61,7 +61,7 @@ class FileTestCase(APITestCase):
def test_create_file(self):
self.assertEqual(0, models.File.objects.count())
request = self.client.post('/api/v1/files/', {
request = self.client.post('/api/v1/files', {
'path': '/path/playbook.yml',
'content': factories.FILE_CONTENTS
})
@ -69,24 +69,24 @@ class FileTestCase(APITestCase):
self.assertEqual(1, models.File.objects.count())
def test_get_no_files(self):
request = self.client.get('/api/v1/files/')
request = self.client.get('/api/v1/files')
self.assertEqual(0, len(request.data['results']))
def test_get_files(self):
file = factories.FileFactory()
request = self.client.get('/api/v1/files/')
request = self.client.get('/api/v1/files')
self.assertEqual(1, len(request.data['results']))
self.assertEqual(file.path, request.data['results'][0]['path'])
def test_get_file(self):
file = factories.FileFactory()
request = self.client.get('/api/v1/files/%s/' % file.id)
request = self.client.get('/api/v1/files/%s' % file.id)
self.assertEqual(file.path, request.data['path'])
def test_update_file(self):
file = factories.FileFactory()
self.assertNotEqual('/path/new_playbook.yml', file.path)
request = self.client.put('/api/v1/files/%s/' % file.id, {
request = self.client.put('/api/v1/files/%s' % file.id, {
"path": "/path/new_playbook.yml",
'content': '# playbook'
})
@ -97,7 +97,7 @@ class FileTestCase(APITestCase):
def test_partial_update_file(self):
file = factories.FileFactory()
self.assertNotEqual('/path/new_playbook.yml', file.path)
request = self.client.patch('/api/v1/files/%s/' % file.id, {
request = self.client.patch('/api/v1/files/%s' % file.id, {
"path": "/path/new_playbook.yml",
})
self.assertEqual(200, request.status_code)
@ -107,6 +107,6 @@ class FileTestCase(APITestCase):
def test_delete_file(self):
file = factories.FileFactory()
self.assertEqual(1, models.File.objects.all().count())
request = self.client.delete('/api/v1/files/%s/' % file.id)
request = self.client.delete('/api/v1/files/%s' % file.id)
self.assertEqual(204, request.status_code)
self.assertEqual(0, models.File.objects.all().count())

View File

@ -59,26 +59,26 @@ class HostTestCase(APITestCase):
self.assertEqual(serializer.data['facts'], factories.HOST_FACTS)
def test_get_no_hosts(self):
request = self.client.get('/api/v1/hosts/')
request = self.client.get('/api/v1/hosts')
self.assertEqual(0, len(request.data['results']))
def test_get_hosts(self):
host = factories.HostFactory()
request = self.client.get('/api/v1/hosts/')
request = self.client.get('/api/v1/hosts')
self.assertEqual(1, len(request.data['results']))
self.assertEqual(host.name, request.data['results'][0]['name'])
def test_delete_host(self):
host = factories.HostFactory()
self.assertEqual(1, models.Host.objects.all().count())
request = self.client.delete('/api/v1/hosts/%s/' % host.id)
request = self.client.delete('/api/v1/hosts/%s' % host.id)
self.assertEqual(204, request.status_code)
self.assertEqual(0, models.Host.objects.all().count())
def test_create_host(self):
play = factories.PlayFactory()
self.assertEqual(0, models.Host.objects.count())
request = self.client.post('/api/v1/hosts/', {
request = self.client.post('/api/v1/hosts', {
'name': 'create',
'play': play.id
})
@ -88,7 +88,7 @@ class HostTestCase(APITestCase):
def test_post_same_host_for_a_play(self):
play = factories.PlayFactory()
self.assertEqual(0, models.Host.objects.count())
request = self.client.post('/api/v1/hosts/', {
request = self.client.post('/api/v1/hosts', {
'name': 'create',
'play': play.id,
'ok': 1
@ -97,7 +97,7 @@ class HostTestCase(APITestCase):
self.assertEqual(1, models.Host.objects.count())
self.assertEqual(1, request.data['ok'])
request = self.client.post('/api/v1/hosts/', {
request = self.client.post('/api/v1/hosts', {
'name': 'create',
'play': play.id,
'ok': 2
@ -110,7 +110,7 @@ class HostTestCase(APITestCase):
def test_partial_update_host(self):
host = factories.HostFactory()
self.assertNotEqual(1, host.ok)
request = self.client.patch('/api/v1/hosts/%s/' % host.id, {
request = self.client.patch('/api/v1/hosts/%s' % host.id, {
'ok': 1
})
self.assertEqual(200, request.status_code)
@ -119,5 +119,5 @@ class HostTestCase(APITestCase):
def test_get_host(self):
host = factories.HostFactory()
request = self.client.get('/api/v1/hosts/%s/' % host.id)
request = self.client.get('/api/v1/hosts/%s' % host.id)
self.assertEqual(host.name, request.data['name'])

View File

@ -41,26 +41,26 @@ class PlayTestCase(APITestCase):
self.assertEqual(play.name, 'serializer')
def test_get_no_plays(self):
request = self.client.get('/api/v1/plays/')
request = self.client.get('/api/v1/plays')
self.assertEqual(0, len(request.data['results']))
def test_get_plays(self):
play = factories.PlayFactory()
request = self.client.get('/api/v1/plays/')
request = self.client.get('/api/v1/plays')
self.assertEqual(1, len(request.data['results']))
self.assertEqual(play.name, request.data['results'][0]['name'])
def test_delete_play(self):
play = factories.PlayFactory()
self.assertEqual(1, models.Play.objects.all().count())
request = self.client.delete('/api/v1/plays/%s/' % play.id)
request = self.client.delete('/api/v1/plays/%s' % play.id)
self.assertEqual(204, request.status_code)
self.assertEqual(0, models.Play.objects.all().count())
def test_create_play(self):
playbook = factories.PlaybookFactory()
self.assertEqual(0, models.Play.objects.count())
request = self.client.post('/api/v1/plays/', {
request = self.client.post('/api/v1/plays', {
'name': 'create',
'completed': False,
'playbook': playbook.id
@ -71,7 +71,7 @@ class PlayTestCase(APITestCase):
def test_partial_update_play(self):
play = factories.PlayFactory()
self.assertNotEqual('update', play.name)
request = self.client.patch('/api/v1/plays/%s/' % play.id, {
request = self.client.patch('/api/v1/plays/%s' % play.id, {
'name': 'update',
})
self.assertEqual(200, request.status_code)
@ -80,12 +80,12 @@ class PlayTestCase(APITestCase):
def test_get_play(self):
play = factories.PlayFactory()
request = self.client.get('/api/v1/plays/%s/' % play.id)
request = self.client.get('/api/v1/plays/%s' % play.id)
self.assertEqual(play.name, request.data['name'])
def test_get_play_duration(self):
started = timezone.now()
ended = started + datetime.timedelta(hours=1)
play = factories.PlayFactory(started=started, ended=ended)
request = self.client.get('/api/v1/plays/%s/' % play.id)
request = self.client.get('/api/v1/plays/%s' % play.id)
self.assertEqual(request.data['duration'], datetime.timedelta(0, 3600))

View File

@ -66,25 +66,25 @@ class PlaybookTestCase(APITestCase):
self.assertEqual(serializer.data['parameters'], factories.PLAYBOOK_PARAMETERS)
def test_get_no_playbooks(self):
request = self.client.get('/api/v1/playbooks/')
request = self.client.get('/api/v1/playbooks')
self.assertEqual(0, len(request.data['results']))
def test_get_playbooks(self):
playbook = factories.PlaybookFactory()
request = self.client.get('/api/v1/playbooks/')
request = self.client.get('/api/v1/playbooks')
self.assertEqual(1, len(request.data['results']))
self.assertEqual(playbook.ansible_version, request.data['results'][0]['ansible_version'])
def test_delete_playbook(self):
playbook = factories.PlaybookFactory()
self.assertEqual(1, models.Playbook.objects.all().count())
request = self.client.delete('/api/v1/playbooks/%s/' % playbook.id)
request = self.client.delete('/api/v1/playbooks/%s' % playbook.id)
self.assertEqual(204, request.status_code)
self.assertEqual(0, models.Playbook.objects.all().count())
def test_create_playbook(self):
self.assertEqual(0, models.Playbook.objects.count())
request = self.client.post('/api/v1/playbooks/', {
request = self.client.post('/api/v1/playbooks', {
"ansible_version": "2.4.0",
'file': {
'path': '/path/playbook.yml',
@ -97,7 +97,7 @@ class PlaybookTestCase(APITestCase):
def test_partial_update_playbook(self):
playbook = factories.PlaybookFactory()
self.assertNotEqual('2.3.0', playbook.ansible_version)
request = self.client.patch('/api/v1/playbooks/%s/' % playbook.id, {
request = self.client.patch('/api/v1/playbooks/%s' % playbook.id, {
"ansible_version": "2.3.0",
})
self.assertEqual(200, request.status_code)
@ -106,14 +106,14 @@ class PlaybookTestCase(APITestCase):
def test_get_playbook(self):
playbook = factories.PlaybookFactory()
request = self.client.get('/api/v1/playbooks/%s/' % playbook.id)
request = self.client.get('/api/v1/playbooks/%s' % playbook.id)
self.assertEqual(playbook.ansible_version, request.data['ansible_version'])
def test_get_playbook_duration(self):
started = timezone.now()
ended = started + datetime.timedelta(hours=1)
playbook = factories.PlaybookFactory(started=started, ended=ended)
request = self.client.get('/api/v1/playbooks/%s/' % playbook.id)
request = self.client.get('/api/v1/playbooks/%s' % playbook.id)
self.assertEqual(request.data['duration'], datetime.timedelta(0, 3600))
# TODO: Add tests for incrementally updating files

View File

@ -25,7 +25,7 @@ class PlaybookFileTestCase(APITestCase):
def test_create_a_file_and_a_playbook_directly(self):
self.assertEqual(0, models.Playbook.objects.all().count())
self.assertEqual(0, models.File.objects.all().count())
self.client.post('/api/v1/playbooks/', {
self.client.post('/api/v1/playbooks', {
'ansible_version': '2.4.0',
'file': {
'path': '/path/playbook.yml',
@ -42,7 +42,7 @@ class PlaybookFileTestCase(APITestCase):
def test_create_file_to_a_playbook(self):
playbook = factories.PlaybookFactory()
self.assertEqual(1, models.File.objects.all().count())
self.client.post('/api/v1/playbooks/%s/files/' % playbook.id, {
self.client.post('/api/v1/playbooks/%s/files' % playbook.id, {
'path': '/path/playbook.yml',
'content': factories.FILE_CONTENTS
})
@ -54,11 +54,11 @@ class PlaybookFileTestCase(APITestCase):
number_playbooks = models.File.objects.all().count()
number_file_contents = models.FileContent.objects.all().count()
content = '# %s' % factories.FILE_CONTENTS
self.client.post('/api/v1/playbooks/%s/files/' % playbook.id, {
self.client.post('/api/v1/playbooks/%s/files' % playbook.id, {
'path': '/path/1/playbook.yml',
'content': content
})
self.client.post('/api/v1/playbooks/%s/files/' % playbook.id, {
self.client.post('/api/v1/playbooks/%s/files' % playbook.id, {
'path': '/path/2/playbook.yml',
'content': content
})

View File

@ -55,7 +55,7 @@ class ReportTestCase(APITestCase):
def test_create_report(self):
self.assertEqual(0, models.Report.objects.count())
request = self.client.post('/api/v1/reports/', {
request = self.client.post('/api/v1/reports', {
'name': 'compress',
'description': factories.REPORT_DESCRIPTION
})
@ -63,24 +63,24 @@ class ReportTestCase(APITestCase):
self.assertEqual(1, models.Report.objects.count())
def test_get_no_reports(self):
request = self.client.get('/api/v1/reports/')
request = self.client.get('/api/v1/reports')
self.assertEqual(0, len(request.data['results']))
def test_get_reports(self):
report = factories.ReportFactory()
request = self.client.get('/api/v1/reports/')
request = self.client.get('/api/v1/reports')
self.assertEqual(1, len(request.data['results']))
self.assertEqual(report.name, request.data['results'][0]['name'])
def test_get_report(self):
report = factories.ReportFactory()
request = self.client.get('/api/v1/reports/%s/' % report.id)
request = self.client.get('/api/v1/reports/%s' % report.id)
self.assertEqual(report.name, request.data['name'])
def test_partial_update_report(self):
report = factories.ReportFactory()
self.assertNotEqual('updated', report.name)
request = self.client.patch('/api/v1/reports/%s/' % report.id, {
request = self.client.patch('/api/v1/reports/%s' % report.id, {
'name': 'updated'
})
self.assertEqual(200, request.status_code)
@ -90,6 +90,6 @@ class ReportTestCase(APITestCase):
def test_delete_report(self):
report = factories.ReportFactory()
self.assertEqual(1, models.Report.objects.all().count())
request = self.client.delete('/api/v1/reports/%s/' % report.id)
request = self.client.delete('/api/v1/reports/%s' % report.id)
self.assertEqual(204, request.status_code)
self.assertEqual(0, models.Report.objects.all().count())

View File

@ -61,19 +61,19 @@ class ResultTestCase(APITestCase):
self.assertEqual(serializer.data['content'], factories.RESULT_CONTENTS)
def test_get_no_results(self):
request = self.client.get('/api/v1/results/')
request = self.client.get('/api/v1/results')
self.assertEqual(0, len(request.data['results']))
def test_get_results(self):
result = factories.ResultFactory()
request = self.client.get('/api/v1/results/')
request = self.client.get('/api/v1/results')
self.assertEqual(1, len(request.data['results']))
self.assertEqual(result.status, request.data['results'][0]['status'])
def test_delete_result(self):
result = factories.ResultFactory()
self.assertEqual(1, models.Result.objects.all().count())
request = self.client.delete('/api/v1/results/%s/' % result.id)
request = self.client.delete('/api/v1/results/%s' % result.id)
self.assertEqual(204, request.status_code)
self.assertEqual(0, models.Result.objects.all().count())
@ -81,7 +81,7 @@ class ResultTestCase(APITestCase):
host = factories.HostFactory()
task = factories.TaskFactory()
self.assertEqual(0, models.Result.objects.count())
request = self.client.post('/api/v1/results/', {
request = self.client.post('/api/v1/results', {
'status': 'ok',
'host': host.id,
'task': task.id,
@ -93,7 +93,7 @@ class ResultTestCase(APITestCase):
def test_partial_update_result(self):
result = factories.ResultFactory()
self.assertNotEqual('unreachable', result.status)
request = self.client.patch('/api/v1/results/%s/' % result.id, {
request = self.client.patch('/api/v1/results/%s' % result.id, {
'status': 'unreachable'
})
self.assertEqual(200, request.status_code)
@ -102,5 +102,5 @@ class ResultTestCase(APITestCase):
def test_get_result(self):
result = factories.ResultFactory()
request = self.client.get('/api/v1/results/%s/' % result.id)
request = self.client.get('/api/v1/results/%s' % result.id)
self.assertEqual(result.status, request.data['status'])

View File

@ -70,19 +70,19 @@ class TaskTestCase(APITestCase):
self.assertEqual(serializer.data['tags'], factories.TASK_TAGS)
def test_get_no_tasks(self):
request = self.client.get('/api/v1/tasks/')
request = self.client.get('/api/v1/tasks')
self.assertEqual(0, len(request.data['results']))
def test_get_tasks(self):
task = factories.TaskFactory()
request = self.client.get('/api/v1/tasks/')
request = self.client.get('/api/v1/tasks')
self.assertEqual(1, len(request.data['results']))
self.assertEqual(task.name, request.data['results'][0]['name'])
def test_delete_task(self):
task = factories.TaskFactory()
self.assertEqual(1, models.Task.objects.all().count())
request = self.client.delete('/api/v1/tasks/%s/' % task.id)
request = self.client.delete('/api/v1/tasks/%s' % task.id)
self.assertEqual(204, request.status_code)
self.assertEqual(0, models.Task.objects.all().count())
@ -90,7 +90,7 @@ class TaskTestCase(APITestCase):
play = factories.PlayFactory()
file = factories.FileFactory()
self.assertEqual(0, models.Task.objects.count())
request = self.client.post('/api/v1/tasks/', {
request = self.client.post('/api/v1/tasks', {
'name': 'create',
'action': 'test',
'lineno': 2,
@ -105,7 +105,7 @@ class TaskTestCase(APITestCase):
def test_partial_update_task(self):
task = factories.TaskFactory()
self.assertNotEqual('update', task.name)
request = self.client.patch('/api/v1/tasks/%s/' % task.id, {
request = self.client.patch('/api/v1/tasks/%s' % task.id, {
'name': 'update'
})
self.assertEqual(200, request.status_code)
@ -114,12 +114,12 @@ class TaskTestCase(APITestCase):
def test_get_task(self):
task = factories.TaskFactory()
request = self.client.get('/api/v1/tasks/%s/' % task.id)
request = self.client.get('/api/v1/tasks/%s' % task.id)
self.assertEqual(task.name, request.data['name'])
def test_get_task_duration(self):
started = timezone.now()
ended = started + datetime.timedelta(hours=1)
task = factories.TaskFactory(started=started, ended=ended)
request = self.client.get('/api/v1/tasks/%s/' % task.id)
request = self.client.get('/api/v1/tasks/%s' % task.id)
self.assertEqual(request.data['duration'], datetime.timedelta(0, 3600))

View File

@ -20,22 +20,22 @@ from rest_framework.urlpatterns import format_suffix_patterns
from ara.api import views
urlpatterns = [
url(r'^$', views.api_root),
url(r'^reports/$', views.ReportList.as_view(), name='report-list'),
url(r'^reports/(?P<pk>[0-9]+)/$', views.ReportDetail.as_view(), name='report-detail'),
url(r'^playbooks/$', views.PlaybookList.as_view(), name='playbook-list'),
url(r'^playbooks/(?P<pk>[0-9]+)/$', views.PlaybookDetail.as_view(), name='playbook-detail'),
url(r'^playbooks/(?P<pk>[0-9]+)/files/$', views.PlaybookFilesDetail.as_view(), name='playbook-file-detail'),
url(r'^plays/$', views.PlayList.as_view(), name='play-list'),
url(r'^plays/(?P<pk>[0-9]+)/$', views.PlayDetail.as_view(), name='play-detail'),
url(r'^tasks/$', views.TaskList.as_view(), name='task-list'),
url(r'^tasks/(?P<pk>[0-9]+)/$', views.TaskDetail.as_view(), name='task-detail'),
url(r'^hosts/$', views.HostList.as_view(), name='host-list'),
url(r'^hosts/(?P<pk>[0-9]+)/$', views.HostDetail.as_view(), name='host-detail'),
url(r'^results/$', views.ResultList.as_view(), name='result-list'),
url(r'^results/(?P<pk>[0-9]+)/$', views.ResultDetail.as_view(), name='result-detail'),
url(r'^files/$', views.FileList.as_view(), name='file-list'),
url(r'^files/(?P<pk>[0-9]+)/$', views.FileDetail.as_view(), name='file-detail'),
url(r'^/$', views.api_root),
url(r'^/reports$', views.ReportList.as_view(), name='report-list'),
url(r'^/reports/(?P<pk>[0-9]+)$', views.ReportDetail.as_view(), name='report-detail'),
url(r'^/playbooks$', views.PlaybookList.as_view(), name='playbook-list'),
url(r'^/playbooks/(?P<pk>[0-9]+)$', views.PlaybookDetail.as_view(), name='playbook-detail'),
url(r'^/playbooks/(?P<pk>[0-9]+)/files$', views.PlaybookFilesDetail.as_view(), name='playbook-file-detail'),
url(r'^/plays$', views.PlayList.as_view(), name='play-list'),
url(r'^/plays/(?P<pk>[0-9]+)$', views.PlayDetail.as_view(), name='play-detail'),
url(r'^/tasks$', views.TaskList.as_view(), name='task-list'),
url(r'^/tasks/(?P<pk>[0-9]+)$', views.TaskDetail.as_view(), name='task-detail'),
url(r'^/hosts$', views.HostList.as_view(), name='host-list'),
url(r'^/hosts/(?P<pk>[0-9]+)$', views.HostDetail.as_view(), name='host-detail'),
url(r'^/results$', views.ResultList.as_view(), name='result-list'),
url(r'^/results/(?P<pk>[0-9]+)$', views.ResultDetail.as_view(), name='result-detail'),
url(r'^/files$', views.FileList.as_view(), name='file-list'),
url(r'^/files/(?P<pk>[0-9]+)$', views.FileDetail.as_view(), name='file-detail'),
]
urlpatterns = format_suffix_patterns(urlpatterns)

View File

@ -45,6 +45,7 @@ MIDDLEWARE = [
CORS_ORIGIN_ALLOW_ALL = True
ROOT_URLCONF = 'ara.server.urls'
APPEND_SLASH = False
TEMPLATES = [
{

View File

@ -7,7 +7,7 @@ admin.site.site_header = 'Administration'
admin.site.index_title = 'Administration Ara'
routes = [
url(r'^api/v1/', include('ara.api.urls')),
url(r'^admin/', admin.site.urls),
url(r'^api/v1', include('ara.api.urls')),
url(r'^admin', admin.site.urls),
]
urlpatterns = routes + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)