Skip to content
Snippets Groups Projects
tests.py 7.35 KiB
Newer Older
Olivier Le Brouster's avatar
Olivier Le Brouster committed
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from copy import copy

from django.test import TestCase, Client
from django.contrib.auth.models import User
from django.core.paginator import EmptyPage
from cms.test_utils.testcases import CMSTestCase
from cms.api import create_page, add_plugin, publish_page
from cms.models.fields import PlaceholderField
Olivier Le Brouster's avatar
Olivier Le Brouster committed
from djangocms_text_ckeditor.fields import HTMLField

from utils import create_tests_data, delete_tests_data
Dylann Cordel's avatar
Dylann Cordel committed
from .models import News, NewsComplete, NewsExtended
Olivier Le Brouster's avatar
Olivier Le Brouster committed
from .cms_plugins import NewsPlugin

try:
    from cms.plugin_rendering import render_plugin as render_plugin_base
    def render_plugin(context, plugin, placeholder):
        instance, plugin = plugin.get_plugin_instance()
        template = plugin.get_render_template(context, instance, placeholder)
        return render_plugin_base(context, plugin, placeholder, template)
except ImportError:
    from django.template import RequestContext
    from cms.plugin_rendering import ContentRenderer
Olivier Le Brouster's avatar
Olivier Le Brouster committed

    def render_plugin(context, plugin, placeholder):
        renderer = ContentRenderer(context['request'])
        context = RequestContext(context['request'], context)
        return renderer.render_plugin(plugin, context, placeholder)
Olivier Le Brouster's avatar
Olivier Le Brouster committed


class NewsboxCMSModelsTests(TestCase):

    def setUp(self):
        create_tests_data('myapp_cms')
        
    def tearDown(self):
        delete_tests_data('myapp_cms')

    # fixtures = ['tests_data.json', ]
Olivier Le Brouster's avatar
Olivier Le Brouster committed

    def test_01_manager_published(self):
        """
        Test if we only get really published news via the manager
        """
        newsClasses = [News, NewsComplete, NewsExtended, ]
Olivier Le Brouster's avatar
Olivier Le Brouster committed
        for cls in newsClasses:
            returned_ids = list(cls.objects.published().values_list(
                'id', flat=True).order_by('id'))
Dylann Cordel's avatar
Dylann Cordel committed
            self.assertEqual((cls.__name__, returned_ids),
                             (cls.__name__, [1, 4, 6, 7, ]))
Olivier Le Brouster's avatar
Olivier Le Brouster committed

    def test_02_summary_as_html_field(self):
        """
        Test if newsbox_summary field is HTMLField
        """
        newsClasses = [News, NewsComplete, NewsExtended, ]
Olivier Le Brouster's avatar
Olivier Le Brouster committed

        for cls in newsClasses:
            try:
                summary_field = cls._meta.get_field('newsbox_summary')
            except:
                self.fail('%s is not properly configured' % cls)
            self.assertIsInstance(summary_field, HTMLField)

    def test_03_body_as_placeholder_field(self):
        """
        Test if newsbox_summary field is PlaceholderField
        """
        newsClasses = [News, NewsComplete, NewsExtended, ]

        for cls in newsClasses:
            try:
                body_field = cls._meta.get_field('newsbox_body')
            except:
                self.fail('%s is not properly configured' % cls)
            self.assertIsInstance(body_field, PlaceholderField)

Olivier Le Brouster's avatar
Olivier Le Brouster committed

class NewsboxPageIntegrationTests(CMSTestCase):

    # fixtures = ['tests_data.json', ]
Olivier Le Brouster's avatar
Olivier Le Brouster committed

    def setUp(self):
        create_tests_data('myapp_cms')
Olivier Le Brouster's avatar
Olivier Le Brouster committed
        self.super_user = User(username="test", is_staff=True, is_active=True, is_superuser=True)
        self.super_user.set_password("test")
        self.super_user.save()

Dylann Cordel's avatar
Dylann Cordel committed
        home = create_page(title='Home', template='page.html',  language='en', published=True,
                           reverse_id='home', in_navigation=True)

        self.hooked_news_page = create_page(title='News page', template='page.html', parent=home,
Dylann Cordel's avatar
Dylann Cordel committed
                                language='en', published=True, apphook='NewsApphook',
                                reverse_id='hooked_newspage', in_navigation=True)
        self.plugin_news_page = create_page(title='Plugin News page', template='page.html', parent=home,
                                language='en', published=True,
                                reverse_id='plugin_newspage', in_navigation=True)
        self.placeholder = self.plugin_news_page.placeholders.get(slot='main')
