dynamicweb/cms/tests/test_site.py

160 lines
6.9 KiB
Python
Raw Normal View History

import warnings
from django.contrib.sites.models import Site
from django.test import RequestFactory, override_settings
from cms.api import create_page
from cms.models import Page
from cms.test_utils.testcases import CMSTestCase
from cms.utils import get_current_site
from cms.utils.admin import get_site_from_request
from cms.utils.compat.warnings import RemovedInDjangoCMS60Warning
class SiteTestCase(CMSTestCase):
"""Site framework specific test cases.
All stuff which is changing settings.SITE_ID for tests should come here.
"""
def setUp(self):
self.assertEqual(Site.objects.all().count(), 1)
with self.settings(SITE_ID=1):
u = self._create_user("test", True, True)
# setup sites
self.site2 = Site.objects.create(domain="sample2.com", name="sample2.com", pk=2)
self.site3 = Site.objects.create(domain="sample3.com", name="sample3.com", pk=3)
self._login_context = self.login_user_context(u)
self._login_context.__enter__()
def tearDown(self):
self._login_context.__exit__(None, None, None)
def test_site_framework(self):
# Test the site framework, and test if it's possible to disable it
with self.settings(SITE_ID=self.site2.pk):
create_page("page_2a", "nav_playground.html", "de", site=self.site2)
page_list = self.get_pages_admin_list_uri('en')
response = self.client.get(f"{page_list}?site__exact={self.site3.pk}")
self.assertEqual(response.status_code, 200)
create_page("page_3b", "nav_playground.html", "de", site=self.site3)
with self.settings(SITE_ID=self.site3.pk):
create_page("page_3a", "nav_playground.html", "nl", site=self.site3)
# with param
self.assertEqual(Page.objects.on_site(self.site2.pk).count(), 1)
self.assertEqual(Page.objects.on_site(self.site3.pk).count(), 2)
self.assertEqual(Page.objects.on_site().count(), 2)
with self.settings(SITE_ID=self.site2.pk):
# without param
self.assertEqual(Page.objects.on_site().count(), 1)
class GetCurrentSiteTests(CMSTestCase):
def setUp(self):
self.factory = RequestFactory()
# Stelle sicher, dass eindeutige Sites existieren
Site.objects.all().delete()
self.site1 = Site.objects.create(domain='example.com', name='Example')
self.site2 = Site.objects.create(domain='second.test', name='Second')
@override_settings(SITE_ID=1)
def test_request_site_attribute_is_used(self):
with self.settings(SITE_ID=self.site1.id):
req = self.factory.get('/')
# Middleware könnte request.site setzen – simuliere das
req.site = self.site2
site = get_current_site(req)
self.assertEqual(site.pk, self.site2.pk)
@override_settings(SITE_ID=1)
def test_warns_without_request_and_returns_current(self):
with self.settings(SITE_ID=self.site1.id):
with warnings.catch_warnings(record=True) as w:
warnings.simplefilter('always')
site = get_current_site()
self.assertTrue(any(issubclass(wi.category, RemovedInDjangoCMS60Warning) for wi in w))
self.assertEqual(site.pk, self.site1.pk)
@override_settings(SITE_ID=1)
def test_fallback_to_default_site(self):
with self.settings(SITE_ID=self.site1.id):
req = self.factory.get('/')
site = get_current_site(req)
self.assertEqual(site.pk, self.site1.pk)
class GetSiteFromRequestTests(CMSTestCase):
def setUp(self):
self.factory = RequestFactory()
Site.objects.all().delete()
self.site_default = Site.objects.create(domain='default.test', name='Default')
self.site_other = Site.objects.create(domain='other.test', name='Other')
def test_get_param_valid_returns_requested_site(self):
with self.settings(SITE_ID=self.site_default.pk):
req = self.factory.get(f'/admin/?site={self.site_other.pk}')
site = get_site_from_request(req)
self.assertEqual(site.pk, self.site_other.pk)
def test_post_param_valid_returns_requested_site(self):
with self.settings(SITE_ID=self.site_default.pk):
req = self.factory.post('/admin/', data={'site': str(self.site_other.pk)})
site = get_site_from_request(req)
self.assertEqual(site.pk, self.site_other.pk)
def test_invalid_non_integer_falls_back_to_current_site(self):
with self.settings(SITE_ID=self.site_default.pk):
req = self.factory.get('/admin/?site=not-an-int')
site = get_site_from_request(req)
self.assertEqual(site.pk, self.site_default.pk)
def test_nonexistent_site_id_falls_back_to_current_site(self):
with self.settings(SITE_ID=self.site_default.pk):
req = self.factory.get('/admin/?site=999999')
site = get_site_from_request(req)
self.assertEqual(site.pk, self.site_default.pk)
def test_missing_param_falls_back_to_current_site(self):
with self.settings(SITE_ID=self.site_default.pk):
req = self.factory.get('/admin/')
site = get_site_from_request(req)
self.assertEqual(site.pk, self.site_default.pk)
class GetSiteFromRequestWithMiddlewareTests(CMSTestCase):
def setUp(self):
self.factory = RequestFactory()
Site.objects.all().delete()
self.site_default = Site.objects.create(domain='default.test', name='Default')
self.site_other = Site.objects.create(domain='other.test', name='Other')
def test_request_site_from_middleware_is_respected(self):
"""Test that if middleware sets request.site, get_site_from_request respects it."""
with self.settings(SITE_ID=self.site_default.pk):
req = self.factory.get('/admin/')
# Simulate middleware setting request.site
req.site = self.site_other
site = get_site_from_request(req)
self.assertEqual(site.pk, self.site_other.pk)
def test_request_site_from_middleware_does_not_override_get_param(self):
"""Test that request.site does not override GET parameter."""
# GET param points to default, but middleware sets other
req = self.factory.get(f'/admin/?site={self.site_default.pk}')
req.site = self.site_other
site = get_site_from_request(req)
self.assertEqual(site.pk, self.site_default.pk)
def test_request_site_from_middleware_does_not_override_post_param(self):
"""Test that request.site does not override POST parameter."""
with self.settings(SITE_ID=self.site_default.pk):
req = self.factory.post('/admin/', data={'site': str(self.site_other.pk)})
req.site = self.site_default
site = get_site_from_request(req)
self.assertEqual(site.pk, self.site_other.pk)