Skip to content

Commit dcc4b76

Browse files
committed
Addons: add test cases for the endpoint
Closes #10685
1 parent 8566a62 commit dcc4b76

File tree

3 files changed

+301
-6
lines changed

3 files changed

+301
-6
lines changed

readthedocs/proxito/tests/test_headers.py

+11-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from readthedocs.builds.constants import LATEST
66
from readthedocs.projects.constants import PRIVATE, PUBLIC
7-
from readthedocs.projects.models import Domain, HTTPHeader
7+
from readthedocs.projects.models import AddonsConfig, Domain, HTTPHeader
88

99
from .base import BaseDocServing
1010

@@ -159,6 +159,16 @@ def test_hosting_integrations_header(self):
159159
self.assertIsNotNone(r.get("X-RTD-Hosting-Integrations"))
160160
self.assertEqual(r["X-RTD-Hosting-Integrations"], "true")
161161

162+
def test_force_addons_header(self):
163+
fixture.get(AddonsConfig, project=self.project, enabled=True)
164+
165+
r = self.client.get(
166+
"/en/latest/", secure=True, headers={"host": "project.dev.readthedocs.io"}
167+
)
168+
self.assertEqual(r.status_code, 200)
169+
self.assertIsNotNone(r.get("X-RTD-Force-Addons"))
170+
self.assertEqual(r["X-RTD-Force-Addons"], "true")
171+
162172
def test_cors_headers_private_version(self):
163173
version = self.project.versions.get(slug=LATEST)
164174
version.privacy_level = PRIVATE

readthedocs/proxito/tests/test_hosting.py

+287-3
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
from django.urls import reverse
1111

1212
from readthedocs.builds.constants import LATEST
13-
from readthedocs.builds.models import Build
14-
from readthedocs.projects.constants import PUBLIC
15-
from readthedocs.projects.models import Project
13+
from readthedocs.builds.models import Build, Version
14+
from readthedocs.projects.constants import PRIVATE, PUBLIC
15+
from readthedocs.projects.models import Feature, Project
1616

1717

