Skip to content
Snippets Groups Projects
tests.py 5.09 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 django.utils.translation import activate
from cms.test_utils.testcases import CMSTestCase
from cms.plugin_rendering import render_plugin
from cms.api import create_page, add_plugin, publish_page, create_title
from djangocms_text_ckeditor.fields import HTMLField

from .models import News, NewsComplete, NewsExtended, NewsPlugin as NewsPluginModel
from .cms_plugins import NewsPlugin


class NewsboxAbstractModelsTests(TestCase):

    fixtures = ['tests_data.json',]
    

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

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

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


class NewsboxPageIntegrationTests(CMSTestCase):

    fixtures = ['tests_data.json',]

    def setUp(self):
        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()
        
        home = create_page(title='Home', slug='home',
            template='page.html', 
            language='en', published=True,
            reverse_id='home', in_navigation=True)

        create_title('fr', 'Accueil', home, slug='accueil')
        home.publish('en')
        home.publish('fr')

        self.page = create_page(title='News page', slug='news-page',
            template='page.html', parent=home,
            language='en', published=True, apphook='NewsApphook',
            reverse_id='newspage', in_navigation=True)
        create_title('fr', 'page Actualités', self.page, slug='page-actualites')
        self.placeholder = self.page.placeholders.get(slot='main')

        self.plugin_en = add_plugin(
            self.placeholder, 'NewsPlugin', 'en', 
            title = 'News',
            numitems = 1,
            with_pager = True,
            page_link = None,)
        self.plugin_en.save()

        self.plugin_fr = add_plugin(
            self.placeholder, 'NewsPlugin', 'fr', 
            title = 'Actualités',
            numitems = 1,
            with_pager = True,
            page_link = None,)
        self.plugin_fr.save()
        
        self.page.publish('en')
        self.page.publish('fr')
        self.page.reload()
        
        self.newsPlugin = NewsPlugin()
        self.placeholder = self.page.placeholders.get(slot='main')

    def test_01_cmsplugin_context(self):
        expected_results = {'en':'News 7', 'fr':'Actualité 7',}
        for lang in expected_results:
            activate(lang)
            context = self.get_context(
                self.page.get_absolute_url(), page=self.page)
            self.newsPlugin.render(
                context, 
                getattr(self, 'plugin_%s' % lang), 
                self.placeholder)
            self.assertIn('newsset', context)
            self.assertEqual(context['newsset'][0].pk, 7)
            self.assertEqual(
                context['newsset'][0].newsbox_title, 
                expected_results[lang])
            self.assertEqual(context['newsset'].number, 1)
            self.assertEqual(context['newsset'].paginator.num_pages, 4)
            self.assertFalse(context['newsset'].has_previous())
            self.assertTrue(context['newsset'].has_next())
            self.assertRaises(EmptyPage, context['newsset'].previous_page_number)
            self.assertEqual(context['newsset'].next_page_number(), 2)

    def test_02_wrong_language_404(self):
        c = Client()
        r_en = c.get('/en/news-page/2020/01/01/news-7/')
        r_fr = c.get('/fr/page-actualites/2020/01/01/actualite-7/')
        r_en_and_fr = c.get('/en/news-page/2020/01/01/actualite-7/')
        self.assertEqual(r_en.status_code, 200)
        self.assertEqual(r_fr.status_code, 200)
        self.assertEqual(r_en_and_fr.status_code, 404)

    def test_03_get_absolute_url(self):
        news7 = News.objects.get(pk=7)
        expected_results = {
            'en':'/en/news-page/2020/01/01/news-7/', 
            'fr':'/fr/page-actualites/2020/01/01/actualite-7/',}
        for lang in expected_results:
            activate(lang)
            self.assertEqual(news7.get_absolute_url(), expected_results[lang])