forked from ungleich-public/dynamicweb
160 lines
6.9 KiB
Python
160 lines
6.9 KiB
Python
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)
|