diff --git a/swh/web/api/views/directory.py b/swh/web/api/views/directory.py --- a/swh/web/api/views/directory.py +++ b/swh/web/api/views/directory.py @@ -10,8 +10,8 @@ from swh.web.api.views.utils import api_lookup -@api_route(r'/directory/(?P[0-9a-f]+)/', 'api-directory') -@api_route(r'/directory/(?P[0-9a-f]+)/(?P.+)/', +@api_route(r'/directory/(?P[0-9a-fA-F]+)/', 'api-directory') +@api_route(r'/directory/(?P[0-9a-fA-F]+)/(?P.+)/', 'api-directory') @api_doc('/directory/') def api_directory(request, sha1_git, path=None): @@ -60,6 +60,7 @@ :swh_web_api:`directory/977fc4b98c0e85816348cebd3b12026407c368b6/` """ # noqa + sha1_git = sha1_git.lower() if path: error_msg_path = ('Entry with path %s relative to directory ' 'with sha1_git %s not found.') % (path, sha1_git) diff --git a/swh/web/api/views/release.py b/swh/web/api/views/release.py --- a/swh/web/api/views/release.py +++ b/swh/web/api/views/release.py @@ -10,7 +10,7 @@ from swh.web.api.views.utils import api_lookup -@api_route(r'/release/(?P[0-9a-f]+)/', 'api-release') +@api_route(r'/release/(?P[0-9a-fA-F]+)/', 'api-release') @api_doc('/release/') def api_release(request, sha1_git): """ @@ -51,6 +51,7 @@ :swh_web_api:`release/208f61cc7a5dbc9879ae6e5c2f95891e270f09ef/` """ # noqa + sha1_git = sha1_git.lower() error_msg = 'Release with sha1_git %s not found.' % sha1_git return api_lookup( service.lookup_release, sha1_git, diff --git a/swh/web/api/views/revision.py b/swh/web/api/views/revision.py --- a/swh/web/api/views/revision.py +++ b/swh/web/api/views/revision.py @@ -133,7 +133,7 @@ nb_rev = len(rev_get) if nb_rev == per_page+1: revisions = rev_get[:-1] - last_sha1_git = rev_get[-1]['id'] + last_sha1_git = rev_get[-1]['id'].lower() params = {k: v for k, v in {'origin_id': origin_id, 'branch_name': branch_name, @@ -271,7 +271,7 @@ enrich_fn=utils.enrich_revision) -@api_route(r'/revision/(?P[0-9a-f]+)/', 'api-revision') +@api_route(r'/revision/(?P[0-9a-fA-F]+)/', 'api-revision') @api_doc('/revision/') def api_revision(request, sha1_git): """ @@ -320,18 +320,20 @@ :swh_web_api:`revision/aafb16d69fd30ff58afdd69036a26047f3aebdc6/` """ # noqa + sha1_git = sha1_git.lower() return api_lookup( service.lookup_revision, sha1_git, notfound_msg='Revision with sha1_git {} not found.'.format(sha1_git), enrich_fn=utils.enrich_revision) -@api_route(r'/revision/(?P[0-9a-f]+)/raw/', +@api_route(r'/revision/(?P[0-9a-fA-F]+)/raw/', 'api-revision-raw-message') @api_doc('/revision/raw/', tags=['hidden'], handle_response=True) def api_revision_raw_message(request, sha1_git): """Return the raw data of the message of revision identified by sha1_git """ + sha1_git = sha1_git.lower() raw = service.lookup_revision_message(sha1_git) response = HttpResponse(raw['message'], content_type='application/octet-stream') @@ -340,9 +342,9 @@ return response -@api_route(r'/revision/(?P[0-9a-f]+)/directory/', +@api_route(r'/revision/(?P[0-9a-fA-F]+)/directory/', 'api-revision-directory') -@api_route(r'/revision/(?P[0-9a-f]+)/directory/(?P.+)/', +@api_route(r'/revision/(?P[0-9a-fA-F]+)/directory/(?P.+)/', 'api-revision-directory') @api_doc('/revision/directory/') def api_revision_directory(request, sha1_git, @@ -381,14 +383,15 @@ :swh_web_api:`revision/f1b94134a4b879bc55c3dacdb496690c8ebdc03f/directory/` """ # noqa + sha1_git = sha1_git.lower() return _revision_directory_by({'sha1_git': sha1_git}, dir_path, request.path, with_data=with_data) -@api_route(r'/revision/(?P[0-9a-f]+)/log/', 'api-revision-log') -@api_route(r'/revision/(?P[0-9a-f]+)' - r'/prev/(?P[0-9a-f/]+)/log/', +@api_route(r'/revision/(?P[0-9a-fA-F]+)/log/', 'api-revision-log') +@api_route(r'/revision/(?P[0-9a-fA-F]+)' + r'/prev/(?P[0-9a-fA-F/]+)/log/', 'api-revision-log') @api_doc('/revision/log/') def api_revision_log(request, sha1_git, prev_sha1s=None): @@ -441,6 +444,7 @@ :swh_web_api:`revision/e1a315fa3fa734e2a6154ed7b5b9ae0eb8987aad/log/` """ # noqa + sha1_git = sha1_git.lower() result = {} per_page = int(request.query_params.get('per_page', '10')) diff --git a/swh/web/api/views/snapshot.py b/swh/web/api/views/snapshot.py --- a/swh/web/api/views/snapshot.py +++ b/swh/web/api/views/snapshot.py @@ -12,7 +12,7 @@ from swh.web.api.views.utils import api_lookup -@api_route(r'/snapshot/(?P[0-9a-f]+)/', 'api-snapshot') +@api_route(r'/snapshot/(?P[0-9a-fA-F]+)/', 'api-snapshot') @api_doc('/snapshot/') def api_snapshot(request, snapshot_id): """ @@ -65,6 +65,7 @@ :swh_web_api:`snapshot/6a3a2cf0b2b90ce7ae1cf0a221ed68035b686f5a/` """ # noqa + snapshot_id = snapshot_id.lower() def _enrich_snapshot(snapshot): s = snapshot.copy() diff --git a/swh/web/browse/views/directory.py b/swh/web/browse/views/directory.py --- a/swh/web/browse/views/directory.py +++ b/swh/web/browse/views/directory.py @@ -21,8 +21,8 @@ from swh.web.browse.browseurls import browse_route -@browse_route(r'directory/(?P[0-9a-f]+)/', - r'directory/(?P[0-9a-f]+)/(?P.+)/', +@browse_route(r'directory/(?P[0-9a-fA-F]+)/', + r'directory/(?P[0-9a-fA-F]+)/(?P.+)/', view_name='browse-directory') def directory_browse(request, sha1_git, path=None): """Django view for browsing the content of a directory identified @@ -30,6 +30,7 @@ The url that points to it is :http:get:`/browse/directory/(sha1_git)/[(path)/]` """ # noqa + sha1_git = sha1_git.lower() root_sha1_git = sha1_git try: if path: diff --git a/swh/web/browse/views/release.py b/swh/web/browse/views/release.py --- a/swh/web/browse/views/release.py +++ b/swh/web/browse/views/release.py @@ -18,7 +18,7 @@ ) -@browse_route(r'release/(?P[0-9a-f]+)/', +@browse_route(r'release/(?P[0-9a-fA-F]+)/', view_name='browse-release') def release_browse(request, sha1_git): """ @@ -27,6 +27,7 @@ The url that points to it is :http:get:`/browse/release/(sha1_git)/`. """ + sha1_git = sha1_git.lower() try: release = service.lookup_release(sha1_git) snapshot_context = None diff --git a/swh/web/browse/views/revision.py b/swh/web/browse/views/revision.py --- a/swh/web/browse/views/revision.py +++ b/swh/web/browse/views/revision.py @@ -136,12 +136,13 @@ return mark_safe('\n'.join(changes_msg)) -@browse_route(r'revision/(?P[0-9a-f]+)/diff/', +@browse_route(r'revision/(?P[0-9a-fA-F]+)/diff/', view_name='diff-revision') def _revision_diff(request, sha1_git): """ Browse internal endpoint to compute revision diff """ + sha1_git = sha1_git.lower() try: revision = service.lookup_revision(sha1_git) snapshot_context = None @@ -174,7 +175,7 @@ NB_LOG_ENTRIES = 100 -@browse_route(r'revision/(?P[0-9a-f]+)/log/', +@browse_route(r'revision/(?P[0-9a-fA-F]+)/log/', view_name='browse-revision-log') def revision_log_browse(request, sha1_git): """ @@ -183,6 +184,7 @@ The url that points to it is :http:get:`/browse/revision/(sha1_git)/log/` """ # noqa + sha1_git = sha1_git.lower() try: per_page = int(request.GET.get('per_page', NB_LOG_ENTRIES)) offset = int(request.GET.get('offset', 0)) @@ -252,8 +254,8 @@ 'swh_ids': None}) -@browse_route(r'revision/(?P[0-9a-f]+)/', - r'revision/(?P[0-9a-f]+)/(?P.+)/', +@browse_route(r'revision/(?P[0-9a-fA-F]+)/', + r'revision/(?P[0-9a-fA-F]+)/(?P.+)/', view_name='browse-revision') def revision_browse(request, sha1_git, extra_path=None): """ @@ -262,6 +264,7 @@ The url that points to it is :http:get:`/browse/revision/(sha1_git)/`. """ + sha1_git = sha1_git.lower() try: revision = service.lookup_revision(sha1_git) # some readme files can reference assets reachable from the diff --git a/swh/web/browse/views/snapshot.py b/swh/web/browse/views/snapshot.py --- a/swh/web/browse/views/snapshot.py +++ b/swh/web/browse/views/snapshot.py @@ -16,21 +16,22 @@ ) -@browse_route(r'snapshot/(?P[0-9a-f]+)/', +@browse_route(r'snapshot/(?P[0-9a-fA-F]+)/', view_name='browse-snapshot') def snapshot_browse(request, snapshot_id): """Django view for browsing the content of a snapshot. The url that points to it is :http:get:`/browse/snapshot/(snapshot_id)/` """ + snapshot_id = snapshot_id.lower() browse_snapshot_url = reverse('browse-snapshot-directory', url_args={'snapshot_id': snapshot_id}, query_params=request.GET) return redirect(browse_snapshot_url) -@browse_route(r'snapshot/(?P[0-9a-f]+)/directory/', - r'snapshot/(?P[0-9a-f]+)/directory/(?P.+)/', +@browse_route(r'snapshot/(?P[0-9a-fA-F]+)/directory/', + r'snapshot/(?P[0-9a-fA-F]+)/directory/(?P.+)/', # noqa view_name='browse-snapshot-directory') def snapshot_directory_browse(request, snapshot_id, path=None): """Django view for browsing the content of a directory collected @@ -38,6 +39,7 @@ The url that points to it is :http:get:`/browse/snapshot/(snapshot_id)/directory/[(path)/]` """ # noqa + snapshot_id = snapshot_id.lower() origin_type = request.GET.get('origin_type', None) origin_url = request.GET.get('origin_url', None) if not origin_url: @@ -47,7 +49,7 @@ origin_url=origin_url) -@browse_route(r'snapshot/(?P[0-9a-f]+)/content/(?P.+)/', +@browse_route(r'snapshot/(?P[0-9a-fA-F]+)/content/(?P.+)/', view_name='browse-snapshot-content') def snapshot_content_browse(request, snapshot_id, path): """Django view that produces an HTML display of a content @@ -55,10 +57,11 @@ The url that points to it is :http:get:`/browse/snapshot/(snapshot_id)/content/(path)/` """ # noqa + snapshot_id = snapshot_id.lower() return browse_snapshot_content(request, snapshot_id=snapshot_id, path=path) -@browse_route(r'snapshot/(?P[0-9a-f]+)/log/', +@browse_route(r'snapshot/(?P[0-9a-fA-F]+)/log/', view_name='browse-snapshot-log') def snapshot_log_browse(request, snapshot_id): """Django view that produces an HTML display of revisions history (aka @@ -66,10 +69,11 @@ The url that points to it is :http:get:`/browse/snapshot/(snapshot_id)/log/` """ # noqa + snapshot_id = snapshot_id.lower() return browse_snapshot_log(request, snapshot_id=snapshot_id) -@browse_route(r'snapshot/(?P[0-9a-f]+)/branches/', +@browse_route(r'snapshot/(?P[0-9a-fA-F]+)/branches/', view_name='browse-snapshot-branches') def snapshot_branches_browse(request, snapshot_id): """Django view that produces an HTML display of the list of releases @@ -77,10 +81,11 @@ The url that points to it is :http:get:`/browse/snapshot/(snapshot_id)/branches/` """ # noqa + snapshot_id = snapshot_id.lower() return browse_snapshot_branches(request, snapshot_id=snapshot_id) -@browse_route(r'snapshot/(?P[0-9a-f]+)/releases/', +@browse_route(r'snapshot/(?P[0-9a-fA-F]+)/releases/', view_name='browse-snapshot-releases') def snapshot_releases_browse(request, snapshot_id): """Django view that produces an HTML display of the list of releases @@ -88,4 +93,5 @@ The url that points to it is :http:get:`/browse/snapshot/(snapshot_id)/releases/` """ # noqa + snapshot_id = snapshot_id.lower() return browse_snapshot_releases(request, snapshot_id=snapshot_id) diff --git a/swh/web/tests/api/views/test_directory.py b/swh/web/tests/api/views/test_directory.py --- a/swh/web/tests/api/views/test_directory.py +++ b/swh/web/tests/api/views/test_directory.py @@ -15,8 +15,7 @@ class DirectoryApiTestCase(WebTestCase, APITestCase): - @given(directory()) - def test_api_directory(self, directory): + def _api_directory_test(self, directory): url = reverse('api-directory', url_args={'sha1_git': directory}) rv = self.client.get(url) @@ -29,6 +28,15 @@ self.assertEqual(rv.data, expected_data) + @given(directory()) + def test_api_directory(self, directory): + self._api_directory_test(directory) + + @given(directory()) + def test_api_directory_with_uppercase_sha1(self, directory): + directory = directory.upper() + self._api_directory_test(directory) + @given(unknown_directory()) def test_api_directory_not_found(self, unknown_directory): diff --git a/swh/web/tests/api/views/test_release.py b/swh/web/tests/api/views/test_release.py --- a/swh/web/tests/api/views/test_release.py +++ b/swh/web/tests/api/views/test_release.py @@ -17,8 +17,7 @@ class ReleaseApiTestCase(WebTestCase, APITestCase): - @given(release()) - def test_api_release(self, release): + def _api_release_test(self, release): url = reverse('api-release', url_args={'sha1_git': release}) @@ -38,6 +37,15 @@ self.assertEqual(rv['Content-Type'], 'application/json') self.assertEqual(rv.data, expected_release) + @given(release()) + def test_api_release(self, release): + self._api_release_test(release) + + @given(release()) + def test_api_release_with_uppercase_sha1(self, release): + release = release.upper() + self._api_release_test(release) + @given(sha1(), sha1(), sha1(), content(), directory(), release()) def test_api_release_target_type_not_a_revision(self, new_rel1, new_rel2, new_rel3, content, diff --git a/swh/web/tests/api/views/test_revision.py b/swh/web/tests/api/views/test_revision.py --- a/swh/web/tests/api/views/test_revision.py +++ b/swh/web/tests/api/views/test_revision.py @@ -23,10 +23,8 @@ class RevisionApiTestCase(WebTestCase, APITestCase): - @given(revision()) - def test_api_revision(self, revision): - - url = reverse('api-revision', url_args={'sha1_git': revision}) + def _api_revision_test(self, revision, sha1_git): + url = reverse('api-revision', url_args={'sha1_git': sha1_git}) rv = self.client.get(url) expected_revision = self.revision_get(revision) @@ -37,6 +35,16 @@ self.assertEqual(rv['Content-Type'], 'application/json') self.assertEqual(rv.data, expected_revision) + @given(revision()) + def test_api_revision(self, revision): + sha1_git = revision + self._api_revision_test(revision, sha1_git) + + @given(revision()) + def test_api_revision_with_uppercase_sha1(self, revision): + sha1_git = revision.upper() + self._api_revision_test(revision, sha1_git) + @given(unknown_revision()) def test_api_revision_not_found(self, unknown_revision): diff --git a/swh/web/tests/api/views/test_snapshot.py b/swh/web/tests/api/views/test_snapshot.py --- a/swh/web/tests/api/views/test_snapshot.py +++ b/swh/web/tests/api/views/test_snapshot.py @@ -87,8 +87,7 @@ self.assertEqual(rv['Content-Type'], 'application/json') self.assertEqual(rv.data, whole_snapshot) - @given(snapshot()) - def test_api_snapshot_filtered(self, snapshot): + def _api_snapshot_filtered_test(self, snapshot): snapshot_branches = [] @@ -114,6 +113,15 @@ self.assertEqual(rv['Content-Type'], 'application/json') self.assertEqual(rv.data, expected_data) + @given(snapshot()) + def test_api_snapshot_filtered(self, snapshot): + self._api_snapshot_filtered_test(snapshot) + + @given(snapshot()) + def test_api_snapshot_filtered_with_uppercase_sha1(self, snapshot): + snapshot = snapshot.upper() + self._api_snapshot_filtered_test(snapshot) + @given(unknown_snapshot()) def test_api_snapshot_errors(self, unknown_snapshot): diff --git a/swh/web/tests/browse/views/test_directory.py b/swh/web/tests/browse/views/test_directory.py --- a/swh/web/tests/browse/views/test_directory.py +++ b/swh/web/tests/browse/views/test_directory.py @@ -35,6 +35,9 @@ resp = self.client.get(url) + root_directory_sha1 = root_directory_sha1.lower() + root_dir_url = root_dir_url.lower() + self.assertEqual(resp.status_code, 200) self.assertTemplateUsed('browse/directory.html') self.assertContains(resp, '' + @@ -93,6 +96,11 @@ def test_root_directory_view(self, directory): self.directory_view(directory, self.directory_ls(directory)) + @given(directory()) + def test_directory_uppercase_sha1(self, directory): + directory = directory.upper() + self.directory_view(directory, self.directory_ls(directory)) + @given(directory_with_subdirs()) def test_sub_directory_view(self, directory): dir_content = self.directory_ls(directory) diff --git a/swh/web/tests/browse/views/test_release.py b/swh/web/tests/browse/views/test_release.py --- a/swh/web/tests/browse/views/test_release.py +++ b/swh/web/tests/browse/views/test_release.py @@ -18,8 +18,7 @@ class SwhBrowseReleaseTest(WebTestCase): - @given(release()) - def test_release_browse(self, release): + def _release_browse_test(self, release): url = reverse('browse-release', url_args={'sha1_git': release}) @@ -30,6 +29,15 @@ self._release_browse_checks(resp, release_data) + @given(release()) + def test_release_browse(self, release): + release = release.upper() + self._release_browse_test(release) + + @given(release()) + def test_release_browse_with_uppercase_sha1(self, release): + self._release_browse_test(release) + @given(origin_with_release()) def test_release_browse_with_origin(self, origin): snapshot = self.snapshot_get_latest(origin['id']) diff --git a/swh/web/tests/browse/views/test_revision.py b/swh/web/tests/browse/views/test_revision.py --- a/swh/web/tests/browse/views/test_revision.py +++ b/swh/web/tests/browse/views/test_revision.py @@ -18,8 +18,7 @@ class SwhBrowseRevisionTest(WebTestCase): - @given(revision()) - def test_revision_browse(self, revision): + def _revision_browse_test(self, revision): url = reverse('browse-revision', url_args={'sha1_git': revision}) @@ -45,6 +44,9 @@ resp = self.client.get(url) + revision = revision.lower() + history_url = history_url.lower() + self.assertEqual(resp.status_code, 200) self.assertTemplateUsed('browse/revision.html') self.assertContains(resp, '%s' % @@ -70,6 +72,15 @@ self.assertContains(resp, escape(message_lines[0])) self.assertContains(resp, escape('\n'.join(message_lines[1:]))) + @given(revision()) + def test_revision_browse(self, revision): + self._revision_browse_test(revision) + + @given(revision()) + def test_revision_browse_with_uppercase_sha1(self, revision): + revision = revision.upper() + self._revision_browse_test(revision) + @given(origin()) def test_revision_origin_browse(self, origin):