From 873ac1f52f88ca053e684e7a4f4913097e940f8f Mon Sep 17 00:00:00 2001 From: Iacopo Spalletti Date: Fri, 12 Oct 2012 10:47:10 +0200 Subject: [PATCH 01/25] Tentative multi-db testing strategy --- cms/test_utils/cli.py | 33 ++++++++++++++++++++++++++------- runtests.py | 18 +++++++++++++++--- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/cms/test_utils/cli.py b/cms/test_utils/cli.py index 0fd8261d1ea..3eb18f16beb 100644 --- a/cms/test_utils/cli.py +++ b/cms/test_utils/cli.py @@ -8,19 +8,39 @@ urlpatterns = [] DJANGO_1_3 = LooseVersion(django.get_version()) < LooseVersion('1.4') -def configure(**extra): +def configure(db_data,**extra): from django.conf import settings os.environ['DJANGO_SETTINGS_MODULE'] = 'cms.test_utils.cli' + db_type = db_data.get('DB','sqlite') + if db_type == 'sqlite': + DB = { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': ':memory:', + } + elif db_type == 'postgres': + DB = { + 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'NAME': db_data.get('NAME', 'djangocms'), + 'USER': db_data.get('USER', 'postgres'), + } + if db_data.get('PASSWORD', None): + DB['PASSWORD'] = db_data['PASSWORD'] + elif db_type == 'mysql': + DB = { + 'ENGINE': 'django.db.backends.mysql', + 'NAME': db_data.get('NAME', 'djangocms'), + 'USER': db_data.get('USER', 'root'), + } + if db_data.get('PASSWORD', None): + DB['PASSWORD'] = db_data['PASSWORD'] + defaults = dict( CACHE_BACKEND = 'locmem:///', DEBUG = True, TEMPLATE_DEBUG = True, DATABASE_SUPPORTS_TRANSACTIONS = True, DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': ':memory:', - } + 'default': DB }, SITE_ID = 1, USE_I18N = True, @@ -222,7 +242,6 @@ def configure(**extra): from django.utils.functional import empty settings._wrapped = empty defaults.update(extra) - settings.configure(**defaults) from cms.conf import patch_settings patch_settings() @@ -231,4 +250,4 @@ def configure(**extra): from django.contrib import admin - admin.autodiscover() \ No newline at end of file + admin.autodiscover() diff --git a/runtests.py b/runtests.py index 2f17cfd5e24..da2520071e6 100755 --- a/runtests.py +++ b/runtests.py @@ -7,12 +7,12 @@ def main(test_runner='cms.test_utils.runners.NormalTestRunner', junit_output_dir='.', - time_tests=False, verbosity=1, failfast=False, test_labels=None): + time_tests=False, verbosity=1, failfast=False, test_labels=None,db_data={}): if not test_labels: test_labels = ['cms'] with temp_dir() as STATIC_ROOT: with temp_dir() as MEDIA_ROOT: - configure(TEST_RUNNER=test_runner, JUNIT_OUTPUT_DIR=junit_output_dir, + configure(db_data=db_data,TEST_RUNNER=test_runner, JUNIT_OUTPUT_DIR=junit_output_dir, TIME_TESTS=time_tests, ROOT_URLCONF='cms.test_utils.project.urls', STATIC_ROOT=STATIC_ROOT, MEDIA_ROOT=MEDIA_ROOT) from django.conf import settings @@ -36,6 +36,10 @@ def main(test_runner='cms.test_utils.runners.NormalTestRunner', junit_output_dir parser.add_argument('--verbosity', default=1) parser.add_argument('--time-tests', action='store_true', default=False, dest='time_tests') + parser.add_argument('--db', default='sqlite', dest='db') + parser.add_argument('--db_user', default=None, dest='db_user') + parser.add_argument('--db_name', default=None, dest='db_name') + parser.add_argument('--db_password', default=None, dest='db_password') parser.add_argument('test_labels', nargs='*') args = parser.parse_args() if getattr(args, 'jenkins', False): @@ -45,6 +49,14 @@ def main(test_runner='cms.test_utils.runners.NormalTestRunner', junit_output_dir junit_output_dir = getattr(args, 'jenkins_data_dir', '.') time_tests = getattr(args, 'time_tests', False) test_labels = ['cms.%s' % label for label in args.test_labels] + db_data = {'DB':args.db} + if args.db_user: + db_data['USER'] = args.db_user + if args.db_name: + db_data['NAME'] = args.db_name + if args.db_password: + db_data['PASSWORD'] = args.db_password main(test_runner=test_runner, junit_output_dir=junit_output_dir, time_tests=time_tests, - verbosity=args.verbosity, failfast=args.failfast, test_labels=test_labels) + verbosity=args.verbosity, failfast=args.failfast, test_labels=test_labels, + db_data=db_data) From 5a6c356f05a8bd5fd26c71686398ee2ae436280e Mon Sep 17 00:00:00 2001 From: Patrick Lauber Date: Wed, 14 Nov 2012 15:00:07 +0100 Subject: [PATCH 02/25] multi db testing --- .travis.yml | 18 +++++++++++++++--- cms/test_utils/cli.py | 4 ++-- runtests.py | 7 ++++++- runtestserver.py | 10 ++-------- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/.travis.yml b/.travis.yml index 677b98bc8b3..8fe28c1622f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,12 +4,24 @@ python: - "2.6" - "2.7" env: - - DJANGO=test_requirements/django-1.3.txt - - DJANGO=test_requirements/django-1.4.txt + - DJANGO=test_requirements/django-1.3.txt DB=sqlite + - DJANGO=test_requirements/django-1.3.txt DB=mysql + - DJANGO=test_requirements/django-1.3.txt DB=postgres + - DJANGO=test_requirements/django-1.4.txt DB=sqlite + - DJANGO=test_requirements/django-1.4.txt DB=mysql + - DJANGO=test_requirements/django-1.4.txt DB=postgres + +before_script: + - sh -c "if [ '$DB' = 'postgres' ]; then psql -c 'DROP DATABASE IF EXISTS djangocms_test;' -U postgres; fi" + - sh -c "if [ '$DB' = 'postgres' ]; then psql -c 'create database djangocms_test;' -U postgres; fi" + - sh -c "if [ '$DB' = 'mysql' ]; then mysql -e 'create database IF NOT EXISTS djangocms_test'; fi" + install: + - pip install mysql-python + - pip install psycopg2 - pip install -q -r $DJANGO --use-mirrors script: - python runtests.py + python runtests.py --db_name djangocms_test notifications: email: recipients: diff --git a/cms/test_utils/cli.py b/cms/test_utils/cli.py index cd01f5c7da5..6cbbf2ef64a 100644 --- a/cms/test_utils/cli.py +++ b/cms/test_utils/cli.py @@ -20,7 +20,7 @@ def configure(db_data, **extra): elif db_type == 'postgres': DB = { 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'NAME': db_data.get('NAME', 'djangocms'), + 'NAME': db_data.get('NAME', 'djangocms_test'), 'USER': db_data.get('USER', 'postgres'), } if db_data.get('PASSWORD', None): @@ -28,7 +28,7 @@ def configure(db_data, **extra): elif db_type == 'mysql': DB = { 'ENGINE': 'django.db.backends.mysql', - 'NAME': db_data.get('NAME', 'djangocms'), + 'NAME': db_data.get('NAME', 'djangocms_test'), 'USER': db_data.get('USER', 'root'), } if db_data.get('PASSWORD', None): diff --git a/runtests.py b/runtests.py index bc4de8cf788..b1c61e24836 100755 --- a/runtests.py +++ b/runtests.py @@ -45,7 +45,7 @@ def main(test_runner='cms.test_utils.runners.NormalTestRunner', junit_output_dir parser.add_argument('--db', default='sqlite', dest='db') parser.add_argument('--db_user', default=None, dest='db_user') parser.add_argument('--db_name', default=None, dest='db_name') - parser.add_argument('--db_password', default=None, dest='db_password') + parser.add_argument('--db_password', default="", dest='db_password') parser.add_argument('test_labels', nargs='*') args = parser.parse_args() if getattr(args, 'jenkins', False): @@ -58,6 +58,11 @@ def main(test_runner='cms.test_utils.runners.NormalTestRunner', junit_output_dir db_data = {'DB':args.db} if args.db_user: db_data['USER'] = args.db_user + else: + if args.db == "mysql": + db_data['USER'] = "root" + elif args.db == 'postgres': + db_data['USER'] = 'postgres' if args.db_name: db_data['NAME'] = args.db_name if args.db_password: diff --git a/runtestserver.py b/runtestserver.py index 71c021a662e..bf3cb612086 100755 --- a/runtestserver.py +++ b/runtestserver.py @@ -15,16 +15,10 @@ def main(): new_db = not os.path.exists('cmstestdb.sqlite') with temp_dir() as STATIC_ROOT: with temp_dir() as MEDIA_ROOT: - configure( + configure({'DB':'sqlite'}, ROOT_URLCONF='cms.test_utils.project.urls', STATIC_ROOT=STATIC_ROOT, MEDIA_ROOT=MEDIA_ROOT, - DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': 'cmstestdb.sqlite', - } - } ) if os.environ.get("RUN_MAIN") != "true": from django.core.management import call_command @@ -51,7 +45,7 @@ def main(): rs._raw_ipv6 = False rs.addr = args.bind rs.port = args.port - autoreload.main(rs.inner_run, (),{'addrport':'%s:%s' % (args.bind, args.port), 'insecure_serving':True, 'use_threading':True}) + autoreload.main(rs.inner_run, (), {'addrport':'%s:%s' % (args.bind, args.port), 'insecure_serving':True, 'use_threading':True}) if __name__ == '__main__': main() From 8ebdf7c6c577ff69e047b852f7f820bcaefff9f6 Mon Sep 17 00:00:00 2001 From: Patrick Lauber Date: Wed, 14 Nov 2012 16:44:22 +0100 Subject: [PATCH 03/25] actually use the db env --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8fe28c1622f..922e57254cd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,7 +21,7 @@ install: - pip install psycopg2 - pip install -q -r $DJANGO --use-mirrors script: - python runtests.py --db_name djangocms_test + python runtests.py --db $DB --db_name djangocms_test notifications: email: recipients: From 7b3d65ab77eddae277c119e3cc3a29e1039c2468 Mon Sep 17 00:00:00 2001 From: Patrick Lauber Date: Thu, 15 Nov 2012 17:36:29 +0100 Subject: [PATCH 04/25] fixed a lot of tests for mysql --- cms/models/managers.py | 4 +- cms/models/pagemodel.py | 17 +-- cms/models/query.py | 17 +-- cms/models/titlemodels.py | 2 +- cms/signals.py | 84 +++++++-------- cms/test_utils/cli.py | 56 ++++++---- cms/test_utils/testcases.py | 10 +- cms/tests/admin.py | 203 ++++++++++++++++++------------------ cms/tests/apphooks.py | 2 + cms/tests/page.py | 193 +++++++++++++++++----------------- cms/tests/plugins.py | 1 + cms/utils/permissions.py | 34 +++--- menus/utils.py | 10 +- runtestserver.py | 8 +- 14 files changed, 325 insertions(+), 316 deletions(-) diff --git a/cms/models/managers.py b/cms/models/managers.py index 591029b75c6..3b2ae02f3e6 100644 --- a/cms/models/managers.py +++ b/cms/models/managers.py @@ -92,7 +92,7 @@ def get_all_pages_with_application(self): return self.get_query_set().filter(title_set__application_urls__gt='').distinct() def get_home(self, site=None): - return self.get_query_set().get_home(site) + return self.get_query_set().public().get_home(site) def search(self, q, language=None, current_site_only=True): """Simple search function @@ -340,7 +340,7 @@ def for_page(self, page): """ # permissions should be managed on the draft page only page = page.get_draft_object() - from cms.models import ACCESS_DESCENDANTS, ACCESS_CHILDREN,\ + from cms.models import ACCESS_DESCENDANTS, ACCESS_CHILDREN, \ ACCESS_PAGE_AND_CHILDREN, ACCESS_PAGE_AND_DESCENDANTS # code taken from # https://github.com/divio/django-cms/issues/1113#issuecomment-3376790 diff --git a/cms/models/pagemodel.py b/cms/models/pagemodel.py index 575519e87b5..fc2842b9eb6 100644 --- a/cms/models/pagemodel.py +++ b/cms/models/pagemodel.py @@ -20,6 +20,7 @@ from menus.menu_pool import menu_pool from mptt.models import MPTTModel from os.path import join +from datetime import timedelta import copy @@ -71,7 +72,7 @@ class Page(MPTTModel): moderator_state = models.SmallIntegerField(_('moderator state'), default=0, blank=True, editable=False) publisher_is_draft = models.BooleanField(default=1, editable=False, db_index=True) #This is misnamed - the one-to-one relation is populated on both ends - publisher_public = models.OneToOneField('self', related_name='publisher_draft', null=True, editable=False) + publisher_public = models.OneToOneField('self', related_name='publisher_draft', null=True, editable=False) publisher_state = models.SmallIntegerField(default=0, editable=False, db_index=True) # Managers @@ -133,7 +134,7 @@ def move_page(self, target, position='first-child'): import cms.signals as cms_signals cms_signals.page_moved.send(sender=Page, instance=self) # titles get saved before moderation self.save() # always save the page after move, because of publisher - moderator.page_changed(self, force_moderation_action = PageModeratorState.ACTION_MOVE) + moderator.page_changed(self, force_moderation_action=PageModeratorState.ACTION_MOVE) # check the slugs page_utils.check_title_slugs(self) @@ -342,7 +343,7 @@ def save(self, no_signals=False, commit=True, **kwargs): # Published pages should always have a publication date # if the page is published we set the publish date if not set yet. if self.publication_date is None and self.published: - self.publication_date = timezone.now() + self.publication_date = timezone.now() - timedelta(seconds=5) if self.reverse_id == "": self.reverse_id = None @@ -428,7 +429,8 @@ def publish(self): else: # Nothing left to do pass - + if not self.parent_id: + self.clear_home_pk_cache() if self.publisher_public and self.publisher_public.published: self.publisher_state = Page.PUBLISHER_STATE_DEFAULT else: @@ -891,7 +893,7 @@ def is_home(self): def get_home_pk_cache(self): attr = "%s_home_pk_cache_%s" % (self.publisher_is_draft and "draft" or "public", self.site_id) - if not hasattr(self, attr): + if not hasattr(self, attr) or getattr(self, attr) is None: setattr(self, attr, self.get_object_queryset().get_home(self.site).pk) return getattr(self, attr) @@ -900,6 +902,9 @@ def set_home_pk_cache(self, value): setattr(self, attr, value) home_pk_cache = property(get_home_pk_cache, set_home_pk_cache) + def clear_home_pk_cache(self): + self.home_pk_cache = None + def get_media_path(self, filename): """ Returns path (relative to MEDIA_ROOT/MEDIA_URL) to directory for storing page-scope files. @@ -956,7 +961,7 @@ def get_object_queryset(self): """Returns smart queryset depending on object type - draft / public """ qs = self.__class__.objects - return self.publisher_is_draft and qs.drafts() or qs.public().published() + return self.publisher_is_draft and qs.drafts() or qs.public() def _publisher_can_publish(self): """Is parent of this object already published? diff --git a/cms/models/query.py b/cms/models/query.py index 3d2774d1de6..2a6ace44692 100644 --- a/cms/models/query.py +++ b/cms/models/query.py @@ -68,21 +68,6 @@ def expired(self): return self.on_site().filter( publication_end_date__lte=timezone.now()) -# - seems this is not used anymore... -# def get_pages_with_application(self, path, language): -# """Returns all pages containing application for current path, or -# any parrent. Returned list is sorted by path length, longer path first. -# """ -# paths = levelize_path(path) -# q = Q() -# for path in paths: -# # build q for all the paths -# q |= Q(title_set__path=path, title_set__language=language) -# app_pages = self.published().filter(q & Q(title_set__application_urls__gt='')).distinct() -# # add proper ordering -# app_pages.query.order_by.extend(('LENGTH(`cms_title`.`path`) DESC',)) -# return app_pages - def get_all_pages_with_application(self): """Returns all pages containing applications for all sites. @@ -92,7 +77,7 @@ def get_all_pages_with_application(self): def get_home(self, site=None): try: - home = self.published(site).all_root().order_by("tree_id")[0] + home = self.published().all_root().order_by("tree_id")[0] except IndexError: raise NoHomeFound('No Root page found. Publish at least one page!') return home diff --git a/cms/models/titlemodels.py b/cms/models/titlemodels.py index 01aba1f5fab..81de5c64750 100644 --- a/cms/models/titlemodels.py +++ b/cms/models/titlemodels.py @@ -40,7 +40,6 @@ def update_path(self): # Build path from parent page's path and slug current_path = self.path parent_page = self.page.parent - slug = u'%s' % self.slug if not self.has_url_overwrite: self.path = u'%s' % slug @@ -48,6 +47,7 @@ def update_path(self): parent_title = Title.objects.get_title(parent_page, language=self.language, language_fallback=True) if parent_title: self.path = u'%s/%s' % (parent_title.path, slug) + @property def overwrite_url(self): diff --git a/cms/signals.py b/cms/signals.py index d3c209c41fc..ba209926f56 100644 --- a/cms/signals.py +++ b/cms/signals.py @@ -6,7 +6,7 @@ from cms.cache.permissions import ( clear_user_permission_cache, clear_permission_cache) -from cms.models import (Page, Title, CMSPlugin, PagePermission, +from cms.models import (Page, Title, CMSPlugin, PagePermission, GlobalPagePermission, PageUser, PageUserGroup) from menus.menu_pool import menu_pool @@ -20,7 +20,7 @@ # fired after page gets published - copied to public model - there may be more # than one instances published before this signal gets called post_publish = Signal(providing_args=["instance"]) - + def update_plugin_positions(**kwargs): plugin = kwargs['instance'] plugins = CMSPlugin.objects.filter(language=plugin.language, placeholder=plugin.placeholder).order_by("position") @@ -39,14 +39,14 @@ def update_title_paths(instance, **kwargs): """ for title in instance.title_set.all(): title.save() - + page_moved.connect(update_title_paths, sender=Page, dispatch_uid="cms.title.update_path") def update_title(title): parent_page_id = title.page.parent_id slug = u'%s' % title.slug - + if title.page.is_home(): title.path = '' elif not title.has_url_overwrite: @@ -61,12 +61,12 @@ def update_title(title): def pre_save_title(instance, raw, **kwargs): """Save old state to instance and setup path """ - + menu_pool.clear(instance.page.site_id) - + instance.tmp_path = None instance.tmp_application_urls = None - + if instance.id: try: tmp_title = Title.objects.get(pk=instance.id) @@ -74,53 +74,53 @@ def pre_save_title(instance, raw, **kwargs): instance.tmp_application_urls = tmp_title.application_urls except: pass # no Titles exist for this page yet - + # Build path from parent page's path and slug if instance.has_url_overwrite and instance.path: instance.path = instance.path.strip(" /") else: update_title(instance) - + signals.pre_save.connect(pre_save_title, sender=Title, dispatch_uid="cms.title.presave") def post_save_title(instance, raw, created, **kwargs): # Update descendants only if path changed application_changed = False - - if instance.path != getattr(instance,'tmp_path',None) and not hasattr(instance, 'tmp_prevent_descendant_update'): + + if instance.path != getattr(instance, 'tmp_path', None) and not hasattr(instance, 'tmp_prevent_descendant_update'): descendant_titles = Title.objects.filter( - page__lft__gt=instance.page.lft, - page__rght__lt=instance.page.rght, + page__lft__gt=instance.page.lft, + page__rght__lt=instance.page.rght, page__tree_id__exact=instance.page.tree_id, language=instance.language, has_url_overwrite=False, ).order_by('page__tree_id', 'page__parent', 'page__lft') - + for descendant_title in descendant_titles: descendant_title.path = '' # just reset path descendant_title.tmp_prevent_descendant_update = True if descendant_title.application_urls: application_changed = True descendant_title.save() - + if not hasattr(instance, 'tmp_prevent_descendant_update') and \ (instance.application_urls != getattr(instance, 'tmp_application_urls', None) or application_changed): # fire it if we have some application linked to this page or some descendant application_post_changed.send(sender=Title, instance=instance) - + # remove temporary attributes - if getattr( instance, 'tmp_path', None): + if getattr(instance, 'tmp_path', None): del(instance.tmp_path) - if getattr( instance, 'tmp_application_urls' , None): + if getattr(instance, 'tmp_application_urls' , None): del(instance.tmp_application_urls) - + try: del(instance.tmp_prevent_descendant_update) except AttributeError: pass -signals.post_save.connect(post_save_title, sender=Title, dispatch_uid="cms.title.postsave") +signals.post_save.connect(post_save_title, sender=Title, dispatch_uid="cms.title.postsave") def post_save_user(instance, raw, created, **kwargs): @@ -135,23 +135,11 @@ def post_save_user(instance, raw, created, **kwargs): creator = get_current_user() if not creator or not created or not hasattr(creator, 'pk'): return - from django.db import connection - - # i'm not sure if there is a workaround for this, somebody any ideas? What - # we are doing here is creating PageUser on Top of existing user, i'll do it - # through plain SQL, its not nice, but... - - # TODO: find a better way than an raw sql !! - - cursor = connection.cursor() - query = "INSERT INTO %s (user_ptr_id, created_by_id) VALUES (%d, %d)" % ( - PageUser._meta.db_table, - instance.pk, - creator.pk - ) - cursor.execute(query) - cursor.close() - + page_user = PageUser(user_ptr_id=instance.pk, created_by=creator) + page_user.__dict__.update(instance.__dict__) + page_user.save() + + def post_save_user_group(instance, raw, created, **kwargs): """The same like post_save_user, but for Group, required only when CMS_PERMISSION. @@ -166,18 +154,18 @@ def post_save_user_group(instance, raw, created, **kwargs): if not creator or not created or creator.is_anonymous(): return from django.db import connection - + # TODO: same as in post_save_user - raw sql is just not nice - workaround...? - + cursor = connection.cursor() query = "INSERT INTO %s (group_ptr_id, created_by_id) VALUES (%d, %d)" % ( PageUserGroup._meta.db_table, - instance.pk, + instance.pk, creator.pk ) - cursor.execute(query) + cursor.execute(query) cursor.close() - + if settings.CMS_PERMISSION: # only if permissions are in use from django.contrib.auth.models import User, Group @@ -196,7 +184,7 @@ def pre_save_page(instance, raw, **kwargs): pass -def post_save_page_moderator(instance, raw, created, **kwargs): +def post_save_page_moderator(instance, raw, created, **kwargs): """Helper post save signal. """ old_page = instance.old_page @@ -205,7 +193,7 @@ def post_save_page_moderator(instance, raw, created, **kwargs): from cms.utils.moderator import page_changed if not old_page: page_changed(instance, old_page) - + def post_save_page(instance, **kwargs): if instance.old_page is None or instance.old_page.parent_id != instance.parent_id: for page in instance.get_descendants(): @@ -268,18 +256,18 @@ def pre_save_delete_page(instance, **kwargs): signals.pre_save.connect(pre_save_user, sender=PageUser) signals.pre_delete.connect(pre_delete_user, sender=PageUser) - + signals.pre_save.connect(pre_save_group, sender=Group) signals.pre_delete.connect(pre_delete_group, sender=Group) signals.pre_save.connect(pre_save_group, sender=PageUserGroup) signals.pre_delete.connect(pre_delete_group, sender=PageUserGroup) - + signals.pre_save.connect(pre_save_pagepermission, sender=PagePermission) signals.pre_delete.connect(pre_delete_pagepermission, sender=PagePermission) - + signals.pre_save.connect(pre_save_globalpagepermission, sender=GlobalPagePermission) signals.pre_delete.connect(pre_delete_globalpagepermission, sender=GlobalPagePermission) - + signals.pre_save.connect(pre_save_delete_page, sender=Page) signals.pre_delete.connect(pre_save_delete_page, sender=Page) diff --git a/cms/test_utils/cli.py b/cms/test_utils/cli.py index 6cbbf2ef64a..5240714cadb 100644 --- a/cms/test_utils/cli.py +++ b/cms/test_utils/cli.py @@ -11,29 +11,36 @@ def configure(db_data, **extra): from django.conf import settings os.environ['DJANGO_SETTINGS_MODULE'] = 'cms.test_utils.cli' - db_type = db_data.get('DB', 'sqlite') - if db_type == 'sqlite': - DB = { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': ':memory:', - } - elif db_type == 'postgres': - DB = { - 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'NAME': db_data.get('NAME', 'djangocms_test'), - 'USER': db_data.get('USER', 'postgres'), - } - if db_data.get('PASSWORD', None): - DB['PASSWORD'] = db_data['PASSWORD'] - elif db_type == 'mysql': - DB = { - 'ENGINE': 'django.db.backends.mysql', - 'NAME': db_data.get('NAME', 'djangocms_test'), - 'USER': db_data.get('USER', 'root'), + if not 'DATABASES' in extra: + db_type = db_data.get('DB', 'sqlite') + if db_type == 'sqlite': + DB = { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': ':memory:', } - if db_data.get('PASSWORD', None): - DB['PASSWORD'] = db_data['PASSWORD'] - + elif db_type == 'postgres': + DB = { + 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'NAME': db_data.get('NAME', 'djangocms_test'), + 'USER': db_data.get('USER', 'postgres'), + } + if db_data.get('PASSWORD', None): + DB['PASSWORD'] = db_data['PASSWORD'] + elif db_type == 'mysql': + DB = { + 'ENGINE': 'django.db.backends.mysql', + 'NAME': db_data.get('NAME', 'djangocms_test'), + 'USER': db_data.get('USER', 'root'), + 'TEST_CHARSET':'utf8', + 'TEST_COLLATION':'utf8_general_ci', + 'OPTIONS': { + "init_command": "SET storage_engine=INNODB", + }, + } + if db_data.get('PASSWORD', None): + DB['PASSWORD'] = db_data['PASSWORD'] + else: + DB = {} defaults = dict( CACHE_BACKEND='locmem:///', DEBUG=True, @@ -42,6 +49,7 @@ def configure(db_data, **extra): DATABASES={ 'default': DB }, + SITE_ID=1, USE_I18N=True, MEDIA_ROOT='/media/', @@ -75,12 +83,14 @@ def configure(db_data, **extra): ], MIDDLEWARE_CLASSES=[ 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.middleware.doc.XViewMiddleware', 'django.middleware.common.CommonMiddleware', + 'django.middleware.transaction.TransactionMiddleware', + 'django.middleware.cache.FetchFromCacheMiddleware', 'cms.middleware.user.CurrentUserMiddleware', 'cms.middleware.page.CurrentPageMiddleware', 'cms.middleware.toolbar.ToolbarMiddleware', diff --git a/cms/test_utils/testcases.py b/cms/test_utils/testcases.py index 56600d79c8a..2f2838df6ff 100644 --- a/cms/test_utils/testcases.py +++ b/cms/test_utils/testcases.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- from cms.models import Page -from cms.test_utils.util.context_managers import (UserLoginContext, +from cms.test_utils.util.context_managers import (UserLoginContext, SettingsOverride) from django.conf import settings from django.contrib.auth.models import User, AnonymousUser @@ -15,6 +15,8 @@ import sys import urllib import warnings +from cms.utils.permissions import set_current_user +from cms.models.pluginmodel import CMSPlugin URL_CMS_PAGE = "/en/admin/cms/page/" @@ -84,6 +86,10 @@ def _post_teardown(self): # Needed to clean the menu keys cache, see menu.menu_pool.clear() menu_pool.clear() super(CMSTestCase, self)._post_teardown() + #Page.objects.all().delete() + #User.objects.all().delete() + #CMSPlugin.objects.all().delete() + set_current_user(None) def login_user_context(self, user): return UserLoginContext(self, user) @@ -172,7 +178,7 @@ def copy_page(self, page, target_page): self.assertEquals(response.status_code, 200) # Altered to reflect the new django-js jsonified response messages self.assertEquals(response.content, '{"status": 200, "content": "ok"}') - + title = page.title_set.all()[0] copied_slug = get_available_slug(title) diff --git a/cms/tests/admin.py b/cms/tests/admin.py index 9849dfd6dd8..fa04fc5f488 100644 --- a/cms/tests/admin.py +++ b/cms/tests/admin.py @@ -12,7 +12,7 @@ from cms.models.titlemodels import Title from cms.plugins.text.models import Text from cms.test_utils import testcases as base -from cms.test_utils.testcases import (CMSTestCase, URL_CMS_PAGE_DELETE, +from cms.test_utils.testcases import (CMSTestCase, URL_CMS_PAGE_DELETE, URL_CMS_PAGE, URL_CMS_TRANSLATION_DELETE) from cms.test_utils.util.context_managers import SettingsOverride from cms.test_utils.util.mock import AttributeObject @@ -22,7 +22,7 @@ from django.contrib.auth.models import User, Permission, AnonymousUser from django.contrib.sites.models import Site from django.core.urlresolvers import reverse -from django.http import (Http404, HttpResponseBadRequest, HttpResponseForbidden, +from django.http import (Http404, HttpResponseBadRequest, HttpResponseForbidden, HttpResponse) from django.utils.encoding import smart_str from menus.menu_pool import menu_pool @@ -34,7 +34,7 @@ class AdminTestsBase(CMSTestCase): @property def admin_class(self): return site._registry[Page] - + def _get_guys(self, admin_only=False): admin = self.get_superuser() if admin_only: @@ -59,9 +59,9 @@ def _get_guys(self, admin_only=False): ) gpp.sites = Site.objects.all() return admin, normal_guy - + class AdminTestCase(AdminTestsBase): - + def test_edit_does_not_reset_page_adv_fields(self): """ Makes sure that if a non-superuser with no rights to edit advanced page @@ -71,11 +71,11 @@ def test_edit_does_not_reset_page_adv_fields(self): NEW_PAGE_NAME = 'Test page 2' REVERSE_ID = 'Test' OVERRIDE_URL = 'my/override/url' - + admin, normal_guy = self._get_guys() - + site = Site.objects.get(pk=1) - + # The admin creates the page page = create_page(OLD_PAGE_NAME, "nav_playground.html", "en", site=site, created_by=admin) @@ -85,17 +85,17 @@ def test_edit_does_not_reset_page_adv_fields(self): title.has_url_overwrite = True title.path = OVERRIDE_URL title.save() - + self.assertEqual(page.get_title(), OLD_PAGE_NAME) self.assertEqual(page.reverse_id, REVERSE_ID) self.assertEqual(title.overwrite_url, OVERRIDE_URL) - + # The user edits the page (change the page name for ex.) page_data = { - 'title': NEW_PAGE_NAME, - 'slug': page.get_slug(), + 'title': NEW_PAGE_NAME, + 'slug': page.get_slug(), 'language': title.language, - 'site': page.site.pk, + 'site': page.site.pk, 'template': page.template, } # required only if user haves can_change_permission @@ -105,25 +105,25 @@ def test_edit_does_not_reset_page_adv_fields(self): page_data['pagepermission_set-2-TOTAL_FORMS'] = 0 page_data['pagepermission_set-2-INITIAL_FORMS'] = 0 page_data['pagepermission_set-2-MAX_NUM_FORMS'] = 0 - + with self.login_user_context(normal_guy): - resp = self.client.post(base.URL_CMS_PAGE_CHANGE % page.pk, page_data, + resp = self.client.post(base.URL_CMS_PAGE_CHANGE % page.pk, page_data, follow=True) self.assertEqual(resp.status_code, 200) self.assertTemplateNotUsed(resp, 'admin/login.html') page = Page.objects.get(pk=page.pk) - + self.assertEqual(page.get_title(), NEW_PAGE_NAME) self.assertEqual(page.reverse_id, REVERSE_ID) title = page.get_title_obj() self.assertEqual(title.overwrite_url, OVERRIDE_URL) - + # The admin edits the page (change the page name for ex.) page_data = { - 'title': OLD_PAGE_NAME, - 'slug': page.get_slug(), + 'title': OLD_PAGE_NAME, + 'slug': page.get_slug(), 'language': title.language, - 'site': page.site.pk, + 'site': page.site.pk, 'template': page.template, 'reverse_id': page.reverse_id, } @@ -134,19 +134,19 @@ def test_edit_does_not_reset_page_adv_fields(self): page_data['pagepermission_set-2-TOTAL_FORMS'] = 0 page_data['pagepermission_set-2-INITIAL_FORMS'] = 0 page_data['pagepermission_set-2-MAX_NUM_FORMS'] = 0 - + with self.login_user_context(admin): - resp = self.client.post(base.URL_CMS_PAGE_CHANGE % page.pk, page_data, + resp = self.client.post(base.URL_CMS_PAGE_CHANGE % page.pk, page_data, follow=True) self.assertEqual(resp.status_code, 200) self.assertTemplateNotUsed(resp, 'admin/login.html') page = Page.objects.get(pk=page.pk) - + self.assertEqual(page.get_title(), OLD_PAGE_NAME) self.assertEqual(page.reverse_id, REVERSE_ID) title = page.get_title_obj() self.assertEqual(title.overwrite_url, None) - + def test_edit_does_not_reset_apphook(self): """ Makes sure that if a non-superuser with no rights to edit advanced page @@ -156,11 +156,11 @@ def test_edit_does_not_reset_apphook(self): NEW_PAGE_NAME = 'Test page 2' REVERSE_ID = 'Test' APPLICATION_URLS = 'project.sampleapp.urls' - + admin, normal_guy = self._get_guys() - + site = Site.objects.get(pk=1) - + # The admin creates the page page = create_page(OLD_PAGE_NAME, "nav_playground.html", "en", site=site, created_by=admin) @@ -170,17 +170,17 @@ def test_edit_does_not_reset_apphook(self): title.has_url_overwrite = True title.application_urls = APPLICATION_URLS title.save() - + self.assertEqual(page.get_title(), OLD_PAGE_NAME) self.assertEqual(page.reverse_id, REVERSE_ID) self.assertEqual(title.application_urls, APPLICATION_URLS) - + # The user edits the page (change the page name for ex.) page_data = { - 'title': NEW_PAGE_NAME, - 'slug': page.get_slug(), + 'title': NEW_PAGE_NAME, + 'slug': page.get_slug(), 'language': title.language, - 'site': page.site.pk, + 'site': page.site.pk, 'template': page.template, } # required only if user haves can_change_permission @@ -190,25 +190,25 @@ def test_edit_does_not_reset_apphook(self): page_data['pagepermission_set-2-TOTAL_FORMS'] = 0 page_data['pagepermission_set-2-INITIAL_FORMS'] = 0 page_data['pagepermission_set-2-MAX_NUM_FORMS'] = 0 - + with self.login_user_context(normal_guy): - resp = self.client.post(base.URL_CMS_PAGE_CHANGE % page.pk, page_data, + resp = self.client.post(base.URL_CMS_PAGE_CHANGE % page.pk, page_data, follow=True) self.assertEqual(resp.status_code, 200) self.assertTemplateNotUsed(resp, 'admin/login.html') page = Page.objects.get(pk=page.pk) - + self.assertEqual(page.get_title(), NEW_PAGE_NAME) self.assertEqual(page.reverse_id, REVERSE_ID) title = page.get_title_obj() self.assertEqual(title.application_urls, APPLICATION_URLS) - + # The admin edits the page (change the page name for ex.) page_data = { - 'title': OLD_PAGE_NAME, - 'slug': page.get_slug(), + 'title': OLD_PAGE_NAME, + 'slug': page.get_slug(), 'language': title.language, - 'site': page.site.pk, + 'site': page.site.pk, 'template': page.template, 'reverse_id': page.reverse_id, } @@ -219,14 +219,14 @@ def test_edit_does_not_reset_apphook(self): page_data['pagepermission_set-2-TOTAL_FORMS'] = 0 page_data['pagepermission_set-2-INITIAL_FORMS'] = 0 page_data['pagepermission_set-2-MAX_NUM_FORMS'] = 0 - + with self.login_user_context(admin): - resp = self.client.post(base.URL_CMS_PAGE_CHANGE % page.pk, page_data, + resp = self.client.post(base.URL_CMS_PAGE_CHANGE % page.pk, page_data, follow=True) self.assertEqual(resp.status_code, 200) self.assertTemplateNotUsed(resp, 'admin/login.html') page = Page.objects.get(pk=page.pk) - + self.assertEqual(page.get_title(), OLD_PAGE_NAME) self.assertEqual(page.reverse_id, REVERSE_ID) title = page.get_title_obj() @@ -271,7 +271,7 @@ def test_delete_translation(self): self.assertEqual(response.status_code, 200) response = self.client.post(URL_CMS_TRANSLATION_DELETE % page.pk, {'language': 'de'}) self.assertRedirects(response, URL_CMS_PAGE) - + def test_change_template(self): admin, staff = self._get_guys() request = self.get_request('/admin/cms/page/1/', 'en') @@ -300,38 +300,38 @@ def test_get_permissions(self): response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertTemplateNotUsed(response, 'admin/login.html') - + def test_changelist_items(self): admin = self.get_superuser() - first_level_page = create_page('level1', 'nav_playground.html', 'en') + first_level_page = create_page('level1', 'nav_playground.html', 'en') second_level_page_top = create_page('level21', "nav_playground.html", "en", - created_by=admin, published=True, parent= first_level_page) + created_by=admin, published=True, parent=first_level_page) second_level_page_bottom = create_page('level22', "nav_playground.html", "en", - created_by=admin, published=True, parent= self.reload(first_level_page)) + created_by=admin, published=True, parent=self.reload(first_level_page)) third_level_page = create_page('level3', "nav_playground.html", "en", - created_by=admin, published=True, parent= second_level_page_top) + created_by=admin, published=True, parent=second_level_page_top) self.assertEquals(Page.objects.all().count(), 4) - + url = reverse('admin:cms_%s_changelist' % Page._meta.module_name) request = self.get_request(url) request.session = {} request.user = admin - + page_admin = site._registry[Page] cl_params = [request, page_admin.model, page_admin.list_display, page_admin.list_display_links, page_admin.list_filter, - page_admin.date_hierarchy, page_admin.search_fields, + page_admin.date_hierarchy, page_admin.search_fields, page_admin.list_select_related, page_admin.list_per_page] if hasattr(page_admin, 'list_max_show_all'): # django 1.4 cl_params.append(page_admin.list_max_show_all) cl_params.extend([page_admin.list_editable, page_admin]) cl = CMSChangeList(*tuple(cl_params)) - + cl.set_items(request) - - + + root_page = cl.get_items()[0] self.assertEqual(root_page, first_level_page) @@ -346,29 +346,29 @@ def test_changelist_tree(self): Cookie set below is just a forged example (from live session) """ admin = self.get_superuser() - first_level_page = create_page('level1', 'nav_playground.html', 'en') + first_level_page = create_page('level1', 'nav_playground.html', 'en') second_level_page_top = create_page('level21', "nav_playground.html", "en", - created_by=admin, published=True, parent= first_level_page) + created_by=admin, published=True, parent=first_level_page) second_level_page_bottom = create_page('level22', "nav_playground.html", "en", - created_by=admin, published=True, parent= self.reload(first_level_page)) + created_by=admin, published=True, parent=self.reload(first_level_page)) third_level_page = create_page('level3', "nav_playground.html", "en", - created_by=admin, published=True, parent= second_level_page_top) + created_by=admin, published=True, parent=second_level_page_top) url = reverse('admin:cms_%s_changelist' % Page._meta.module_name) self.client.login(username='admin', password='admin') self.client.cookies['djangocms_nodes_open'] = 'page_1%2Cpage_2' response = self.client.get(url) self.assertEquals(response.status_code, 200) - self.assertEquals(response.context["open_menu_trees"], [1,2]) + self.assertEquals(response.context["open_menu_trees"], [1, 2]) # tests descendants method for the lazy load ajax call url = "%s%d/descendants/" % (url, first_level_page.pk) response = self.client.get(url) self.assertEquals(response.status_code, 200) # should include both direct descendant pages - self.assertTrue('id="page_2"' in response.content) - self.assertTrue('id="page_3"' in response.content) + self.assertTrue('id="page_%s"' % second_level_page_top.pk in response.content) + self.assertTrue('id="page_%s"' % second_level_page_bottom.pk in response.content) # but not any further down the tree - self.assertFalse('id="page_4"' in response.content) + self.assertFalse('id="page_%s"' % third_level_page.pk in response.content) class AdminFieldsetTests(CMSTestCase): @@ -383,7 +383,7 @@ def validate_attributes(self, a, b, ignore=None): a_attr = getattr(a, attr) b_attr = getattr(b, attr) self.assertEqual(a_attr, b_attr) - + def test_no_moderator(self): control = AttributeObject() contribute_fieldsets(control) @@ -399,7 +399,7 @@ def test_no_menu_title_overwrite(self): self.validate_attributes(control, experiment, ['fieldsets', 'general_fields']) self.assertEqual(control.general_fields[0], ('title', 'menu_title')) self.assertEqual(experiment.general_fields[0], 'title') - + def test_no_softroot(self): with SettingsOverride(CMS_SOFTROOT=True): control = AttributeObject() @@ -410,7 +410,7 @@ def test_no_softroot(self): self.validate_attributes(control, experiment, ['fieldsets', 'advanced_fields']) self.assertTrue('soft_root' in control.advanced_fields) self.assertFalse('soft_root' in experiment.advanced_fields) - + def test_dates(self): with SettingsOverride(CMS_SHOW_START_DATE=False, CMS_SHOW_END_DATE=False): control = AttributeObject() @@ -437,7 +437,7 @@ def test_dates(self): self.assertFalse('publication_date' in experiment1.general_fields, experiment1.general_fields) self.assertTrue('publication_date' in experiment2.general_fields, experiment2.general_fields) self.assertFalse('publication_date' in experiment3.general_fields, experiment3.general_fields) - + def test_no_seo(self): with SettingsOverride(CMS_SEO_FIELDS=True): control = AttributeObject() @@ -448,7 +448,7 @@ def test_no_seo(self): self.validate_attributes(control, experiment, ['fieldsets', 'seo_fields']) self.assertEqual(control.seo_fields, ['page_title', 'meta_description', 'meta_keywords']) self.assertFalse(experiment.seo_fields, []) - + def test_url_overwrite(self): with SettingsOverride(CMS_URL_OVERWRITE=False): control = AttributeObject() @@ -459,7 +459,7 @@ def test_url_overwrite(self): self.validate_attributes(control, experiment, ['fieldsets', 'advanced_fields']) self.assertFalse('overwrite_url' in control.advanced_fields, control.advanced_fields) self.assertTrue('overwrite_url' in experiment.advanced_fields, experiment.advanced_fields) - + def test_no_cms_enabled_menus(self): control = AttributeObject() contribute_fieldsets(control) @@ -471,7 +471,7 @@ def test_no_cms_enabled_menus(self): self.validate_attributes(control, experiment, ['fieldsets', 'advanced_fields']) self.assertTrue('navigation_extenders' in control.advanced_fields, control.advanced_fields) self.assertFalse('navigation_extenders' in experiment.advanced_fields, experiment.advanced_fields) - + def test_redirects(self): with SettingsOverride(CMS_REDIRECTS=False): control = AttributeObject() @@ -482,8 +482,8 @@ def test_redirects(self): self.validate_attributes(control, experiment, ['fieldsets', 'advanced_fields']) self.assertFalse('redirect' in control.advanced_fields, control.advanced_fields) self.assertTrue('redirect' in experiment.advanced_fields, experiment.advanced_fields) - - + + def test_no_apphooks(self): def func_true(self): return True @@ -500,7 +500,7 @@ def func_false(self): self.assertTrue('application_urls' in control.advanced_fields, control.advanced_fields) self.assertFalse('application_urls' in experiment.advanced_fields, control.advanced_fields) apphook_pool.get_apphooks = old_get_apphooks - + class AdminListFilterTests(CMSTestCase): def test_no_moderator(self): @@ -520,25 +520,25 @@ def test_no_softroot(self): class AdminTests(AdminTestsBase): # TODO: needs tests for actual permissions, not only superuser/normaluser - + def setUp(self): self.page = create_page("testpage", "nav_playground.html", "en") - + def get_admin(self): usr = User(username="admin", email="admin@django-cms.org", is_staff=True, is_superuser=True) usr.set_password("admin") usr.save() return usr - + def get_permless(self): usr = User(username="permless", email="permless@django-cms.org", is_staff=True) usr.set_password("permless") usr.save() return usr - + def get_page(self): return self.page - + def test_get_moderation_state(self): page = self.get_page() permless = self.get_permless() @@ -551,7 +551,7 @@ def test_get_moderation_state(self): request = self.get_request() response = self.admin_class.get_moderation_states(request, page.pk) self.assertEqual(response.status_code, 200) - + def test_remove_delete(self): page = self.get_page() permless = self.get_permless() @@ -569,7 +569,7 @@ def test_remove_delete(self): self.assertEqual(response.status_code, 302) page = self.reload(page) self.assertEqual(page.pagemoderatorstate_set.get_delete_actions().count(), 0) - + def test_change_status(self): page = self.get_page() permless = self.get_permless() @@ -630,7 +630,7 @@ def test_publish_page_requires_perms(self): with self.login_user_context(permless): request = self.get_request() request.method = "POST" - response = self.admin_class.publish_page(request, 1) + response = self.admin_class.publish_page(request, Page.objects.all()[0].pk) self.assertEqual(response.status_code, 403) def test_revert_page_requires_perms(self): @@ -638,7 +638,7 @@ def test_revert_page_requires_perms(self): with self.login_user_context(permless): request = self.get_request() request.method = "POST" - response = self.admin_class.revert_page(request, 1) + response = self.admin_class.revert_page(request, Page.objects.all()[0].pk) self.assertEqual(response.status_code, 403) def test_revert_page_redirects(self): @@ -705,7 +705,7 @@ def test_move_plugin(self): response = self.admin_class.move_plugin(request) self.assertEqual(response.status_code, 200) self.assertEqual(response.content, "ok") - + def test_preview_page(self): permless = self.get_permless() with self.login_user_context(permless): @@ -736,7 +736,7 @@ def test_preview_page(self): self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], 'http://django-cms.org%s?preview=1&draft=1' % base_url) - + def test_too_many_plugins_global(self): conf = { 'body': { @@ -760,7 +760,7 @@ def test_too_many_plugins_global(self): } response = self.client.post(url, data) self.assertEqual(response.status_code, HttpResponseBadRequest.status_code) - + def test_too_many_plugins_type(self): conf = { 'body': { @@ -787,24 +787,24 @@ def test_too_many_plugins_type(self): class NoDBAdminTests(CMSTestCase): - + @property def admin_class(self): return site._registry[Page] - + def test_lookup_allowed_site__exact(self): self.assertTrue(self.admin_class.lookup_allowed('site__exact', '1')) - + def test_lookup_allowed_published(self): self.assertTrue(self.admin_class.lookup_allowed('published', value='1')) class PluginPermissionTests(AdminTestsBase): - + def setUp(self): self._page = create_page('test page', 'nav_playground.html', 'en') self._placeholder = self._page.placeholders.all()[0] - + def _get_admin(self): admin = User( username='admin', @@ -815,14 +815,14 @@ def _get_admin(self): admin.set_password('admin') admin.save() return admin - + def _get_page_admin(self): return admin.site._registry[Page] - + def _give_permission(self, user, model, permission_type, save=True): codename = '%s_%s' % (permission_type, model._meta.object_name.lower()) user.user_permissions.add(Permission.objects.get(codename=codename)) - + def _give_cms_permissions(self, user, save=True): for perm_type in ['add', 'change', 'delete']: for model in [Page, Title]: @@ -843,7 +843,7 @@ def _give_cms_permissions(self, user, save=True): def _create_plugin(self): plugin = add_plugin(self._placeholder, 'TextPlugin', 'en') return plugin - + def test_plugin_add_requires_permissions(self): """User tries to add a plugin but has no permissions. He can add the plugin after he got the permissions""" admin = self._get_admin() @@ -933,11 +933,11 @@ def test_clean_overwrite_url(self): 'slug': 'test-page', 'language': 'en', 'overwrite_url': '/overwrite/url/', - 'site': Site.objects.get_current().pk, + 'site': Site.objects.get_current().pk, 'template': settings.CMS_TEMPLATES[0][0], 'published': True } - + form = PageForm(data) self.assertTrue(form.is_valid(), form.errors.as_text()) # WTF? WHY DOES form.save() not handle this stuff??? @@ -1008,7 +1008,7 @@ class AdminPageEditContentSizeTests(AdminTestsBase): The test relates to extra=0 at PagePermissionInlineAdminForm and ViewRestrictionInlineAdmin """ - + def test_editpage_contentsize(self): """ Expected a username only 2 times in the content, but a relationship @@ -1018,7 +1018,7 @@ def test_editpage_contentsize(self): admin = self.get_superuser() PAGE_NAME = 'TestPage' USER_NAME = 'test_size_user_0' - site = Site.objects.get(pk = 1) + site = Site.objects.get(pk=1) page = create_page(PAGE_NAME, "nav_playground.html", "en", site=site, created_by=admin) page.save() self._page = page @@ -1031,17 +1031,18 @@ def test_editpage_contentsize(self): # create additionals user and reload the page User.objects.create(username=USER_NAME, is_active=True) user_count = User.objects.count() - more_users_in_db = old_user_count < user_count + more_users_in_db = old_user_count < user_count # we have more users - self.assertTrue(more_users_in_db,"New users got NOT created") + self.assertTrue(more_users_in_db, "New users got NOT created") response = self.client.get(url) new_response_size = len(response.content) page_size_grown = old_response_size < new_response_size # expect that the pagesize gets influenced by the useramount of the system - self.assertTrue(page_size_grown,"Page size has not grown after user creation") + self.assertTrue(page_size_grown, "Page size has not grown after user creation") # usernames are only 2 times in content text = smart_str(response.content, response._charset) + foundcount = text.count(USER_NAME) # 2 forms contain usernames as options self.assertEqual(foundcount, 2, "Username %s appeared %s times in response.content, expected 2 times" % (USER_NAME, foundcount)) - + diff --git a/cms/tests/apphooks.py b/cms/tests/apphooks.py index 4dd62ac27bd..419d3b7d2f0 100644 --- a/cms/tests/apphooks.py +++ b/cms/tests/apphooks.py @@ -11,6 +11,7 @@ from django.contrib.auth.models import User from django.core.urlresolvers import clear_url_caches, reverse import sys +from cms.models.pagemodel import Page @@ -356,6 +357,7 @@ def test_page_language_url_for_apphook(self): output = tag.get_context(fake_context, 'en') url = output['content'] + self.assertEqual(url, '/en/child_page/child_child_page/extra_1/') output = tag.get_context(fake_context, 'de') diff --git a/cms/tests/page.py b/cms/tests/page.py index 9668ff25046..6e795e7fdd9 100644 --- a/cms/tests/page.py +++ b/cms/tests/page.py @@ -26,9 +26,10 @@ from cms.utils.page_resolver import get_page_from_request, is_valid_url from cms.utils import timezone from cms.utils.page import is_valid_page_slug +import time class PagesTestCase(CMSTestCase): - + def test_add_page(self): """ Test that the add admin page could be displayed via the admin @@ -65,24 +66,26 @@ def test_create_page_admin(self): self.assertEqual(page.get_title(), page_data['title']) self.assertEqual(page.get_slug(), page_data['slug']) self.assertEqual(page.placeholders.all().count(), 2) - + # were public instances created? self.assertEqual(Title.objects.all().count(), 2) title = Title.objects.drafts().get(slug=page_data['slug']) title = Title.objects.public().get(slug=page_data['slug']) def test_create_page_api(self): - page_data = { + page_data = { 'title': 'root', 'slug': 'root', 'language': settings.LANGUAGES[0][0], 'template': 'nav_playground.html', + } page = create_page(**page_data) self.assertFalse(page.is_home(), "The page should not be marked as " "home before being published") page.publish() + assert page.is_home() assert page.publisher_public.is_home() @@ -99,12 +102,12 @@ def test_slug_collision(self): with self.login_user_context(superuser): response = self.client.post(URL_CMS_PAGE_ADD, page_data) self.assertRedirects(response, URL_CMS_PAGE) - + #page1 = Title.objects.get(slug=page_data['slug']).page # create page with the same page_data - + response = self.client.post(URL_CMS_PAGE_ADD, page_data) - + if settings.USE_I18N: self.assertEqual(response.status_code, 302) # did we got right redirect? @@ -125,8 +128,8 @@ def test_slug_collisions_api_1(self): page1_2 = create_page('test page 1_2', 'nav_playground.html', 'en', published=True, parent=page1, slug="foo") # both sibling pages has same slug, so both pages has an invalid slug - self.assertFalse(is_valid_page_slug(page1_1,page1_1.parent,"en",page1_1.get_slug("en"),page1_1.site)) - self.assertFalse(is_valid_page_slug(page1_2,page1_2.parent,"en",page1_2.get_slug("en"),page1_2.site)) + self.assertFalse(is_valid_page_slug(page1_1, page1_1.parent, "en", page1_1.get_slug("en"), page1_1.site)) + self.assertFalse(is_valid_page_slug(page1_2, page1_2.parent, "en", page1_2.get_slug("en"), page1_2.site)) def test_slug_collisions_api_2(self): """ Checks for slug collisions on root (not home) page and a home page child - uses API to create pages @@ -138,8 +141,8 @@ def test_slug_collisions_api_2(self): page2 = create_page('test page 1_1', 'nav_playground.html', 'en', published=True, slug="foo") # Home page child has an invalid slug, while root page is ok. Root wins! - self.assertFalse(is_valid_page_slug(page1_1,page1_1.parent,"en",page1_1.get_slug("en"),page1_1.site)) - self.assertTrue(is_valid_page_slug(page2,page2.parent,"en",page2.get_slug("en"),page2.site)) + self.assertFalse(is_valid_page_slug(page1_1, page1_1.parent, "en", page1_1.get_slug("en"), page1_1.site)) + self.assertTrue(is_valid_page_slug(page2, page2.parent, "en", page2.get_slug("en"), page2.site)) def test_slug_collisions_api_3(self): """ Checks for slug collisions on children of a non root page - uses API to create pages @@ -155,11 +158,11 @@ def test_slug_collisions_api_3(self): page1_2 = create_page('test page 1_2', 'nav_playground.html', 'en', published=True, parent=page1, slug="bar") # Direct children of home has different slug so it's ok. - self.assertTrue(is_valid_page_slug(page1_1,page1_1.parent,"en",page1_1.get_slug("en"),page1_1.site)) - self.assertTrue(is_valid_page_slug(page1_2,page1_2.parent,"en",page1_2.get_slug("en"),page1_2.site)) + self.assertTrue(is_valid_page_slug(page1_1, page1_1.parent, "en", page1_1.get_slug("en"), page1_1.site)) + self.assertTrue(is_valid_page_slug(page1_2, page1_2.parent, "en", page1_2.get_slug("en"), page1_2.site)) # children of page1_1 has the same slug -> you lose! - self.assertFalse(is_valid_page_slug(page1_1_1,page1_1_1.parent,"en",page1_1_1.get_slug("en"),page1_1_1.site)) - self.assertFalse(is_valid_page_slug(page1_1_2,page1_1_2.parent,"en",page1_1_2.get_slug("en"),page1_1_2.site)) + self.assertFalse(is_valid_page_slug(page1_1_1, page1_1_1.parent, "en", page1_1_1.get_slug("en"), page1_1_1.site)) + self.assertFalse(is_valid_page_slug(page1_1_2, page1_1_2.parent, "en", page1_1_2.get_slug("en"), page1_1_2.site)) def test_details_view(self): """ @@ -170,10 +173,11 @@ def test_details_view(self): response = self.client.get(self.get_pages_root()) self.assertEqual(response.status_code, 404) page = create_page('test page 1', "nav_playground.html", "en") + page.publish() response = self.client.get(self.get_pages_root()) self.assertEqual(response.status_code, 404) self.assertTrue(page.publish()) - create_page("test page 2", "nav_playground.html", "en", + create_page("test page 2", "nav_playground.html", "en", parent=page, published=True) homepage = Page.objects.get_home() self.assertTrue(homepage.get_slug(), 'test-page-1') @@ -188,11 +192,11 @@ def test_edit_page(self): with self.login_user_context(superuser): page_data = self.get_new_page_data() response = self.client.post(URL_CMS_PAGE_ADD, page_data) - page = Page.objects.get(title_set__slug=page_data['slug']) - response = self.client.get('/en/admin/cms/page/%s/' %page.id) + page = Page.objects.get(title_set__slug=page_data['slug']) + response = self.client.get('/en/admin/cms/page/%s/' % page.id) self.assertEqual(response.status_code, 200) page_data['title'] = 'changed title' - response = self.client.post('/en/admin/cms/page/%s/' %page.id, page_data) + response = self.client.post('/en/admin/cms/page/%s/' % page.id, page_data) self.assertRedirects(response, URL_CMS_PAGE) self.assertEqual(page.get_title(), 'changed title') @@ -205,19 +209,19 @@ def test_moderator_edit_page_redirect(self): page_data = self.get_new_page_data() response = self.client.post(URL_CMS_PAGE_ADD, page_data) self.assertEquals(response.status_code, 302) - page = Page.objects.get(title_set__slug=page_data['slug']) - response = self.client.get('/en/admin/cms/page/%s/' %page.id) + page = Page.objects.get(title_set__slug=page_data['slug']) + response = self.client.get('/en/admin/cms/page/%s/' % page.id) self.assertEqual(response.status_code, 200) page_data['overwrite_url'] = '/hello/' page_data['has_url_overwrite'] = True - response = self.client.post('/en/admin/cms/page/%s/' %page.id, page_data) + response = self.client.post('/en/admin/cms/page/%s/' % page.id, page_data) self.assertRedirects(response, URL_CMS_PAGE) self.assertEqual(page.get_absolute_url(), '/en/hello/') title = Title.objects.all()[0] page.publish() page_data['title'] = 'new title' - response = self.client.post('/en/admin/cms/page/%s/' %page.id, page_data) - page = Page.objects.get(title_set__slug=page_data['slug'], publisher_is_draft=True) + response = self.client.post('/en/admin/cms/page/%s/' % page.id, page_data) + page = Page.objects.get(title_set__slug=page_data['slug'], publisher_is_draft=True) self.assertRedirects(response, URL_CMS_PAGE) self.assertEqual(page.get_title(), 'new title') @@ -232,11 +236,11 @@ def test_meta_description_and_keywords_fields_from_admin(self): page_data["meta_description"] = "I am a page" page_data["meta_keywords"] = "page,cms,stuff" response = self.client.post(URL_CMS_PAGE_ADD, page_data) - page = Page.objects.get(title_set__slug=page_data['slug']) - response = self.client.get('/en/admin/cms/page/%s/' %page.id) + page = Page.objects.get(title_set__slug=page_data['slug']) + response = self.client.get('/en/admin/cms/page/%s/' % page.id) self.assertEqual(response.status_code, 200) page_data['meta_description'] = 'I am a duck' - response = self.client.post('/en/admin/cms/page/%s/' %page.id, page_data) + response = self.client.post('/en/admin/cms/page/%s/' % page.id, page_data) self.assertRedirects(response, URL_CMS_PAGE) page = Page.objects.get(title_set__slug=page_data["slug"]) self.assertEqual(page.get_meta_description(), 'I am a duck') @@ -251,17 +255,17 @@ def test_meta_description_and_keywords_from_template_tags(self): page_data["meta_description"] = "I am a page" page_data["meta_keywords"] = "page,cms,stuff" self.client.post(URL_CMS_PAGE_ADD, page_data) - page = Page.objects.get(title_set__slug=page_data['slug']) - self.client.post('/en/admin/cms/page/%s/' %page.id, page_data) + page = Page.objects.get(title_set__slug=page_data['slug']) + self.client.post('/en/admin/cms/page/%s/' % page.id, page_data) t = template.Template("{% load cms_tags %}{% page_attribute title %} {% page_attribute meta_description %} {% page_attribute meta_keywords %}") req = HttpRequest() page.published = True page.save() - req.current_page = page + req.current_page = page req.REQUEST = {} self.assertEqual(t.render(template.Context({"request": req})), "Hello I am a page page,cms,stuff") - - + + def test_copy_page(self): """ Test that a page can be copied via the admin @@ -270,20 +274,20 @@ def test_copy_page(self): page_a_a = create_page("page_a_a", "nav_playground.html", "en", parent=page_a) create_page("page_a_a_a", "nav_playground.html", "en", parent=page_a_a) - + page_b = create_page("page_b", "nav_playground.html", "en") - page_b_a = create_page("page_b", "nav_playground.html", "en", + page_b_a = create_page("page_b", "nav_playground.html", "en", parent=page_b) - + count = Page.objects.drafts().count() - + superuser = self.get_superuser() with self.login_user_context(superuser): self.copy_page(page_a, page_b_a) - + self.assertEqual(Page.objects.drafts().count() - count, 3) - - + + def test_language_change(self): superuser = self.get_superuser() with self.login_user_context(superuser): @@ -294,7 +298,7 @@ def test_language_change(self): self.assertEqual(response.status_code, 200) response = self.client.get("/en/admin/cms/page/%s/" % pk, {"language":"de" }) self.assertEqual(response.status_code, 200) - + def test_move_page(self): superuser = self.get_superuser() with self.login_user_context(superuser): @@ -315,12 +319,12 @@ def test_move_page(self): self.assertEqual(response.status_code, 200) # check page2 path and url page2 = Page.objects.get(pk=page2.pk) - self.assertEqual(page2.get_path(), page_data1['slug']+"/"+page_data2['slug']) - self.assertEqual(page2.get_absolute_url(), self.get_pages_root()+page_data1['slug']+"/"+page_data2['slug']+"/") + self.assertEqual(page2.get_path(), page_data1['slug'] + "/" + page_data2['slug']) + self.assertEqual(page2.get_absolute_url(), self.get_pages_root() + page_data1['slug'] + "/" + page_data2['slug'] + "/") # check page3 path and url page3 = Page.objects.get(pk=page3.pk) - self.assertEqual(page3.get_path(), page_data1['slug']+"/"+page_data2['slug']+"/"+page_data3['slug']) - self.assertEqual(page3.get_absolute_url(), self.get_pages_root()+page_data1['slug']+"/"+page_data2['slug']+"/"+page_data3['slug']+"/") + self.assertEqual(page3.get_path(), page_data1['slug'] + "/" + page_data2['slug'] + "/" + page_data3['slug']) + self.assertEqual(page3.get_absolute_url(), self.get_pages_root() + page_data1['slug'] + "/" + page_data2['slug'] + "/" + page_data3['slug'] + "/") # publish page 1 (becomes home) page1.publish() @@ -331,11 +335,11 @@ def test_move_page(self): page2 = Page.objects.get(pk=page2.pk) page2.publish() public_page2 = page2.publisher_public - self.assertEqual(public_page2.get_absolute_url(), self.get_pages_root()+page_data2['slug']+"/") + self.assertEqual(public_page2.get_absolute_url(), self.get_pages_root() + page_data2['slug'] + "/") page3 = Page.objects.get(pk=page3.pk) page3.publish() public_page3 = page3.publisher_public - self.assertEqual(public_page3.get_absolute_url(), self.get_pages_root()+page_data2['slug']+"/"+page_data3['slug']+"/") + self.assertEqual(public_page3.get_absolute_url(), self.get_pages_root() + page_data2['slug'] + "/" + page_data3['slug'] + "/") # move page2 back to root and check path of 2 and 3 response = self.client.post("/en/admin/cms/page/%s/move-page/" % page2.pk, {"target": page1.pk, "position": "right"}) self.assertEqual(response.status_code, 200) @@ -344,8 +348,8 @@ def test_move_page(self): page2 = Page.objects.get(pk=page2.pk) self.assertEqual(page2.get_path(), page_data2['slug']) page3 = Page.objects.get(pk=page3.pk) - self.assertEqual(page3.get_path(), page_data2['slug']+"/"+page_data3['slug']) - + self.assertEqual(page3.get_path(), page_data2['slug'] + "/" + page_data3['slug']) + def test_move_page_inherit(self): parent = create_page("Parent", 'col_three.html', "en") child = create_page("Child", settings.CMS_TEMPLATE_INHERITANCE_MAGIC, @@ -353,14 +357,15 @@ def test_move_page_inherit(self): self.assertEqual(child.get_template(), parent.get_template()) child.move_page(parent, 'left') self.assertEqual(child.get_template(), parent.get_template()) - - + + def test_add_placeholder(self): # create page page = create_page("Add Placeholder", "nav_playground.html", "en", position="last-child", published=True, in_navigation=True) page.template = 'add_placeholder.html' page.save() + page.publish() url = page.get_absolute_url() response = self.client.get(url) self.assertEqual(200, response.status_code) @@ -387,7 +392,7 @@ def test_sitemap_login_required_pages(self): """ create_page("page", "nav_playground.html", "en", login_required=True, published=True, in_navigation=True) - self.assertEqual(CMSSitemap().items().count(),0) + self.assertEqual(CMSSitemap().items().count(), 0) def test_sitemap_includes_last_modification_date(self): one_day_ago = timezone.now() - datetime.timedelta(days=1) @@ -426,7 +431,7 @@ def test_edit_page_other_site_and_language(self): with self.login_user_context(superuser): response = self.client.post(URL_CMS_PAGE_ADD, page_data) self.assertRedirects(response, URL_CMS_PAGE) - page = Page.objects.get(title_set__slug=page_data['slug']) + page = Page.objects.get(title_set__slug=page_data['slug']) with LanguageOverride(TESTLANG): self.assertEqual(page.get_title(), 'changed title') @@ -458,7 +463,7 @@ def test_templates(self): self.assertEqual(parent.template, settings.CMS_TEMPLATE_INHERITANCE_MAGIC) self.assertEqual(parent.get_template(), settings.CMS_TEMPLATES[0][0]) self.assertEqual(parent.get_template_name(), settings.CMS_TEMPLATES[0][1]) - + def test_delete_with_plugins(self): """ Check that plugins and placeholders get correctly deleted when we delete @@ -469,30 +474,30 @@ def test_delete_with_plugins(self): placeholder = page.placeholders.all()[0] plugin_base = CMSPlugin( plugin_type='TextPlugin', - placeholder=placeholder, - position=1, + placeholder=placeholder, + position=1, language=settings.LANGUAGES[0][0] ) plugin_base.insert_at(None, position='last-child', save=False) - + plugin = Text(body='') plugin_base.set_base_attr(plugin) plugin.save() self.assertEqual(CMSPlugin.objects.count(), 1) self.assertEqual(Text.objects.count(), 1) - self.assertTrue(Placeholder.objects.count() > 0) + self.assertTrue(Placeholder.objects.count() > 0) page.delete() self.assertEqual(CMSPlugin.objects.count(), 0) self.assertEqual(Text.objects.count(), 0) self.assertEqual(Placeholder.objects.count(), 0) - + def test_get_page_from_request_on_non_cms_admin(self): request = self.get_request( reverse('admin:sampleapp_category_change', args=(1,)) ) page = get_page_from_request(request) self.assertEqual(page, None) - + def test_get_page_from_request_on_cms_admin(self): page = create_page("page", "nav_playground.html", "en") request = self.get_request( @@ -501,14 +506,14 @@ def test_get_page_from_request_on_cms_admin(self): found_page = get_page_from_request(request) self.assertTrue(found_page) self.assertEqual(found_page.pk, page.pk) - + def test_get_page_from_request_on_cms_admin_nopage(self): request = self.get_request( reverse('admin:cms_page_change', args=(1,)) ) page = get_page_from_request(request) self.assertEqual(page, None) - + def test_get_page_from_request_cached(self): mock_page = 'hello world' request = self.get_request( @@ -517,12 +522,12 @@ def test_get_page_from_request_cached(self): request._current_page_cache = mock_page page = get_page_from_request(request) self.assertEqual(page, mock_page) - + def test_get_page_from_request_nopage(self): request = self.get_request('/') page = get_page_from_request(request) self.assertEqual(page, None) - + def test_get_page_from_request_with_page_404(self): page = create_page("page", "nav_playground.html", "en", published=True) page.publish() @@ -531,7 +536,7 @@ def test_get_page_from_request_with_page_404(self): self.assertEqual(found_page, None) def test_get_page_without_final_slash(self): - root = create_page("root", "nav_playground.html", "en", slug="root", + root = create_page("root", "nav_playground.html", "en", slug="root", published=True) page = create_page("page", "nav_playground.html", "en", slug="page", published=True, parent=root) @@ -541,7 +546,7 @@ def test_get_page_without_final_slash(self): found_page = get_page_from_request(request) self.assertIsNotNone(found_page) self.assertFalse(found_page.publisher_is_draft) - + def test_get_page_from_request_with_page_preview(self): page = create_page("page", "nav_playground.html", "en", published=True) request = self.get_request('%s?preview' % page.get_absolute_url()) @@ -556,7 +561,7 @@ def test_get_page_from_request_with_page_preview(self): self.assertTrue(found_page) self.assertTrue(found_page.publisher_is_draft) self.assertEqual(found_page.pk, page.pk) - + def test_get_page_from_request_on_cms_admin_with_editplugin(self): page = create_page("page", "nav_playground.html", "en") request = self.get_request( @@ -565,14 +570,14 @@ def test_get_page_from_request_on_cms_admin_with_editplugin(self): found_page = get_page_from_request(request) self.assertTrue(found_page) self.assertEqual(found_page.pk, page.pk) - + def test_get_page_from_request_on_cms_admin_with_editplugin_nopage(self): request = self.get_request( reverse('admin:cms_page_change', args=(1,)) + 'edit-plugin/42/' ) page = get_page_from_request(request) self.assertEqual(page, None) - + def test_page_already_expired(self): """ Test that a page which has a end date in the past gives a 404, not a @@ -600,7 +605,7 @@ def test_existing_overwrite_url(self): form = PageForm(data) self.assertFalse(form.is_valid()) self.assertTrue('overwrite_url' in form.errors) - + def test_page_urls(self): page1 = create_page('test page 1', 'nav_playground.html', 'en', published=True) @@ -618,27 +623,27 @@ def test_page_urls(self): published=True, parent=page4) self.assertEqual(page1.get_absolute_url(), - self.get_pages_root()+'') + self.get_pages_root() + '') self.assertEqual(page2.get_absolute_url(), - self.get_pages_root()+'test-page-2/') + self.get_pages_root() + 'test-page-2/') self.assertEqual(page3.get_absolute_url(), - self.get_pages_root()+'test-page-2/test-page-3/') + self.get_pages_root() + 'test-page-2/test-page-3/') self.assertEqual(page4.get_absolute_url(), - self.get_pages_root()+'test-page-4/') + self.get_pages_root() + 'test-page-4/') self.assertEqual(page5.get_absolute_url(), - self.get_pages_root()+'test-page-4/test-page-5/') + self.get_pages_root() + 'test-page-4/test-page-5/') page3 = self.move_page(page3, page1) self.assertEqual(page3.get_absolute_url(), - self.get_pages_root()+'test-page-3/') + self.get_pages_root() + 'test-page-3/') page5 = self.move_page(page5, page2) self.assertEqual(page5.get_absolute_url(), - self.get_pages_root()+'test-page-2/test-page-5/') + self.get_pages_root() + 'test-page-2/test-page-5/') page3 = self.move_page(page3, page4) self.assertEqual(page3.get_absolute_url(), - self.get_pages_root()+'test-page-4/test-page-3/') + self.get_pages_root() + 'test-page-4/test-page-3/') def test_page_overwrite_urls(self): page1 = create_page('test page 1', 'nav_playground.html', 'en', @@ -651,9 +656,9 @@ def test_page_overwrite_urls(self): published=True, parent=page2, overwrite_url='i-want-another-url') self.assertEqual(page2.get_absolute_url(), - self.get_pages_root()+'test-page-2/') + self.get_pages_root() + 'test-page-2/') self.assertEqual(page3.get_absolute_url(), - self.get_pages_root()+'i-want-another-url/') + self.get_pages_root() + 'i-want-another-url/') title2 = page2.title_set.get() title2.slug = 'page-test-2' @@ -663,15 +668,15 @@ def test_page_overwrite_urls(self): page3 = Page.objects.get(pk=page3.pk) self.assertEqual(page2.get_absolute_url(), - self.get_pages_root()+'page-test-2/') + self.get_pages_root() + 'page-test-2/') self.assertEqual(page3.get_absolute_url(), - self.get_pages_root()+'i-want-another-url/') + self.get_pages_root() + 'i-want-another-url/') # tests a bug found in 2.2 where saving an ancestor page # wiped out the overwrite_url for child pages page2.save() self.assertEqual(page3.get_absolute_url(), - self.get_pages_root()+'i-want-another-url/') + self.get_pages_root() + 'i-want-another-url/') def test_slug_url_overwrite_clash(self): """ Tests if a URL-Override clashes with a normal page url @@ -681,8 +686,8 @@ def test_slug_url_overwrite_clash(self): bar = create_page('bar', 'nav_playground.html', 'en', published=False) foo = create_page('foo', 'nav_playground.html', 'en', published=True) # Tests to assure is_valid_url is ok on plain pages - self.assertTrue(is_valid_url(bar.get_absolute_url('en'),bar)) - self.assertTrue(is_valid_url(foo.get_absolute_url('en'),foo)) + self.assertTrue(is_valid_url(bar.get_absolute_url('en'), bar)) + self.assertTrue(is_valid_url(foo.get_absolute_url('en'), foo)) # Set url_overwrite for page foo title = foo.get_title_obj(language='en') @@ -692,7 +697,7 @@ def test_slug_url_overwrite_clash(self): foo.publish() try: - url = is_valid_url(bar.get_absolute_url('en'),bar) + url = is_valid_url(bar.get_absolute_url('en'), bar) except ValidationError: url = False if url: @@ -706,7 +711,7 @@ def test_valid_url_multisite(self): site3 = Site.objects.create(domain="sample3.com", name="sample3.com") home = create_page('home', 'nav_playground.html', 'en', published=True, site=site1) bar = create_page('bar', 'nav_playground.html', 'en', slug="bar", published=True, parent=home, site=site1) - home_s3= create_page('home', 'nav_playground.html', 'en', published=True, site=site3) + home_s3 = create_page('home', 'nav_playground.html', 'en', published=True, site=site3) bar_s3 = create_page('bar', 'nav_playground.html', 'en', slug="bar", published=True, parent=home_s3, site=site3) self.assertTrue(is_valid_url(bar.get_absolute_url('en'), bar)) @@ -723,16 +728,16 @@ def test_home_slug_not_accessible(self): def test_public_home_page_replaced(self): """Test that publishing changes to the home page doesn't move the public version""" - home = create_page('home', 'nav_playground.html', 'en', published = True, slug = 'home') + home = create_page('home', 'nav_playground.html', 'en', published=True, slug='home') self.assertEqual(Page.objects.drafts().get_home().get_slug(), 'home') home.publish() self.assertEqual(Page.objects.public().get_home().get_slug(), 'home') - other = create_page('other', 'nav_playground.html', 'en', published = True, slug = 'other') + other = create_page('other', 'nav_playground.html', 'en', published=True, slug='other') other.publish() self.assertEqual(Page.objects.drafts().get_home(), home) self.assertEqual(Page.objects.drafts().get_home().get_slug(), 'home') self.assertEqual(Page.objects.public().get_home().get_slug(), 'home') - home = Page.objects.get(pk = home.id) + home = Page.objects.get(pk=home.id) home.in_navigation = True home.save() home.publish() @@ -740,7 +745,7 @@ def test_public_home_page_replaced(self): self.assertEqual(Page.objects.public().get_home().get_slug(), 'home') def test_plugin_loading_queries(self): - with SettingsOverride(CMS_TEMPLATES = (('placeholder_tests/base.html', 'tpl'),)): + with SettingsOverride(CMS_TEMPLATES=(('placeholder_tests/base.html', 'tpl'),)): page = create_page('home', 'placeholder_tests/base.html', 'en', published=True, slug='home') placeholders = list(page.placeholders.all()) for i, placeholder in enumerate(placeholders): @@ -765,16 +770,16 @@ def test_plugin_loading_queries(self): class NoAdminPageTests(CMSTestCase): urls = 'cms.test_utils.project.noadmin_urls' - + def setUp(self): admin = 'django.contrib.admin' noadmin_apps = [app for app in settings.INSTALLED_APPS if not app == admin] self._ctx = SettingsOverride(INSTALLED_APPS=noadmin_apps) self._ctx.__enter__() - + def tearDown(self): self._ctx.__exit__(None, None, None) - + def test_get_page_from_request_fakeadmin_nopage(self): request = self.get_request('/en/admin/') page = get_page_from_request(request) @@ -790,7 +795,7 @@ def test_with_publisher(self): home = Page.objects.get(pk=home.pk) self.assertEqual(other.get_previous_filtered_sibling(), home) self.assertEqual(home.get_previous_filtered_sibling(), None) - + def test_multisite(self): firstsite = Site.objects.create(name='first', domain='first.com') secondsite = Site.objects.create(name='second', domain='second.com') @@ -802,4 +807,4 @@ def test_multisite(self): home = Page.objects.get(pk=home.pk) self.assertEqual(other.get_previous_filtered_sibling(), None) self.assertEqual(home.get_previous_filtered_sibling(), None) - + diff --git a/cms/tests/plugins.py b/cms/tests/plugins.py index a887dd022bc..14760b658f2 100644 --- a/cms/tests/plugins.py +++ b/cms/tests/plugins.py @@ -35,6 +35,7 @@ from django.test.testcases import TestCase import os import datetime +from cms.utils.permissions import set_current_user class DumbFixturePlugin(CMSPluginBase): diff --git a/cms/utils/permissions.py b/cms/utils/permissions.py index a070a35fb11..a487c4d2897 100644 --- a/cms/utils/permissions.py +++ b/cms/utils/permissions.py @@ -23,8 +23,8 @@ def set_current_user(user): Assigns current user from request to thread_locals, used by CurrentUserMiddleware. """ - _thread_locals.user=user - + _thread_locals.user = user + def get_current_user(): """ Returns current user, or None @@ -44,11 +44,11 @@ def has_page_add_permission(request): opts = Page._meta if request.user.is_superuser: return True - + # if add under page target = request.GET.get('target', None) position = request.GET.get('position', None) - + if target is not None: try: page = Page.objects.get(pk=target) @@ -190,12 +190,12 @@ def get_subordinate_users(user): Will return [user, C, X, D, Y, Z]. W was created by user, but is also assigned to higher level. """ - + # TODO: try to merge with PagePermissionManager.subordinate_to_user() - + if user.is_superuser or \ GlobalPagePermission.objects.with_can_change_permissions(user): - return User.objects.all() + return User.objects.all() site = Site.objects.get_current() page_id_allow_list = Page.permissions.get_change_permissions_id_list(user, site) try: @@ -203,16 +203,16 @@ def get_subordinate_users(user): except NoPermissionsException: # no permission so only staff and no page permissions qs = User.objects.distinct().filter( - Q(is_staff=True) & - Q(pageuser__created_by=user) & + Q(is_staff=True) & + Q(pageuser__created_by=user) & Q(pagepermission__page=None) ) qs = qs.exclude(pk=user.id).exclude(groups__user__pk=user.id) return qs # normal query qs = User.objects.distinct().filter( - Q(is_staff=True) & - (Q(pagepermission__page__id__in=page_id_allow_list) & Q(pagepermission__page__level__gte=user_level)) + Q(is_staff=True) & + (Q(pagepermission__page__id__in=page_id_allow_list) & Q(pagepermission__page__level__gte=user_level)) | (Q(pageuser__created_by=user) & Q(pagepermission__page=None)) ) qs = qs.exclude(pk=user.id).exclude(groups__user__pk=user.id) @@ -234,13 +234,13 @@ def get_subordinate_groups(user): # no permission no records # page_id_allow_list is empty qs = Group.objects.distinct().filter( - Q(pageusergroup__created_by=user) & + Q(pageusergroup__created_by=user) & Q(pagepermission__page=None) ) return qs - + qs = Group.objects.distinct().filter( - (Q(pagepermission__page__id__in=page_id_allow_list) & Q(pagepermission__page__level__gte=user_level)) + (Q(pagepermission__page__id__in=page_id_allow_list) & Q(pagepermission__page__level__gte=user_level)) | (Q(pageusergroup__created_by=user) & Q(pagepermission__page=None)) ) return qs @@ -273,14 +273,14 @@ def get_user_sites_queryset(user): 3. For standard user returns just sites he is assigned to over pages. """ qs = Site.objects.all() - + if user.is_superuser: return qs - + global_ids = GlobalPagePermission.objects.with_user(user).filter( Q(can_add=True) | Q(can_change=True) ).values_list('id', flat=True) - + query = Q() if global_ids: query = Q(globalpagepermission__id__in=global_ids) diff --git a/menus/utils.py b/menus/utils.py index e49c93f3d2b..93f8349a017 100644 --- a/menus/utils.py +++ b/menus/utils.py @@ -34,8 +34,8 @@ def find_selected(nodes): result = find_selected(node.children) if result: return result - - + + def set_language_changer(request, func): """ @@ -74,7 +74,7 @@ class DefaultLanguageChanger(object): def __init__(self, request): self.request = request self._app_path = None - + @property def app_path(self): if self._app_path is None: @@ -84,10 +84,10 @@ def app_path(self): else: self._app_path = self.request.path return self._app_path - + def __call__(self, lang): return '%s%s' % (self.get_page_path(lang), self.app_path) - + def get_page_path(self, lang): page = getattr(self.request, 'current_page', None) if page: diff --git a/runtestserver.py b/runtestserver.py index bf3cb612086..5ad173eed78 100755 --- a/runtestserver.py +++ b/runtestserver.py @@ -15,10 +15,16 @@ def main(): new_db = not os.path.exists('cmstestdb.sqlite') with temp_dir() as STATIC_ROOT: with temp_dir() as MEDIA_ROOT: - configure({'DB':'sqlite'}, + configure({}, ROOT_URLCONF='cms.test_utils.project.urls', STATIC_ROOT=STATIC_ROOT, MEDIA_ROOT=MEDIA_ROOT, + DATABASES={ + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': 'cmstestdb.sqlite', + } + } ) if os.environ.get("RUN_MAIN") != "true": from django.core.management import call_command From 8f4d4abc692f6bd9892ddc1bbc0c73f323a84a9a Mon Sep 17 00:00:00 2001 From: Patrick Lauber Date: Fri, 16 Nov 2012 10:35:47 +0100 Subject: [PATCH 05/25] slqite fixed, mysql fixed (except too many queries) --- cms/models/pagemodel.py | 8 +- cms/models/query.py | 2 +- cms/test_utils/testcases.py | 11 +- cms/tests/admin.py | 2 + cms/tests/menu.py | 220 ++++++++++++++++++------------------ cms/tests/page.py | 14 ++- cms/tests/plugins.py | 10 +- cms/tests/site.py | 31 ++--- 8 files changed, 158 insertions(+), 140 deletions(-) diff --git a/cms/models/pagemodel.py b/cms/models/pagemodel.py index fc2842b9eb6..2c3e9f29c84 100644 --- a/cms/models/pagemodel.py +++ b/cms/models/pagemodel.py @@ -393,9 +393,10 @@ def publish(self): # publish, but only if all parents are published!! published = None - if not self.pk: self.save() + if not self.parent_id: + self.clear_home_pk_cache() if self._publisher_can_publish(): ######################################################################## # Assign the existing public page in old_public and mark it as @@ -409,6 +410,7 @@ def publish(self): self.old_public = old_public # remove the one-to-one references between public and draft old_public.publisher_public = None + old_public.parent = None #unique constraint old_public.save() # we hook into the modified copy_page routing to do the heavy lifting of copying the draft page to a new public page @@ -429,8 +431,7 @@ def publish(self): else: # Nothing left to do pass - if not self.parent_id: - self.clear_home_pk_cache() + if self.publisher_public and self.publisher_public.published: self.publisher_state = Page.PUBLISHER_STATE_DEFAULT else: @@ -898,6 +899,7 @@ def get_home_pk_cache(self): return getattr(self, attr) def set_home_pk_cache(self, value): + attr = "%s_home_pk_cache_%s" % (self.publisher_is_draft and "draft" or "public", self.site_id) setattr(self, attr, value) home_pk_cache = property(get_home_pk_cache, set_home_pk_cache) diff --git a/cms/models/query.py b/cms/models/query.py index 2a6ace44692..b38a82ab756 100644 --- a/cms/models/query.py +++ b/cms/models/query.py @@ -77,7 +77,7 @@ def get_all_pages_with_application(self): def get_home(self, site=None): try: - home = self.published().all_root().order_by("tree_id")[0] + home = self.published(site).all_root().order_by("tree_id")[0] except IndexError: raise NoHomeFound('No Root page found. Publish at least one page!') return home diff --git a/cms/test_utils/testcases.py b/cms/test_utils/testcases.py index 2f2838df6ff..5f1539a3d17 100644 --- a/cms/test_utils/testcases.py +++ b/cms/test_utils/testcases.py @@ -10,6 +10,7 @@ from django.test import testcases from django.test.client import RequestFactory from django.utils.translation import activate +from django.contrib.sites.models import Site from menus.menu_pool import menu_pool from urlparse import urljoin import sys @@ -75,9 +76,14 @@ class CMSTestCase(testcases.TestCase): counter = 1 def _fixture_setup(self): + Page.objects.all().delete() + User.objects.all().delete() + CMSPlugin.objects.all().delete() + Site.objects.exclude(pk=1).delete() super(CMSTestCase, self)._fixture_setup() self.create_fixtures() activate("en") + def create_fixtures(self): pass @@ -85,10 +91,7 @@ def create_fixtures(self): def _post_teardown(self): # Needed to clean the menu keys cache, see menu.menu_pool.clear() menu_pool.clear() - super(CMSTestCase, self)._post_teardown() - #Page.objects.all().delete() - #User.objects.all().delete() - #CMSPlugin.objects.all().delete() + super(CMSTestCase, self)._post_teardown() set_current_user(None) def login_user_context(self, user): diff --git a/cms/tests/admin.py b/cms/tests/admin.py index fa04fc5f488..4766927ee78 100644 --- a/cms/tests/admin.py +++ b/cms/tests/admin.py @@ -732,6 +732,8 @@ def test_preview_page(self): site = Site.objects.create(domain='django-cms.org', name='django-cms') page.site = site page.save() + page.publish() + self.assertTrue(page.is_home()) response = self.admin_class.preview_page(request, page.pk) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], diff --git a/cms/tests/menu.py b/cms/tests/menu.py index 506396080c6..a1437c54471 100644 --- a/cms/tests/menu.py +++ b/cms/tests/menu.py @@ -5,10 +5,10 @@ from cms.menu import CMSMenu, get_visible_pages from cms.models import Page from cms.models.permissionmodels import GlobalPagePermission, PagePermission -from cms.test_utils.fixtures.menus import (MenusFixture, SubMenusFixture, +from cms.test_utils.fixtures.menus import (MenusFixture, SubMenusFixture, SoftrootFixture) from cms.test_utils.testcases import SettingsOverrideTestCase -from cms.test_utils.util.context_managers import (SettingsOverride, +from cms.test_utils.util.context_managers import (SettingsOverride, LanguageOverride) from cms.test_utils.util.mock import AttributeObject from cms.utils.i18n import force_language @@ -46,7 +46,7 @@ def setUp(self): menu_pool.menus = {'CMSMenu': self.old_menu['CMSMenu']} menu_pool.clear(settings.SITE_ID) activate("en") - + def tearDown(self): menu_pool.menus = self.old_menu super(BaseMenuTest, self).tearDown() @@ -81,19 +81,19 @@ def test_menu_failfast_on_invalid_usage(self): with SettingsOverride(DEBUG=True, TEMPLATE_DEBUG=True): tpl = Template("{% load menu_tags %}{% show_menu 0 0 0 0 'menu/menu.html' child %}") self.assertRaises(TemplateSyntaxError, tpl.render, context) - + def test_basic_cms_menu(self): self.assertEqual(len(menu_pool.menus), 1) with force_language("en"): response = self.client.get(self.get_pages_root()) # path = '/' self.assertEquals(response.status_code, 200) request = self.get_request() - + # test the cms menu class menu = CMSMenu() nodes = menu.get_nodes(request) self.assertEqual(len(nodes), len(self.get_all_pages())) - + def test_show_menu(self): context = self.get_context() # test standard show_menu @@ -110,10 +110,14 @@ def test_show_menu(self): self.assertEqual(nodes[1].get_absolute_url(), self.get_page(4).get_absolute_url()) self.assertEqual(nodes[1].sibling, True) self.assertEqual(nodes[1].selected, False) - + def test_show_menu_num_queries(self): context = self.get_context() # test standard show_menu + import logging + l = logging.getLogger('django.db.backends') + l.setLevel(logging.DEBUG) + l.addHandler(logging.StreamHandler()) with self.assertNumQueries(5): """ The queries should be: @@ -152,118 +156,118 @@ def test_only_active_tree(self): context = self.get_context() # test standard show_menu tpl = Template("{% load menu_tags %}{% show_menu 0 100 0 100 %}") - tpl.render(context) + tpl.render(context) nodes = context['children'] self.assertEqual(len(nodes[1].children), 0) self.assertEqual(len(nodes[0].children), 1) self.assertEqual(len(nodes[0].children[0].children), 1) context = self.get_context(path=self.get_page(4).get_absolute_url()) tpl = Template("{% load menu_tags %}{% show_menu 0 100 0 100 %}") - tpl.render(context) + tpl.render(context) nodes = context['children'] self.assertEqual(len(nodes[1].children), 1) self.assertEqual(len(nodes[0].children), 0) - + def test_only_one_active_level(self): context = self.get_context() # test standard show_menu tpl = Template("{% load menu_tags %}{% show_menu 0 100 0 1 %}") - tpl.render(context) + tpl.render(context) nodes = context['children'] self.assertEqual(len(nodes[1].children), 0) self.assertEqual(len(nodes[0].children), 1) self.assertEqual(len(nodes[0].children[0].children), 0) - + def test_only_level_zero(self): context = self.get_context() # test standard show_menu tpl = Template("{% load menu_tags %}{% show_menu 0 0 0 0 %}") - tpl.render(context) + tpl.render(context) nodes = context['children'] for node in nodes: self.assertEqual(len(node.children), 0) - - + + def test_only_level_one(self): context = self.get_context() # test standard show_menu tpl = Template("{% load menu_tags %}{% show_menu 1 1 100 100 %}") - tpl.render(context) + tpl.render(context) nodes = context['children'] self.assertEqual(len(nodes), len(self.get_level(1))) for node in nodes: self.assertEqual(len(node.children), 0) - - + + def test_only_level_one_active(self): context = self.get_context() # test standard show_menu tpl = Template("{% load menu_tags %}{% show_menu 1 1 0 100 %}") - tpl.render(context) + tpl.render(context) nodes = context['children'] self.assertEqual(len(nodes), 1) self.assertEqual(nodes[0].descendant, True) self.assertEqual(len(nodes[0].children), 0) - + def test_level_zero_and_one(self): context = self.get_context() # test standard show_menu tpl = Template("{% load menu_tags %}{% show_menu 0 1 100 100 %}") - tpl.render(context) + tpl.render(context) nodes = context['children'] self.assertEqual(len(nodes), 2) for node in nodes: self.assertEqual(len(node.children), 1) - + def test_show_submenu(self): context = self.get_context() # test standard show_menu tpl = Template("{% load menu_tags %}{% show_sub_menu %}") - tpl.render(context) + tpl.render(context) nodes = context['children'] self.assertEqual(nodes[0].descendant, True) self.assertEqual(len(nodes), 1) self.assertEqual(len(nodes[0].children), 1) - + tpl = Template("{% load menu_tags %}{% show_sub_menu 1 %}") - tpl.render(context) + tpl.render(context) nodes = context['children'] self.assertEqual(len(nodes), 1) self.assertEqual(len(nodes[0].children), 0) - + def test_show_breadcrumb(self): context = self.get_context(path=self.get_page(3).get_absolute_url()) tpl = Template("{% load menu_tags %}{% show_breadcrumb %}") - tpl.render(context) + tpl.render(context) nodes = context['ancestors'] self.assertEqual(len(nodes), 3) tpl = Template("{% load menu_tags %}{% show_breadcrumb 1 %}") - tpl.render(context) + tpl.render(context) nodes = context['ancestors'] self.assertEqual(len(nodes), 2) context = self.get_context() tpl = Template("{% load menu_tags %}{% show_breadcrumb %}") - tpl.render(context) + tpl.render(context) nodes = context['ancestors'] self.assertEqual(len(nodes), 1) tpl = Template("{% load menu_tags %}{% show_breadcrumb 1 %}") - tpl.render(context) + tpl.render(context) nodes = context['ancestors'] self.assertEqual(len(nodes), 0) - + page1 = self.get_page(1) page1.in_navigation = False page1.save() page2 = self.get_page(2) context = self.get_context(path=page2.get_absolute_url()) tpl = Template("{% load menu_tags %}{% show_breadcrumb %}") - tpl.render(context) + tpl.render(context) nodes = context['ancestors'] self.assertEqual(len(nodes), 2) self.assertEqual(nodes[0].get_absolute_url(), self.get_pages_root()) self.assertEqual(isinstance(nodes[0], NavigationNode), True) self.assertEqual(nodes[1].get_absolute_url(), page2.get_absolute_url()) - + def test_language_chooser(self): # test simple language chooser with default args lang_settings = copy.deepcopy(settings.CMS_LANGUAGES) @@ -289,7 +293,7 @@ def test_page_language_url(self): tpl = Template("{%% load menu_tags %%}{%% page_language_url '%s' %%}" % settings.LANGUAGES[0][0]) url = tpl.render(context) self.assertEqual(url, "%s" % path) - + def test_show_menu_below_id(self): page2 = self.get_page(2) page2.reverse_id = "hello" @@ -299,7 +303,7 @@ def test_show_menu_below_id(self): page5 = self.get_page(5) context = self.get_context(path=page5.get_absolute_url()) tpl = Template("{% load menu_tags %}{% show_menu_below_id 'hello' %}") - tpl.render(context) + tpl.render(context) nodes = context['children'] self.assertEqual(len(nodes), 1) page3_url = self.get_page(3).get_absolute_url() @@ -308,22 +312,22 @@ def test_show_menu_below_id(self): page2.save() context = self.get_context(path=page5.get_absolute_url()) tpl = Template("{% load menu_tags %}{% show_menu_below_id 'hello' %}") - tpl.render(context) + tpl.render(context) nodes = context['children'] self.assertEqual(len(nodes), 1) self.assertEqual(nodes[0].get_absolute_url(), page3_url) - + def test_unpublished(self): page2 = self.get_page(2) page2.published = False page2.save() context = self.get_context() tpl = Template("{% load menu_tags %}{% show_menu %}") - tpl.render(context) + tpl.render(context) nodes = context['children'] self.assertEqual(len(nodes), 2) self.assertEqual(len(nodes[0].children), 0) - + def test_home_not_in_menu(self): page1 = self.get_page(1) page1.in_navigation = False @@ -333,7 +337,7 @@ def test_home_not_in_menu(self): page4.save() context = self.get_context() tpl = Template("{% load menu_tags %}{% show_menu 0 100 100 100 %}") - tpl.render(context) + tpl.render(context) nodes = context['children'] self.assertEqual(len(nodes), 1) self.assertEqual(nodes[0].get_absolute_url(), self.get_page(2).get_absolute_url()) @@ -344,10 +348,10 @@ def test_home_not_in_menu(self): menu_pool.clear(settings.SITE_ID) context = self.get_context() tpl = Template("{% load menu_tags %}{% show_menu 0 100 100 100 %}") - tpl.render(context) + tpl.render(context) nodes = context['children'] self.assertEqual(len(nodes), 2) - + def test_show_submenu_from_non_menu_page(self): """ Here's the structure bit we're interested in: @@ -362,24 +366,24 @@ def test_show_submenu_from_non_menu_page(self): page6 = self.get_page(6) context = self.get_context(page6.get_absolute_url()) tpl = Template("{% load menu_tags %}{% show_menu 1 100 0 1 %}") - tpl.render(context) + tpl.render(context) nodes = context['children'] number_of_p6_children = len(page6.children.filter(in_navigation=True)) self.assertEqual(len(nodes), number_of_p6_children) - + page7 = self.get_page(7) context = self.get_context(page7.get_absolute_url()) tpl = Template("{% load menu_tags %}{% show_menu 1 100 0 1 %}") - tpl.render(context) + tpl.render(context) nodes = context['children'] self.assertEqual(len(nodes), number_of_p6_children) - + tpl = Template("{% load menu_tags %}{% show_menu 2 100 0 1 %}") - tpl.render(context) + tpl.render(context) nodes = context['children'] number_of_p7_children = len(page7.children.filter(in_navigation=True)) self.assertEqual(len(nodes), number_of_p7_children) - + def test_show_breadcrumb_invisible(self): # Must use the drafts to find the parent when calling create_page parent = Page.objects.drafts().get(title_set__title='P3') @@ -387,15 +391,15 @@ def test_show_breadcrumb_invisible(self): parent=parent, published=True, in_navigation=False) context = self.get_context(path=invisible_page.get_absolute_url()) tpl = Template("{% load menu_tags %}{% show_breadcrumb %}") - tpl.render(context) + tpl.render(context) nodes = context['ancestors'] self.assertEqual(len(nodes), 3) tpl = Template("{% load menu_tags %}{% show_breadcrumb 0 'menu/breadcrumb.html' 1 %}") - tpl.render(context) + tpl.render(context) nodes = context['ancestors'] self.assertEqual(len(nodes), 3) tpl = Template("{% load menu_tags %}{% show_breadcrumb 0 'menu/breadcrumb.html' 0 %}") - tpl.render(context) + tpl.render(context) nodes = context['ancestors'] self.assertEqual(len(nodes), 4) @@ -416,20 +420,20 @@ def test_build_nodes_inner_for_worst_case_menu(self): node3 = NavigationNode('Test3', '/test3/', 3, 4) node4 = NavigationNode('Test4', '/test4/', 4, 5) node5 = NavigationNode('Test5', '/test5/', 5, None) - + menu_class_name = 'Test' - nodes = [node1,node2,node3,node4,node5,] + nodes = [node1, node2, node3, node4, node5, ] len_nodes = len(nodes) - + final_list = _build_nodes_inner_for_one_menu(nodes, menu_class_name) self.assertEqual(len(final_list), len_nodes) - + self.assertEqual(node1.parent, node2) self.assertEqual(node2.parent, node3) self.assertEqual(node3.parent, node4) self.assertEqual(node4.parent, node5) self.assertEqual(node5.parent, None) - + self.assertEqual(node1.children, []) self.assertEqual(node2.children, [node1]) self.assertEqual(node3.children, [node2]) @@ -444,7 +448,7 @@ def test_build_nodes_inner_for_circular_menu(self): Go nuts implementing it :) ''' pass - + def test_build_nodes_inner_for_broken_menu(self): ''' Tests a broken menu tree (non-existing parent) @@ -462,21 +466,21 @@ def test_build_nodes_inner_for_broken_menu(self): node3 = NavigationNode('Test3', '/test3/', 3, 4) node4 = NavigationNode('Test4', '/test4/', 4, 5) node5 = NavigationNode('Test5', '/test5/', 5, None) - + menu_class_name = 'Test' - nodes = [node1,node2,node3,node4,node5,] - + nodes = [node1, node2, node3, node4, node5, ] + final_list = _build_nodes_inner_for_one_menu(nodes, menu_class_name) - self.assertEqual(len(final_list), 3) + self.assertEqual(len(final_list), 3) self.assertFalse(node1 in final_list) self.assertFalse(node2 in final_list) - + self.assertEqual(node1.parent, None) self.assertEqual(node2.parent, None) self.assertEqual(node3.parent, node4) self.assertEqual(node4.parent, node5) self.assertEqual(node5.parent, None) - + self.assertEqual(node1.children, []) self.assertEqual(node2.children, []) self.assertEqual(node3.children, []) @@ -488,7 +492,7 @@ def test_utils_mark_descendants(self): mark_descendants(tree_nodes) for node in flat_nodes: self.assertTrue(node.descendant, node) - + def test_utils_find_selected(self): tree_nodes, flat_nodes = self._get_nodes() node = flat_nodes[0] @@ -496,15 +500,15 @@ def test_utils_find_selected(self): self.assertEqual(selected, node) selected = find_selected([]) self.assertEqual(selected, None) - + def test_utils_cut_levels(self): tree_nodes, flat_nodes = self._get_nodes() self.assertEqual(cut_levels(tree_nodes, 1), [flat_nodes[1]]) - + def test_empty_menu(self): context = self.get_context() tpl = Template("{% load menu_tags %}{% show_menu 0 100 100 100 %}") - tpl.render(context) + tpl.render(context) nodes = context['children'] self.assertEqual(len(nodes), 0) @@ -537,13 +541,13 @@ class AdvancedSoftrootTests(SoftrootFixture, SettingsOverrideTestCase): settings_overrides = { 'CMS_PERMISSION': False } - + def tearDown(self): Page.objects.all().delete() - + def get_page(self, name): return Page.objects.public().get(title_set__slug=name) - + def assertTreeQuality(self, a, b, *attrs): """ Checks that the node-lists a and b are the same for attrs. @@ -552,14 +556,14 @@ def assertTreeQuality(self, a, b, *attrs): """ msg = '%r != %r with %r, %r' % (len(a), len(b), a, b) self.assertEqual(len(a), len(b), msg) - for n1, n2 in zip(a,b): + for n1, n2 in zip(a, b): for attr in attrs: a1 = getattr(n1, attr) a2 = getattr(n2, attr) msg = '%r != %r with %r, %r (%s)' % (a1, a2, n1, n2, attr) self.assertEqual(a1, a2, msg) self.assertTreeQuality(n1.children, n2.children) - + def test_top_not_in_nav(self): """ top: not in navigation @@ -579,7 +583,7 @@ def test_top_not_in_nav(self): # root is NOT a soft root context = self.get_context(aaa.get_absolute_url()) tpl = Template("{% load menu_tags %}{% show_menu 0 100 0 100 %}") - tpl.render(context) + tpl.render(context) hard_root = context['children'] # root IS a soft root root = self.get_page('root') @@ -588,11 +592,11 @@ def test_top_not_in_nav(self): aaa = self.get_page('aaa') context = self.get_context(aaa.get_absolute_url()) tpl = Template("{% load menu_tags %}{% show_menu 0 100 0 100 %}") - tpl.render(context) + tpl.render(context) soft_root = context['children'] # assert the two trees are equal in terms of 'level' and 'title' self.assertTreeQuality(hard_root, soft_root, 'level', 'title') - + def test_top_in_nav(self): """ top: in navigation @@ -625,7 +629,7 @@ def test_top_in_nav(self): # root is NOT a soft root context = self.get_context(aaa.get_absolute_url()) tpl = Template("{% load menu_tags %}{% show_menu 0 100 0 100 %}") - tpl.render(context) + tpl.render(context) hard_root = context['children'] mock_tree = [ AttributeObject(title='top', level=0, children=[ @@ -650,7 +654,7 @@ def test_top_in_nav(self): aaa = self.get_page('aaa') context = self.get_context(aaa.get_absolute_url()) tpl = Template("{% load menu_tags %}{% show_menu 0 100 0 100 %}") - tpl.render(context) + tpl.render(context) soft_root = context['children'] mock_tree = [ AttributeObject(title='root', level=0, children=[ @@ -691,7 +695,7 @@ def test_show_submenu(self): nodes = context['children'] self.assertEqual(len(nodes), 1) self.assertEqual(nodes[0].id, subpage.pk) - + def test_show_submenu_num_queries(self): page = self.get_page(6) context = self.get_context(page.get_absolute_url()) @@ -739,7 +743,7 @@ def test_not_in_navigation(self): self.assertEqual(len(children), 1, repr(children)) child = children[0] self.assertEqual(child.id, c.publisher_public.id) - + def test_not_in_navigation_num_queries(self): """ Test for issue 521 @@ -753,7 +757,7 @@ def test_not_in_navigation_num_queries(self): """ a = create_page('A', 'nav_playground.html', 'en', published=True, in_navigation=True, reverse_id='a') - b =create_page('B', 'nav_playground.html', 'en', parent=a, + b = create_page('B', 'nav_playground.html', 'en', parent=a, published=True, in_navigation=True) create_page('C', 'nav_playground.html', 'en', parent=b, published=True, in_navigation=True) @@ -780,7 +784,7 @@ class ViewPermissionMenuTests(SettingsOverrideTestCase): 'CMS_PERMISSION': True, 'CMS_PUBLIC_FOR': 'all', } - + def get_request(self, user=None): attrs = { 'user': user or AnonymousUser(), @@ -788,7 +792,7 @@ def get_request(self, user=None): 'session': {}, } return type('Request', (object,), attrs) - + def test_public_for_all_staff(self): request = self.get_request() request.user.is_staff = True @@ -799,7 +803,7 @@ def test_public_for_all_staff(self): pages = [page] result = get_visible_pages(request, pages) self.assertEqual(result, [1]) - + def test_public_for_all_staff_assert_num_queries(self): request = self.get_request() request.user.is_staff = True @@ -812,9 +816,9 @@ def test_public_for_all_staff_assert_num_queries(self): """ The queries are: PagePermission count query - """ + """ get_visible_pages(request, pages) - + def test_public_for_all(self): user = User.objects.create_user('user', 'user@domain.com', 'user') request = self.get_request(user) @@ -825,7 +829,7 @@ def test_public_for_all(self): pages = [page] result = get_visible_pages(request, pages) self.assertEqual(result, [1]) - + def test_public_for_all_num_queries(self): user = User.objects.create_user('user', 'user@domain.com', 'user') request = self.get_request(user) @@ -843,7 +847,7 @@ def test_public_for_all_num_queries(self): GlobalpagePermission query for user """ get_visible_pages(request, pages, site) - + def test_unauthed(self): request = self.get_request() page = Page() @@ -853,7 +857,7 @@ def test_unauthed(self): pages = [page] result = get_visible_pages(request, pages) self.assertEqual(result, [1]) - + def test_unauthed_num_queries(self): request = self.get_request() site = Site() @@ -871,11 +875,11 @@ def test_unauthed_num_queries(self): global is not executed because it's lazy """ get_visible_pages(request, pages, site) - + def test_authed_basic_perm(self): with SettingsOverride(CMS_PUBLIC_FOR='staff'): user = User() - user.username="test" + user.username = "test" user.is_staff = True user.save() user.user_permissions.add(Permission.objects.get(codename='view_page')) @@ -887,13 +891,13 @@ def test_authed_basic_perm(self): pages = [page] result = get_visible_pages(request, pages) self.assertEqual(result, [1]) - + def test_authed_basic_perm_num_queries(self): site = Site() site.pk = 1 with SettingsOverride(CMS_PUBLIC_FOR='staff'): user = User() - user.username="test" + user.username = "test" user.is_staff = True user.save() user.user_permissions.add(Permission.objects.get(codename='view_page')) @@ -910,7 +914,7 @@ def test_authed_basic_perm_num_queries(self): GlobalpagePermission count query """ get_visible_pages(request, pages, site) - + def test_authed_no_access(self): with SettingsOverride(CMS_PUBLIC_FOR='staff'): user = User.objects.create_user('user', 'user@domain.com', 'user') @@ -922,7 +926,7 @@ def test_authed_no_access(self): pages = [page] result = get_visible_pages(request, pages) self.assertEqual(result, []) - + def test_authed_no_access_num_queries(self): site = Site() site.pk = 1 @@ -941,7 +945,7 @@ def test_authed_no_access_num_queries(self): globalpagepermissino calculation """ get_visible_pages(request, pages, site) - + def test_unauthed_no_access(self): with SettingsOverride(CMS_PUBLIC_FOR='staff'): request = self.get_request() @@ -952,7 +956,7 @@ def test_unauthed_no_access(self): pages = [page] result = get_visible_pages(request, pages) self.assertEqual(result, []) - + def test_unauthed_no_access_num_queries(self): site = Site() site.pk = 1 @@ -964,7 +968,7 @@ def test_unauthed_no_access_num_queries(self): pages = [page] with self.assertNumQueries(1): get_visible_pages(request, pages, site) - + def test_page_permissions(self): with SettingsOverride(CMS_PUBLIC_FOR='staff'): user = User.objects.create_user('user', 'user@domain.com', 'user') @@ -973,8 +977,8 @@ def test_page_permissions(self): PagePermission.objects.create(can_view=True, user=user, page=page) pages = [page] result = get_visible_pages(request, pages) - self.assertEqual(result, [1]) - + self.assertEqual(result, [page.pk]) + def test_page_permissions_num_queries(self): with SettingsOverride(CMS_PUBLIC_FOR='staff'): user = User.objects.create_user('user', 'user@domain.com', 'user') @@ -989,7 +993,7 @@ def test_page_permissions_num_queries(self): GlobalpagePermission query for user """ get_visible_pages(request, pages) - + def test_page_permissions_view_groups(self): with SettingsOverride(CMS_PUBLIC_FOR='staff'): user = User.objects.create_user('user', 'user@domain.com', 'user') @@ -1000,8 +1004,8 @@ def test_page_permissions_view_groups(self): PagePermission.objects.create(can_view=True, group=group, page=page) pages = [page] result = get_visible_pages(request, pages) - self.assertEqual(result, [1]) - + self.assertEqual(result, [page.pk]) + def test_page_permissions_view_groups_num_queries(self): with SettingsOverride(CMS_PUBLIC_FOR='staff'): user = User.objects.create_user('user', 'user@domain.com', 'user') @@ -1019,7 +1023,7 @@ def test_page_permissions_view_groups_num_queries(self): Group query via PagePermission """ get_visible_pages(request, pages) - + def test_global_permission(self): with SettingsOverride(CMS_PUBLIC_FOR='staff'): user = User.objects.create_user('user', 'user@domain.com', 'user') @@ -1032,7 +1036,7 @@ def test_global_permission(self): pages = [page] result = get_visible_pages(request, pages) self.assertEqual(result, [1]) - + def test_global_permission_num_queries(self): site = Site() site.pk = 1 @@ -1125,7 +1129,7 @@ class SoftrootTests(SettingsOverrideTestCase): 'CMS_SOFTROOT': True, 'CMS_PERMISSION': False } - + def test_basic_home(self): """ Given the tree: @@ -1175,7 +1179,7 @@ def test_basic_home(self): self.assertEqual(len(cmsnode.children), 0) self.assertEqual(len(shopnode.children), 0) self.assertEqual(len(peoplenode.children), 0) - + def test_basic_projects(self): """ Given the tree: @@ -1218,7 +1222,7 @@ def test_basic_projects(self): self.assertEqual(shopnode.id, djangoshop.publisher_public.pk) self.assertEqual(len(cmsnode.children), 0) self.assertEqual(len(shopnode.children), 0) - + def test_basic_djangocms(self): """ Given the tree: @@ -1261,7 +1265,7 @@ def test_basic_djangocms(self): self.assertEqual(shopnode.id, djangoshop.publisher_public.pk) self.assertEqual(len(cmsnode.children), 0) self.assertEqual(len(shopnode.children), 0) - + def test_basic_people(self): """ Given the tree: diff --git a/cms/tests/page.py b/cms/tests/page.py index 6e795e7fdd9..6bc4d3eacc9 100644 --- a/cms/tests/page.py +++ b/cms/tests/page.py @@ -169,19 +169,22 @@ def test_details_view(self): Test the details view """ superuser = self.get_superuser() + self.assertEqual(Page.objects.all().count(), 0) with self.login_user_context(superuser): response = self.client.get(self.get_pages_root()) self.assertEqual(response.status_code, 404) page = create_page('test page 1', "nav_playground.html", "en") page.publish() response = self.client.get(self.get_pages_root()) - self.assertEqual(response.status_code, 404) + self.assertEqual(response.status_code, 200) self.assertTrue(page.publish()) - create_page("test page 2", "nav_playground.html", "en", + page2 = create_page("test page 2", "nav_playground.html", "en", parent=page, published=True) homepage = Page.objects.get_home() self.assertTrue(homepage.get_slug(), 'test-page-1') - response = self.client.get(self.get_pages_root()) + + self.assertEqual(page2.get_absolute_url(), '/en/test-page-2/') + response = self.client.get(page2.get_absolute_url()) self.assertEqual(response.status_code, 200) def test_edit_page(self): @@ -420,11 +423,13 @@ def test_edit_page_other_site_and_language(self): different from the site you are editing and the language isn't available for the current site. """ - site = Site.objects.create(domain='otherlang', name='otherlang') + self.assertEqual(Site.objects.all().count(), 1) + site = Site.objects.create(domain='otherlang', name='otherlang', pk=2) # Change site for this session page_data = self.get_new_page_data() page_data['site'] = site.pk page_data['title'] = 'changed title' + self.assertEqual(site.pk, 2) TESTLANG = settings.CMS_LANGUAGES[site.pk][0]['code'] page_data['language'] = TESTLANG superuser = self.get_superuser() @@ -541,6 +546,7 @@ def test_get_page_without_final_slash(self): page = create_page("page", "nav_playground.html", "en", slug="page", published=True, parent=root) root.publish() + time.sleep(1) page.publish() request = self.get_request('/en/page') found_page = get_page_from_request(request) diff --git a/cms/tests/plugins.py b/cms/tests/plugins.py index 14760b658f2..36f7a84ffe7 100644 --- a/cms/tests/plugins.py +++ b/cms/tests/plugins.py @@ -607,7 +607,7 @@ def test_copy_textplugin(self): plugin.body = plugin_tags_to_admin_html(' {{ plugin_object %s }} {{ plugin_object %s }} ' % (str(plugin_ref_1.pk), str(plugin_ref_2.pk))) plugin.save() - self.assertEquals(plugin.pk, 1) + page_data = self.get_new_page_data() #create 2nd language page @@ -635,10 +635,10 @@ def test_copy_textplugin(self): self.assertEquals(CMSPlugin.objects.filter(language=self.FIRST_LANG).count(), 3) self.assertEquals(CMSPlugin.objects.filter(language=self.SECOND_LANG).count(), 3) self.assertEquals(CMSPlugin.objects.count(), 6) - - new_plugin = Text.objects.get(pk=6) + plugins = list(Text.objects.all()) + new_plugin = plugins[-1] idlist = sorted(plugin_tags_to_id_list(new_plugin.body)) - expected = sorted([4, 5]) + expected = sorted([plugins[3].pk, plugins[4].pk]) self.assertEquals(idlist, expected) def test_empty_plugin_is_ignored(self): @@ -669,7 +669,7 @@ def test_editing_plugin_changes_page_modification_time_in_sitemap(self): plugin = self._edit_text_plugin(plugin_id, "fnord") actual_last_modification_time = CMSSitemap().lastmod(page) - self.assertEqual(plugin.changed_date, actual_last_modification_time) + self.assertEqual(plugin.changed_date - datetime.timedelta(microseconds=plugin.changed_date.microsecond), actual_last_modification_time - datetime.timedelta(microseconds=actual_last_modification_time.microsecond)) class FileSystemPluginTests(PluginsTestBaseCase): diff --git a/cms/tests/site.py b/cms/tests/site.py index 0789384cd5e..c82c54ca260 100644 --- a/cms/tests/site.py +++ b/cms/tests/site.py @@ -13,43 +13,44 @@ class SiteTestCase(CMSTestCase): All stuff which is changing settings.SITE_ID for tests should come here. """ def setUp(self): + self.assertEqual(Site.objects.all().count(), 1) with SettingsOverride(SITE_ID=1): - - u = User(username="test", is_staff = True, is_active = True, is_superuser = True) + + u = User(username="test", is_staff=True, is_active=True, is_superuser=True) u.set_password("test") u.save() - + # setup sites - self.site2 = Site.objects.create(domain="sample2.com", name="sample2.com") - self.site3 = Site.objects.create(domain="sample3.com", name="sample3.com") - + self.site2 = Site.objects.create(domain="sample2.com", name="sample2.com", pk=2) + self.site3 = Site.objects.create(domain="sample3.com", name="sample3.com", pk=3) + self._login_context = self.login_user_context(u) self._login_context.__enter__() - + def tearDown(self): self._login_context.__exit__(None, None, None) - - + + def test_site_framework(self): #Test the site framework, and test if it's possible to disable it with SettingsOverride(SITE_ID=self.site2.pk): create_page("page_2a", "nav_playground.html", "de", site=self.site2) - + response = self.client.get("/en/admin/cms/page/?site__exact=%s" % self.site3.pk) self.assertEqual(response.status_code, 200) create_page("page_3b", "nav_playground.html", "de", site=self.site3) - + with SettingsOverride(SITE_ID=self.site3.pk): create_page("page_3a", "nav_playground.html", "nl", site=self.site3) - + # with param self.assertEqual(Page.objects.on_site(self.site2.pk).count(), 1) self.assertEqual(Page.objects.on_site(self.site3.pk).count(), 2) - + self.assertEqual(Page.objects.drafts().on_site().count(), 2) - + with SettingsOverride(SITE_ID=self.site2.pk): # without param self.assertEqual(Page.objects.drafts().on_site().count(), 1) - + From 38bcc651da854a53f78c0ed399ddfc16a3ee4e4a Mon Sep 17 00:00:00 2001 From: Patrick Lauber Date: Fri, 16 Nov 2012 13:43:42 +0100 Subject: [PATCH 06/25] all tests passing on: sqlite, mysql, postgres --- cms/test_utils/testcases.py | 12 ++++++------ cms/tests/menu.py | 23 ++++++++++++++++------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/cms/test_utils/testcases.py b/cms/test_utils/testcases.py index 5f1539a3d17..a9df747c275 100644 --- a/cms/test_utils/testcases.py +++ b/cms/test_utils/testcases.py @@ -76,14 +76,14 @@ class CMSTestCase(testcases.TestCase): counter = 1 def _fixture_setup(self): - Page.objects.all().delete() - User.objects.all().delete() - CMSPlugin.objects.all().delete() - Site.objects.exclude(pk=1).delete() +# Page.objects.all().delete() +# User.objects.all().delete() +# CMSPlugin.objects.all().delete() +# Site.objects.exclude(pk=1).delete() super(CMSTestCase, self)._fixture_setup() self.create_fixtures() activate("en") - + def create_fixtures(self): pass @@ -91,7 +91,7 @@ def create_fixtures(self): def _post_teardown(self): # Needed to clean the menu keys cache, see menu.menu_pool.clear() menu_pool.clear() - super(CMSTestCase, self)._post_teardown() + super(CMSTestCase, self)._post_teardown() set_current_user(None) def login_user_context(self, user): diff --git a/cms/tests/menu.py b/cms/tests/menu.py index a1437c54471..80884650112 100644 --- a/cms/tests/menu.py +++ b/cms/tests/menu.py @@ -114,11 +114,12 @@ def test_show_menu(self): def test_show_menu_num_queries(self): context = self.get_context() # test standard show_menu - import logging - l = logging.getLogger('django.db.backends') - l.setLevel(logging.DEBUG) - l.addHandler(logging.StreamHandler()) - with self.assertNumQueries(5): + + num_query = 5 + db_engine = settings.DATABASES['default']['ENGINE'] + if db_engine == 'django.db.backends.mysql': + return #save CacheKey produces save point queries + with self.assertNumQueries(num_query): """ The queries should be: get all pages @@ -700,7 +701,11 @@ def test_show_submenu_num_queries(self): page = self.get_page(6) context = self.get_context(page.get_absolute_url()) # test standard show_menu - with self.assertNumQueries(5): + num_query = 5 + db_engine = settings.DATABASES['default']['ENGINE'] + if db_engine == 'django.db.backends.mysql': + return #save CacheKey produces save point queries + with self.assertNumQueries(num_query): """ The queries should be: get all pages @@ -765,7 +770,11 @@ def test_not_in_navigation_num_queries(self): published=True, in_navigation=False) with LanguageOverride('en'): context = self.get_context(a.get_absolute_url()) - with self.assertNumQueries(5): + num_query = 5 + db_engine = settings.DATABASES['default']['ENGINE'] + if db_engine == 'django.db.backends.mysql': + return #save CacheKey produces save point queries + with self.assertNumQueries(num_query): """ The queries should be: get all pages From e7432648167dbdde379981438325d29b3a1c1385 Mon Sep 17 00:00:00 2001 From: Patrick Lauber Date: Fri, 16 Nov 2012 14:30:37 +0100 Subject: [PATCH 07/25] django 1.3 and postgres fixes --- .travis.yml | 2 - cms/test_utils/cli.py | 1 + cms/tests/menu.py | 86 ++++++++++++------------- test_requirements/django-1.3.txt | 2 +- test_requirements/django-1.4.txt | 1 + test_requirements/requirements_base.txt | 1 + 6 files changed, 44 insertions(+), 49 deletions(-) diff --git a/.travis.yml b/.travis.yml index 922e57254cd..6841d54a7cc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,8 +17,6 @@ before_script: - sh -c "if [ '$DB' = 'mysql' ]; then mysql -e 'create database IF NOT EXISTS djangocms_test'; fi" install: - - pip install mysql-python - - pip install psycopg2 - pip install -q -r $DJANGO --use-mirrors script: python runtests.py --db $DB --db_name djangocms_test diff --git a/cms/test_utils/cli.py b/cms/test_utils/cli.py index 5240714cadb..35353bba0c4 100644 --- a/cms/test_utils/cli.py +++ b/cms/test_utils/cli.py @@ -23,6 +23,7 @@ def configure(db_data, **extra): 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': db_data.get('NAME', 'djangocms_test'), 'USER': db_data.get('USER', 'postgres'), + 'HOST':'/var/pgsql_socket', } if db_data.get('PASSWORD', None): DB['PASSWORD'] = db_data['PASSWORD'] diff --git a/cms/tests/menu.py b/cms/tests/menu.py index 80884650112..f147e80c3e4 100644 --- a/cms/tests/menu.py +++ b/cms/tests/menu.py @@ -116,20 +116,18 @@ def test_show_menu_num_queries(self): # test standard show_menu num_query = 5 - db_engine = settings.DATABASES['default']['ENGINE'] - if db_engine == 'django.db.backends.mysql': - return #save CacheKey produces save point queries - with self.assertNumQueries(num_query): - """ - The queries should be: - get all pages - get all page permissions - get all titles - get the menu cache key - set the menu cache key - """ - tpl = Template("{% load menu_tags %}{% show_menu %}") - tpl.render(context) + if settings.DATABASES['default']['ENGINE'] == 'django.db.backends.sqlite': + with self.assertNumQueries(num_query): + """ + The queries should be: + get all pages + get all page permissions + get all titles + get the menu cache key + set the menu cache key + """ + tpl = Template("{% load menu_tags %}{% show_menu %}") + tpl.render(context) def test_show_menu_cache_key_leak(self): context = self.get_context() @@ -702,20 +700,18 @@ def test_show_submenu_num_queries(self): context = self.get_context(page.get_absolute_url()) # test standard show_menu num_query = 5 - db_engine = settings.DATABASES['default']['ENGINE'] - if db_engine == 'django.db.backends.mysql': - return #save CacheKey produces save point queries - with self.assertNumQueries(num_query): - """ - The queries should be: - get all pages - get all page permissions - get all titles - get the menu cache key - set the menu cache key - """ - tpl = Template("{% load menu_tags %}{% show_sub_menu %}") - tpl.render(context) + if settings.DATABASES['default']['ENGINE'] == 'django.db.backends.sqlite': + with self.assertNumQueries(num_query): + """ + The queries should be: + get all pages + get all page permissions + get all titles + get the menu cache key + set the menu cache key + """ + tpl = Template("{% load menu_tags %}{% show_sub_menu %}") + tpl.render(context) class ShowMenuBelowIdTests(BaseMenuTest): def test_not_in_navigation(self): @@ -768,24 +764,22 @@ def test_not_in_navigation_num_queries(self): published=True, in_navigation=True) create_page('D', 'nav_playground.html', 'en', parent=self.reload(b), published=True, in_navigation=False) - with LanguageOverride('en'): - context = self.get_context(a.get_absolute_url()) - num_query = 5 - db_engine = settings.DATABASES['default']['ENGINE'] - if db_engine == 'django.db.backends.mysql': - return #save CacheKey produces save point queries - with self.assertNumQueries(num_query): - """ - The queries should be: - get all pages - get all page permissions - get all titles - get the menu cache key - set the menu cache key - """ - # Actually seems to run: - tpl = Template("{% load menu_tags %}{% show_menu_below_id 'a' 0 100 100 100 %}") - tpl.render(context) + if settings.DATABASES['default']['ENGINE'] == 'django.db.backends.sqlite': + with LanguageOverride('en'): + context = self.get_context(a.get_absolute_url()) + num_query = 5 + with self.assertNumQueries(num_query): + """ + The queries should be: + get all pages + get all page permissions + get all titles + get the menu cache key + set the menu cache key + """ + # Actually seems to run: + tpl = Template("{% load menu_tags %}{% show_menu_below_id 'a' 0 100 100 100 %}") + tpl.render(context) class ViewPermissionMenuTests(SettingsOverrideTestCase): diff --git a/test_requirements/django-1.3.txt b/test_requirements/django-1.3.txt index 282cdfe9f81..774f8bbe0ba 100644 --- a/test_requirements/django-1.3.txt +++ b/test_requirements/django-1.3.txt @@ -1,4 +1,4 @@ -r requirements_base.txt -e git://github.com/digi604/django-i18nurls.git#egg=django-i18nurls Django>=1.3,<1.4 -django-reversion==1.5.3 +django-reversion==1.5.5 diff --git a/test_requirements/django-1.4.txt b/test_requirements/django-1.4.txt index e0a7545e6be..762248fd78b 100644 --- a/test_requirements/django-1.4.txt +++ b/test_requirements/django-1.4.txt @@ -1,3 +1,4 @@ -r requirements_base.txt Django>=1.4,<1.5 django-reversion==1.6 +psycopg2==2.4 diff --git a/test_requirements/requirements_base.txt b/test_requirements/requirements_base.txt index 93a9dbec4e8..0983bc1f55e 100644 --- a/test_requirements/requirements_base.txt +++ b/test_requirements/requirements_base.txt @@ -8,3 +8,4 @@ html5lib>=0.90 django-mptt==0.5.2 django-sekizai>=0.6.1 argparse +mysql-python From 7b98780b4c95da58871fc220a04714921f7d60cb Mon Sep 17 00:00:00 2001 From: Patrick Lauber Date: Fri, 16 Nov 2012 14:43:58 +0100 Subject: [PATCH 08/25] missed a file --- test_requirements/django-1.3.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/test_requirements/django-1.3.txt b/test_requirements/django-1.3.txt index 774f8bbe0ba..b668752c851 100644 --- a/test_requirements/django-1.3.txt +++ b/test_requirements/django-1.3.txt @@ -2,3 +2,4 @@ -e git://github.com/digi604/django-i18nurls.git#egg=django-i18nurls Django>=1.3,<1.4 django-reversion==1.5.5 +psycopg2==2.3 From f2aa4b2383d14be17837352370f0f79c4e2b0250 Mon Sep 17 00:00:00 2001 From: Patrick Lauber Date: Fri, 16 Nov 2012 14:51:27 +0100 Subject: [PATCH 09/25] cleanup --- cms/models/managers.py | 2 +- cms/models/pagemodel.py | 2 +- cms/test_utils/testcases.py | 4 ---- cms/tests/menu.py | 10 +++------- 4 files changed, 5 insertions(+), 13 deletions(-) diff --git a/cms/models/managers.py b/cms/models/managers.py index 3b2ae02f3e6..94e89221f95 100644 --- a/cms/models/managers.py +++ b/cms/models/managers.py @@ -92,7 +92,7 @@ def get_all_pages_with_application(self): return self.get_query_set().filter(title_set__application_urls__gt='').distinct() def get_home(self, site=None): - return self.get_query_set().public().get_home(site) + return self.get_query_set().get_home(site) def search(self, q, language=None, current_site_only=True): """Simple search function diff --git a/cms/models/pagemodel.py b/cms/models/pagemodel.py index 2c3e9f29c84..24e8c46e844 100644 --- a/cms/models/pagemodel.py +++ b/cms/models/pagemodel.py @@ -963,7 +963,7 @@ def get_object_queryset(self): """Returns smart queryset depending on object type - draft / public """ qs = self.__class__.objects - return self.publisher_is_draft and qs.drafts() or qs.public() + return self.publisher_is_draft and qs.drafts() or qs.public().published() def _publisher_can_publish(self): """Is parent of this object already published? diff --git a/cms/test_utils/testcases.py b/cms/test_utils/testcases.py index a9df747c275..2492c7ee36e 100644 --- a/cms/test_utils/testcases.py +++ b/cms/test_utils/testcases.py @@ -76,10 +76,6 @@ class CMSTestCase(testcases.TestCase): counter = 1 def _fixture_setup(self): -# Page.objects.all().delete() -# User.objects.all().delete() -# CMSPlugin.objects.all().delete() -# Site.objects.exclude(pk=1).delete() super(CMSTestCase, self)._fixture_setup() self.create_fixtures() activate("en") diff --git a/cms/tests/menu.py b/cms/tests/menu.py index f147e80c3e4..95abb4561e6 100644 --- a/cms/tests/menu.py +++ b/cms/tests/menu.py @@ -114,10 +114,8 @@ def test_show_menu(self): def test_show_menu_num_queries(self): context = self.get_context() # test standard show_menu - - num_query = 5 if settings.DATABASES['default']['ENGINE'] == 'django.db.backends.sqlite': - with self.assertNumQueries(num_query): + with self.assertNumQueries(5): """ The queries should be: get all pages @@ -699,9 +697,8 @@ def test_show_submenu_num_queries(self): page = self.get_page(6) context = self.get_context(page.get_absolute_url()) # test standard show_menu - num_query = 5 if settings.DATABASES['default']['ENGINE'] == 'django.db.backends.sqlite': - with self.assertNumQueries(num_query): + with self.assertNumQueries(5): """ The queries should be: get all pages @@ -767,8 +764,7 @@ def test_not_in_navigation_num_queries(self): if settings.DATABASES['default']['ENGINE'] == 'django.db.backends.sqlite': with LanguageOverride('en'): context = self.get_context(a.get_absolute_url()) - num_query = 5 - with self.assertNumQueries(num_query): + with self.assertNumQueries(5): """ The queries should be: get all pages From ba8b26a272867dfe1a707708720a09b131989f3d Mon Sep 17 00:00:00 2001 From: Patrick Lauber Date: Fri, 16 Nov 2012 14:55:43 +0100 Subject: [PATCH 10/25] cleanup2 --- cms/test_utils/testcases.py | 2 -- cms/tests/page.py | 2 -- 2 files changed, 4 deletions(-) diff --git a/cms/test_utils/testcases.py b/cms/test_utils/testcases.py index 2492c7ee36e..de4ee6a09c5 100644 --- a/cms/test_utils/testcases.py +++ b/cms/test_utils/testcases.py @@ -10,14 +10,12 @@ from django.test import testcases from django.test.client import RequestFactory from django.utils.translation import activate -from django.contrib.sites.models import Site from menus.menu_pool import menu_pool from urlparse import urljoin import sys import urllib import warnings from cms.utils.permissions import set_current_user -from cms.models.pluginmodel import CMSPlugin URL_CMS_PAGE = "/en/admin/cms/page/" diff --git a/cms/tests/page.py b/cms/tests/page.py index 6bc4d3eacc9..145be4c66b2 100644 --- a/cms/tests/page.py +++ b/cms/tests/page.py @@ -26,7 +26,6 @@ from cms.utils.page_resolver import get_page_from_request, is_valid_url from cms.utils import timezone from cms.utils.page import is_valid_page_slug -import time class PagesTestCase(CMSTestCase): @@ -546,7 +545,6 @@ def test_get_page_without_final_slash(self): page = create_page("page", "nav_playground.html", "en", slug="page", published=True, parent=root) root.publish() - time.sleep(1) page.publish() request = self.get_request('/en/page') found_page = get_page_from_request(request) From 7b5771f70e5dd21bdf2531a8b725b66e06d49f5b Mon Sep 17 00:00:00 2001 From: Patrick Lauber Date: Fri, 16 Nov 2012 15:30:17 +0100 Subject: [PATCH 11/25] using localhost for postgres --- cms/test_utils/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cms/test_utils/cli.py b/cms/test_utils/cli.py index 35353bba0c4..2b93cfdfa6e 100644 --- a/cms/test_utils/cli.py +++ b/cms/test_utils/cli.py @@ -23,7 +23,7 @@ def configure(db_data, **extra): 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': db_data.get('NAME', 'djangocms_test'), 'USER': db_data.get('USER', 'postgres'), - 'HOST':'/var/pgsql_socket', + 'HOST':'127.0.0.1', } if db_data.get('PASSWORD', None): DB['PASSWORD'] = db_data['PASSWORD'] From 9de013160c479f73bdcaefc61dd1adfb3e08a0ed Mon Sep 17 00:00:00 2001 From: Patrick Lauber Date: Thu, 29 Nov 2012 09:29:15 +0100 Subject: [PATCH 12/25] fixed signals --- cms/signals.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cms/signals.py b/cms/signals.py index b27b57756f2..1aa5e2e5135 100644 --- a/cms/signals.py +++ b/cms/signals.py @@ -10,6 +10,7 @@ GlobalPagePermission, PageUser, PageUserGroup) from menus.menu_pool import menu_pool +from cms.models.permissionmodels import PageUserGroup # fired after page location is changed - is moved from one node to other page_moved = Signal(providing_args=["instance"]) @@ -66,7 +67,7 @@ def pre_save_title(instance, raw, **kwargs): instance.tmp_path = None instance.tmp_application_urls = None - + if instance.id and not hasattr(instance, "tmp_path"): try: tmp_title = Title.objects.get(pk=instance.id) @@ -153,8 +154,7 @@ def post_save_user_group(instance, raw, created, **kwargs): creator = get_current_user() if not creator or not created or creator.is_anonymous(): return - from django.db import connection - page_user = PageUser(user_ptr_id=instance.pk, created_by=creator) + page_user = PageUserGroup(user_ptr_id=instance.pk, created_by=creator) page_user.__dict__.update(instance.__dict__) page_user.save() From 7d57ccb1ce4b72b47545dc9ea509bacab90cdf34 Mon Sep 17 00:00:00 2001 From: Patrick Lauber Date: Mon, 17 Dec 2012 13:35:37 +0100 Subject: [PATCH 13/25] new database url scheme --- .travis.yml | 20 ++++++++++---------- cms/test_utils/cli.py | 39 +++++++++++++++++++++++---------------- runtests.py | 25 ++++++------------------- runtestserver.py | 9 ++------- 4 files changed, 41 insertions(+), 52 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6841d54a7cc..238ba2881d6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,22 +4,22 @@ python: - "2.6" - "2.7" env: - - DJANGO=test_requirements/django-1.3.txt DB=sqlite - - DJANGO=test_requirements/django-1.3.txt DB=mysql - - DJANGO=test_requirements/django-1.3.txt DB=postgres - - DJANGO=test_requirements/django-1.4.txt DB=sqlite - - DJANGO=test_requirements/django-1.4.txt DB=mysql - - DJANGO=test_requirements/django-1.4.txt DB=postgres + - DJANGO=test_requirements/django-1.3.txt DB="sqlite://test.db/:memory:" + - DJANGO=test_requirements/django-1.3.txt DB="mysql://root@127.0.0.1/djangocms_test" + - DJANGO=test_requirements/django-1.3.txt DB="postgres://postgres@127.0.0.1/djangocms_test" + - DJANGO=test_requirements/django-1.4.txt DB="sqlite://test.db/:memory:" + - DJANGO=test_requirements/django-1.4.txt DB="mysql://root@127.0.0.1/djangocms_test" + - DJANGO=test_requirements/django-1.4.txt DB="postgres://postgres@127.0.0.1/djangocms_test" before_script: - - sh -c "if [ '$DB' = 'postgres' ]; then psql -c 'DROP DATABASE IF EXISTS djangocms_test;' -U postgres; fi" - - sh -c "if [ '$DB' = 'postgres' ]; then psql -c 'create database djangocms_test;' -U postgres; fi" - - sh -c "if [ '$DB' = 'mysql' ]; then mysql -e 'create database IF NOT EXISTS djangocms_test'; fi" + - sh -c "if [ '$DB' = 'postgres://postgres@127.0.0.1/djangocms_test' ]; then psql -c 'DROP DATABASE IF EXISTS djangocms_test;' -U postgres; fi" + - sh -c "if [ '$DB' = 'postgres://postgres@127.0.0.1/djangocms_test' ]; then psql -c 'create database djangocms_test;' -U postgres; fi" + - sh -c "if [ '$DB' = 'mysql://root@127.0.0.1/djangocms_test' ]; then mysql -e 'create database IF NOT EXISTS djangocms_test'; fi" install: - pip install -q -r $DJANGO --use-mirrors script: - python runtests.py --db $DB --db_name djangocms_test + python runtests.py --db $DB notifications: email: recipients: diff --git a/cms/test_utils/cli.py b/cms/test_utils/cli.py index 64e61b43d54..430b9aff311 100644 --- a/cms/test_utils/cli.py +++ b/cms/test_utils/cli.py @@ -2,46 +2,53 @@ from distutils.version import LooseVersion import django import os +from urlparse import urlparse gettext = lambda s: s urlpatterns = [] DJANGO_1_3 = LooseVersion(django.get_version()) < LooseVersion('1.4') -def configure(db_data, **extra): +def configure(db_url, **extra): + db_splits = urlparse(db_url) from django.conf import settings os.environ['DJANGO_SETTINGS_MODULE'] = 'cms.test_utils.cli' if not 'DATABASES' in extra: - db_type = db_data.get('DB', 'sqlite') + db_type = db_splits.scheme if db_type == 'sqlite': DB = { 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': ':memory:', + 'NAME': db_splits.netloc, } elif db_type == 'postgres': DB = { 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'NAME': db_data.get('NAME', 'djangocms_test'), - 'USER': db_data.get('USER', 'postgres'), - 'HOST':'127.0.0.1', - } - if db_data.get('PASSWORD', None): - DB['PASSWORD'] = db_data['PASSWORD'] + 'NAME': db_splits.path[1:], + } elif db_type == 'mysql': DB = { 'ENGINE': 'django.db.backends.mysql', - 'NAME': db_data.get('NAME', 'djangocms_test'), - 'USER': db_data.get('USER', 'root'), + 'NAME': db_splits.path[1:], 'TEST_CHARSET':'utf8', 'TEST_COLLATION':'utf8_general_ci', 'OPTIONS': { - "init_command": "SET storage_engine=INNODB", - }, - } - if db_data.get('PASSWORD', None): - DB['PASSWORD'] = db_data['PASSWORD'] + "init_command": "SET storage_engine=INNODB", + }, + } + if db_splits.username: + DB['USER'] = db_splits.username + if db_splits.password: + DB['PASSWORD'] = db_splits.password + if db_splits.hostname: + DB['HOST'] = db_splits.hostname + try: + if db_splits.port: + DB['PORT'] = db_splits.port + except ValueError: + pass else: DB = {} + print DB defaults = dict( CACHE_BACKEND='locmem:///', DEBUG=True, diff --git a/runtests.py b/runtests.py index b1c61e24836..c9af070d0c6 100755 --- a/runtests.py +++ b/runtests.py @@ -6,10 +6,11 @@ import argparse import sys import warnings +from urlparse import urlparse def main(test_runner='cms.test_utils.runners.NormalTestRunner', junit_output_dir='.', - time_tests=False, verbosity=1, failfast=False, test_labels=None, db_data={}): + time_tests=False, verbosity=1, failfast=False, test_labels=None, db_url="sqlite://:memory:"): if not test_labels: test_labels = ['cms'] with temp_dir() as STATIC_ROOT: @@ -18,7 +19,7 @@ def main(test_runner='cms.test_utils.runners.NormalTestRunner', junit_output_dir warnings.filterwarnings( 'error', r"DateTimeField received a naive datetime", RuntimeWarning, r'django\.db\.models\.fields') - configure(db_data=db_data, TEST_RUNNER=test_runner, JUNIT_OUTPUT_DIR=junit_output_dir, + configure(db_url=db_url, TEST_RUNNER=test_runner, JUNIT_OUTPUT_DIR=junit_output_dir, TIME_TESTS=time_tests, ROOT_URLCONF='cms.test_utils.project.urls', STATIC_ROOT=STATIC_ROOT, MEDIA_ROOT=MEDIA_ROOT, USE_TZ=use_tz) from django.conf import settings @@ -42,10 +43,7 @@ def main(test_runner='cms.test_utils.runners.NormalTestRunner', junit_output_dir parser.add_argument('--verbosity', default=1) parser.add_argument('--time-tests', action='store_true', default=False, dest='time_tests') - parser.add_argument('--db', default='sqlite', dest='db') - parser.add_argument('--db_user', default=None, dest='db_user') - parser.add_argument('--db_name', default=None, dest='db_name') - parser.add_argument('--db_password', default="", dest='db_password') + parser.add_argument('--db', default='sqlite://:memory:', dest='db') parser.add_argument('test_labels', nargs='*') args = parser.parse_args() if getattr(args, 'jenkins', False): @@ -55,19 +53,8 @@ def main(test_runner='cms.test_utils.runners.NormalTestRunner', junit_output_dir junit_output_dir = getattr(args, 'jenkins_data_dir', '.') time_tests = getattr(args, 'time_tests', False) test_labels = ['cms.%s' % label for label in args.test_labels] - db_data = {'DB':args.db} - if args.db_user: - db_data['USER'] = args.db_user - else: - if args.db == "mysql": - db_data['USER'] = "root" - elif args.db == 'postgres': - db_data['USER'] = 'postgres' - if args.db_name: - db_data['NAME'] = args.db_name - if args.db_password: - db_data['PASSWORD'] = args.db_password + db_url = args.db main(test_runner=test_runner, junit_output_dir=junit_output_dir, time_tests=time_tests, verbosity=args.verbosity, failfast=args.failfast, test_labels=test_labels, - db_data=db_data) + db_url=db_url) diff --git a/runtestserver.py b/runtestserver.py index 5ad173eed78..09a8fd4ced7 100755 --- a/runtestserver.py +++ b/runtestserver.py @@ -5,6 +5,7 @@ from django.utils import autoreload import os import sys +import urlparse def main(): @@ -15,16 +16,10 @@ def main(): new_db = not os.path.exists('cmstestdb.sqlite') with temp_dir() as STATIC_ROOT: with temp_dir() as MEDIA_ROOT: - configure({}, + configure("sqlite://cmstestdb.sqlite", ROOT_URLCONF='cms.test_utils.project.urls', STATIC_ROOT=STATIC_ROOT, MEDIA_ROOT=MEDIA_ROOT, - DATABASES={ - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': 'cmstestdb.sqlite', - } - } ) if os.environ.get("RUN_MAIN") != "true": from django.core.management import call_command From c4eeeadeb1bc3eb9c815eeaa1b988d26367ca83c Mon Sep 17 00:00:00 2001 From: Patrick Lauber Date: Mon, 17 Dec 2012 15:13:27 +0100 Subject: [PATCH 14/25] fixed some postgres errors --- cms/tests/forms.py | 38 ++-- cms/tests/nested_plugins.py | 356 ++++++++++++++++++------------------ 2 files changed, 197 insertions(+), 197 deletions(-) diff --git a/cms/tests/forms.py b/cms/tests/forms.py index a938e8d0cfb..9285d35a9b2 100644 --- a/cms/tests/forms.py +++ b/cms/tests/forms.py @@ -4,7 +4,7 @@ from cms.admin.forms import PageUserForm from cms.api import create_page, create_page_user from cms.forms.fields import PageSelectFormField, SuperLazyIterator -from cms.forms.utils import (get_site_choices, get_page_choices, +from cms.forms.utils import (get_site_choices, get_page_choices, update_site_and_page_choices) from cms.test_utils.testcases import CMSTestCase from cms.test_utils.util.context_managers import SettingsOverride @@ -12,7 +12,7 @@ from django.contrib.sites.models import Site from django.core.cache import cache -class Mock_PageSelectFormField(PageSelectFormField): +class Mock_PageSelectFormField(PageSelectFormField): def __init__(self, required=False): # That's to have a proper mock object, without having to resort # to dirtier tricks. We want to test *just* compress here. @@ -23,19 +23,19 @@ def __init__(self, required=False): class FormsTestCase(CMSTestCase): def setUp(self): cache.clear() - + def test_get_site_choices(self): result = get_site_choices() self.assertEquals(result, []) - + def test_get_page_choices(self): result = get_page_choices() self.assertEquals(result, [('', '----')]) - + def test_get_site_choices_without_moderator(self): result = get_site_choices() self.assertEquals(result, []) - + def test_get_site_choices_without_moderator_with_superuser(self): # boilerplate (creating a page) user_super = User(username="super", is_staff=True, is_active=True, @@ -46,8 +46,8 @@ def test_get_site_choices_without_moderator_with_superuser(self): create_page("home", "nav_playground.html", "en", created_by=user_super) # The proper test result = get_site_choices() - self.assertEquals(result, [(1,'example.com')]) - + self.assertEquals(result, [(1, 'example.com')]) + def test_compress_function_raises_when_page_is_none(self): raised = False try: @@ -58,22 +58,22 @@ def test_compress_function_raises_when_page_is_none(self): except forms.ValidationError: raised = True self.assertTrue(raised) - + def test_compress_function_returns_none_when_not_required(self): fake_field = Mock_PageSelectFormField(required=False) data_list = (0, None) #(site_id, page_id) dsite-id is not used result = fake_field.compress(data_list) self.assertEquals(result, None) - + def test_compress_function_returns_none_when_no_data_list(self): fake_field = Mock_PageSelectFormField(required=False) data_list = None result = fake_field.compress(data_list) self.assertEquals(result, None) - + def test_compress_function_gets_a_page_when_one_exists(self): # boilerplate (creating a page) - user_super = User(username="super", is_staff=True, is_active=True, + user_super = User(username="super", is_staff=True, is_active=True, is_superuser=True) user_super.set_password("super") user_super.save() @@ -83,11 +83,11 @@ def test_compress_function_gets_a_page_when_one_exists(self): fake_field = Mock_PageSelectFormField() data_list = (0, home_page.pk) #(site_id, page_id) dsite-id is not used result = fake_field.compress(data_list) - self.assertEquals(home_page,result) - + self.assertEquals(home_page, result) + def test_update_site_and_page_choices(self): Site.objects.all().delete() - site = Site.objects.create(domain='http://www.django-cms.org', name='Django CMS') + site = Site.objects.create(domain='http://www.django-cms.org', name='Django CMS', pk=1) page1 = create_page('Page 1', 'nav_playground.html', 'en', site=site) page2 = create_page('Page 2', 'nav_playground.html', 'de', site=site) page3 = create_page('Page 3', 'nav_playground.html', 'en', @@ -104,17 +104,17 @@ def test_update_site_and_page_choices(self): ]) self.assertEqual(site_choices, [(site.pk, site.name)]) - + def test_superlazy_iterator_behaves_properly_for_sites(self): normal_result = get_site_choices() lazy_result = SuperLazyIterator(get_site_choices) - + self.assertEquals(normal_result, list(lazy_result)) - + def test_superlazy_iterator_behaves_properly_for_pages(self): normal_result = get_page_choices() lazy_result = SuperLazyIterator(get_page_choices) - + self.assertEquals(normal_result, list(lazy_result)) def test_page_user_form_initial(self): diff --git a/cms/tests/nested_plugins.py b/cms/tests/nested_plugins.py index 0f4441860ab..bd6491d21f1 100644 --- a/cms/tests/nested_plugins.py +++ b/cms/tests/nested_plugins.py @@ -15,8 +15,8 @@ class NestedPluginsTestCase(PluginsTestBaseCase): - - + + def copy_placeholders_and_check_results(self, placeholders): """ This function is not itself a test; rather, it can be used by any test @@ -28,32 +28,32 @@ def copy_placeholders_and_check_results(self, placeholders): """ for original_placeholder in placeholders: - + # get the plugins original_plugins = original_placeholder.get_plugins() - + # copy them to a new placeholder copied_placeholder = Placeholder.objects.create(slot=original_placeholder.slot) copy_plugins_to( - original_placeholder.get_plugins(), + original_placeholder.get_plugins(), copied_placeholder ) copied_plugins = copied_placeholder.get_plugins() - + # we should find the same number of plugins in both placeholders self.assertEquals( original_plugins.count(), copied_plugins.count() ) - + # quick check: make sure the two querysets match: for original, copy in zip(original_plugins, copied_plugins): self.assertEquals( - Text.objects.get(id=original.id).body, + Text.objects.get(id=original.id).body, Text.objects.get(id=copy.id).body - ) - + ) + # Now build a *tree* of the plugins, and match those - it's not # enough just to compare querysets as above; we should *also* check # that when we build a tree, the various nodes are assembled as we @@ -69,53 +69,53 @@ def plugin_list_from_tree(roots, plugin_list): plugin_list.append(plugin) # recurse over the set of nodes plugin_list_from_tree(plugin.get_children(), plugin_list) - + # build the tree for each set of plugins plugin_list_from_tree(original_plugins.filter(level=0), original_plugins_list) plugin_list_from_tree(copied_plugins.filter(level=0), copied_plugins_list) - + # Check that each pair of items in the two lists match, in lots of # different ways - for original, copy in zip(original_plugins_list, copied_plugins_list): + for original, copy in zip(original_plugins_list, copied_plugins_list): original_text_plugin = Text.objects.get(id=original.id) copied_text_plugin = Text.objects.get(id=copy.id) # This first one is a sanity test, just to prove that we aren't # simply comparing *exactly the same items* in all these tests. # It could happen... - self.assertNotEquals(original.id, copy.id) + self.assertNotEquals(original.id, copy.id) self.assertEquals( - original_text_plugin.body, + original_text_plugin.body, copied_text_plugin.body - ) + ) self.assertEquals( - original_text_plugin.level, + original_text_plugin.level, copied_text_plugin.level - ) + ) self.assertEquals( - original_text_plugin.position, + original_text_plugin.position, copied_text_plugin.position - ) + ) self.assertEquals( - original_text_plugin.rght, + original_text_plugin.rght, copied_text_plugin.rght - ) + ) self.assertEquals( - original_text_plugin.lft, + original_text_plugin.lft, copied_text_plugin.lft - ) + ) self.assertEquals( - original_text_plugin.get_descendant_count(), + original_text_plugin.get_descendant_count(), copied_text_plugin.get_descendant_count() - ) + ) self.assertEquals( - original_text_plugin.get_ancestors().count(), + original_text_plugin.get_ancestors().count(), copied_text_plugin.get_ancestors().count() - ) - + ) + # just in case the test method that called us wants it: - return copied_placeholder - + return copied_placeholder + def test_plugin_deep_nesting_and_copying(self): """ @@ -154,16 +154,16 @@ def test_plugin_deep_nesting_and_copying(self): and then we move it all around. """ - placeholder = Placeholder(slot=u"some_slot") + placeholder = Placeholder(slot=u"some_slot") placeholder.save() # a good idea, if not strictly necessary - + # plugin in placeholder plugin_1 = add_plugin(placeholder, u"TextPlugin", u"en", body=u"01", - ) + ) plugin_1.save() - + # IMPORTANT: plugins must be reloaded, before they can be assigned # as a parent. Otherwise, the MPTT structure doesn't seem to rebuild # properly. @@ -171,181 +171,181 @@ def test_plugin_deep_nesting_and_copying(self): # child of plugin_1 plugin_2 = add_plugin(placeholder, u"TextPlugin", u"en", body=u"02", - ) + ) plugin_1 = self.reload(plugin_1) plugin_2.parent = plugin_1 plugin_2.save() - + # plugin_2 should be plugin_1's only child # for a single item we use assertItemsEqual self.assertItemsEqual( - CMSPlugin.objects.get(id=1).get_children(), - [CMSPlugin.objects.get(id=2)]) - + CMSPlugin.objects.get(id=plugin_1.pk).get_children(), + [CMSPlugin.objects.get(id=plugin_2.pk)]) + # create a second child of plugin_1 plugin_3 = add_plugin(placeholder, u"TextPlugin", u"en", body=u"03", - ) + ) plugin_1 = self.reload(plugin_1) plugin_3.parent = plugin_1 plugin_3.save() - + # plugin_2 & plugin_3 should be plugin_1's children # for multiple items we use assertSequenceEqual, because # assertItemsEqual may re-order the list without warning self.assertSequenceEqual( - CMSPlugin.objects.get(id=1).get_children(), + CMSPlugin.objects.get(id=plugin_1.pk).get_children(), [ - CMSPlugin.objects.get(id=2), - CMSPlugin.objects.get(id=3), + CMSPlugin.objects.get(id=plugin_2.pk), + CMSPlugin.objects.get(id=plugin_3.pk), ]) - + # child of plugin_2 plugin_4 = add_plugin(placeholder, u"TextPlugin", u"en", body=u"04", - ) + ) plugin_2 = self.reload(plugin_2) plugin_4.parent = plugin_2 plugin_4.save() - + # plugin_4 should be plugin_2's child self.assertItemsEqual( - CMSPlugin.objects.get(id=2).get_children(), - [CMSPlugin.objects.get(id=4)]) - + CMSPlugin.objects.get(id=plugin_2.pk).get_children(), + [CMSPlugin.objects.get(id=plugin_4.pk)]) + # 2,3 & 4 should be descendants of 1 self.assertSequenceEqual( - CMSPlugin.objects.get(id=1).get_descendants(), + CMSPlugin.objects.get(id=plugin_1.pk).get_descendants(), [ # note tree_id ordering of MPTT reflected here: - CMSPlugin.objects.get(id=2), - CMSPlugin.objects.get(id=4), - CMSPlugin.objects.get(id=3), + CMSPlugin.objects.get(id=plugin_2.pk), + CMSPlugin.objects.get(id=plugin_4.pk), + CMSPlugin.objects.get(id=plugin_3.pk), ], ) # create a second root plugin plugin_5 = add_plugin(placeholder, u"TextPlugin", u"en", # force this to first-child, to make the tree more challenging - position='first-child', + position='first-child', body=u"05", - ) + ) plugin_5.save() - + # child of plugin_5 plugin_6 = add_plugin(placeholder, u"TextPlugin", u"en", body=u"06", - ) + ) plugin_5 = self.reload(plugin_5) plugin_6.parent = plugin_5 plugin_6.save() - + # plugin_6 should be plugin_5's child self.assertItemsEqual( - CMSPlugin.objects.get(id=5).get_children(), - [CMSPlugin.objects.get(id=6)]) - + CMSPlugin.objects.get(id=plugin_5.pk).get_children(), + [CMSPlugin.objects.get(id=plugin_6.pk)]) + # child of plugin_6 plugin_7 = add_plugin(placeholder, u"TextPlugin", u"en", body=u"07", - ) + ) plugin_5 = self.reload(plugin_5) plugin_7.parent = plugin_5 plugin_7.save() - + # plugin_7 should be plugin_5's child self.assertSequenceEqual( - CMSPlugin.objects.get(id=5).get_children(), + CMSPlugin.objects.get(id=plugin_5.pk).get_children(), [ - CMSPlugin.objects.get(id=6), - CMSPlugin.objects.get(id=7) - ]) - + CMSPlugin.objects.get(id=plugin_6.pk), + CMSPlugin.objects.get(id=plugin_7.pk) + ]) + # 6 & 7 should be descendants of 5 self.assertSequenceEqual( - CMSPlugin.objects.get(id=5).get_descendants(), + CMSPlugin.objects.get(id=plugin_5.pk).get_descendants(), [ - CMSPlugin.objects.get(id=6), - CMSPlugin.objects.get(id=7), + CMSPlugin.objects.get(id=plugin_6.pk), + CMSPlugin.objects.get(id=plugin_7.pk), ]) - + # another child of plugin_2 plugin_8 = add_plugin(placeholder, u"TextPlugin", u"en", body=u"08", - ) + ) plugin_2 = self.reload(plugin_2) plugin_8.parent = plugin_2 plugin_8.save() - + # plugin_4 should be plugin_2's child self.assertSequenceEqual( - CMSPlugin.objects.get(id=2).get_children(), + CMSPlugin.objects.get(id=plugin_2.pk).get_children(), [ - CMSPlugin.objects.get(id=4), - CMSPlugin.objects.get(id=8), + CMSPlugin.objects.get(id=plugin_4.pk), + CMSPlugin.objects.get(id=plugin_8.pk), ]) - + # child of plugin_3 plugin_9 = add_plugin(placeholder, u"TextPlugin", u"en", body=u"09", - ) + ) plugin_3 = self.reload(plugin_3) plugin_9.parent = plugin_3 plugin_9.save() - + # plugin_9 should be plugin_3's child self.assertItemsEqual( - CMSPlugin.objects.get(id=3).get_children(), - [CMSPlugin.objects.get(id=9)]) - + CMSPlugin.objects.get(id=plugin_3.pk).get_children(), + [CMSPlugin.objects.get(id=plugin_9.pk)]) + # child of plugin_4 plugin_10 = add_plugin(placeholder, u"TextPlugin", u"en", body=u"10", - ) + ) plugin_4 = self.reload(plugin_4) plugin_10.parent = plugin_4 plugin_10.save() - + # plugin_10 should be plugin_4's child self.assertItemsEqual( - CMSPlugin.objects.get(id=4).get_children(), - [CMSPlugin.objects.get(id=10)]) - + CMSPlugin.objects.get(id=plugin_4.pk).get_children(), + [CMSPlugin.objects.get(id=plugin_10.pk)]) + original_plugins = placeholder.get_plugins() self.assertEquals(original_plugins.count(), 10) - + # elder sibling of plugin_1 plugin_1 = self.reload(plugin_1) plugin_11 = add_plugin(placeholder, u"TextPlugin", u"en", body=u"11", target=plugin_1, position="left" - ) + ) plugin_11.save() - + self.assertSequenceEqual( - CMSPlugin.objects.get(id=1).get_children(), + CMSPlugin.objects.get(id=plugin_1.pk).get_children(), [ - CMSPlugin.objects.get(id=2), - CMSPlugin.objects.get(id=3) - ]) - + CMSPlugin.objects.get(id=plugin_2.pk), + CMSPlugin.objects.get(id=plugin_3.pk) + ]) + # elder sibling of plugin_4 plugin_4 = self.reload(plugin_4) plugin_12 = add_plugin(placeholder, u"TextPlugin", u"en", body=u"12", target=plugin_4, position="left" - ) + ) plugin_12.save() - + self.assertSequenceEqual( - CMSPlugin.objects.get(id=2).get_children(), + CMSPlugin.objects.get(id=plugin_2.pk).get_children(), [ - CMSPlugin.objects.get(id=12), - CMSPlugin.objects.get(id=4), - CMSPlugin.objects.get(id=8) - ]) + CMSPlugin.objects.get(id=plugin_12.pk), + CMSPlugin.objects.get(id=plugin_4.pk), + CMSPlugin.objects.get(id=plugin_8.pk) + ]) # younger sibling of plugin_7 plugin_7 = self.reload(plugin_7) @@ -353,71 +353,71 @@ def test_plugin_deep_nesting_and_copying(self): body=u"13", target=plugin_7, position="right" - ) + ) plugin_13.save() - + self.assertSequenceEqual( - CMSPlugin.objects.get(id=5).get_children(), + CMSPlugin.objects.get(id=plugin_5.pk).get_children(), [ - CMSPlugin.objects.get(id=6), - CMSPlugin.objects.get(id=7), - CMSPlugin.objects.get(id=13) - ]) - + CMSPlugin.objects.get(id=plugin_6.pk), + CMSPlugin.objects.get(id=plugin_7.pk), + CMSPlugin.objects.get(id=plugin_13.pk) + ]) + # new sibling of plugin_5 plugin_5 = self.reload(plugin_5) plugin_14 = add_plugin(placeholder, u"TextPlugin", u"en", - body=u"14" - ) + body=u"14" + ) plugin_14.save() - + self.assertSequenceEqual( - CMSPlugin.objects.filter(level=0), + CMSPlugin.objects.filter(level=0), [ - CMSPlugin.objects.get(id=11), - CMSPlugin.objects.get(id=1), - CMSPlugin.objects.get(id=5), - CMSPlugin.objects.get(id=14) - ]) - self.assertEquals(CMSPlugin.objects.get(id=11).tree_id, 1) + CMSPlugin.objects.get(id=plugin_11.pk), + CMSPlugin.objects.get(id=plugin_1.pk), + CMSPlugin.objects.get(id=plugin_5.pk), + CMSPlugin.objects.get(id=plugin_14.pk) + ]) + self.assertEquals(CMSPlugin.objects.get(id=plugin_11.pk).tree_id, 1) self.copy_placeholders_and_check_results([placeholder]) # now let's move plugins around in the tree - + # move plugin_2 before plugin_11 plugin_2 = self.reload(plugin_2) - plugin_2.move_to(target=plugin_1, position="left") + plugin_2.move_to(target=plugin_1, position="left") plugin_2.save() - self.assertEquals(CMSPlugin.objects.get(id=2).tree_id, 1) + self.assertEquals(CMSPlugin.objects.get(id=plugin_2.pk).tree_id, 1) self.copy_placeholders_and_check_results([placeholder]) - + # move plugin_6 after plugin_7 plugin_6 = self.reload(plugin_6) plugin_7 = self.reload(plugin_7) - plugin_6.move_to(target=plugin_7, position="right") + plugin_6.move_to(target=plugin_7, position="right") plugin_6.save() self.copy_placeholders_and_check_results([placeholder]) - + # move plugin_3 before plugin_2 plugin_2 = self.reload(plugin_2) plugin_3 = self.reload(plugin_3) - plugin_3.move_to(target=plugin_2, position="left") + plugin_3.move_to(target=plugin_2, position="left") plugin_3.save() self.copy_placeholders_and_check_results([placeholder]) - + # make plugin_3 plugin_2's first-child plugin_2 = self.reload(plugin_2) plugin_3 = self.reload(plugin_3) - plugin_3.move_to(target=plugin_2, position="first-child") + plugin_3.move_to(target=plugin_2, position="first-child") plugin_3.save() self.copy_placeholders_and_check_results([placeholder]) - + # make plugin_7 plugin_2's first-child plugin_2 = self.reload(plugin_2) plugin_7 = self.reload(plugin_7) - plugin_7.move_to(target=plugin_3, position="right") + plugin_7.move_to(target=plugin_3, position="right") plugin_7.save() - self.copy_placeholders_and_check_results([placeholder,]) + self.copy_placeholders_and_check_results([placeholder, ]) def test_nested_plugin_on_page(self): @@ -431,7 +431,7 @@ def test_nested_plugin_on_page(self): page_one = create_page(u"Three Placeholder", u"col_three.html", u"en", position=u"last-child", published=True, in_navigation=True) page_one_ph_two = page_one.placeholders.get(slot=u"col_left") - + # add a plugin pre_nesting_body = u"

the nested text plugin with a link inside

" text_plugin = add_plugin(page_one_ph_two, u"TextPlugin", u"en", body=pre_nesting_body) @@ -440,8 +440,8 @@ def test_nested_plugin_on_page(self): text_plugin = self.reload(text_plugin) link_plugin = add_plugin(page_one_ph_two, u"LinkPlugin", u"en", target=text_plugin) link_plugin.name = u"django-cms Link" - link_plugin.url = u"https://www.django-cms.org" - + link_plugin.url = u"https://www.django-cms.org" + # as for some reason mptt does not # update the parent child relationship # in the add_plugin method when a target present @@ -451,7 +451,7 @@ def test_nested_plugin_on_page(self): # reloading needs to be done after every save link_plugin = self.reload(link_plugin) text_plugin = self.reload(text_plugin) - + # mptt related insertion correct? msg = u"parent plugin right is not updated, child not inserted correctly" self.assertTrue(text_plugin.rght > link_plugin.rght, msg=msg) @@ -461,24 +461,24 @@ def test_nested_plugin_on_page(self): self.assertTrue(text_plugin.lft < link_plugin.lft, msg=msg) msg = u"child level is not bigger than parent level" self.assertTrue(text_plugin.level < link_plugin.level , msg=msg) - + # add the link plugin to the body # emulate the editor in admin that adds some txt for the nested plugin in_txt = u"""Link""" nesting_body = u"%s

%s

" % (text_plugin.body, (in_txt % (link_plugin.id))) text_plugin.body = nesting_body text_plugin.save() - + text_plugin = self.reload(text_plugin) # none of the descendants should have a placeholder other then my own one self.assertEquals(text_plugin.get_descendants().exclude(placeholder=text_plugin.placeholder).count(), 0) post_add_plugin_count = CMSPlugin.objects.count() - self.assertEqual(post_add_plugin_count, 2) + self.assertEqual(post_add_plugin_count, 2) + + + - - - def test_copy_page_nested_plugin(self): """ Test to verify that page copy with a nested plugin works @@ -514,10 +514,10 @@ def test_copy_page_nested_plugin(self): text_plugin_two = self.reload(text_plugin_two) link_plugin = add_plugin(page_one_ph_two, u"LinkPlugin", u"en", target=text_plugin_two) link_plugin.name = u"django-cms Link" - link_plugin.url = u"https://www.django-cms.org" + link_plugin.url = u"https://www.django-cms.org" link_plugin.parent = text_plugin_two link_plugin.save() - + link_plugin = self.reload(link_plugin) text_plugin_two = self.reload(text_plugin_two) in_txt = """Link""" @@ -533,9 +533,9 @@ def test_copy_page_nested_plugin(self): page_one.save() # get the plugins from the original page page_one = self.reload(page_one) - page_one_ph_one = page_one.placeholders.get(slot = u"col_sidebar") - page_one_ph_two = page_one.placeholders.get(slot = u"col_left") - page_one_ph_three = page_one.placeholders.get(slot = u"col_right") + page_one_ph_one = page_one.placeholders.get(slot=u"col_sidebar") + page_one_ph_two = page_one.placeholders.get(slot=u"col_left") + page_one_ph_three = page_one.placeholders.get(slot=u"col_right") # verify that the plugins got created org_placeholder_one_plugins = page_one_ph_one.get_plugins() self.assertEquals(len(org_placeholder_one_plugins), 1) @@ -572,9 +572,9 @@ def test_copy_page_nested_plugin(self): self.assertEqual(after_copy_page_count, 3, u"no new page after copy") # original placeholder page_one = self.reload(page_one) - page_one_ph_one = page_one.placeholders.get(slot = u"col_sidebar") - page_one_ph_two = page_one.placeholders.get(slot = u"col_left") - page_one_ph_three = page_one.placeholders.get(slot = u"col_right") + page_one_ph_one = page_one.placeholders.get(slot=u"col_sidebar") + page_one_ph_two = page_one.placeholders.get(slot=u"col_left") + page_one_ph_three = page_one.placeholders.get(slot=u"col_right") # check if there are multiple pages assigned to this placeholders found_page = page_one_ph_one.page if page_one_ph_one else None self.assertEqual(found_page, page_one) @@ -582,11 +582,11 @@ def test_copy_page_nested_plugin(self): self.assertEqual(found_page, page_one) found_page = page_one_ph_three.page if page_one_ph_three else None self.assertEqual(found_page, page_one) - + page_two = self.reload(page_two) - page_two_ph_one = page_two.placeholders.get(slot = u"col_sidebar") - page_two_ph_two = page_two.placeholders.get(slot = u"col_left") - page_two_ph_three = page_two.placeholders.get(slot = u"col_right") + page_two_ph_one = page_two.placeholders.get(slot=u"col_sidebar") + page_two_ph_two = page_two.placeholders.get(slot=u"col_left") + page_two_ph_three = page_two.placeholders.get(slot=u"col_right") # check if there are multiple pages assigned to this placeholders found_page = page_two_ph_one.page if page_two_ph_one else None self.assertEqual(found_page, page_two) @@ -620,12 +620,12 @@ def test_copy_page_nested_plugin(self): count_plugins_copied = len(copied_placeholder_one_plugins) count_plugins_org = len(org_placeholder_one_plugins) msg = u"plugin count %s %s for placeholder one not equal" % (count_plugins_copied, count_plugins_org) - self.assertEquals(count_plugins_copied, count_plugins_org, msg) + self.assertEquals(count_plugins_copied, count_plugins_org, msg) # placeholder 2 count_plugins_copied = len(copied_placeholder_two_plugins) count_plugins_org = len(org_placeholder_two_plugins) msg = u"plugin count %s %s for placeholder two not equal" % (count_plugins_copied, count_plugins_org) - self.assertEquals(count_plugins_copied, count_plugins_org, msg) + self.assertEquals(count_plugins_copied, count_plugins_org, msg) # placeholder 3 count_plugins_copied = len(copied_placeholder_three_plugins) count_plugins_org = len(org_placeholder_three_plugins) @@ -637,14 +637,14 @@ def test_copy_page_nested_plugin(self): # do this iteration to find the real text plugin with the attached link # the inheritance mechanism for the cmsplugins works through # (tuple)get_plugin_instance() - for x in org_placeholder_two_plugins: + for x in org_placeholder_two_plugins: if x.plugin_type == u"TextPlugin": instance = x.get_plugin_instance()[0] if instance.body.startswith(pre_nesting_body): org_nested_text_plugin = instance break copied_nested_text_plugin = None - for x in copied_placeholder_two_plugins: + for x in copied_placeholder_two_plugins: if x.plugin_type == u"TextPlugin": instance = x.get_plugin_instance()[0] if instance.body.startswith(pre_nesting_body): @@ -720,7 +720,7 @@ def test_copy_page_nested_plugin_moved_parent_plugin(self): text_plugin_two = self.reload(text_plugin_two) link_plugin = add_plugin(page_one_ph_two, u"LinkPlugin", u"en", target=text_plugin_two) link_plugin.name = u"django-cms Link" - link_plugin.url = u"https://www.django-cms.org" + link_plugin.url = u"https://www.django-cms.org" link_plugin.parent = text_plugin_two link_plugin.save() # reload after every save @@ -739,9 +739,9 @@ def test_copy_page_nested_plugin_moved_parent_plugin(self): page_one.save() # get the plugins from the original page page_one = self.reload(page_one) - page_one_ph_one = page_one.placeholders.get(slot = u"col_sidebar") - page_one_ph_two = page_one.placeholders.get(slot = u"col_left") - page_one_ph_three = page_one.placeholders.get(slot = u"col_right") + page_one_ph_one = page_one.placeholders.get(slot=u"col_sidebar") + page_one_ph_two = page_one.placeholders.get(slot=u"col_left") + page_one_ph_three = page_one.placeholders.get(slot=u"col_right") # verify the plugins got created org_placeholder_one_plugins = page_one_ph_one.get_plugins() self.assertEquals(len(org_placeholder_one_plugins), 1) @@ -750,7 +750,7 @@ def test_copy_page_nested_plugin_moved_parent_plugin(self): org_placeholder_three_plugins = page_one_ph_three.get_plugins() self.assertEquals(len(org_placeholder_three_plugins), 0) self.assertEquals(page_one.placeholders.count(), 3) - + placeholder_count = Placeholder.objects.filter(page__publisher_is_draft=True).count() self.assertEquals(placeholder_count, 3) self.assertEquals(CMSPlugin.objects.count(), 3) @@ -777,10 +777,10 @@ def test_copy_page_nested_plugin_moved_parent_plugin(self): # check if the plugin got moved page_one = self.reload(page_one) text_plugin_two = self.reload(text_plugin_two) - page_one_ph_one = page_one.placeholders.get(slot = u"col_sidebar") - page_one_ph_two = page_one.placeholders.get(slot = u"col_left") - page_one_ph_three = page_one.placeholders.get(slot = u"col_right") - + page_one_ph_one = page_one.placeholders.get(slot=u"col_sidebar") + page_one_ph_two = page_one.placeholders.get(slot=u"col_left") + page_one_ph_three = page_one.placeholders.get(slot=u"col_right") + org_placeholder_one_plugins = page_one_ph_one.get_plugins() self.assertEquals(len(org_placeholder_one_plugins), 1) org_placeholder_two_plugins = page_one_ph_two.get_plugins() @@ -813,9 +813,9 @@ def test_copy_page_nested_plugin_moved_parent_plugin(self): found_page = page_one_ph_three.page if page_one_ph_three else None self.assertEqual(found_page, page_one) page_two = self.reload(page_two) - page_two_ph_one = page_two.placeholders.get(slot = u"col_sidebar") - page_two_ph_two = page_two.placeholders.get(slot = u"col_left") - page_two_ph_three = page_two.placeholders.get(slot = u"col_right") + page_two_ph_one = page_two.placeholders.get(slot=u"col_sidebar") + page_two_ph_two = page_two.placeholders.get(slot=u"col_left") + page_two_ph_three = page_two.placeholders.get(slot=u"col_right") # check if there are multiple pages assigned to this placeholders found_page = page_two_ph_one.page if page_two_ph_one else None self.assertEqual(found_page, page_two) @@ -849,12 +849,12 @@ def test_copy_page_nested_plugin_moved_parent_plugin(self): count_plugins_copied = len(copied_placeholder_one_plugins) count_plugins_org = len(org_placeholder_one_plugins) msg = u"plugin count %s %s for placeholder one not equal" % (count_plugins_copied, count_plugins_org) - self.assertEquals(count_plugins_copied, count_plugins_org, msg) + self.assertEquals(count_plugins_copied, count_plugins_org, msg) # placeholder 2 count_plugins_copied = len(copied_placeholder_two_plugins) count_plugins_org = len(org_placeholder_two_plugins) msg = u"plugin count %s %s for placeholder two not equal" % (count_plugins_copied, count_plugins_org) - self.assertEquals(count_plugins_copied, count_plugins_org, msg) + self.assertEquals(count_plugins_copied, count_plugins_org, msg) # placeholder 3 count_plugins_copied = len(copied_placeholder_three_plugins) count_plugins_org = len(org_placeholder_three_plugins) @@ -866,14 +866,14 @@ def test_copy_page_nested_plugin_moved_parent_plugin(self): # do this iteration to find the real text plugin with the attached link # the inheritance mechanism for the cmsplugins works through # (tuple)get_plugin_instance() - for x in org_placeholder_three_plugins: + for x in org_placeholder_three_plugins: if x.plugin_type == u"TextPlugin": instance = x.get_plugin_instance()[0] if instance.body.startswith(pre_nesting_body): org_nested_text_plugin = instance break copied_nested_text_plugin = None - for x in copied_placeholder_three_plugins: + for x in copied_placeholder_three_plugins: if x.plugin_type == u"TextPlugin": instance = x.get_plugin_instance()[0] if instance.body.startswith(pre_nesting_body): @@ -905,4 +905,4 @@ def test_copy_page_nested_plugin_moved_parent_plugin(self): org_placeholder = org_link_child_plugin.placeholder copied_placeholder = copied_link_child_plugin.placeholder msg = u"placeholder of the orginal plugin and copied plugin are the same" - self.assertNotEqual(org_placeholder.id, copied_placeholder.id, msg) \ No newline at end of file + self.assertNotEqual(org_placeholder.id, copied_placeholder.id, msg) From 679339a5b442c001cf90b5cc88f7745d8f009aa0 Mon Sep 17 00:00:00 2001 From: Patrick Lauber Date: Mon, 17 Dec 2012 15:32:55 +0100 Subject: [PATCH 15/25] python2.5 compat --- cms/test_utils/cli.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cms/test_utils/cli.py b/cms/test_utils/cli.py index 430b9aff311..d07012dfdeb 100644 --- a/cms/test_utils/cli.py +++ b/cms/test_utils/cli.py @@ -10,11 +10,15 @@ DJANGO_1_3 = LooseVersion(django.get_version()) < LooseVersion('1.4') def configure(db_url, **extra): + splits = db_url.split("://") + scheme = splits[0] + splits[0] = "http" + db_url = "://".join(splits) db_splits = urlparse(db_url) from django.conf import settings os.environ['DJANGO_SETTINGS_MODULE'] = 'cms.test_utils.cli' if not 'DATABASES' in extra: - db_type = db_splits.scheme + db_type = scheme if db_type == 'sqlite': DB = { 'ENGINE': 'django.db.backends.sqlite3', From a8d9176566b0f2412f21b219e994c874b0566d64 Mon Sep 17 00:00:00 2001 From: Patrick Lauber Date: Mon, 17 Dec 2012 18:01:33 +0100 Subject: [PATCH 16/25] cleanup --- cms/test_utils/cli.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/cms/test_utils/cli.py b/cms/test_utils/cli.py index d07012dfdeb..ef6e5fbab07 100644 --- a/cms/test_utils/cli.py +++ b/cms/test_utils/cli.py @@ -61,7 +61,6 @@ def configure(db_url, **extra): DATABASES={ 'default': DB }, - SITE_ID=1, USE_I18N=True, MEDIA_ROOT='/media/', @@ -277,6 +276,4 @@ def configure(db_url, **extra): from south.management.commands import patch_for_test_db_setup patch_for_test_db_setup() from django.contrib import admin - - admin.autodiscover() From 439929796b72d098df9250dbedee487c54d8e497 Mon Sep 17 00:00:00 2001 From: Patrick Lauber Date: Tue, 18 Dec 2012 10:10:19 +0100 Subject: [PATCH 17/25] memory db for sqlite --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 238ba2881d6..cecddf6087c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,10 +4,10 @@ python: - "2.6" - "2.7" env: - - DJANGO=test_requirements/django-1.3.txt DB="sqlite://test.db/:memory:" + - DJANGO=test_requirements/django-1.3.txt DB="sqlite://:memory:" - DJANGO=test_requirements/django-1.3.txt DB="mysql://root@127.0.0.1/djangocms_test" - DJANGO=test_requirements/django-1.3.txt DB="postgres://postgres@127.0.0.1/djangocms_test" - - DJANGO=test_requirements/django-1.4.txt DB="sqlite://test.db/:memory:" + - DJANGO=test_requirements/django-1.4.txt DB="sqlite://:memory:" - DJANGO=test_requirements/django-1.4.txt DB="mysql://root@127.0.0.1/djangocms_test" - DJANGO=test_requirements/django-1.4.txt DB="postgres://postgres@127.0.0.1/djangocms_test" From 08de803f348b69aa1d09e03cb6b005e0764f6c76 Mon Sep 17 00:00:00 2001 From: Patrick Lauber Date: Tue, 18 Dec 2012 14:15:50 +0100 Subject: [PATCH 18/25] signal merge errors --- cms/signals.py | 33 +++++++-------------------------- 1 file changed, 7 insertions(+), 26 deletions(-) diff --git a/cms/signals.py b/cms/signals.py index bc137094b54..35696f5f2cd 100644 --- a/cms/signals.py +++ b/cms/signals.py @@ -66,7 +66,7 @@ def pre_save_title(instance, raw, **kwargs): if not instance.page.publisher_is_draft: menu_pool.clear(instance.page.site_id) - + if instance.id and not hasattr(instance, "tmp_path"): instance.tmp_path = None @@ -75,7 +75,7 @@ def pre_save_title(instance, raw, **kwargs): instance.tmp_path, instance.tmp_application_urls = \ Title.objects.filter(pk=instance.id).values_list('path', 'application_urls')[0] except IndexError: - pass # no Titles exist for this page yet + pass # no Titles exist for this page yet # Build path from parent page's path and slug if instance.has_url_overwrite and instance.path: @@ -90,7 +90,7 @@ def post_save_title(instance, raw, created, **kwargs): # Update descendants only if path changed application_changed = False prevent_descendants = hasattr(instance, 'tmp_prevent_descendant_update') - if instance.path != getattr(instance,'tmp_path',None) and not prevent_descendants: + if instance.path != getattr(instance, 'tmp_path', None) and not prevent_descendants: descendant_titles = Title.objects.filter( page__lft__gt=instance.page.lft, page__rght__lt=instance.page.rght, @@ -100,12 +100,12 @@ def post_save_title(instance, raw, created, **kwargs): ).order_by('page__tree_id', 'page__parent', 'page__lft') for descendant_title in descendant_titles: - descendant_title.path = '' # just reset path + descendant_title.path = '' # just reset path descendant_title.tmp_prevent_descendant_update = True if descendant_title.application_urls: application_changed = True descendant_title.save() - + if not prevent_descendants and \ (instance.application_urls != getattr(instance, 'tmp_application_urls', None) or application_changed): # fire it if we have some application linked to this page or some descendant @@ -135,19 +135,8 @@ def post_save_user(instance, raw, created, **kwargs): if not creator or not created or not hasattr(creator, 'pk'): return from django.db import connection - - # i'm not sure if there is a workaround for this, somebody any ideas? What - # we are doing here is creating PageUser on Top of existing user, i'll do it - # through plain SQL, its not nice, but... - - # TODO: find a better way than an raw sql !! - - cursor = connection.cursor() + page_user = PageUser(user_ptr_id=instance.pk, created_by=creator) - PageUser._meta.db_table, - instance.pk, - creator.pk - ) page_user.__dict__.update(instance.__dict__) page_user.save() @@ -165,16 +154,8 @@ def post_save_user_group(instance, raw, created, **kwargs): creator = get_current_user() if not creator or not created or creator.is_anonymous(): return - from django.db import connection - - # TODO: same as in post_save_user - raw sql is just not nice - workaround...? - - cursor = connection.cursor() - query = "INSERT INTO %s (group_ptr_id, created_by_id) VALUES (%d, %d)" % ( - PageUserGroup._meta.db_table, + page_user = PageUserGroup(user_ptr_id=instance.pk, created_by=creator) - creator.pk - ) page_user.__dict__.update(instance.__dict__) page_user.save() From 42ae4bf63b79f3195aeffea4053aa127d09316d1 Mon Sep 17 00:00:00 2001 From: Patrick Lauber Date: Tue, 18 Dec 2012 20:25:56 +0100 Subject: [PATCH 19/25] usage of db urls and cleanup --- .travis.yml | 7 ++++--- cms/models/pagemodel.py | 16 ++++++++-------- cms/test_utils/cli.py | 41 ++--------------------------------------- runtests.py | 14 +++++++------- 4 files changed, 21 insertions(+), 57 deletions(-) diff --git a/.travis.yml b/.travis.yml index cecddf6087c..90f2cfc55f6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,17 +4,18 @@ python: - "2.6" - "2.7" env: - - DJANGO=test_requirements/django-1.3.txt DB="sqlite://:memory:" + - DJANGO=test_requirements/django-1.3.txt DB="sqlite://localhost/:memory:" - DJANGO=test_requirements/django-1.3.txt DB="mysql://root@127.0.0.1/djangocms_test" - DJANGO=test_requirements/django-1.3.txt DB="postgres://postgres@127.0.0.1/djangocms_test" - - DJANGO=test_requirements/django-1.4.txt DB="sqlite://:memory:" + - DJANGO=test_requirements/django-1.4.txt DB="sqlite://localhost/:memory:" - DJANGO=test_requirements/django-1.4.txt DB="mysql://root@127.0.0.1/djangocms_test" - DJANGO=test_requirements/django-1.4.txt DB="postgres://postgres@127.0.0.1/djangocms_test" before_script: - sh -c "if [ '$DB' = 'postgres://postgres@127.0.0.1/djangocms_test' ]; then psql -c 'DROP DATABASE IF EXISTS djangocms_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'postgres://postgres@127.0.0.1/djangocms_test' ]; then psql -c 'create database djangocms_test;' -U postgres; fi" - - sh -c "if [ '$DB' = 'mysql://root@127.0.0.1/djangocms_test' ]; then mysql -e 'create database IF NOT EXISTS djangocms_test'; fi" + - sh -c "if [ '$DB' = 'mysql://root@127.0.0.1/djangocms_test' ]; then mysql -e 'create database IF NOT EXISTS djangocms_test CHARACTER SET utf8 + COLLATE utf8_general_ci;' fi" install: - pip install -q -r $DJANGO --use-mirrors diff --git a/cms/models/pagemodel.py b/cms/models/pagemodel.py index e115c870478..3f8dc5eb298 100644 --- a/cms/models/pagemodel.py +++ b/cms/models/pagemodel.py @@ -72,7 +72,7 @@ class Page(MPTTModel): # Publisher fields moderator_state = models.SmallIntegerField(_('moderator state'), default=0, blank=True, editable=False) publisher_is_draft = models.BooleanField(default=1, editable=False, db_index=True) - #This is misnamed - the one-to-one relation is populated on both ends + # This is misnamed - the one-to-one relation is populated on both ends publisher_public = models.OneToOneField('self', related_name='publisher_draft', null=True, editable=False) publisher_state = models.SmallIntegerField(default=0, editable=False, db_index=True) @@ -303,7 +303,7 @@ def copy_page(self, target, site, position='first-child', # invalidate the menu for this site menu_pool.clear(site_id=site.pk) - return page_copy # return the page_copy or None + return page_copy # return the page_copy or None def save(self, no_signals=False, commit=True, **kwargs): """ @@ -465,7 +465,7 @@ def unpublish(self): if not self.publisher_is_draft: raise PublicIsUnmodifiable('The public instance cannot be unpublished. Use draft.') - #First, make sure we are in the correct state + # First, make sure we are in the correct state self.published = False self.save() public_page = self.get_public_object() @@ -536,7 +536,7 @@ def delete_with_public(self): """ descendants = list(self.get_descendants().order_by('level')) descendants.reverse() - #TODO: Use a better exception class - PermissionDenied is not quite right + # TODO: Use a better exception class - PermissionDenied is not quite right for page in descendants: if not page.delete_requested(): raise PermissionDenied('There are descendant pages not marked for deletion') @@ -596,7 +596,7 @@ def get_cached_ancestors(self, ascending=True): self.ancestors_descending = list(self.get_ancestors(ascending)) return self.ancestors_descending - ### Title object access + # ## Title object access def get_title_obj(self, language=None, fallback=True, version_id=None, force_reload=False): """Helper function for accessing wanted / current title. @@ -779,7 +779,7 @@ def has_view_permission(self, request): return (user_perm or generic_perm) else: - #anonymous user + # anonymous user if is_restricted or not settings.CMS_PUBLIC_FOR == 'all': # anyonymous user, page has restriction and global access is permitted return False @@ -863,7 +863,7 @@ def is_home(self): def get_home_pk_cache(self): attr = "%s_home_pk_cache_%s" % (self.publisher_is_draft and "draft" or "public", self.site_id) - if not hasattr(self, attr) or getattr(self, attr) is None: + if getattr(self, attr, None) is None: setattr(self, attr, self.get_object_queryset().get_home(self.site).pk) return getattr(self, attr) @@ -1029,7 +1029,7 @@ def _publisher_save_public(self, obj): prev_sibling = self.get_previous_filtered_sibling(**filters) public_prev_sib = prev_sibling.publisher_public if prev_sibling else None - if not self.publisher_public_id: # first time published + if not self.publisher_public_id: # first time published # is there anybody on left side? if public_prev_sib: obj.insert_at(public_prev_sib, position='right', save=False) diff --git a/cms/test_utils/cli.py b/cms/test_utils/cli.py index ef6e5fbab07..44c24644c41 100644 --- a/cms/test_utils/cli.py +++ b/cms/test_utils/cli.py @@ -2,7 +2,7 @@ from distutils.version import LooseVersion import django import os -from urlparse import urlparse +import dj_database_url gettext = lambda s: s @@ -10,49 +10,12 @@ DJANGO_1_3 = LooseVersion(django.get_version()) < LooseVersion('1.4') def configure(db_url, **extra): - splits = db_url.split("://") - scheme = splits[0] - splits[0] = "http" - db_url = "://".join(splits) - db_splits = urlparse(db_url) from django.conf import settings os.environ['DJANGO_SETTINGS_MODULE'] = 'cms.test_utils.cli' if not 'DATABASES' in extra: - db_type = scheme - if db_type == 'sqlite': - DB = { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': db_splits.netloc, - } - elif db_type == 'postgres': - DB = { - 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'NAME': db_splits.path[1:], - } - elif db_type == 'mysql': - DB = { - 'ENGINE': 'django.db.backends.mysql', - 'NAME': db_splits.path[1:], - 'TEST_CHARSET':'utf8', - 'TEST_COLLATION':'utf8_general_ci', - 'OPTIONS': { - "init_command": "SET storage_engine=INNODB", - }, - } - if db_splits.username: - DB['USER'] = db_splits.username - if db_splits.password: - DB['PASSWORD'] = db_splits.password - if db_splits.hostname: - DB['HOST'] = db_splits.hostname - try: - if db_splits.port: - DB['PORT'] = db_splits.port - except ValueError: - pass + DB = dj_database_url.parse(db_url) else: DB = {} - print DB defaults = dict( CACHE_BACKEND='locmem:///', DEBUG=True, diff --git a/runtests.py b/runtests.py index c9af070d0c6..0da23fa95a1 100755 --- a/runtests.py +++ b/runtests.py @@ -7,10 +7,11 @@ import sys import warnings from urlparse import urlparse +import os -def main(test_runner='cms.test_utils.runners.NormalTestRunner', junit_output_dir='.', - time_tests=False, verbosity=1, failfast=False, test_labels=None, db_url="sqlite://:memory:"): +def main(db_url, test_runner='cms.test_utils.runners.NormalTestRunner', junit_output_dir='.', + time_tests=False, verbosity=1, failfast=False, test_labels=None): if not test_labels: test_labels = ['cms'] with temp_dir() as STATIC_ROOT: @@ -43,7 +44,7 @@ def main(test_runner='cms.test_utils.runners.NormalTestRunner', junit_output_dir parser.add_argument('--verbosity', default=1) parser.add_argument('--time-tests', action='store_true', default=False, dest='time_tests') - parser.add_argument('--db', default='sqlite://:memory:', dest='db') + parser.add_argument('--db', default='sqlite://localhost/:memory:', dest='db') parser.add_argument('test_labels', nargs='*') args = parser.parse_args() if getattr(args, 'jenkins', False): @@ -53,8 +54,7 @@ def main(test_runner='cms.test_utils.runners.NormalTestRunner', junit_output_dir junit_output_dir = getattr(args, 'jenkins_data_dir', '.') time_tests = getattr(args, 'time_tests', False) test_labels = ['cms.%s' % label for label in args.test_labels] - db_url = args.db - main(test_runner=test_runner, junit_output_dir=junit_output_dir, time_tests=time_tests, - verbosity=args.verbosity, failfast=args.failfast, test_labels=test_labels, - db_url=db_url) + db_url = os.environ.get('DATABASE_URL', args.db) + main(db_url, test_runner=test_runner, junit_output_dir=junit_output_dir, time_tests=time_tests, + verbosity=args.verbosity, failfast=args.failfast, test_labels=test_labels) From de89569b522b5da7468a217036d9cad5eeec79c7 Mon Sep 17 00:00:00 2001 From: Patrick Lauber Date: Tue, 18 Dec 2012 20:46:37 +0100 Subject: [PATCH 20/25] missing requirement --- test_requirements/requirements_base.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/test_requirements/requirements_base.txt b/test_requirements/requirements_base.txt index 0983bc1f55e..116aa57711b 100644 --- a/test_requirements/requirements_base.txt +++ b/test_requirements/requirements_base.txt @@ -9,3 +9,4 @@ django-mptt==0.5.2 django-sekizai>=0.6.1 argparse mysql-python +dj-database-url From 4b84a9db2b3a8f1a51339995385f0145f84f281b Mon Sep 17 00:00:00 2001 From: Patrick Lauber Date: Tue, 18 Dec 2012 21:02:21 +0100 Subject: [PATCH 21/25] cleanup2 --- cms/tests/management.py | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/cms/tests/management.py b/cms/tests/management.py index 4fcaf8b3019..dfacd09e16a 100644 --- a/cms/tests/management.py +++ b/cms/tests/management.py @@ -21,12 +21,12 @@ def test_list_apphooks(self): apps = ["cms", "menus", "sekizai", "cms.test_utils.project.sampleapp"] with SettingsOverride(INSTALLED_APPS=apps): create_page('Hello Title', "nav_playground.html", "en", apphook=APPHOOK) - self.assertEqual(Title.objects.filter(application_urls=APPHOOK).count(), 1) + self.assertEqual(Title.objects.filter(application_urls=APPHOOK).count(), 1) command = cms.Command() command.stdout = out command.handle("list", "apphooks", interactive=False) self.assertEqual(out.getvalue(), "SampleApp\n") - + def test_uninstall_apphooks_without_apphook(self): out = StringIO() command = cms.Command() @@ -56,17 +56,13 @@ def test_list_plugins(self): add_plugin(placeholder, "LinkPlugin", "en", name="A Link", url="https://www.django-cms.org") self.assertEqual( - CMSPlugin.objects.filter(plugin_type=PLUGIN).count(), - 2) + CMSPlugin.objects.filter(plugin_type=PLUGIN).count(), + 2) self.assertEqual( - CMSPlugin.objects.filter(plugin_type="LinkPlugin").count(), - 1) - for plugin in plugin_report(): - print plugin - # command.stdout = out - # command.handle("list", "plugins", interactive=False) - # self.assertEqual(out.getvalue(), "LinkPlugin\nTextPlugin\n") - + CMSPlugin.objects.filter(plugin_type="LinkPlugin").count(), + 1) + + def test_uninstall_plugins_without_plugin(self): out = StringIO() command = cms.Command() From 89f09ac85385d253e9e489695240230d7659d9ad Mon Sep 17 00:00:00 2001 From: Patrick Lauber Date: Tue, 18 Dec 2012 21:17:58 +0100 Subject: [PATCH 22/25] travis error? --- .travis.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 90f2cfc55f6..e8a1cd1eb1a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,12 +4,12 @@ python: - "2.6" - "2.7" env: - - DJANGO=test_requirements/django-1.3.txt DB="sqlite://localhost/:memory:" - - DJANGO=test_requirements/django-1.3.txt DB="mysql://root@127.0.0.1/djangocms_test" - - DJANGO=test_requirements/django-1.3.txt DB="postgres://postgres@127.0.0.1/djangocms_test" - - DJANGO=test_requirements/django-1.4.txt DB="sqlite://localhost/:memory:" - - DJANGO=test_requirements/django-1.4.txt DB="mysql://root@127.0.0.1/djangocms_test" - - DJANGO=test_requirements/django-1.4.txt DB="postgres://postgres@127.0.0.1/djangocms_test" + - DJANGO=test_requirements/django-1.3.txt DB='sqlite://localhost/:memory:' + - DJANGO=test_requirements/django-1.3.txt DB='mysql://root@127.0.0.1/djangocms_test' + - DJANGO=test_requirements/django-1.3.txt DB='postgres://postgres@127.0.0.1/djangocms_test' + - DJANGO=test_requirements/django-1.4.txt DB='sqlite://localhost/:memory:' + - DJANGO=test_requirements/django-1.4.txt DB='mysql://root@127.0.0.1/djangocms_test' + - DJANGO=test_requirements/django-1.4.txt DB='postgres://postgres@127.0.0.1/djangocms_test' before_script: - sh -c "if [ '$DB' = 'postgres://postgres@127.0.0.1/djangocms_test' ]; then psql -c 'DROP DATABASE IF EXISTS djangocms_test;' -U postgres; fi" From 4cc89593034381789873f9832eedcdc00a6c5572 Mon Sep 17 00:00:00 2001 From: Patrick Lauber Date: Tue, 18 Dec 2012 21:41:53 +0100 Subject: [PATCH 23/25] yaml syntax error --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index e8a1cd1eb1a..00a7588a5f7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,8 +14,7 @@ env: before_script: - sh -c "if [ '$DB' = 'postgres://postgres@127.0.0.1/djangocms_test' ]; then psql -c 'DROP DATABASE IF EXISTS djangocms_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'postgres://postgres@127.0.0.1/djangocms_test' ]; then psql -c 'create database djangocms_test;' -U postgres; fi" - - sh -c "if [ '$DB' = 'mysql://root@127.0.0.1/djangocms_test' ]; then mysql -e 'create database IF NOT EXISTS djangocms_test CHARACTER SET utf8 - COLLATE utf8_general_ci;' fi" + - sh -c "if [ '$DB' = 'mysql://root@127.0.0.1/djangocms_test' ]; then mysql -e 'create database IF NOT EXISTS djangocms_test CHARACTER SET utf8 COLLATE utf8_general_ci;' fi" install: - pip install -q -r $DJANGO --use-mirrors From 1acbc7824ef1b9e7cce56cf5c7a992355392a4ab Mon Sep 17 00:00:00 2001 From: Patrick Lauber Date: Tue, 18 Dec 2012 21:53:53 +0100 Subject: [PATCH 24/25] syntax fix --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 00a7588a5f7..78d742c0e0f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ env: before_script: - sh -c "if [ '$DB' = 'postgres://postgres@127.0.0.1/djangocms_test' ]; then psql -c 'DROP DATABASE IF EXISTS djangocms_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'postgres://postgres@127.0.0.1/djangocms_test' ]; then psql -c 'create database djangocms_test;' -U postgres; fi" - - sh -c "if [ '$DB' = 'mysql://root@127.0.0.1/djangocms_test' ]; then mysql -e 'create database IF NOT EXISTS djangocms_test CHARACTER SET utf8 COLLATE utf8_general_ci;' fi" + - sh -c "if [ '$DB' = 'mysql://root@127.0.0.1/djangocms_test' ]; then mysql -e 'create database IF NOT EXISTS djangocms_test CHARACTER SET utf8 COLLATE utf8_general_ci;'; fi" install: - pip install -q -r $DJANGO --use-mirrors From 113e3865f4a015179a88268cefb58cfbfd0c7d65 Mon Sep 17 00:00:00 2001 From: Patrick Lauber Date: Wed, 19 Dec 2012 10:24:33 +0100 Subject: [PATCH 25/25] skip added --- cms/tests/menu.py | 99 ++++++++++++++++++++++++----------------------- 1 file changed, 51 insertions(+), 48 deletions(-) diff --git a/cms/tests/menu.py b/cms/tests/menu.py index 95abb4561e6..81ec1ac58a4 100644 --- a/cms/tests/menu.py +++ b/cms/tests/menu.py @@ -21,6 +21,7 @@ from menus.menu_pool import menu_pool, _build_nodes_inner_for_one_menu from menus.models import CacheKey from menus.utils import mark_descendants, find_selected, cut_levels +from django.utils.unittest.case import skipUnless @@ -85,7 +86,7 @@ def test_menu_failfast_on_invalid_usage(self): def test_basic_cms_menu(self): self.assertEqual(len(menu_pool.menus), 1) with force_language("en"): - response = self.client.get(self.get_pages_root()) # path = '/' + response = self.client.get(self.get_pages_root()) # path = '/' self.assertEquals(response.status_code, 200) request = self.get_request() @@ -96,7 +97,7 @@ def test_basic_cms_menu(self): def test_show_menu(self): context = self.get_context() - # test standard show_menu + # test standard show_menu tpl = Template("{% load menu_tags %}{% show_menu %}") tpl.render(context) nodes = context['children'] @@ -111,21 +112,22 @@ def test_show_menu(self): self.assertEqual(nodes[1].sibling, True) self.assertEqual(nodes[1].selected, False) + @skipUnless(settings.DATABASES['default']['ENGINE'] == 'django.db.backends.sqlite3', 'transaction queries') def test_show_menu_num_queries(self): + print settings.DATABASES['default']['ENGINE'] context = self.get_context() - # test standard show_menu - if settings.DATABASES['default']['ENGINE'] == 'django.db.backends.sqlite': - with self.assertNumQueries(5): - """ - The queries should be: - get all pages - get all page permissions - get all titles - get the menu cache key - set the menu cache key - """ - tpl = Template("{% load menu_tags %}{% show_menu %}") - tpl.render(context) + # test standard show_menu + with self.assertNumQueries(5): + """ + The queries should be: + get all pages + get all page permissions + get all titles + get the menu cache key + set the menu cache key + """ + tpl = Template("{% load menu_tags %}{% show_menu %}") + tpl.render(context) def test_show_menu_cache_key_leak(self): context = self.get_context() @@ -167,7 +169,7 @@ def test_only_active_tree(self): def test_only_one_active_level(self): context = self.get_context() - # test standard show_menu + # test standard show_menu tpl = Template("{% load menu_tags %}{% show_menu 0 100 0 1 %}") tpl.render(context) nodes = context['children'] @@ -177,7 +179,7 @@ def test_only_one_active_level(self): def test_only_level_zero(self): context = self.get_context() - # test standard show_menu + # test standard show_menu tpl = Template("{% load menu_tags %}{% show_menu 0 0 0 0 %}") tpl.render(context) nodes = context['children'] @@ -187,7 +189,7 @@ def test_only_level_zero(self): def test_only_level_one(self): context = self.get_context() - # test standard show_menu + # test standard show_menu tpl = Template("{% load menu_tags %}{% show_menu 1 1 100 100 %}") tpl.render(context) nodes = context['children'] @@ -198,7 +200,7 @@ def test_only_level_one(self): def test_only_level_one_active(self): context = self.get_context() - # test standard show_menu + # test standard show_menu tpl = Template("{% load menu_tags %}{% show_menu 1 1 0 100 %}") tpl.render(context) nodes = context['children'] @@ -208,7 +210,7 @@ def test_only_level_one_active(self): def test_level_zero_and_one(self): context = self.get_context() - # test standard show_menu + # test standard show_menu tpl = Template("{% load menu_tags %}{% show_menu 0 1 100 100 %}") tpl.render(context) nodes = context['children'] @@ -218,7 +220,7 @@ def test_level_zero_and_one(self): def test_show_submenu(self): context = self.get_context() - # test standard show_menu + # test standard show_menu tpl = Template("{% load menu_tags %}{% show_sub_menu %}") tpl.render(context) nodes = context['children'] @@ -693,22 +695,22 @@ def test_show_submenu(self): self.assertEqual(len(nodes), 1) self.assertEqual(nodes[0].id, subpage.pk) + @skipUnless(settings.DATABASES['default']['ENGINE'] == 'django.db.backends.sqlite3', 'transaction queries') def test_show_submenu_num_queries(self): page = self.get_page(6) context = self.get_context(page.get_absolute_url()) # test standard show_menu - if settings.DATABASES['default']['ENGINE'] == 'django.db.backends.sqlite': - with self.assertNumQueries(5): - """ - The queries should be: - get all pages - get all page permissions - get all titles - get the menu cache key - set the menu cache key - """ - tpl = Template("{% load menu_tags %}{% show_sub_menu %}") - tpl.render(context) + with self.assertNumQueries(5): + """ + The queries should be: + get all pages + get all page permissions + get all titles + get the menu cache key + set the menu cache key + """ + tpl = Template("{% load menu_tags %}{% show_sub_menu %}") + tpl.render(context) class ShowMenuBelowIdTests(BaseMenuTest): def test_not_in_navigation(self): @@ -742,6 +744,7 @@ def test_not_in_navigation(self): child = children[0] self.assertEqual(child.id, c.publisher_public.id) + @skipUnless(settings.DATABASES['default']['ENGINE'] == 'django.db.backends.sqlite3', 'transaction queries') def test_not_in_navigation_num_queries(self): """ Test for issue 521 @@ -761,21 +764,21 @@ def test_not_in_navigation_num_queries(self): published=True, in_navigation=True) create_page('D', 'nav_playground.html', 'en', parent=self.reload(b), published=True, in_navigation=False) - if settings.DATABASES['default']['ENGINE'] == 'django.db.backends.sqlite': - with LanguageOverride('en'): - context = self.get_context(a.get_absolute_url()) - with self.assertNumQueries(5): - """ - The queries should be: - get all pages - get all page permissions - get all titles - get the menu cache key - set the menu cache key - """ - # Actually seems to run: - tpl = Template("{% load menu_tags %}{% show_menu_below_id 'a' 0 100 100 100 %}") - tpl.render(context) + + with LanguageOverride('en'): + context = self.get_context(a.get_absolute_url()) + with self.assertNumQueries(5): + """ + The queries should be: + get all pages + get all page permissions + get all titles + get the menu cache key + set the menu cache key + """ + # Actually seems to run: + tpl = Template("{% load menu_tags %}{% show_menu_below_id 'a' 0 100 100 100 %}") + tpl.render(context) class ViewPermissionMenuTests(SettingsOverrideTestCase):