218 lines
		
	
	
	
		
			9.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			218 lines
		
	
	
	
		
			9.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# -*- coding: utf-8 -*-
 | 
						|
from __future__ import absolute_import, print_function, unicode_literals
 | 
						|
 | 
						|
from aldryn_apphooks_config.utils import get_app_instance
 | 
						|
from django.utils.translation import activate
 | 
						|
from menus.menu_pool import menu_pool
 | 
						|
from parler.utils.context import smart_override, switch_language
 | 
						|
 | 
						|
from djangocms_blog.settings import (
 | 
						|
    MENU_TYPE_CATEGORIES, MENU_TYPE_COMPLETE, MENU_TYPE_NONE, MENU_TYPE_POSTS,
 | 
						|
)
 | 
						|
from djangocms_blog.views import CategoryEntriesView, PostDetailView
 | 
						|
 | 
						|
from .base import BaseTest
 | 
						|
 | 
						|
 | 
						|
class MenuTest(BaseTest):
 | 
						|
    cats = []
 | 
						|
 | 
						|
    def setUp(self):
 | 
						|
        super(MenuTest, self).setUp()
 | 
						|
        self.cats = [self.category_1]
 | 
						|
        self._reset_menus()
 | 
						|
        for i, lang_data in enumerate(self._categories_data):
 | 
						|
            cat = self._get_category(lang_data['en'])
 | 
						|
            if 'it' in lang_data:
 | 
						|
                cat = self._get_category(lang_data['it'], cat, 'it')
 | 
						|
            self.cats.append(cat)
 | 
						|
 | 
						|
        activate('en')
 | 
						|
        menu_pool.clear(all=True)
 | 
						|
        menu_pool.discover_menus()
 | 
						|
        # All cms menu modifiers should be removed from menu_pool.modifiers
 | 
						|
        # so that they do not interfere with our menu nodes
 | 
						|
        menu_pool.modifiers = [m for m in menu_pool.modifiers if m.__module__.startswith('djangocms_blog')]
 | 
						|
        self._reset_menus()
 | 
						|
 | 
						|
    def test_menu_nodes(self):
 | 
						|
        """
 | 
						|
        Tests if all categories are present in the menu
 | 
						|
        """
 | 
						|
        pages = self.get_pages()
 | 
						|
        posts = self.get_posts()
 | 
						|
        self.reload_urlconf()
 | 
						|
 | 
						|
        for lang in ('en', 'it'):
 | 
						|
            with smart_override(lang):
 | 
						|
                request = self.get_page_request(pages[1], self.user, pages[1].get_absolute_url(lang))
 | 
						|
                nodes = menu_pool.get_nodes(request)
 | 
						|
                nodes_url = set([node.url for node in nodes])
 | 
						|
                cats_url = set([cat.get_absolute_url() for cat in self.cats if cat.has_translation(lang)])
 | 
						|
                self.assertTrue(cats_url.issubset(nodes_url))
 | 
						|
 | 
						|
        self._reset_menus()
 | 
						|
        posts[0].categories.clear()
 | 
						|
        for lang in ('en', 'it'):
 | 
						|
            with smart_override(lang):
 | 
						|
                request = self.get_page_request(pages[1], self.user, pages[1].get_absolute_url(lang))
 | 
						|
                nodes = menu_pool.get_nodes(request)
 | 
						|
                nodes_url = set([node.url for node in nodes])
 | 
						|
                self.assertFalse(posts[0].get_absolute_url(lang) in nodes_url)
 | 
						|
                self.assertTrue(posts[1].get_absolute_url(lang) in nodes_url)
 | 
						|
 | 
						|
    def test_menu_options(self):
 | 
						|
        """
 | 
						|
        Tests menu structure based on menu_structure configuration
 | 
						|
        """
 | 
						|
        self.get_pages()
 | 
						|
        posts = self.get_posts()
 | 
						|
 | 
						|
        cats_url = {}
 | 
						|
        cats_with_post_url = {}
 | 
						|
        cats_without_post_url = {}
 | 
						|
        posts_url = {}
 | 
						|
 | 
						|
        languages = ('en', 'it')
 | 
						|
 | 
						|
        for lang in languages:
 | 
						|
            with smart_override(lang):
 | 
						|
                cats_url[lang] = set([cat.get_absolute_url() for cat in self.cats if cat.has_translation(lang)])
 | 
						|
                cats_with_post_url[lang] = set([cat.get_absolute_url() for cat in self.cats if cat.has_translation(lang) and cat.blog_posts.published().exists()])
 | 
						|
                cats_without_post_url[lang] = cats_url[lang].difference(cats_with_post_url[lang])
 | 
						|
                posts_url[lang] = set([post.get_absolute_url(lang) for post in posts if post.has_translation(lang) and post.app_config == self.app_config_1])
 | 
						|
 | 
						|
        # No item in the menu
 | 
						|
        self.app_config_1.app_data.config.menu_structure = MENU_TYPE_NONE
 | 
						|
        self.app_config_1.save()
 | 
						|
        self._reset_menus()
 | 
						|
        for lang in languages:
 | 
						|
            request = self.get_page_request(None, self.user, r'/%s/page-two/' % lang)
 | 
						|
            with smart_override(lang):
 | 
						|
                nodes = menu_pool.get_nodes(request)
 | 
						|
                nodes_url = set([node.url for node in nodes])
 | 
						|
                self.assertFalse(cats_url[lang].issubset(nodes_url))
 | 
						|
                self.assertFalse(posts_url[lang].issubset(nodes_url))
 | 
						|
 | 
						|
        # Only posts in the menu
 | 
						|
        self.app_config_1.app_data.config.menu_structure = MENU_TYPE_POSTS
 | 
						|
        self.app_config_1.save()
 | 
						|
        self._reset_menus()
 | 
						|
        for lang in languages:
 | 
						|
            request = self.get_page_request(None, self.user, r'/%s/page-two/' % lang)
 | 
						|
            with smart_override(lang):
 | 
						|
                nodes = menu_pool.get_nodes(request)
 | 
						|
                nodes_url = set([node.url for node in nodes])
 | 
						|
                self.assertFalse(cats_url[lang].issubset(nodes_url))
 | 
						|
                self.assertTrue(posts_url[lang].issubset(nodes_url))
 | 
						|
 | 
						|
        # Only categories in the menu
 | 
						|
        self.app_config_1.app_data.config.menu_structure = MENU_TYPE_CATEGORIES
 | 
						|
        self.app_config_1.save()
 | 
						|
        self._reset_menus()
 | 
						|
        for lang in languages:
 | 
						|
            request = self.get_page_request(None, self.user, r'/%s/page-two/' % lang)
 | 
						|
            with smart_override(lang):
 | 
						|
                nodes = menu_pool.get_nodes(request)
 | 
						|
                nodes_url = set([node.url for node in nodes])
 | 
						|
                self.assertTrue(cats_url[lang].issubset(nodes_url))
 | 
						|
                self.assertFalse(posts_url[lang].issubset(nodes_url))
 | 
						|
 | 
						|
        # Both types in the menu
 | 
						|
        self.app_config_1.app_data.config.menu_structure = MENU_TYPE_COMPLETE
 | 
						|
        self.app_config_1.save()
 | 
						|
        self._reset_menus()
 | 
						|
        for lang in languages:
 | 
						|
            request = self.get_page_request(None, self.user, r'/%s/page-two/' % lang)
 | 
						|
            with smart_override(lang):
 | 
						|
                nodes = menu_pool.get_nodes(request)
 | 
						|
                nodes_url = set([node.url for node in nodes])
 | 
						|
                self.assertTrue(cats_url[lang].issubset(nodes_url))
 | 
						|
                self.assertTrue(posts_url[lang].issubset(nodes_url))
 | 
						|
 | 
						|
        # Both types in the menu
 | 
						|
        self.app_config_1.app_data.config.menu_empty_categories = False
 | 
						|
        self.app_config_1.save()
 | 
						|
        self.app_config_2.app_data.config.menu_empty_categories = False
 | 
						|
        self.app_config_2.save()
 | 
						|
        self._reset_menus()
 | 
						|
        for lang in languages:
 | 
						|
            request = self.get_page_request(None, self.user, r'/%s/page-two/' % lang)
 | 
						|
            with smart_override(lang):
 | 
						|
                nodes = menu_pool.get_nodes(request)
 | 
						|
                nodes_url = set([node.url for node in nodes])
 | 
						|
                self.assertTrue(cats_with_post_url[lang].issubset(nodes_url))
 | 
						|
                self.assertFalse(cats_without_post_url[lang].intersection(nodes_url))
 | 
						|
                self.assertTrue(posts_url[lang].issubset(nodes_url))
 | 
						|
        # Both types in the menu
 | 
						|
        self.app_config_1.app_data.config.menu_empty_categories = True
 | 
						|
        self.app_config_1.save()
 | 
						|
        self.app_config_2.app_data.config.menu_empty_categories = True
 | 
						|
        self.app_config_2.save()
 | 
						|
        self._reset_menus()
 | 
						|
 | 
						|
    def test_modifier(self):
 | 
						|
        """
 | 
						|
        Tests if correct category is selected in the menu
 | 
						|
        according to context (view object)
 | 
						|
        """
 | 
						|
        pages = self.get_pages()
 | 
						|
        posts = self.get_posts()
 | 
						|
 | 
						|
        tests = (
 | 
						|
            # view class, view kwarg, view object, category
 | 
						|
            (PostDetailView, 'slug', posts[0], posts[0].categories.first()),
 | 
						|
            (CategoryEntriesView, 'category', self.cats[2], self.cats[2])
 | 
						|
        )
 | 
						|
        self.app_config_1.app_data.config.menu_structure = MENU_TYPE_COMPLETE
 | 
						|
        self.app_config_1.save()
 | 
						|
        for view_cls, kwarg, obj, cat in tests:
 | 
						|
            with smart_override('en'):
 | 
						|
                with switch_language(obj, 'en'):
 | 
						|
                    request = self.get_page_request(
 | 
						|
                        pages[1], self.user, path=obj.get_absolute_url()
 | 
						|
                    )
 | 
						|
                    self._reset_menus()
 | 
						|
                    menu_pool.clear(all=True)
 | 
						|
                    view_obj = view_cls()
 | 
						|
                    view_obj.request = request
 | 
						|
                    view_obj.namespace, view_obj.config = get_app_instance(request)
 | 
						|
                    view_obj.app_config = self.app_config_1
 | 
						|
                    view_obj.kwargs = {kwarg: obj.slug}
 | 
						|
                    view_obj.get(request)
 | 
						|
                    view_obj.get_context_data()
 | 
						|
                    # check if selected menu node points to cat
 | 
						|
                    nodes = menu_pool.get_nodes(request)
 | 
						|
                    found = []
 | 
						|
                    for node in nodes:
 | 
						|
                        if node.selected:
 | 
						|
                            found.append(node.get_absolute_url())
 | 
						|
                    self.assertTrue(obj.get_absolute_url() in found)
 | 
						|
 | 
						|
        self.app_config_1.app_data.config.menu_structure = MENU_TYPE_CATEGORIES
 | 
						|
        self.app_config_1.save()
 | 
						|
        for view_cls, kwarg, obj, cat in tests:
 | 
						|
            with smart_override('en'):
 | 
						|
                with switch_language(obj, 'en'):
 | 
						|
                    request = self.get_page_request(
 | 
						|
                        pages[1], self.user, path=obj.get_absolute_url()
 | 
						|
                    )
 | 
						|
                    self._reset_menus()
 | 
						|
                    menu_pool.clear(all=True)
 | 
						|
                    view_obj = view_cls()
 | 
						|
                    view_obj.request = request
 | 
						|
                    view_obj.namespace, view_obj.config = get_app_instance(request)
 | 
						|
                    view_obj.app_config = self.app_config_1
 | 
						|
                    view_obj.kwargs = {kwarg: obj.slug}
 | 
						|
                    view_obj.get(request)
 | 
						|
                    view_obj.get_context_data()
 | 
						|
                    # check if selected menu node points to cat
 | 
						|
                    nodes = menu_pool.get_nodes(request)
 | 
						|
                    found = []
 | 
						|
                    for node in nodes:
 | 
						|
                        if node.selected:
 | 
						|
                            found.append(node.get_absolute_url())
 | 
						|
                    self.assertTrue(cat.get_absolute_url() in found)
 | 
						|
 | 
						|
        self.app_config_1.app_data.config.menu_structure = MENU_TYPE_COMPLETE
 | 
						|
        self.app_config_1.save()
 |