Dylann Cordel's avatar
Dylann Cordel committed
        self.plugin = add_plugin(self.placeholder, 'NewsPlugin', 'en',
                                 title='News', numitems=1, with_pager=True, page_link=None,)
Olivier Le Brouster's avatar
Olivier Le Brouster committed
        self.plugin.save()
        self.plugin, self.newsPlugin = self.plugin.get_plugin_instance()
        self.hooked_news_page = publish_page(self.hooked_news_page, self.super_user, 'en')
        self.placeholder = self.plugin_news_page.placeholders.get(slot='main')

    def tearDown(self):
        delete_tests_data('myapp_cms')
Olivier Le Brouster's avatar
Olivier Le Brouster committed

    def test_01_cmsplugin_context(self):
        context = self.get_context(self.plugin_news_page.get_absolute_url(),
                                   page=self.plugin_news_page)
Olivier Le Brouster's avatar
Olivier Le Brouster committed
        self.newsPlugin.render(context, self.plugin, self.placeholder)
        self.assertIn('object_list', context)
        self.assertEqual(context['object_list'][0].pk, 7)
        self.assertEqual(context['page_obj'].number, 1)
        self.assertEqual(context['paginator'].num_pages, 4)
        self.assertFalse(context['page_obj'].has_previous())
        self.assertTrue(context['page_obj'].has_next())
        with self.assertRaises(EmptyPage):
            context['page_obj'].previous_page_number()
        self.assertEqual(context['page_obj'].next_page_number(), 2)
Olivier Le Brouster's avatar
Olivier Le Brouster committed

    def test_02_cmsplugin_disable_pager(self):
        context = self.get_context(self.plugin_news_page.get_absolute_url(),
                                   page=self.plugin_news_page)
        self.plugin.with_pager = False
        self.plugin.save()
        self.newsPlugin.render(context, self.plugin, self.placeholder)
Olivier Le Brouster's avatar
Olivier Le Brouster committed
        with self.assertRaises(AttributeError):
            getattr(context['object_list'], 'has_previous')
Olivier Le Brouster's avatar
Olivier Le Brouster committed
        with self.assertRaises(AttributeError):
            getattr(context['object_list'], 'paginator')
Olivier Le Brouster's avatar
Olivier Le Brouster committed

    def test_03_cmsplugin_numitems(self):
        context = self.get_context(self.plugin_news_page.get_absolute_url(),
                                   page=self.plugin_news_page)
        self.plugin.numitems = 2
        self.plugin.save()
        self.newsPlugin.render(context, self.plugin, self.placeholder)
        self.assertIn('object_list', context)
        self.assertEqual(context['paginator'].num_pages, 2)
Olivier Le Brouster's avatar
Olivier Le Brouster committed

    def test_04_cmsplugin_html(self):
        context = self.get_context(self.plugin_news_page.get_absolute_url(),
                                   page=self.plugin_news_page)
Olivier Le Brouster's avatar
Olivier Le Brouster committed
        self.newsPlugin.render(context, self.plugin, self.placeholder)
        html = render_plugin(context, self.plugin, self.placeholder)
        self.assertIn('<a href="/news-page/2014/03/07/news-7/">', html)
Olivier Le Brouster's avatar
Olivier Le Brouster committed
        self.assertIn('<a class="next" href="?page=2">Next news</a>', html)

    def test_05_app_view_detail_200(self):
        """
        Test if generic day views return right informations.
        """
        c = Client()
        r = c.get('/news-page/2005/07/15/news-6/')
        self.assertEqual(r.status_code, 200)
        self.assertEqual(r.context['object'].pk, 6)
Olivier Le Brouster's avatar
Olivier Le Brouster committed

    def test_06_app_view_detail_404(self):
        """
Dylann Cordel's avatar
Dylann Cordel committed
        Test if generic day views return a 404 with an URL with a date without
Olivier Le Brouster's avatar
Olivier Le Brouster committed
        any news.
        """
        c = Client()
        r = c.get('/news-page/1985/07/02/my-birthday/')
        self.assertEqual(r.status_code, 404)

    def test_07_app_view_detail_404_not_published(self):
        """
        Test if generic day views return a 404 with an URL with a not published
        news
        """
        c = Client()
        r = c.get('/news-page/2014/02/22/news-2/')
        self.assertEqual(r.status_code, 404)