Merge pull request #44 from nephila/feature/fix_tests

Fix tests
This commit is contained in:
Iacopo Spalletti 2014-10-05 09:46:08 +02:00
commit 366913b452
7 changed files with 134 additions and 77 deletions

View file

@ -83,6 +83,7 @@ HELPER_SETTINGS = {
'easy_thumbnails.processors.filters', 'easy_thumbnails.processors.filters',
), ),
'FILE_UPLOAD_TEMP_DIR': mkdtemp(), 'FILE_UPLOAD_TEMP_DIR': mkdtemp(),
'SITE_ID': 1
} }
if 'test' in sys.argv: if 'test' in sys.argv:
HELPER_SETTINGS['INSTALLED_APPS'].append('django_nose') HELPER_SETTINGS['INSTALLED_APPS'].append('django_nose')

View file

@ -7,7 +7,6 @@ from django.conf import settings
from parler.admin import TranslatableAdmin from parler.admin import TranslatableAdmin
from .models import Post, BlogCategory from .models import Post, BlogCategory
from .settings import BLOG_USE_PLACEHOLDER, BLOG_MULTISITE
class BlogCategoryAdmin(EnhancedModelAdminMixin, TranslatableAdmin): class BlogCategoryAdmin(EnhancedModelAdminMixin, TranslatableAdmin):
@ -48,6 +47,7 @@ class PostAdmin(EnhancedModelAdminMixin, FrontendEditableAdmin,
] ]
def get_fieldsets(self, request, obj=None): def get_fieldsets(self, request, obj=None):
from .settings import BLOG_USE_PLACEHOLDER, BLOG_MULTISITE
fsets = deepcopy(self._fieldsets) fsets = deepcopy(self._fieldsets)
if not BLOG_USE_PLACEHOLDER: if not BLOG_USE_PLACEHOLDER:
fsets[0][1]['fields'].append('post_text') fsets[0][1]['fields'].append('post_text')

View file

@ -1,4 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import django
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
from django.db.models import Q from django.db.models import Q
@ -77,7 +78,7 @@ class GenericDateQuerySet(TranslatableQuerySet):
publish_field = 'publish' publish_field = 'publish'
def on_site(self): def on_site(self):
return self.filter(Q(sites__isnull=True) | Q(sites=Site.objects.get_current())) return self.filter(Q(sites__isnull=True) | Q(sites=Site.objects.get_current().pk))
def published(self): def published(self):
queryset = self.published_future() queryset = self.published_future()
@ -122,11 +123,10 @@ class GenericDateTaggedManager(TaggedFilterItem, TranslationManager):
def get_queryset(self, *args, **kwargs): def get_queryset(self, *args, **kwargs):
try: try:
return super(GenericDateTaggedManager, self).get_queryset(*args, **kwargs) return super(GenericDateTaggedManager, self).get_queryset(*args, **kwargs)
except AttributeError: except AttributeError: # pragma: no cover
return super(GenericDateTaggedManager, self).get_query_set(*args, **kwargs) return super(GenericDateTaggedManager, self).get_query_set(*args, **kwargs)
if django.VERSION < (1, 8):
def get_query_set(self, *args, **kwargs): get_query_set = get_queryset
return self.get_queryset(*args, **kwargs)
def published(self): def published(self):
return self.get_queryset().published() return self.get_queryset().published()

View file

@ -18,7 +18,7 @@ class BaseBlogView(ViewUrlMixin):
def get_queryset(self): def get_queryset(self):
language = get_language() language = get_language()
queryset = self.model._default_manager.active_translations(language_code=language) queryset = self.model._default_manager.language(language_code=language)
if not self.request.user.is_staff: if not self.request.user.is_staff:
queryset = queryset.published() queryset = queryset.published()
return queryset.on_site() return queryset.on_site()
@ -128,10 +128,7 @@ class CategoryEntriesView(BaseBlogView, ListView):
@property @property
def category(self): def category(self):
if not self._category: if not self._category:
language = get_language() self._category = BlogCategory.objects.active_translations(get_language(), slug=self.kwargs['category']).last()
self._category = BlogCategory._default_manager.language(language).get(
translations__language_code=language,
translations__slug=self.kwargs['category'])
return self._category return self._category
def get_queryset(self): def get_queryset(self):

