218 lines
8.3 KiB
Python
218 lines
8.3 KiB
Python
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)
|