Тесты для расширенной панели инструментов DjangoCMS - PullRequest
0 голосов
/ 14 сентября 2018

Можете ли вы помочь мне, как написать модульные тесты для расширенной панели инструментов в DjangoCMS?Вот ссылка на то, как расширить панель инструментов http://support.divio.com/academy/advanced-how-to-build-a-website-and-blog-with-django-cms/17-adapting-your-application

Кто-нибудь имел опыт работы с этим?Заранее спасибо!

1 Ответ

0 голосов
/ 02 октября 2018

После некоторых исследований и изучения базы кода 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]
...