View file

@ -2,13 +2,13 @@
""" """
Tests for `djangocms_blog` module. Tests for `djangocms_blog` module.
""" """
from django.contrib.sites.models import Site
import os import os
from cms.utils.i18n import get_language_list from cms.utils.i18n import get_language_list
from cmsplugin_filer_image.models import ThumbnailOption from cmsplugin_filer_image.models import ThumbnailOption
from django.conf import settings from django.conf import settings
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.contrib.sites.models import Site
from django.core.files import File as DjangoFile from django.core.files import File as DjangoFile
from django.http import SimpleCookie from django.http import SimpleCookie
from django.test import TestCase, RequestFactory from django.test import TestCase, RequestFactory
@ -17,8 +17,8 @@ from filer.models import File, Image
from PIL import Image as PilImage, ImageDraw from PIL import Image as PilImage, ImageDraw
from six import StringIO from six import StringIO
from djangocms_blog.models import BlogCategory, Post
from djangocms_helper.utils import create_user from djangocms_helper.utils import create_user
from djangocms_blog.models import BlogCategory, Post
User = get_user_model() User = get_user_model()
@ -38,10 +38,13 @@ class BaseTest(TestCase):
'it': [ 'it': [
{'title': u'Primo post', 'abstract': u'<p>prima riga</p>', {'title': u'Primo post', 'abstract': u'<p>prima riga</p>',
'description': u'Questa è la descrizione', 'keywords': u'keyword1, keyword2', 'description': u'Questa è la descrizione', 'keywords': u'keyword1, keyword2',
'text': u'Testo del post',}, 'text': u'Testo del post'},
{'title': u'Secondo post', 'abstract': u'<p>prima riga del secondo post</p>', {'title': u'Secondo post', 'abstract': u'<p>prima riga del secondo post</p>',
'description': u'Descrizione del secondo post', 'keywords': u'keyword3, keyword4', 'description': u'Descrizione del secondo post', 'keywords': u'keyword3, keyword4',
'text': u'Testo del secondo post'}, 'text': u'Testo del secondo post'},
{'title': u'Terzo post', 'abstract': u'<p>prima riga del terzo post</p>',
'description': u'Descrizione del terzo post', 'keywords': u'keyword5, keyword6',
'text': u'Testo del terzo post'},
], ],
'en': [ 'en': [
{'title': u'First post', 'abstract': u'<p>first line</p>', {'title': u'First post', 'abstract': u'<p>first line</p>',
@ -49,7 +52,10 @@ class BaseTest(TestCase):
'text': u'Post text'}, 'text': u'Post text'},
{'title': u'Second post', 'abstract': u'<p>second post first line</p>', {'title': u'Second post', 'abstract': u'<p>second post first line</p>',
'description': u'Second post description', 'keywords': u'keyword3, keyword4', 'description': u'Second post description', 'keywords': u'keyword3, keyword4',
'text': u'Second post text'} 'text': u'Second post text'},
{'title': u'Third post', 'abstract': u'<p>third post first line</p>',
'description': u'third post description', 'keywords': u'keyword5, keyword6',
'text': u'Third post text'}
] ]
} }
@ -59,19 +65,16 @@ class BaseTest(TestCase):
cls.user = create_user('admin', 'admin@admin.com', 'admin', is_staff=True, is_superuser=True) cls.user = create_user('admin', 'admin@admin.com', 'admin', is_staff=True, is_superuser=True)
cls.user_staff = create_user('staff', 'staff@admin.com', 'staff', is_staff=True) cls.user_staff = create_user('staff', 'staff@admin.com', 'staff', is_staff=True)
cls.user_normal = create_user('normal', 'normal@admin.com', 'normal') cls.user_normal = create_user('normal', 'normal@admin.com', 'normal')
cls.site_1 = Site.objects.create(domain='http://example1.com', name='example 1') cls.site_1 = Site.objects.get(pk=1)
cls.site_2 = Site.objects.create(domain='http://example2.com', name='example 2') cls.site_2 = Site.objects.create(domain='http://example2.com', name='example 2')
def setUp(self): def setUp(self):
activate('en') activate('en')
super(BaseTest, self).setUp() super(BaseTest, self).setUp()
self.category_1 = BlogCategory.objects.create() self.category_1 = BlogCategory.objects.create(name=u'category 1')
self.category_1.name = u'category 1' self.category_1.set_current_language('it', initialize=True)
self.category_1.save()
self.category_1.set_current_language('it')
self.category_1.name = u'categoria 1' self.category_1.name = u'categoria 1'
self.category_1.save() self.category_1.save()
self.category_1.set_current_language('en')
self.thumb_1 = ThumbnailOption.objects.create( self.thumb_1 = ThumbnailOption.objects.create(
name='base', width=100, height=100, crop=True, upscale=False name='base', width=100, height=100, crop=True, upscale=False
) )
@ -88,18 +91,27 @@ class BaseTest(TestCase):
original_filename=self.image_name, original_filename=self.image_name,
file=file_obj) file=file_obj)
def _get_post(self, data, post=None, lang='en'): def _get_post(self, data, post=None, lang='en', sites=None):
if not post: if not post:
post = Post() post_data = {
post.set_current_language(lang) 'author': self.user,
post.author = self.user 'title': data['title'],
post.title = data['title'] 'abstract': data['abstract'],
post.abstract = data['abstract'] 'meta_description': data['description'],
post.meta_description = data['description'] 'meta_keywords': data['keywords'],
post.meta_keywords = data['keywords'] }
post.save() post = Post.objects.create(**post_data)
else:
post.set_current_language(lang)
post.title = data['title']
post.abstract = data['abstract']
post.meta_description = data['description']
post.meta_keywords = data['keywords']
post.save()
post.categories.add(self.category_1) post.categories.add(self.category_1)
post.save() if sites:
for site in sites:
post.sites.add(site)
return post return post
@classmethod @classmethod
@ -107,6 +119,8 @@ class BaseTest(TestCase):
User.objects.all().delete() User.objects.all().delete()
def tearDown(self): def tearDown(self):
for post in Post.objects.all():
post.delete()
os.remove(self.filename) os.remove(self.filename)
for f in File.objects.all(): for f in File.objects.all():
f.delete() f.delete()
@ -149,17 +163,16 @@ class BaseTest(TestCase):
mid.process_request(request) mid.process_request(request)
return request return request
def get_posts(self): def get_posts(self, sites=None):
post1 = self._get_post(self.data['en'][0]) post1 = self._get_post(self.data['en'][0], sites=sites)
post1 = self._get_post(self.data['it'][0], post1, 'it') post1 = self._get_post(self.data['it'][0], post1, 'it')
post1.publish = True post1.publish = True
post1.main_image = self.img post1.main_image = self.img
post1.save() post1.save()
post1.set_current_language('en') post2 = self._get_post(self.data['en'][1], sites=sites)
post2 = self._get_post(self.data['en'][1])
post2 = self._get_post(self.data['it'][1], post2, 'it') post2 = self._get_post(self.data['it'][1], post2, 'it')
post2.set_current_language('en')
post2.main_image = self.img post2.main_image = self.img
post2.save()
return post1, post2 return post1, post2

