From 369df5943582b970d0cfabc17419d345463a7cc8 Mon Sep 17 00:00:00 2001 From: David Moreau Simard Date: Fri, 22 Jun 2018 23:58:19 -0400 Subject: [PATCH] Remove trailing slashes from URL MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This has been annoying me way too much. (╯°□°)╯︵ ┻━┻ Depends-On: https://review.openstack.org/#/c/577632/ Change-Id: I0d66f3e37027151e8d9d418db30a9c725372a396 --- ara/api/tests/tests_file.py | 14 ++++---- ara/api/tests/{test_host.py => tests_host.py} | 16 +++++----- ara/api/tests/tests_play.py | 14 ++++---- ara/api/tests/tests_playbook.py | 14 ++++---- ara/api/tests/tests_playbook_file.py | 8 ++--- ara/api/tests/tests_report.py | 12 +++---- ara/api/tests/tests_result.py | 12 +++---- ara/api/tests/tests_task.py | 14 ++++---- ara/api/urls.py | 32 +++++++++---------- ara/server/settings.py | 1 + ara/server/urls.py | 4 +-- 11 files changed, 71 insertions(+), 70 deletions(-) rename ara/api/tests/{test_host.py => tests_host.py} (89%) diff --git a/ara/api/tests/tests_file.py b/ara/api/tests/tests_file.py index b61a25e..987983e 100644 --- a/ara/api/tests/tests_file.py +++ b/ara/api/tests/tests_file.py @@ -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()) diff --git a/ara/api/tests/test_host.py b/ara/api/tests/tests_host.py similarity index 89% rename from ara/api/tests/test_host.py rename to ara/api/tests/tests_host.py index 1140cee..fdeaf61 100644 --- a/ara/api/tests/test_host.py +++ b/ara/api/tests/tests_host.py @@ -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']) diff --git a/ara/api/tests/tests_play.py b/ara/api/tests/tests_play.py index 5815a45..627b734 100644 --- a/ara/api/tests/tests_play.py +++ b/ara/api/tests/tests_play.py @@ -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)) diff --git a/ara/api/tests/tests_playbook.py b/ara/api/tests/tests_playbook.py index 5c9c8c4..415e248 100644 --- a/ara/api/tests/tests_playbook.py +++ b/ara/api/tests/tests_playbook.py @@ -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 diff --git a/ara/api/tests/tests_playbook_file.py b/ara/api/tests/tests_playbook_file.py index 641fc7c..9945d66 100644 --- a/ara/api/tests/tests_playbook_file.py +++ b/ara/api/tests/tests_playbook_file.py @@ -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 }) diff --git a/ara/api/tests/tests_report.py b/ara/api/tests/tests_report.py index 51b385c..55627a5 100644 --- a/ara/api/tests/tests_report.py +++ b/ara/api/tests/tests_report.py @@ -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()) diff --git a/ara/api/tests/tests_result.py b/ara/api/tests/tests_result.py index ac31211..d9998dd 100644 --- a/ara/api/tests/tests_result.py +++ b/ara/api/tests/tests_result.py @@ -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']) diff --git a/ara/api/tests/tests_task.py b/ara/api/tests/tests_task.py index 64df977..a7588a3 100644 --- a/ara/api/tests/tests_task.py +++ b/ara/api/tests/tests_task.py @@ -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)) diff --git a/ara/api/urls.py b/ara/api/urls.py index 0de4d2a..00e1a7d 100644 --- a/ara/api/urls.py +++ b/ara/api/urls.py @@ -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[0-9]+)/$', views.ReportDetail.as_view(), name='report-detail'), - url(r'^playbooks/$', views.PlaybookList.as_view(), name='playbook-list'), - url(r'^playbooks/(?P[0-9]+)/$', views.PlaybookDetail.as_view(), name='playbook-detail'), - url(r'^playbooks/(?P[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[0-9]+)/$', views.PlayDetail.as_view(), name='play-detail'), - url(r'^tasks/$', views.TaskList.as_view(), name='task-list'), - url(r'^tasks/(?P[0-9]+)/$', views.TaskDetail.as_view(), name='task-detail'), - url(r'^hosts/$', views.HostList.as_view(), name='host-list'), - url(r'^hosts/(?P[0-9]+)/$', views.HostDetail.as_view(), name='host-detail'), - url(r'^results/$', views.ResultList.as_view(), name='result-list'), - url(r'^results/(?P[0-9]+)/$', views.ResultDetail.as_view(), name='result-detail'), - url(r'^files/$', views.FileList.as_view(), name='file-list'), - url(r'^files/(?P[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[0-9]+)$', views.ReportDetail.as_view(), name='report-detail'), + url(r'^/playbooks$', views.PlaybookList.as_view(), name='playbook-list'), + url(r'^/playbooks/(?P[0-9]+)$', views.PlaybookDetail.as_view(), name='playbook-detail'), + url(r'^/playbooks/(?P[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[0-9]+)$', views.PlayDetail.as_view(), name='play-detail'), + url(r'^/tasks$', views.TaskList.as_view(), name='task-list'), + url(r'^/tasks/(?P[0-9]+)$', views.TaskDetail.as_view(), name='task-detail'), + url(r'^/hosts$', views.HostList.as_view(), name='host-list'), + url(r'^/hosts/(?P[0-9]+)$', views.HostDetail.as_view(), name='host-detail'), + url(r'^/results$', views.ResultList.as_view(), name='result-list'), + url(r'^/results/(?P[0-9]+)$', views.ResultDetail.as_view(), name='result-detail'), + url(r'^/files$', views.FileList.as_view(), name='file-list'), + url(r'^/files/(?P[0-9]+)$', views.FileDetail.as_view(), name='file-detail'), ] urlpatterns = format_suffix_patterns(urlpatterns) diff --git a/ara/server/settings.py b/ara/server/settings.py index 15c4e18..58f8854 100644 --- a/ara/server/settings.py +++ b/ara/server/settings.py @@ -45,6 +45,7 @@ MIDDLEWARE = [ CORS_ORIGIN_ALLOW_ALL = True ROOT_URLCONF = 'ara.server.urls' +APPEND_SLASH = False TEMPLATES = [ { diff --git a/ara/server/urls.py b/ara/server/urls.py index be7836c..f82fd40 100644 --- a/ara/server/urls.py +++ b/ara/server/urls.py @@ -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)