1818
@override_settings(
@@ -117,3 +117,287 @@ def test_get_config_unsupported_version(self):
117117
)
118118
assert r.status_code == 400
119119
assert r.json() == self._get_response_dict("v2")
120+
121+
def test_disabled_addons_via_feature_flags(self):
122+
fixture.get(
123+
Feature,
124+
projects=[self.project],
125+
feature_id=Feature.ADDONS_ANALYTICS_DISABLED,
126+
)
127+
fixture.get(
128+
Feature,
129+
projects=[self.project],
130+
feature_id=Feature.ADDONS_EXTERNAL_VERSION_WARNING_DISABLED,
131+
)
132+
fixture.get(
133+
Feature,
134+
projects=[self.project],
135+
feature_id=Feature.ADDONS_NON_LATEST_VERSION_WARNING_DISABLED,
136+
)
137+
fixture.get(
138+
Feature,
139+
projects=[self.project],
140+
feature_id=Feature.ADDONS_DOC_DIFF_DISABLED,
141+
)
142+
fixture.get(
143+
Feature,
144+
projects=[self.project],
145+
feature_id=Feature.ADDONS_FLYOUT_DISABLED,
146+
)
147+
fixture.get(
148+
Feature,
149+
projects=[self.project],
150+
feature_id=Feature.ADDONS_SEARCH_DISABLED,
151+
)
152+
fixture.get(
153+
Feature,
154+
projects=[self.project],
155+
feature_id=Feature.ADDONS_HOTKEYS_DISABLED,
156+
)
157+
158+
r = self.client.get(
159+
reverse("proxito_readthedocs_docs_addons"),
160+
{"url": "https://project.dev.readthedocs.io/en/latest/"},
161+
secure=True,
162+
headers={
163+
"host": "project.dev.readthedocs.io",
164+
"x-rtd-hosting-integrations-version": "0.1.0",
165+
},
166+
)
167+
assert r.status_code == 200
168+
assert r.json()["addons"]["analytics"]["enabled"] is False
169+
assert r.json()["addons"]["external_version_warning"]["enabled"] is False
170+
assert r.json()["addons"]["non_latest_version_warning"]["enabled"] is False
171+
assert r.json()["addons"]["doc_diff"]["enabled"] is False
172+
assert r.json()["addons"]["flyout"]["enabled"] is False
173+
assert r.json()["addons"]["search"]["enabled"] is False
174+
assert r.json()["addons"]["hotkeys"]["enabled"] is False
175+
176+
def test_non_latest_version_warning_versions(self):
177+
fixture.get(
178+
Version,
179+
project=self.project,
180+
privacy_level=PRIVATE,
181+
slug="private",
182+
verbose_name="private",
183+
built=True,
184+
active=True,
185+
)
186+
fixture.get(
187+
Version,
188+
project=self.project,
189+
privacy_level=PUBLIC,
190+
slug="public-built",
191+
verbose_name="public-built",
192+
built=True,
193+
active=True,
194+
)
195+
fixture.get(
196+
Version,
197+
project=self.project,
198+
privacy_level=PUBLIC,
199+
slug="public-not-built",
200+
verbose_name="public-not-built",
201+
built=False,
202+
active=True,
203+
)
204+
205+
r = self.client.get(
206+
reverse("proxito_readthedocs_docs_addons"),
207+
{"url": "https://project.dev.readthedocs.io/en/latest/"},
208+
secure=True,
209+
headers={
210+
"host": "project.dev.readthedocs.io",
211+
"x-rtd-hosting-integrations-version": "0.1.0",
212+
},
213+
)
214+
assert r.status_code == 200
215+
216+
expected = ["latest", "public-built"]
217+
assert r.json()["addons"]["non_latest_version_warning"]["versions"] == expected
218+
219+
def test_flyout_versions(self):
220+
fixture.get(
221+
Version,
222+
project=self.project,
223+
privacy_level=PRIVATE,
224+
slug="private",
225+
verbose_name="private",
226+
built=True,
227+
active=True,
228+
)
229+
fixture.get(
230+
Version,
231+
project=self.project,
232+
privacy_level=PUBLIC,
233+
slug="public-built",
234+
verbose_name="public-built",
235+
built=True,
236+
active=True,
237+
)
238+
fixture.get(
239+
Version,
240+
project=self.project,
241+
privacy_level=PUBLIC,
242+
slug="public-not-built",
243+
verbose_name="public-not-built",
244+
built=False,
245+
active=True,
246+
)
247+
fixture.get(
248+
Version,
249+
project=self.project,
250+
privacy_level=PUBLIC,
251+
slug="hidden",
252+
verbose_name="hidden",
253+
built=False,
254+
hidden=True,
255+
active=True,
256+
)
257+
258+
r = self.client.get(
259+
reverse("proxito_readthedocs_docs_addons"),
260+
{"url": "https://project.dev.readthedocs.io/en/latest/"},
261+
secure=True,
262+
headers={
263+
"host": "project.dev.readthedocs.io",
264+
"x-rtd-hosting-integrations-version": "0.1.0",
265+
},
266+
)
267+
assert r.status_code == 200
268+
269+
expected = [
270+
{"slug": "latest", "url": "/en/latest/"},
271+
{"slug": "public-built", "url": "/en/public-built/"},
272+
]
273+
assert r.json()["addons"]["flyout"]["versions"] == expected
274+
275+
def test_flyout_translations(self):
276+
fixture.get(
277+
Project,
278+
slug="translation",
279+
main_language_project=self.project,
280+
language="ja",
281+
)
282+
283+
r = self.client.get(
284+
reverse("proxito_readthedocs_docs_addons"),
285+
{"url": "https://project.dev.readthedocs.io/en/latest/"},
286+
secure=True,
287+
headers={
288+
"host": "project.dev.readthedocs.io",
289+
"x-rtd-hosting-integrations-version": "0.1.0",
290+
},
291+
)
292+
assert r.status_code == 200
293+
294+
expected = [
295+
{"slug": "ja", "url": "/ja/"},
296+
]
297+
assert r.json()["addons"]["flyout"]["translations"] == expected
298+
299+
def test_flyout_downloads(self):
300+
fixture.get(
301+
Version,
302+
project=self.project,
303+
privacy_level=PUBLIC,
304+
slug="offline",
305+
verbose_name="offline",
306+
built=True,
307+
has_pdf=True,
308+
has_epub=True,
309+
has_htmlzip=True,
310+
active=True,
311+
)
312+
313+
r = self.client.get(
314+
reverse("proxito_readthedocs_docs_addons"),
315+
{"url": "https://project.dev.readthedocs.io/en/offline/"},
316+
secure=True,
317+
headers={
318+
"host": "project.dev.readthedocs.io",
319+
"x-rtd-hosting-integrations-version": "0.1.0",
320+
},
321+
)
322+
assert r.status_code == 200
323+
324+
expected = [
325+
{
326+
"name": "PDF",
327+
"url": "//project.dev.readthedocs.io/_/downloads/en/offline/pdf/",
328+
},
329+
{
330+
"name": "HTML",
331+
"url": "//project.dev.readthedocs.io/_/downloads/en/offline/htmlzip/",
332+
},
333+
{
334+
"name": "Epub",
335+
"url": "//project.dev.readthedocs.io/_/downloads/en/offline/epub/",
336+
},
337+
]
338+
assert r.json()["addons"]["flyout"]["downloads"] == expected
339+
340+
def test_flyout_single_version_project(self):
341+
self.version.has_pdf = True
342+
self.version.has_epub = True
343+
self.version.has_htmlzip = True
344+
self.version.save()
345+
346+
self.project.single_version = True
347+
self.project.save()
348+
349+
r = self.client.get(
350+
reverse("proxito_readthedocs_docs_addons"),
351+
{"url": "https://project.dev.readthedocs.io/"},
352+
secure=True,
353+
headers={
354+
"host": "project.dev.readthedocs.io",
355+
"x-rtd-hosting-integrations-version": "0.1.0",
356+
},
357+
)
358+
assert r.status_code == 200
359+
360+
expected = []
361+
assert r.json()["addons"]["flyout"]["versions"] == expected
362+
363+
expected = [
364+
{
365+
"name": "PDF",
366+
"url": "//project.dev.readthedocs.io/_/downloads/en/latest/pdf/",
367+
},
368+
{
369+
"name": "HTML",
370+
"url": "//project.dev.readthedocs.io/_/downloads/en/latest/htmlzip/",
371+
},
372+
{
373+
"name": "Epub",
374+
"url": "//project.dev.readthedocs.io/_/downloads/en/latest/epub/",
375+
},
376+
]
377+
assert r.json()["addons"]["flyout"]["downloads"] == expected
378+
379+
def test_project_subproject(self):
380+
subproject = fixture.get(
381+
Project, slug="subproject", repo="https://github.com/readthedocs/subproject"
382+
)
383+
self.project.add_subproject(subproject)
384+
385+
r = self.client.get(
386+
reverse("proxito_readthedocs_docs_addons"),
387+
{
388+
"url": "https://project.dev.readthedocs.io/projects/subproject/en/latest/"
389+
},
390+
secure=True,
391+
headers={
392+
"host": "project.dev.readthedocs.io",
393+
"x-rtd-hosting-integrations-version": "0.1.0",
394+
},
395+
)
396+
assert r.status_code == 200
397+
398+
assert r.json()["projects"]["current"]["id"] == subproject.pk
399+
assert r.json()["projects"]["current"]["slug"] == subproject.slug
400+
assert (
401+
r.json()["projects"]["current"]["repository"]["url"]
402+
== "https://github.com/readthedocs/subproject"
403+
)

readthedocs/proxito/views/hosting.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -237,8 +237,9 @@ def _v0(self, project, version, build, filename, user):
237237
.only("slug")
238238
.order_by("slug")
239239
)
240-
if version:
241-
version_downloads = version.get_downloads(pretty=True).items()
240+
241+
if version:
242+
version_downloads = version.get_downloads(pretty=True).items()
242243

243244
project_translations = (
244245
project.translations.all().only("language").order_by("language")

0 commit comments

Comments
 (0)