View file

@ -2,9 +2,11 @@
from cms.api import add_plugin from cms.api import add_plugin
from cms.utils.copy_plugins import copy_plugins_to from cms.utils.copy_plugins import copy_plugins_to
from cms.utils.plugins import downcast_plugins from cms.utils.plugins import downcast_plugins
from django.contrib import admin
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.utils.timezone import now from django.utils.timezone import now
from django.utils.translation import get_language, override
import parler import parler
from taggit.models import Tag from taggit.models import Tag
@ -15,6 +17,33 @@ from djangocms_blog import settings
from . import BaseTest from . import BaseTest
class AdminTest(BaseTest):
def test_admin_fieldsets(self):
request = self.get_page_request('/', self.user_staff, r'/en/blog/', edit=False)
post_admin = admin.site._registry[Post]
settings.BLOG_USE_PLACEHOLDER = True
fsets = post_admin.get_fieldsets(request)
self.assertFalse('post_text' in fsets[0][1]['fields'])
settings.BLOG_USE_PLACEHOLDER = False
fsets = post_admin.get_fieldsets(request)
self.assertTrue('post_text' in fsets[0][1]['fields'])
settings.BLOG_USE_PLACEHOLDER = True
settings.BLOG_MULTISITE = True
fsets = post_admin.get_fieldsets(request)
self.assertTrue('sites' in fsets[1][1]['fields'][0])
settings.BLOG_MULTISITE = False
fsets = post_admin.get_fieldsets(request)
self.assertFalse('sites' in fsets[1][1]['fields'][0])
settings.BLOG_MULTISITE = True
request = self.get_page_request('/', self.user, r'/en/blog/', edit=False)
fsets = post_admin.get_fieldsets(request)
self.assertTrue('author' in fsets[1][1]['fields'][0])
class ModelsTest(BaseTest): class ModelsTest(BaseTest):
def test_model_attributes(self): def test_model_attributes(self):
@ -37,23 +66,26 @@ class ModelsTest(BaseTest):
self.assertNotEqual(meta_it.title, meta_en.title) self.assertNotEqual(meta_it.title, meta_en.title)
self.assertEqual(meta_it.description, post.meta_description) self.assertEqual(meta_it.description, post.meta_description)
post.set_current_language('en') with override('en'):
kwargs = {'year': post.date_published.year, post.set_current_language(get_language())
'month': post.date_published.month, kwargs = {'year': post.date_published.year,
'day': post.date_published.day, 'month': '%02d' % post.date_published.month,
'slug': post.safe_translation_getter('slug', any_language=True)} 'day': '%02d' % post.date_published.day,
url_en = reverse('djangocms_blog:post-detail', kwargs=kwargs) 'slug': post.safe_translation_getter('slug', any_language=get_language())}
self.assertEqual(url_en, post.get_absolute_url()) url_en = reverse('djangocms_blog:post-detail', kwargs=kwargs)
post.set_current_language('it') self.assertEqual(url_en, post.get_absolute_url())
kwargs = {'year': post.date_published.year,
'month': post.date_published.month,
'day': post.date_published.day,
'slug': post.safe_translation_getter('slug', any_language=True)}
url_it = reverse('djangocms_blog:post-detail', kwargs=kwargs)
self.assertEqual(url_it, post.get_absolute_url())
self.assertNotEqual(url_it, url_en)
self.assertEqual(post.get_full_url(), 'http://example.com%s' % url_it) with override('it'):
post.set_current_language(get_language())
kwargs = {'year': post.date_published.year,
'month': '%02d' % post.date_published.month,
'day': '%02d' % post.date_published.day,
'slug': post.safe_translation_getter('slug', any_language=get_language())}
url_it = reverse('djangocms_blog:post-detail', kwargs=kwargs)
self.assertEqual(url_it, post.get_absolute_url())
self.assertNotEqual(url_it, url_en)
self.assertEqual(post.get_full_url(), 'http://example.com%s' % url_it)
self.assertEqual(post.get_image_full_url(), 'http://example.com%s' % post.main_image.url) self.assertEqual(post.get_image_full_url(), 'http://example.com%s' % post.main_image.url)
self.assertEqual(post.thumbnail_options(), settings.BLOG_IMAGE_THUMBNAIL_SIZE) self.assertEqual(post.thumbnail_options(), settings.BLOG_IMAGE_THUMBNAIL_SIZE)
@ -213,3 +245,17 @@ class ModelsTest(BaseTest):
copy_plugins_to(plugins, post2.content) copy_plugins_to(plugins, post2.content)
new = downcast_plugins(post2.content.cmsplugin_set.all()) new = downcast_plugins(post2.content.cmsplugin_set.all())
self.assertEqual(set(new[0].authors.all()), set([self.user])) self.assertEqual(set(new[0].authors.all()), set([self.user]))
def test_multisite(self):
with override('en'):
post1 = self._get_post(self.data['en'][0], sites=(self.site_1,))
post2 = self._get_post(self.data['en'][1], sites=(self.site_2,))
post3 = self._get_post(self.data['en'][2], sites=(self.site_2, self.site_1))
self.assertEqual(len(Post.objects.all()), 3)
with self.settings(**{'SITE_ID': self.site_1.pk}):
self.assertEqual(len(Post.objects.all().on_site()), 2)
self.assertEqual(set(list(Post.objects.all().on_site())), set([post1, post3]))
with self.settings(**{'SITE_ID': self.site_2.pk}):
self.assertEqual(len(Post.objects.all().on_site()), 2)
self.assertEqual(set(list(Post.objects.all().on_site())), set([post2, post3]))

