# -*- coding: utf-8 -*- """ Tests for `djangocms_blog` module. """ import os from cms.utils.i18n import get_language_list from cmsplugin_filer_image.models import ThumbnailOption from django.conf import settings 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.http import SimpleCookie from django.test import TestCase, RequestFactory from django.utils.translation import activate from filer.models import File, Image from PIL import Image as PilImage, ImageDraw from six import StringIO from djangocms_helper.utils import create_user from djangocms_blog.models import BlogCategory, Post User = get_user_model() def _get_cat_pk(lang, name): return lambda: BlogCategory.objects.translated(lang, name=name).get().pk class BaseTest(TestCase): """ Base class with utility function """ request_factory = None user = None languages = get_language_list() category_1 = None thumb_1 = None thumb_2 = None data = { 'it': [ {'title': u'Primo post', 'abstract': u'

prima riga

', 'description': u'Questa รจ la descrizione', 'keywords': u'keyword1, keyword2', 'text': u'Testo del post'}, {'title': u'Secondo post', 'abstract': u'

prima riga del secondo post

', 'description': u'Descrizione del secondo post', 'keywords': u'keyword3, keyword4', 'text': u'Testo del secondo post'}, {'title': u'Terzo post', 'abstract': u'

prima riga del terzo post

', 'description': u'Descrizione del terzo post', 'keywords': u'keyword5, keyword6', 'text': u'Testo del terzo post'}, ], 'en': [ {'title': u'First post', 'abstract': u'

first line

', 'description': u'This is the description', 'keywords': u'keyword1, keyword2', 'text': u'Post text'}, {'title': u'Second post', 'abstract': u'

second post first line

', 'description': u'Second post description', 'keywords': u'keyword3, keyword4', 'text': u'Second post text'}, {'title': u'Third post', 'abstract': u'

third post first line

', 'description': u'third post description', 'keywords': u'keyword5, keyword6', 'text': u'Third post text'} ] } cat_data = { 'it': [ {'name': u'Fortissimo'}, {'name': u'Pianississimo'}, {'name': u'Mezzo'}, {'name': u'Forte', 'parent_id': _get_cat_pk('it', 'Mezzo')}, ], 'en': [ {'name': u'Very loud'}, {'name': u'Very very silent'}, {'name': u'Almost'}, {'name': u'Loud', 'parent_id': _get_cat_pk('en', 'Almost')}, {'name': u'Silent', 'parent_id': _get_cat_pk('en', 'Almost')}, ] } @classmethod def setUpClass(cls): cls.request_factory = RequestFactory() 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_normal = create_user('normal', 'normal@admin.com', 'normal') cls.site_1 = Site.objects.get(pk=1) cls.site_2 = Site.objects.create(domain='http://example2.com', name='example 2') def setUp(self): activate('en') super(BaseTest, self).setUp() self.category_1 = BlogCategory.objects.create(name=u'category 1') self.category_1.set_current_language('it', initialize=True) self.category_1.name = u'categoria 1' self.category_1.save() self.thumb_1 = ThumbnailOption.objects.create( name='base', width=100, height=100, crop=True, upscale=False ) self.thumb_2 = ThumbnailOption.objects.create( name='main', width=200, height=200, crop=False, upscale=False ) img = create_image() self.image_name = 'test_file.jpg' self.filename = os.path.join(settings.FILE_UPLOAD_TEMP_DIR, self.image_name) img.save(self.filename, 'JPEG') file_obj = DjangoFile(open(self.filename, 'rb'), name=self.image_name) self.img = Image.objects.create(owner=self.user, original_filename=self.image_name, file=file_obj) def _get_category(self, data, category=None, lang='en'): for k, v in data.items(): if hasattr(v, '__call__'): data[k] = v() if not category: category = BlogCategory.objects.create(**data) else: category.set_current_language(lang) for attr, val in data.items(): setattr(category, attr, val) category.save() return category def _get_post(self, data, post=None, lang='en', sites=None): if not post: post_data = { 'author': self.user, 'title': data['title'], 'abstract': data['abstract'], 'meta_description': data['description'], 'meta_keywords': data['keywords'], } 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) if sites: for site in sites: post.sites.add(site) return post @classmethod def tearDownClass(cls): User.objects.all().delete() def tearDown(self): for post in Post.objects.all(): post.delete() os.remove(self.filename) for f in File.objects.all(): f.delete() def get_pages(self): from cms.api import create_page, create_title page = create_page(u'page one', 'fullwidth.html', language='en') page_2 = create_page(u'page two', 'fullwidth.html', language='en') create_title(language='fr', title=u'page un', page=page) create_title(language='it', title=u'pagina uno', page=page) for lang in self.languages: page.publish(lang) page_2.publish('en') return page.get_draft_object(), page_2.get_draft_object() def get_request(self, page, lang): request = self.request_factory.get(page.get_path(lang)) request.current_page = page request.user = self.user request.session = {} request.cookies = SimpleCookie() request.errors = StringIO() return request def post_request(self, page, lang, data, path=None): if not path: path = page.get_path(lang) request = self.request_factory.post(path, data) request.current_page = page request.user = self.user request.session = {} request.cookies = SimpleCookie() request.errors = StringIO() request._dont_enforce_csrf_checks = True return request def get_page_request(self, page, user, path=None, edit=False, lang_code='en'): from cms.middleware.toolbar import ToolbarMiddleware path = path or page and page.get_absolute_url() if edit: path += '?edit' 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} request.current_page = page mid = ToolbarMiddleware() mid.process_request(request) return request def get_posts(self, sites=None): post1 = self._get_post(self.data['en'][0], sites=sites) post1 = self._get_post(self.data['it'][0], post1, 'it') post1.publish = True post1.main_image = self.img post1.save() post2 = self._get_post(self.data['en'][1], sites=sites) post2 = self._get_post(self.data['it'][1], post2, 'it') post2.main_image = self.img post2.save() return post1, post2 def create_image(mode='RGB', size=(800, 600)): image = PilImage.new(mode, size) draw = ImageDraw.Draw(image) x_bit, y_bit = size[0] // 10, size[1] // 10 draw.rectangle((x_bit, y_bit * 2, x_bit * 7, y_bit * 3), 'red') draw.rectangle((x_bit * 2, y_bit, x_bit * 3, y_bit * 8), 'red') return image