После некоторых исследований и изучения базы кода DjangoCMS мне удалось написать несколько тестов, расширяющих панель инструментов DjangoCMS.
Если у вас есть какое-то расширение страницы, например models.py
class PageFieldExtension(PageExtension):
subtitle = models.CharField(max_length=255, blank=True)
background_image = FilerImageField(null=True, blank=True,
on_delete=models.SET_NULL)
extension_pool.register(PageFieldExtension)
И заполните меню панели инструментов в cms_toolbar.py
@toolbar_pool.register
class PageFieldExtensionToolbar(ExtensionToolbar):
model = PageFieldExtension
def populate(self):
# setup the extension toolbar with permissions and sanity checks
current_page_menu = self._setup_extension_toolbar()
# if its all ok
if current_page_menu:
# retrieves the instance of the current extension (if any)
# and the toolbar item URL
page_extension, url = self.get_page_extension_admin()
if url:
# adds separator
current_page_menu.add_break()
# adds a toolbar item
current_page_menu.add_modal_item(
'Extra settings',
url=url,
disabled=not self.toolbar.edit_mode,
)
. Вы можете создать тесты для проверки существования Extra settings
на панели инструментов страницы:
def test_existence_of_extra_settings(self):
"""
Test if Extra settings appears in Page toolbar.
"""
request = self.get_page_request(self.page, self.superuser, "/", edit=True)
toolbar = CMSToolbar(request)
page_item = self.get_page_item(toolbar)
template_item = [item for item in page_item.items
if force_text(getattr(item, 'name', '')) == 'Extra settings...']
self.assertEqual(len(template_item), 1)
Проверка функциональности расширения страницы:
def test_page_extensions(self):
"""
Test Page Extensions functionality.
"""
request = self.get_page_request(self.page, self.superuser, "/", edit=True)
extension = self.PageExtensionModel(subtitle="Extra settings subtitle", background_image=self.test_image,
extended_object=self.page)
extension.save()
self.assertEqual(request.current_page.pagefieldextension.subtitle, "Extra settings subtitle")
self.assertEqual(request.current_page.pagefieldextension.background_image, self.test_image)
Расширение тестовой страницы html-разбор на реальной странице (если вы используете его для чего-то, отображая некоторые субтитры или фоновое изображение):
def test_page_extensions_template(self):
"""
Test Page Extensions html parsing.
"""
extension = self.PageExtensionModel(subtitle="Extra settings subtitle", background_image=self.test_image,
extended_object=self.page)
extension.save()
self.page.publish('en')
self.client.logout()
response = self.client.get(self.page.get_absolute_url())
self.assertEqual(response.status_code, 200)
expected_html = '<div><h1 class="title">Extra settings subtitle</h1></div>'
self.assertContains(response, expected_html, html=True)
expected_html = '<div class="parallax" style="background: url(\'{}\')"></div>'.format(
self.test_image.url)
self.assertContains(response, expected_html, html=True)
Вот методы get_page_request
и get_page_item
вы также можете найти их в кодовой базе DjangoCMS.
@staticmethod
def get_page_request(page, user, path=None, edit=False,
preview=False, structure=False, lang_code='en', disable=False):
if not path:
path = page.get_absolute_url()
if edit:
path += '?%s' % get_cms_setting('CMS_TOOLBAR_URL__EDIT_ON')
if structure:
path += '?%s' % get_cms_setting('CMS_TOOLBAR_URL__BUILD')
if preview:
path += '?preview'
request = RequestFactory().get(path)
request.session = {}
request.user = user
request.LANGUAGE_CODE = lang_code
if edit:
request.GET = {'edit': None}
else:
request.GET = {'edit_off': None}
if disable:
request.GET[get_cms_setting('CMS_TOOLBAR_URL__DISABLE')] = None
request.current_page = page
mid = ToolbarMiddleware()
mid.process_request(request)
if hasattr(request, 'toolbar'):
request.toolbar.populate()
return request
@staticmethod
def get_page_item(toolbar):
items = toolbar.get_left_items() + toolbar.get_right_items()
page_item = [item for item in items if force_text(item.name) == 'Page']
return page_item[0]