View file

@ -3,7 +3,8 @@ from django.contrib.auth.models import AnonymousUser
from django.http import Http404 from django.http import Http404
from django.utils.translation import activate from django.utils.translation import activate
from django.utils.timezone import now from django.utils.timezone import now
from djangocms_blog.models import Post from parler.utils.context import switch_language
from djangocms_blog.models import Post, BlogCategory
from djangocms_blog.feeds import LatestEntriesFeed, TagFeed from djangocms_blog.feeds import LatestEntriesFeed, TagFeed
from djangocms_blog.sitemaps import BlogSitemap from djangocms_blog.sitemaps import BlogSitemap
from djangocms_blog.views import (PostListView, PostDetailView, from djangocms_blog.views import (PostListView, PostDetailView,
@ -54,34 +55,33 @@ class ViewTest(BaseTest):
page1, page2 = self.get_pages() page1, page2 = self.get_pages()
post1, post2 = self.get_posts() post1, post2 = self.get_posts()
request = self.get_page_request(page1, AnonymousUser(), r'/en/blog/', edit=False) with switch_language(post1, 'en'):
activate('en') request = self.get_page_request(page1, AnonymousUser(), r'/en/blog/', edit=False)
view_obj = PostDetailView() view_obj = PostDetailView()
view_obj.request = request view_obj.request = request
with self.assertRaises(Http404): with self.assertRaises(Http404):
view_obj.kwargs = {'slug': 'not-existing'} view_obj.kwargs = {'slug': 'not-existing'}
post_obj = view_obj.get_object()
view_obj.kwargs = {'slug': post1.slug}
post_obj = view_obj.get_object() post_obj = view_obj.get_object()
self.assertEqual(post_obj, post1)
self.assertEqual(post_obj.language_code, 'en')
view_obj.kwargs = {'slug': post1.slug} with switch_language(post1, 'it'):
post_obj = view_obj.get_object() request = self.get_page_request(page1, AnonymousUser(), r'/it/blog/', lang_code='it', edit=False)
self.assertEqual(post_obj, post1) view_obj.request = request
self.assertEqual(post_obj.language_code, 'en') view_obj.kwargs = {'slug': post1.slug}
post_obj = view_obj.get_object()
self.assertEqual(post_obj, post1)
self.assertEqual(post_obj.language_code, 'it')
request = self.get_page_request(page1, AnonymousUser(), r'/it/blog/', lang_code='it', edit=False) view_obj.object = post_obj
activate('it') context = view_obj.get_context_data()
post1.set_current_language('it') self.assertEqual(context['post'], post1)
view_obj.request = request self.assertEqual(context['post'].language_code, 'it')
view_obj.kwargs = {'slug': post1.slug} self.assertTrue(context['meta'])
post_obj = view_obj.get_object()
self.assertEqual(post_obj, post1)
self.assertEqual(post_obj.language_code, 'it')
view_obj.object = post_obj
context = view_obj.get_context_data()
self.assertEqual(context['post'], post1)
self.assertEqual(context['post'].language_code, 'it')
self.assertTrue(context['meta'])
def test_post_archive_view(self): def test_post_archive_view(self):
page1, page2 = self.get_pages() page1, page2 = self.get_pages()