dynamicweb/cms/tests/test_toolbar_enabled_models.py

190 lines
8 KiB
Python
Raw Normal View History

from unittest.mock import Mock, patch
from django.apps import apps
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ImproperlyConfigured
from django.http import Http404
from cms.api import create_page
from cms.app_registration import get_cms_config_apps, get_cms_extension_apps
from cms.cms_config import CMSCoreExtensions
from cms.models import Page, PageContent
from cms.page_rendering import render_pagecontent
from cms.test_utils.testcases import CMSTestCase
from cms.toolbar.toolbar import CMSToolbar
from cms.utils.setup import setup_cms_apps
from cms.views import render_object_edit, render_object_preview
class ConfigureToolbarEnabledModelsUnitTestCase(CMSTestCase):
def test_adds_to_mapping(self):
"""Test that a list of (model, render_func) elements gets
correctly added to internal dict with model as a key
and render_func as value.
"""
extensions = CMSCoreExtensions()
model1 = Mock()
model2 = Mock()
render_func1 = Mock()
render_func2 = Mock()
config = [(model1, render_func1), (model2, render_func2)]
cms_config = Mock(
cms_enabled=True, cms_toolbar_enabled_models=config)
extensions.configure_toolbar_enabled_models(cms_config)
self.assertDictEqual(
extensions.toolbar_enabled_models,
{model1: render_func1, model2: render_func2},
)
def test_doesnt_raise_exception_when_toolbar_enabled_models_undefined(self):
"""
If the toolbar enabled models setting is not present in the config, simply
ignore this.
"""
extensions = CMSCoreExtensions()
cms_config = Mock(cms_enabled=True, spec=[])
try:
extensions.configure_app(cms_config)
except AttributeError:
self.fail("Raises exception when cms_toolbar_enabled_models undefined")
def test_raises_exception_if_not_iterable(self):
"""
If the toolbar enabled models setting isn't iterable, raise an exception.
"""
extensions = CMSCoreExtensions()
cms_config = Mock(
cms_enabled=True, cms_toolbar_enabled_models=Mock())
with self.assertRaises(ImproperlyConfigured):
extensions.configure_toolbar_enabled_models(cms_config)
@patch('cms.cms_config.logger.warning')
def test_warning_if_registering_the_same_model_twice(self, mocked_logger):
"""
If a model is already added to the toolbar enabled models dict,
log a warning.
"""
extensions = CMSCoreExtensions()
model = Mock()
render_func = Mock()
config = [(model, render_func), (model, render_func)]
cms_config = Mock(
cms_enabled=True, cms_toolbar_enabled_models=config)
extensions.configure_toolbar_enabled_models(cms_config)
# Warning message displayed
mocked_logger.assert_called_once_with(
f"Model {model} already registered for frontend rendering"
)
# Toolbar enabled models dict is still what we expect it to be
self.assertDictEqual(
extensions.toolbar_enabled_models,
{model: render_func},
)
class ConfigureToolbarEnabledModelsRenderingIntegrationTestCase(CMSTestCase):
def setUp(self):
# The results of get_cms_extension_apps and get_cms_config_apps
# are cached. Clear this cache because installed apps change
# between tests and therefore unlike in a live environment,
# results of this function can change between tests
get_cms_extension_apps.cache_clear()
get_cms_config_apps.cache_clear()
def test_adds_all_toolbar_enabled_models_settings_to_dict(self):
"""
Check that all toolbar enabled models settings are picked up
from cms.cms_config.
"""
setup_cms_apps()
app = apps.get_app_config('cms')
toolbar_enabled_models = app.cms_extension.toolbar_enabled_models
self.assertIn(PageContent, toolbar_enabled_models.keys())
self.assertEqual(toolbar_enabled_models[PageContent], render_pagecontent)
class ToolbarEnabledModelsTestCase(CMSTestCase):
def test_render_preview_not_supported(self):
"""Test that attempting to use render_object_preview with
unsupported model returns 400 response.
"""
request = self.get_request('/')
# The view is called directly here, bypassing the admin_view staff gate,
# so give the request an authorized user: the endpoint now runs an
# object-level view check before the "supported model" check.
request.user = self.get_superuser()
request.toolbar = CMSToolbar(request)
ctype = ContentType.objects.get_for_model(Page)
page = create_page('home', 'nav_playground.html', 'en')
response = render_object_preview(request, ctype.pk, page.pk)
self.assertEqual(response.status_code, 400)
def test_render_edit_not_supported(self):
"""Test that attempting to use render_object_edit with
unsupported model returns 400 response.
"""
request = self.get_request('/')
request.toolbar = CMSToolbar(request)
ctype = ContentType.objects.get_for_model(Page)
page = create_page('home', 'nav_playground.html', 'en')
response = render_object_edit(request, ctype.pk, page.pk)
self.assertEqual(response.status_code, 400)
def test_render_edit_not_editable_model(self):
"""Test that attempting to use render_object_edit with
a model that doesn't have placeholder field returns 400.
"""
request = self.get_request('/')
request.toolbar = CMSToolbar(request)
ctype = ContentType.objects.get_for_model(Page)
page = create_page('home', 'nav_playground.html', 'en')
render_func = Mock()
mocked_models = {Page: render_func}
extension = apps.get_app_config('cms').cms_extension
with patch.object(extension, 'toolbar_enabled_models', mocked_models):
response = render_object_edit(request, ctype.pk, page.pk)
# even though Page is registered for toolbar enabled models,
# it doesn't pass is_editable_model check, so this view returns 400
self.assertEqual(response.status_code, 400)
def test_render_preview_object_not_found(self):
"""Test that render_object_object returns 404 when provided
object id doesn't exist.
"""
request = self.get_request('/')
request.toolbar = CMSToolbar(request)
ctype = ContentType.objects.get_for_model(Page)
page = create_page('home', 'nav_playground.html', 'en')
with self.assertRaises(Http404):
render_object_preview(request, ctype.pk, page.pk + 100)
def test_render_preview_ctype_not_found(self):
"""Test that render_object_object returns 404 when provided
content type id doesn't exist.
"""
request = self.get_request('/')
request.toolbar = CMSToolbar(request)
ctype = ContentType.objects.last()
with self.assertRaises(Http404):
render_object_preview(request, ctype.pk + 100, 1)
def test_render_preview_uses_render_func(self):
"""Test that render_object_preview uses render_func associated
with provided model in CMS config.
"""
request = self.get_request('/')
# See test_render_preview_not_supported: the direct call needs an
# authorized user for the object-level view check.
request.user = self.get_superuser()
request.toolbar = CMSToolbar(request)
ctype = ContentType.objects.get_for_model(Page)
page = create_page('home', 'nav_playground.html', 'en')
render_func = Mock()
mocked_models = {Page: render_func}
extension = apps.get_app_config('cms').cms_extension
with patch.object(extension, 'toolbar_enabled_models', mocked_models):
render_object_preview(request, ctype.pk, page.pk)
render_func.assert_called_once_with(request, page)