Use util method to construct util dummy requests (#9797)

This more reliably mocks a request for a given site and path.
pull/9851/head
Jake Howard 2022-12-16 12:10:08 +00:00 zatwierdzone przez Matt Westcott
rodzic 2204dd05cf
commit 2f86d9abc7
12 zmienionych plików z 70 dodań i 120 usunięć

Wyświetl plik

@ -94,6 +94,7 @@ Changelog
* Maintenance: Switch userbar to initialise a Web Component to avoid styling clashes (Albina Starykova)
* Maintenance: Refactor userbar stylesheets to use the same CSS loading as the rest of the admin (Albina Starykova)
* Maintenance: Remove unused search-bar and button-filter styles (Thibaud Colas)
* Maintenance: Use util method to construct dummy requests in tests (Jake Howard)
4.1.2 (xx.xx.xxxx) - IN DEVELOPMENT

Wyświetl plik

@ -119,6 +119,7 @@ This feature was developed by Sage Abdullah.
* Switch userbar to initialise a Web Component to avoid styling clashes (Albina Starykova)
* Refactor userbar stylesheets to use the same CSS loading as the rest of the admin (Albina Starykova)
* Remove unused search-bar and button-filter styles (Thibaud Colas)
* Use util method to construct dummy requests in tests (Jake Howard)
## Upgrade considerations

Wyświetl plik

@ -1,8 +1,8 @@
from django.contrib.auth.models import AnonymousUser
from django.http import HttpRequest
from django.template import engines
from django.test import TestCase
from wagtail.coreutils import get_dummy_request
from wagtail.models import PAGE_TEMPLATE_VAR, Page, Site
from wagtail.test.utils import WagtailTestUtils
@ -25,10 +25,7 @@ class TestCoreJinja(TestCase, WagtailTestUtils):
def dummy_request(self, user=None):
site = Site.objects.get(is_default_site=True)
request = HttpRequest()
request.META["HTTP_HOST"] = site.hostname
request.META["SERVER_PORT"] = site.port
request = get_dummy_request(site=site)
request.user = user or AnonymousUser()
return request

Wyświetl plik

@ -1,5 +1,4 @@
from django.http import HttpRequest
from wagtail.coreutils import get_dummy_request
from wagtail.models import Page, Site
from wagtail.test.testapp.models import TestGenericSetting
@ -20,7 +19,4 @@ class GenericSettingsTestMixin:
def get_request(self, site=None):
if site is None:
site = self.default_site
request = HttpRequest()
request.META["HTTP_HOST"] = site.hostname
request.META["SERVER_PORT"] = site.port
return request
return get_dummy_request(site=site)

Wyświetl plik

@ -1,8 +1,8 @@
from django.http import HttpRequest
from django.template import Context, RequestContext, Template, engines
from django.test import TestCase
from django.test.utils import override_settings
from wagtail.coreutils import get_dummy_request
from wagtail.models import Site
from wagtail.test.utils import WagtailTestUtils
@ -136,10 +136,7 @@ class GenericSettingJinjaContextProcessorTestCase(GenericSettingTemplateTestCase
# Add a request to the template, to simulate a RequestContext
if request_context:
site = Site.objects.get(is_default_site=True)
request = HttpRequest()
request.META["HTTP_HOST"] = site.hostname
request.META["SERVER_PORT"] = site.port
context["request"] = request
context["request"] = get_dummy_request(site=site)
template = self.engine.from_string(string)
return template.render(context)

Wyświetl plik

@ -1,5 +1,4 @@
from django.http import HttpRequest
from wagtail.coreutils import get_dummy_request
from wagtail.models import Page, Site
from wagtail.test.testapp.models import TestSiteSetting
@ -23,7 +22,4 @@ class SiteSettingsTestMixin:
def get_request(self, site=None):
if site is None:
site = self.default_site
request = HttpRequest()
request.META["HTTP_HOST"] = site.hostname
request.META["SERVER_PORT"] = site.port
return request
return get_dummy_request(site=site)

Wyświetl plik

@ -1,8 +1,8 @@
from django.http import HttpRequest
from django.template import Context, RequestContext, Template, engines
from django.test import TestCase
from django.test.utils import override_settings
from wagtail.coreutils import get_dummy_request
from wagtail.models import Site
from wagtail.test.utils import WagtailTestUtils
@ -204,10 +204,7 @@ class TestSiteSettingsJinja(TemplateTestCase):
site = context["site"]
else:
site = Site.objects.get(is_default_site=True)
request = HttpRequest()
request.META["HTTP_HOST"] = site.hostname
request.META["SERVER_PORT"] = site.port
context["request"] = request
context["request"] = get_dummy_request(site=site)
template = self.engine.from_string(string)
return template.render(context)

Wyświetl plik

@ -15,6 +15,7 @@ from django.db.models import Model
from django.db.models.base import ModelBase
from django.dispatch import receiver
from django.http import HttpRequest
from django.test import RequestFactory
from django.utils.encoding import force_str
from django.utils.text import capfirst, slugify
from django.utils.translation import check_for_language, get_supported_language_variant
@ -394,7 +395,7 @@ def multigetattr(item, accessor):
return current
def get_dummy_request(path: str = "/", site: "Site" = None) -> HttpRequest:
def get_dummy_request(*, path: str = "/", site: "Site" = None) -> HttpRequest:
"""
Return a simple ``HttpRequest`` instance that can be passed to
``Page.get_url()`` and other methods to benefit from improved performance
@ -403,19 +404,17 @@ def get_dummy_request(path: str = "/", site: "Site" = None) -> HttpRequest:
If ``site`` is provided, the ``HttpRequest`` is made to look like it came
from that Wagtail ``Site``.
"""
request = HttpRequest()
request.path = path
request.method = "GET"
SERVER_PORT = 80
server_port = 80
if site:
SERVER_NAME = site.hostname
SERVER_PORT = site.port
server_name = site.hostname
server_port = site.port
elif settings.ALLOWED_HOSTS == ["*"]:
SERVER_NAME = "example.com"
server_name = "example.com"
else:
SERVER_NAME = settings.ALLOWED_HOSTS[0]
request.META = {"SERVER_NAME": SERVER_NAME, "SERVER_PORT": SERVER_PORT}
return request
server_name = settings.ALLOWED_HOSTS[0]
# `SERVER_PORT` doesn't work when passed to the constructor
return RequestFactory(SERVER_NAME=server_name).get(path, SERVER_PORT=server_port)
class BatchProcessor:

Wyświetl plik

@ -1,10 +1,10 @@
from django.http import HttpRequest
from django.template import engines
from django.template.loader import render_to_string
from django.test import TestCase
from django.utils.safestring import mark_safe
from wagtail import __version__, blocks
from wagtail.coreutils import get_dummy_request
from wagtail.models import Page, Site
from wagtail.test.testapp.blocks import SectionBlock
@ -20,10 +20,7 @@ class TestCoreGlobalsAndFilters(TestCase):
# Add a request to the template, to simulate a RequestContext
if request_context:
site = Site.objects.get(is_default_site=True)
request = HttpRequest()
request.META["HTTP_HOST"] = site.hostname
request.META["SERVER_PORT"] = site.port
context["request"] = request
context["request"] = get_dummy_request(site=site)
template = self.engine.from_string(string)
return template.render(context)

Wyświetl plik

@ -8,13 +8,14 @@ from django.contrib.auth import get_user_model
from django.contrib.auth.models import AnonymousUser, Group
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ValidationError
from django.http import Http404, HttpRequest
from django.http import Http404
from django.test import Client, TestCase, override_settings
from django.test.client import RequestFactory
from django.utils import timezone, translation
from freezegun import freeze_time
from wagtail.actions.copy_for_translation import ParentNotTranslatedError
from wagtail.coreutils import get_dummy_request
from wagtail.locks import BasicLock, ScheduledForPublishLock, WorkflowLock
from wagtail.models import (
Comment,
@ -213,19 +214,13 @@ class TestSiteRouting(TestCase):
def test_valid_headers_route_to_specific_site(self):
# requests with a known Host: header should be directed to the specific site
request = HttpRequest()
request.path = "/"
request.META["HTTP_HOST"] = self.events_site.hostname
request.META["SERVER_PORT"] = self.events_site.port
request = get_dummy_request(site=self.events_site)
with self.assertNumQueries(1):
self.assertEqual(Site.find_for_request(request), self.events_site)
def test_ports_in_request_headers_are_respected(self):
# ports in the Host: header should be respected
request = HttpRequest()
request.path = "/"
request.META["HTTP_HOST"] = self.alternate_port_events_site.hostname
request.META["SERVER_PORT"] = self.alternate_port_events_site.port
request = get_dummy_request(site=self.alternate_port_events_site)
with self.assertNumQueries(1):
self.assertEqual(
Site.find_for_request(request), self.alternate_port_events_site
@ -233,18 +228,14 @@ class TestSiteRouting(TestCase):
def test_unrecognised_host_header_routes_to_default_site(self):
# requests with an unrecognised Host: header should be directed to the default site
request = HttpRequest()
request.path = "/"
request = get_dummy_request()
request.META["HTTP_HOST"] = self.unrecognised_hostname
request.META["SERVER_PORT"] = "80"
with self.assertNumQueries(1):
self.assertEqual(Site.find_for_request(request), self.default_site)
def test_unrecognised_port_and_default_host_routes_to_default_site(self):
# requests to the default host on an unrecognised port should be directed to the default site
request = HttpRequest()
request.path = "/"
request.META["HTTP_HOST"] = self.default_site.hostname
request = get_dummy_request(site=self.default_site)
request.META["SERVER_PORT"] = self.unrecognised_port
with self.assertNumQueries(1):
self.assertEqual(Site.find_for_request(request), self.default_site)
@ -252,8 +243,7 @@ class TestSiteRouting(TestCase):
def test_unrecognised_port_and_unrecognised_host_routes_to_default_site(self):
# requests with an unrecognised Host: header _and_ an unrecognised port
# should be directed to the default site
request = HttpRequest()
request.path = "/"
request = get_dummy_request()
request.META["HTTP_HOST"] = self.unrecognised_hostname
request.META["SERVER_PORT"] = self.unrecognised_port
with self.assertNumQueries(1):
@ -262,8 +252,7 @@ class TestSiteRouting(TestCase):
def test_unrecognised_port_on_known_hostname_routes_there_if_no_ambiguity(self):
# requests on an unrecognised port should be directed to the site with
# matching hostname if there is no ambiguity
request = HttpRequest()
request.path = "/"
request = get_dummy_request()
request.META["HTTP_HOST"] = self.about_site.hostname
request.META["SERVER_PORT"] = self.unrecognised_port
with self.assertNumQueries(1):
@ -275,17 +264,14 @@ class TestSiteRouting(TestCase):
# requests on an unrecognised port should be directed to the default
# site, even if their hostname (but not port) matches more than one
# other entry
request = HttpRequest()
request.path = "/"
request.META["HTTP_HOST"] = self.events_site.hostname
request = get_dummy_request(site=self.events_site)
request.META["SERVER_PORT"] = self.unrecognised_port
with self.assertNumQueries(1):
self.assertEqual(Site.find_for_request(request), self.default_site)
def test_port_in_http_host_header_is_ignored(self):
# port in the HTTP_HOST header is ignored
request = HttpRequest()
request.path = "/"
request = get_dummy_request()
request.META["HTTP_HOST"] = "%s:%s" % (
self.events_site.hostname,
self.events_site.port,
@ -397,18 +383,14 @@ class TestRouting(TestCase):
self.assertEqual(christmas_page.relative_url(events_site), "/christmas/")
self.assertEqual(christmas_page.get_site(), events_site)
request = HttpRequest()
request.META["HTTP_HOST"] = events_site.hostname
request.META["SERVER_PORT"] = events_site.port
request = get_dummy_request(site=events_site)
self.assertEqual(
christmas_page.get_url_parts(request=request),
(events_site.id, "http://events.example.com", "/christmas/"),
)
request2 = HttpRequest()
request2.META["HTTP_HOST"] = second_events_site.hostname
request2.META["SERVER_PORT"] = second_events_site.port
request2 = get_dummy_request(site=second_events_site)
self.assertEqual(
christmas_page.get_url_parts(request=request2),
(second_events_site.id, "http://second-events.example.com", "/christmas/"),
@ -457,17 +439,15 @@ class TestRouting(TestCase):
homepage = Page.objects.get(url_path="/home/")
christmas_page = EventPage.objects.get(url_path="/home/events/christmas/")
request = HttpRequest()
request.path = "/events/christmas/"
request = get_dummy_request(path="/events/christmas/")
(found_page, args, kwargs) = homepage.route(request, ["events", "christmas"])
self.assertEqual(found_page, christmas_page)
def test_request_serving(self):
christmas_page = EventPage.objects.get(url_path="/home/events/christmas/")
request = HttpRequest()
request = get_dummy_request(site=Site.objects.first())
request.user = AnonymousUser()
request.META["HTTP_HOST"] = Site.objects.first().hostname
response = christmas_page.serve(request)
self.assertEqual(response.status_code, 200)
@ -478,16 +458,14 @@ class TestRouting(TestCase):
def test_route_to_unknown_page_returns_404(self):
homepage = Page.objects.get(url_path="/home/")
request = HttpRequest()
request.path = "/events/quinquagesima/"
request = get_dummy_request(path="/events/quinquagesima/")
with self.assertRaises(Http404):
homepage.route(request, ["events", "quinquagesima"])
def test_route_to_unpublished_page_returns_404(self):
homepage = Page.objects.get(url_path="/home/")
request = HttpRequest()
request.path = "/events/tentative-unpublished-event/"
request = get_dummy_request(path="/events/tentative-unpublished-event/")
with self.assertRaises(Http404):
homepage.route(request, ["events", "tentative-unpublished-event"])
@ -512,9 +490,7 @@ class TestRouting(TestCase):
self.assertEqual(christmas_page.get_url(), "/events/christmas/")
# with a request, the first call to get_url should issue 1 SQL query
request = HttpRequest()
request.META["HTTP_HOST"] = "dummy"
request.META["SERVER_PORT"] = "8888"
request = get_dummy_request()
# first call with "balnk" request issues a extra query for the Site.find_for_request() call
with self.assertNumQueries(2):
self.assertEqual(homepage.get_url(request=request), "/")
@ -703,18 +679,15 @@ class TestRoutingWithI18N(TestRouting):
self.assertEqual(christmas_page.relative_url(events_site), "/en/christmas/")
self.assertEqual(christmas_page.get_site(), events_site)
request = HttpRequest()
request.META["HTTP_HOST"] = events_site.hostname
request.META["SERVER_PORT"] = events_site.port
request = get_dummy_request(site=events_site)
self.assertEqual(
christmas_page.get_url_parts(request=request),
(events_site.id, "http://events.example.com", "/en/christmas/"),
)
request2 = HttpRequest()
request2.META["HTTP_HOST"] = second_events_site.hostname
request2.META["SERVER_PORT"] = second_events_site.port
request2 = get_dummy_request(site=second_events_site)
self.assertEqual(
christmas_page.get_url_parts(request=request2),
(
@ -745,9 +718,7 @@ class TestRoutingWithI18N(TestRouting):
self.assertEqual(christmas_page.get_url(), "/en/events/christmas/")
# with a request, the first call to get_url should issue 1 SQL query
request = HttpRequest()
request.META["HTTP_HOST"] = "dummy"
request.META["SERVER_PORT"] = "8888"
request = get_dummy_request()
# first call with "balnk" request issues a extra query for the Site.find_for_request() call
with self.assertNumQueries(3):
self.assertEqual(homepage.get_url(request=request), "/en/")

Wyświetl plik

@ -1,7 +1,7 @@
from django.core.exceptions import ValidationError
from django.http.request import HttpRequest
from django.test import TestCase, override_settings
from wagtail.coreutils import get_dummy_request
from wagtail.models import Page, Site
@ -114,35 +114,41 @@ class TestFindSiteForRequest(TestCase):
hostname="example.com", port=80, root_page=Page.objects.get(pk=2)
)
def test_dummy_request(self):
request = get_dummy_request(site=self.site)
self.assertEqual(Site.find_for_request(request), self.site)
def test_with_host(self):
request = HttpRequest()
request.META = {"HTTP_HOST": "example.com", "SERVER_PORT": 80}
request = get_dummy_request()
request.META.update({"HTTP_HOST": "example.com", "SERVER_PORT": 80})
self.assertEqual(Site.find_for_request(request), self.site)
def test_with_unknown_host(self):
request = HttpRequest()
request.META = {"HTTP_HOST": "unknown.com", "SERVER_PORT": 80}
request = get_dummy_request()
request.META.update({"HTTP_HOST": "unknown.com", "SERVER_PORT": 80})
self.assertEqual(Site.find_for_request(request), self.default_site)
def test_with_server_name(self):
request = HttpRequest()
request.META = {"SERVER_NAME": "example.com", "SERVER_PORT": 80}
request = get_dummy_request()
request.META.update({"SERVER_NAME": "example.com", "SERVER_PORT": 80})
self.assertEqual(Site.find_for_request(request), self.site)
def test_with_x_forwarded_host(self):
with self.settings(USE_X_FORWARDED_HOST=True):
request = HttpRequest()
request.META = {"HTTP_X_FORWARDED_HOST": "example.com", "SERVER_PORT": 80}
request = get_dummy_request()
request.META.update(
{"HTTP_X_FORWARDED_HOST": "example.com", "SERVER_PORT": 80}
)
self.assertEqual(Site.find_for_request(request), self.site)
def test_ipv4_host(self):
request = HttpRequest()
request.META = {"SERVER_NAME": "127.0.0.1", "SERVER_PORT": 80}
request = get_dummy_request()
request.META.update({"SERVER_NAME": "127.0.0.1", "SERVER_PORT": 80})
self.assertEqual(Site.find_for_request(request), self.default_site)
def test_ipv6_host(self):
request = HttpRequest()
request.META = {"SERVER_NAME": "[::1]", "SERVER_PORT": 80}
request = get_dummy_request()
request.META.update({"SERVER_NAME": "[::1]", "SERVER_PORT": 80})
self.assertEqual(Site.find_for_request(request), self.default_site)

Wyświetl plik

@ -6,7 +6,7 @@ from django.test.utils import override_settings
from django.urls.exceptions import NoReverseMatch
from django.utils.safestring import SafeString
from wagtail.coreutils import resolve_model_string
from wagtail.coreutils import get_dummy_request, resolve_model_string
from wagtail.models import Locale, Page, Site, SiteRootPath
from wagtail.templatetags.wagtailcore_tags import richtext, slugurl
from wagtail.test.testapp.models import SimplePage
@ -96,9 +96,8 @@ class TestPageUrlTags(TestCase):
)
# 'request' object in context, but site is None
request = HttpRequest()
request = get_dummy_request()
request.META["HTTP_HOST"] = "unknown.example.com"
request.META["SERVER_PORT"] = 80
result = tpl.render(template.Context({"page": page, "request": request}))
self.assertIn('<a href="/events/">Events</a>', result)
@ -137,9 +136,7 @@ class TestPageUrlTags(TestCase):
# the first site, but is in a different position in the treeself.
new_christmas_page = Page(title="Christmas", slug="christmas")
new_home_page.add_child(instance=new_christmas_page)
request = HttpRequest()
request.META["HTTP_HOST"] = second_site.hostname
request.META["SERVER_PORT"] = second_site.port
request = get_dummy_request(site=second_site)
url = slugurl(context=template.Context({"request": request}), slug="christmas")
self.assertEqual(url, "/christmas/")
@ -152,9 +149,7 @@ class TestPageUrlTags(TestCase):
second_site = Site.objects.create(
hostname="site2.example.com", root_page=new_home_page
)
request = HttpRequest()
request.META["HTTP_HOST"] = second_site.hostname
request.META["SERVER_PORT"] = second_site.port
request = get_dummy_request(site=second_site)
# There is no page with this slug on the current site, so this
# should return an absolute URL for the page on the first site.
url = slugurl(slug="christmas", context=template.Context({"request": request}))
@ -172,9 +167,8 @@ class TestPageUrlTags(TestCase):
@override_settings(ALLOWED_HOSTS=["testserver", "localhost", "unknown.example.com"])
def test_slugurl_with_null_site_in_request(self):
# 'request' object in context, but site is None
request = HttpRequest()
request = get_dummy_request()
request.META["HTTP_HOST"] = "unknown.example.com"
request.META["SERVER_PORT"] = 80
result = slugurl(template.Context({"request": request}), "events")
self.assertEqual(result, "/events/")
@ -183,9 +177,7 @@ class TestWagtailSiteTag(TestCase):
fixtures = ["test.json"]
def test_wagtail_site_tag(self):
request = HttpRequest()
request.META["HTTP_HOST"] = "localhost"
request.META["SERVER_PORT"] = 80
request = get_dummy_request(site=Site.objects.first())
tpl = template.Template(
"""{% load wagtailcore_tags %}{% wagtail_site as current_site %}{{ current_site.hostname }}"""