angrybeanie_wagtail/env/lib/python3.12/site-packages/wagtail/tests/test_sites.py

219 lines
8.3 KiB
Python
Raw Permalink Normal View History

2025-07-25 21:32:16 +10:00
from django.core.exceptions import ValidationError
from django.test import TestCase, override_settings
from wagtail.coreutils import get_dummy_request
from wagtail.models import Page, Site
class TestSiteNaturalKey(TestCase):
def test_natural_key(self):
site = Site(hostname="example.com", port=8080)
self.assertEqual(site.natural_key(), ("example.com", 8080))
def test_get_by_natural_key(self):
site = Site.objects.create(
hostname="example.com", port=8080, root_page=Page.objects.get(pk=2)
)
self.assertEqual(Site.objects.get_by_natural_key("example.com", 8080), site)
class TestSiteUrl(TestCase):
def test_root_url_http(self):
site = Site(hostname="example.com", port=80)
self.assertEqual(site.root_url, "http://example.com")
def test_root_url_https(self):
site = Site(hostname="example.com", port=443)
self.assertEqual(site.root_url, "https://example.com")
def test_root_url_custom_port(self):
site = Site(hostname="example.com", port=8000)
self.assertEqual(site.root_url, "http://example.com:8000")
class TestSiteNameDisplay(TestCase):
def test_site_name_not_default(self):
site = Site(
hostname="example.com",
port=80,
site_name="example dot com",
is_default_site=False,
)
self.assertEqual(site.__str__(), "example dot com")
def test_site_name_default(self):
site = Site(
hostname="example.com",
port=80,
site_name="example dot com",
is_default_site=True,
)
self.assertEqual(site.__str__(), "example dot com [default]")
def test_no_site_name_not_default_port_80(self):
site = Site(hostname="example.com", port=80, is_default_site=False)
self.assertEqual(site.__str__(), "example.com")
def test_no_site_name_default_port_80(self):
site = Site(hostname="example.com", port=80, is_default_site=True)
self.assertEqual(site.__str__(), "example.com [default]")
def test_no_site_name_not_default_port_n(self):
site = Site(hostname="example.com", port=8080, is_default_site=False)
self.assertEqual(site.__str__(), "example.com:8080")
def test_no_site_name_default_port_n(self):
site = Site(hostname="example.com", port=8080, is_default_site=True)
self.assertEqual(site.__str__(), "example.com:8080 [default]")
class TestSiteOrdering(TestCase):
def setUp(self):
self.root_page = Page.objects.get(pk=2)
Site.objects.all().delete() # Drop the initial site.
def test_site_order_by_hostname(self):
site_1 = Site.objects.create(hostname="charly.com", root_page=self.root_page)
site_2 = Site.objects.create(hostname="bravo.com", root_page=self.root_page)
site_3 = Site.objects.create(hostname="alfa.com", root_page=self.root_page)
self.assertEqual(
list(Site.objects.all().values_list("id", flat=True)),
[site_3.id, site_2.id, site_1.id],
)
def test_site_order_by_hostname_upper(self):
site_1 = Site.objects.create(hostname="charly.com", root_page=self.root_page)
site_2 = Site.objects.create(hostname="Bravo.com", root_page=self.root_page)
site_3 = Site.objects.create(hostname="alfa.com", root_page=self.root_page)
self.assertEqual(
list(Site.objects.all().values_list("id", flat=True)),
[site_3.id, site_2.id, site_1.id],
)
def test_site_order_by_hostname_site_name_irrelevant(self):
site_1 = Site.objects.create(
hostname="charly.com", site_name="X-ray", root_page=self.root_page
)
site_2 = Site.objects.create(
hostname="bravo.com", site_name="Yankee", root_page=self.root_page
)
site_3 = Site.objects.create(
hostname="alfa.com", site_name="Zulu", root_page=self.root_page
)
self.assertEqual(
list(Site.objects.all().values_list("id", flat=True)),
[site_3.id, site_2.id, site_1.id],
)
@override_settings(ALLOWED_HOSTS=["example.com", "unknown.com", "127.0.0.1", "[::1]"])
class TestFindSiteForRequest(TestCase):
def setUp(self):
self.default_site = Site.objects.get()
self.site = Site.objects.create(
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 = 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 = 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 = 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 = 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 = 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 = get_dummy_request()
request.META.update({"SERVER_NAME": "[::1]", "SERVER_PORT": 80})
self.assertEqual(Site.find_for_request(request), self.default_site)
class TestDefaultSite(TestCase):
def test_create_default_site(self):
Site.objects.all().delete()
Site.objects.create(
hostname="test.com", is_default_site=True, root_page=Page.objects.get(pk=2)
)
self.assertTrue(Site.objects.filter(is_default_site=True).exists())
def test_change_default_site(self):
default = Site.objects.get(is_default_site=True)
default.is_default_site = False
default.save()
Site.objects.create(
hostname="test.com", is_default_site=True, root_page=Page.objects.get(pk=2)
)
self.assertTrue(Site.objects.filter(is_default_site=True).exists())
def test_there_can_only_be_one(self):
site = Site(
hostname="test.com", is_default_site=True, root_page=Page.objects.get(pk=2)
)
with self.assertRaises(ValidationError):
site.clean_fields()
def test_oops_there_is_more_than_one(self):
Site.objects.create(
hostname="example.com",
is_default_site=True,
root_page=Page.objects.get(pk=2),
)
site = Site(
hostname="test.com", is_default_site=True, root_page=Page.objects.get(pk=2)
)
with self.assertRaises(Site.MultipleObjectsReturned):
# If there already are multiple default sites, you're in trouble
site.clean_fields()
class TestGetSiteRootPaths(TestCase):
def setUp(self):
self.default_site = Site.objects.get()
self.abc_site = Site.objects.create(
hostname="abc.com", root_page=self.default_site.root_page
)
self.def_site = Site.objects.create(
hostname="def.com", root_page=self.default_site.root_page
)
# Changing the hostname to show that being the default site takes
# promotes a site over the alphabetical ordering of hostname
self.default_site.hostname = "xyz.com"
self.default_site.save()
def test_result_order_when_multiple_sites_share_the_same_root_page(self):
result = Site.get_site_root_paths()
# An entry for the default site should come first
self.assertEqual(result[0][0], self.default_site.id)
# Followed by entries for others in 'host' alphabetical order
self.assertEqual(result[1][0], self.abc_site.id)
self.assertEqual(result[2][0], self.def_site.id)