Skip to content

Commit 0153059

Browse files
authored
Addons: make it work on invalid URLs (#12372)
Closes #12371
1 parent 4b3727a commit 0153059

File tree

2 files changed

+47
-6
lines changed

2 files changed

+47
-6
lines changed

readthedocs/proxito/tests/test_hosting.py

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,17 @@ def _get_response_dict(self, view_name, filepath=None):
8989
return json.load(open(filename))
9090

9191
def _normalize_datetime_fields(self, obj):
92-
obj["projects"]["current"]["created"] = "2019-04-29T10:00:00Z"
93-
obj["projects"]["current"]["modified"] = "2019-04-29T12:00:00Z"
94-
obj["builds"]["current"]["created"] = "2019-04-29T10:00:00Z"
95-
obj["builds"]["current"]["finished"] = "2019-04-29T10:01:00Z"
92+
try:
93+
obj["projects"]["current"]["created"] = "2019-04-29T10:00:00Z"
94+
obj["projects"]["current"]["modified"] = "2019-04-29T12:00:00Z"
95+
except:
96+
pass
97+
98+
try:
99+
obj["builds"]["current"]["created"] = "2019-04-29T10:00:00Z"
100+
obj["builds"]["current"]["finished"] = "2019-04-29T10:01:00Z"
101+
except:
102+
pass
96103
return obj
97104

98105
def test_get_config_v1(self):
@@ -727,6 +734,33 @@ def test_send_project_version_slugs_and_url(self):
727734
"v1"
728735
)
729736

737+
def test_send_project_slug_and_notfound_version_slug(self):
738+
r = self.client.get(
739+
reverse("proxito_readthedocs_docs_addons"),
740+
{
741+
"api-version": "1.0.0",
742+
"client-version": "0.6.0",
743+
"project-slug": self.project.slug,
744+
"version-slug": "not-found",
745+
},
746+
secure=True,
747+
headers={
748+
"host": "project.dev.readthedocs.io",
749+
},
750+
)
751+
assert r.status_code == 200
752+
753+
expected_response = self._get_response_dict("v1")
754+
755+
# Since there is no version, there are some fields that we need to change from the default response
756+
del expected_response["addons"]["doc_diff"]
757+
expected_response["builds"]["current"] = None
758+
expected_response["versions"]["current"] = None
759+
expected_response["readthedocs"]["resolver"]["filename"] = None
760+
expected_response["addons"]["search"]["default_filter"] = f"project:{self.project.slug}"
761+
assert self._normalize_datetime_fields(r.json()) == expected_response
762+
763+
730764
def test_custom_domain_url(self):
731765
fixture.get(
732766
Domain,

readthedocs/proxito/views/hosting.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,10 @@ def _resolve_resources(self):
134134
else:
135135
# When not sending "url", we require "project-slug" and "version-slug".
136136
project = get_object_or_404(Project, slug=project_slug)
137-
version = get_object_or_404(project.versions.all(), slug=version_slug)
137+
# We do allow hitting this URL without a valid version.
138+
# This is the same case than sending `?url=` with a partial match
139+
# (eg. invalid URL path).
140+
version = project.versions.filter(slug=version_slug).first()
138141

139142
# A project is always required.
140143
if not project:
@@ -378,6 +381,10 @@ def _v1(self, project, version, build, filename, url, request):
378381
project.addons.flyout_sorting_latest_stable_at_beginning,
379382
)
380383

384+
search_default_filter = f"project:{project.slug}"
385+
if version:
386+
search_default_filter = f"project:{project.slug}/{version.slug}"
387+
381388
data = {
382389
"api_version": "1",
383390
"projects": self._get_projects_response(
@@ -478,7 +485,7 @@ def _v1(self, project, version, build, filename, url, request):
478485
# f"subprojects:{project.slug}/{version.slug}",
479486
# ],
480487
],
481-
"default_filter": f"project:{project.slug}/{version.slug}" if version else None,
488+
"default_filter": search_default_filter,
482489
},
483490
"linkpreviews": {
484491
"enabled": project.addons.linkpreviews_enabled,

0 commit comments

Comments
 (0)