wagtail-modeltranslation/wagtail_modeltranslation/tests/tests.py
Dario Marcelino 11cbedfe13 #191, drop support for Wagtail < 1.8
And inherently Django < 1.8
2018-04-24 16:52:15 +01:00

976 lines
44 KiB
Python
Executable file

# coding: utf-8
import imp
import django
from django.apps import apps as django_apps
from django.core.cache import cache
from django.core.exceptions import ValidationError
from django.core.management import call_command
from django.http import HttpRequest
from django.test import TestCase, TransactionTestCase
from django.test.client import RequestFactory
from django.test.utils import override_settings
from django.utils.translation import get_language, trans_real
from modeltranslation import settings as mt_settings, translator
from wagtail import VERSION
from .util import page_factory
from wagtail_modeltranslation.tests.test_settings import TEST_SETTINGS
models = translation = None
request_factory = RequestFactory()
class dummy_context_mgr():
def __enter__(self):
return None
def __exit__(self, _type, value, traceback):
return False
@override_settings(**TEST_SETTINGS)
class WagtailModeltranslationTransactionTestBase(TransactionTestCase):
cache = django_apps
synced = False
@classmethod
def setUpClass(cls):
"""
Prepare database:
* Call syncdb to create tables for tests.models (since during
default testrunner's db creation wagtail_modeltranslation.tests was not in INSTALLED_APPS
"""
super(WagtailModeltranslationTransactionTestBase, cls).setUpClass()
if not WagtailModeltranslationTransactionTestBase.synced:
# In order to perform only one syncdb
WagtailModeltranslationTransactionTestBase.synced = True
mgr = dummy_context_mgr()
with mgr:
# 1. Reload translation in case USE_I18N was False
from django.utils import translation as dj_trans
imp.reload(dj_trans)
# 2. Reload MT because LANGUAGES likely changed.
imp.reload(mt_settings)
imp.reload(translator)
# reload the translation module to register the Page model
# and also edit_handlers so any patches made to Page are reapplied
import sys
del cls.cache.all_models['wagtailcore']
sys.modules.pop('wagtail_modeltranslation.translation.pagetr', None)
from wagtail_modeltranslation import translation as wag_translation
try:
from wagtail.admin import edit_handlers
sys.modules.pop('wagtail.core.models', None)
except ImportError:
from wagtail.wagtailadmin import edit_handlers
sys.modules.pop('wagtail.wagtailcore.models', None)
imp.reload(wag_translation)
imp.reload(edit_handlers) # so Page can be repatched by edit_handlers
wagtailcore_args = []
if django.VERSION < (1, 11):
wagtailcore_args = [cls.cache.all_models['wagtailcore']]
cls.cache.get_app_config('wagtailcore').import_models(*wagtailcore_args)
# Reload the patching class to update the imported translator
# in order to include the newly registered models
from wagtail_modeltranslation import patch_wagtailadmin
imp.reload(patch_wagtailadmin)
# 3. Reset test models (because autodiscover have already run, those models
# have translation fields, but for languages previously defined. We want
# to be sure that 'de' and 'en' are available)
del cls.cache.all_models['tests']
sys.modules.pop('wagtail_modeltranslation.tests.models', None)
sys.modules.pop('wagtail_modeltranslation.tests.translation', None)
tests_args = []
if django.VERSION < (1, 11):
tests_args = [cls.cache.all_models['tests']]
cls.cache.get_app_config('tests').import_models(*tests_args)
# 4. Autodiscover
from modeltranslation.models import handle_translation_registrations
handle_translation_registrations()
# 5. makemigrations
from django.db import connections, DEFAULT_DB_ALIAS
call_command('makemigrations', verbosity=2, interactive=False)
# 6. Syncdb
call_command('migrate', verbosity=0, interactive=False, run_syncdb=True,
database=connections[DEFAULT_DB_ALIAS].alias)
# 7. Make sure Page translation fields are created
call_command('sync_page_translation_fields', interactive=False, verbosity=0)
# 8. patch wagtail models
from wagtail_modeltranslation.patch_wagtailadmin import patch_wagtail_models
patch_wagtail_models()
# A rather dirty trick to import models into module namespace, but not before
# tests app has been added into INSTALLED_APPS and loaded
# (that's why this is not imported in normal import section)
global models, translation
from wagtail_modeltranslation.tests import models, translation # NOQA
def setUp(self):
self._old_language = get_language()
trans_real.activate('de')
# ensure we have a fresh site cache
for language in mt_settings.AVAILABLE_LANGUAGES:
cache.delete('wagtail_site_root_paths_{}'.format(language))
def tearDown(self):
trans_real.activate(self._old_language)
class WagtailModeltranslationTestBase(TestCase, WagtailModeltranslationTransactionTestBase):
pass
class WagtailModeltranslationTest(WagtailModeltranslationTestBase):
"""
Test of the modeltranslation features with Wagtail models (Page and Snippet)
"""
@classmethod
def setUpClass(cls):
super(WagtailModeltranslationTest, cls).setUpClass()
# Delete the default wagtail pages from db
try:
from wagtail.core.models import Page
except ImportError:
from wagtail.wagtailcore.models import Page
Page.objects.delete()
def test_page_fields(self):
fields = dir(models.PatchTestPage())
# Check if Page fields are being created
self.assertIn('title_en', fields)
self.assertIn('title_de', fields)
self.assertIn('slug_en', fields)
self.assertIn('slug_de', fields)
self.assertIn('seo_title_en', fields)
self.assertIn('seo_title_de', fields)
self.assertIn('search_description_en', fields)
self.assertIn('search_description_de', fields)
self.assertIn('url_path_en', fields)
self.assertIn('url_path_de', fields)
# Check if subclass fields are being created
self.assertIn('description_en', fields)
self.assertIn('description_de', fields)
def test_snippet_fields(self):
fields = dir(models.PatchTestSnippet())
self.assertIn('name', fields)
self.assertIn('name_en', fields)
self.assertIn('name_de', fields)
def check_fieldpanel_patching(self, panels, name='name'):
# Check if there is one panel per language
self.assertEquals(len(panels), 2)
# Validate if the created panels are instances of FieldPanel
try:
from wagtail.admin.edit_handlers import FieldPanel
except ImportError:
from wagtail.wagtailadmin.edit_handlers import FieldPanel
self.assertIsInstance(panels[0], FieldPanel)
self.assertIsInstance(panels[1], FieldPanel)
# Check if both field names were correctly created
fields = [panel.field_name for panel in panels]
self.assertListEqual([name + '_de', name + '_en'], fields)
def check_imagechooserpanel_patching(self, panels, name='image'):
# Check if there is one panel per language
self.assertEquals(len(panels), 2)
try:
from wagtail.images.edit_handlers import ImageChooserPanel
except ImportError:
from wagtail.wagtailimages.edit_handlers import ImageChooserPanel
self.assertIsInstance(panels[0], ImageChooserPanel)
self.assertIsInstance(panels[1], ImageChooserPanel)
# Check if both field names were correctly created
fields = [panel.field_name for panel in panels]
self.assertListEqual([name + '_de', name + '_en'], fields)
def check_fieldrowpanel_patching(self, panels, child_name='other_name'):
# Check if the fieldrowpanel still exists
self.assertEqual(len(panels), 1)
try:
from wagtail.admin.edit_handlers import FieldRowPanel
except ImportError:
from wagtail.wagtailadmin.edit_handlers import FieldRowPanel
self.assertIsInstance(panels[0], FieldRowPanel)
# Check if the children were correctly patched using the fieldpanel test
children_panels = panels[0].children
self.check_fieldpanel_patching(panels=children_panels, name=child_name)
def check_streamfieldpanel_patching(self, panels):
# Check if there is one panel per language
self.assertEquals(len(panels), 2)
try:
from wagtail.admin.edit_handlers import StreamFieldPanel
except ImportError:
from wagtail.wagtailadmin.edit_handlers import StreamFieldPanel
self.assertIsInstance(panels[0], StreamFieldPanel)
self.assertIsInstance(panels[1], StreamFieldPanel)
# Check if both field names were correctly created
fields = [panel.field_name for panel in panels]
self.assertListEqual(['body_de', 'body_en'], fields)
# Fetch one of the streamfield panels to see if the block was correctly created
child_block = list(models.StreamFieldPanelPage.body_en.field.stream_block.child_blocks.items())
self.assertEquals(len(child_block), 1)
try:
from wagtail.core.blocks import CharBlock
except ImportError:
from wagtail.wagtailcore.blocks import CharBlock
self.assertEquals(child_block[0][0], 'text')
self.assertIsInstance(child_block[0][1], CharBlock)
if VERSION >= (1, 12):
# Original and Default language StreamFields are required
self.assertFalse(models.StreamFieldPanelPage.body.field.blank)
self.assertTrue(models.StreamFieldPanelPage.body.field.stream_block.required)
self.assertFalse(models.StreamFieldPanelPage.body_de.field.blank)
self.assertTrue(models.StreamFieldPanelPage.body_de.field.stream_block.required)
# Translated StreamField is optional
self.assertTrue(models.StreamFieldPanelPage.body_en.field.blank)
self.assertFalse(models.StreamFieldPanelPage.body_en.field.stream_block.required)
def check_multipanel_patching(self, panels):
# There are three multifield panels, one for each of the available
# children panels
self.assertEquals(len(panels), 3)
try:
from wagtail.admin.edit_handlers import MultiFieldPanel
except ImportError:
from wagtail.wagtailadmin.edit_handlers import MultiFieldPanel
self.assertIsInstance(panels[0], MultiFieldPanel)
self.assertIsInstance(panels[1], MultiFieldPanel)
self.assertIsInstance(panels[2], MultiFieldPanel)
fieldpanel = panels[0].children
imagechooser = panels[1].children
fieldrow = panels[2].children
self.check_fieldpanel_patching(panels=fieldpanel)
self.check_imagechooserpanel_patching(panels=imagechooser)
self.check_fieldrowpanel_patching(panels=fieldrow)
def check_inlinepanel_patching(self, panels):
# The inline panel has all the available combination of children panels making
# a grand total of 8 panels
self.assertEqual(len(panels), 8)
# The first 2 panels are fieldpanels, the following 2 are imagechooserpanels,
# next is a fieldrowpanel and finally there are 3 multifieldpanels
self.check_fieldpanel_patching(panels=panels[0:2], name='field_name')
self.check_imagechooserpanel_patching(panels=panels[2:4], name='image_chooser')
self.check_fieldrowpanel_patching(panels=panels[4:5], child_name='fieldrow_name')
self.check_multipanel_patching(panels=panels[5:8])
def test_page_patching(self):
self.check_fieldpanel_patching(panels=models.FieldPanelPage.content_panels)
self.check_imagechooserpanel_patching(panels=models.ImageChooserPanelPage.content_panels)
self.check_fieldrowpanel_patching(panels=models.FieldRowPanelPage.content_panels)
self.check_streamfieldpanel_patching(panels=models.StreamFieldPanelPage.content_panels)
self.check_multipanel_patching(panels=models.MultiFieldPanelPage.content_panels)
# In spite of the model being the InlinePanelPage the panels are patch on the related model
# which is the PageInlineModel
self.check_inlinepanel_patching(panels=models.PageInlineModel.panels)
def test_snippet_patching(self):
self.check_fieldpanel_patching(panels=models.FieldPanelSnippet.panels)
self.check_imagechooserpanel_patching(panels=models.ImageChooserPanelSnippet.panels)
self.check_fieldrowpanel_patching(panels=models.FieldRowPanelSnippet.panels)
self.check_streamfieldpanel_patching(panels=models.StreamFieldPanelSnippet.panels)
self.check_multipanel_patching(panels=models.MultiFieldPanelSnippet.panels)
# In spite of the model being the InlinePanelSnippet the panels are patch on the related model
# which is the SnippetInlineModel
self.check_inlinepanel_patching(panels=models.SnippetInlineModel.panels)
def test_page_form(self):
"""
In this test we use the InlinePanelPage model because it has all the possible "patchable" fields
so if the created form has all fields the the form was correctly patched
"""
page_edit_handler = models.InlinePanelPage.get_edit_handler()
if VERSION < (2,):
form = page_edit_handler.get_form_class(models.InlinePanelPage)
else:
form = page_edit_handler.get_form_class()
page_base_fields = ['slug_de', 'slug_en', 'seo_title_de', 'seo_title_en', 'search_description_de',
'search_description_en', u'show_in_menus', u'go_live_at', u'expire_at']
try:
# python 3
self.assertCountEqual(page_base_fields, form.base_fields.keys())
except AttributeError:
# python 2.7
self.assertItemsEqual(page_base_fields, form.base_fields.keys())
inline_model_fields = ['field_name_de', 'field_name_en', 'image_chooser_de', 'image_chooser_en',
'fieldrow_name_de', 'fieldrow_name_en', 'name_de', 'name_en', 'image_de', 'image_en',
'other_name_de', 'other_name_en']
related_formset_form = form.formsets['related_page_model'].form
try:
# python 3
self.assertCountEqual(inline_model_fields, related_formset_form.base_fields.keys())
except AttributeError:
# python 2.7
self.assertItemsEqual(inline_model_fields, related_formset_form.base_fields.keys())
def test_snippet_form(self):
"""
In this test we use the InlinePanelSnippet model because it has all the possible "patchable" fields
so if the created form has all fields the the form was correctly patched
"""
try:
from wagtail.snippets.views.snippets import get_snippet_edit_handler
except ImportError:
from wagtail.wagtailsnippets.views.snippets import get_snippet_edit_handler
snippet_edit_handler = get_snippet_edit_handler(models.InlinePanelSnippet)
if VERSION < (2,):
form = snippet_edit_handler.get_form_class(models.InlinePanelSnippet)
else:
form = snippet_edit_handler.get_form_class()
inline_model_fields = ['field_name_de', 'field_name_en', 'image_chooser_de', 'image_chooser_en',
'fieldrow_name_de', 'fieldrow_name_en', 'name_de', 'name_en', 'image_de', 'image_en',
'other_name_de', 'other_name_en']
related_formset_form = form.formsets['related_snippet_model'].form
try:
# python 3
self.assertCountEqual(inline_model_fields, related_formset_form.base_fields.keys())
except AttributeError:
# python 2.7
self.assertItemsEqual(inline_model_fields, related_formset_form.base_fields.keys())
def test_duplicate_slug(self):
try:
from wagtail.core.models import Site
except ImportError:
from wagtail.wagtailcore.models import Site
# Create a test Site with a root page
root = models.TestRootPage(title='title', depth=1, path='0001', slug_en='slug_en', slug_de='slug_de')
root.save()
site = Site(root_page=root)
site.save()
# Add children to the root
child = root.add_child(
instance=models.TestSlugPage1(title='child1', slug_de='child', slug_en='child-en', depth=2, path='00010001')
)
child2 = root.add_child(
instance=models.TestSlugPage2(title='child2', slug_de='child-2', slug_en='child2-en', depth=2,
path='00010002')
)
# Clean should work fine as the two slugs are different
child2.clean()
# Make the slug equal to test if the duplicate is detected
child2.slug_de = 'child'
self.assertRaises(ValidationError, child2.clean)
child2.slug_de = 'child-2'
# Make the translated slug equal to test if the duplicate is detected
child2.slug_en = 'child-en'
self.assertRaises(ValidationError, child2.clean)
def test_slugurl_trans(self):
"""
Assert tag slugurl_trans is immune to user's current language
"""
from wagtail_modeltranslation.templatetags.wagtail_modeltranslation import slugurl_trans
site_pages = {
'model': models.TestRootPage,
'kwargs': {'title': 'root slugurl', },
'children': {
'child': {
'model': models.TestSlugPage1,
'kwargs': {'title': 'child slugurl', 'slug': 'child-slugurl', 'slug_en': 'child-slugurl-en'},
'children': {},
},
},
}
site = page_factory.create_page_tree(site_pages)
request_mock = request_factory.get('/')
setattr(request_mock, 'site', site)
context = {'request': request_mock}
self.assertEqual(slugurl_trans(context, 'root-slugurl'), '/de/')
self.assertEqual(slugurl_trans(context, 'child-slugurl'), '/de/child-slugurl/')
self.assertEqual(slugurl_trans(context, 'child-slugurl-en', 'en'), '/de/child-slugurl/')
trans_real.activate('en')
self.assertEqual(slugurl_trans(context, 'root-slugurl'), '/en/')
self.assertEqual(slugurl_trans(context, 'child-slugurl'), '/en/child-slugurl-en/')
self.assertEqual(slugurl_trans(context, 'child-slugurl-en', 'en'), '/en/child-slugurl-en/')
def test_relative_url(self):
try:
from wagtail.core.models import Site
except ImportError:
from wagtail.wagtailcore.models import Site
# Create a test Site with a root page
root = models.TestRootPage(title='title slugurl', depth=1, path='0004',
slug_en='title_slugurl_en', slug_de='title_slugurl_de')
root.save()
site = Site(root_page=root)
site.save()
# Add children to the root
child = root.add_child(
instance=models.TestSlugPage1(title='child1 slugurl',
slug_en='child-slugurl-en', slug_de='child-slugurl-de',
depth=2, path='00040001')
)
child.save_revision().publish()
url_1_de = child.relative_url(site)
self.assertEqual(url_1_de, '/de/child-slugurl-de/',
'When using the default language, slugurl produces the wrong url.')
trans_real.activate('en')
url_1_en = child.relative_url(site)
self.assertEqual(url_1_en, '/en/child-slugurl-en/',
'When using non-default language, slugurl produces the wrong url.')
# Add children using non-default language
child2 = root.add_child(
instance=models.TestSlugPage2(title='child2 slugurl', title_de='child2 slugurl DE',
slug_de='child2-slugurl-de', slug_en='child2-slugurl-en',
depth=2, path='00040002')
)
child2.save_revision().publish()
url_2_en = child2.relative_url(site)
self.assertEqual(url_2_en, '/en/child2-slugurl-en/',
'When using non-default language, slugurl produces the wrong url.')
trans_real.activate('de')
url_2_de = child2.relative_url(site)
self.assertEqual(url_2_de, '/de/child2-slugurl-de/',
'When using non-default language, slugurl produces the wrong url.')
def test_searchfield_patching(self):
# Check if the search fields have the original field plus the translated ones
expected_fields = ['title', 'title_de', 'title_en', 'description', 'description_de', 'description_en']
model_search_fields = [searchfield.field_name for searchfield in models.PatchTestPage.search_fields]
try:
# python 3
self.assertCountEqual(expected_fields, model_search_fields)
except AttributeError:
# python 2.7
self.assertItemsEqual(expected_fields, model_search_fields)
def test_streamfield_fallback(self):
body_text = '[{"value": "Some text", "type": "text"}]'
page = models.StreamFieldPanelPage(title='Streamfield Fallback', slug='streamfield_fallback',
depth=1, path='0005', body=body_text)
page.save()
self.assertEqual(str(page.body), '<div class="block-text">Some text</div>')
trans_real.activate('en')
self.assertEqual(str(page.body), '<div class="block-text">Some text</div>',
'page.body did not fallback to original language.')
def test_set_url_path(self):
"""
Assert translation URL Paths are correctly set in page and descendants for a slug change and
page move operations
"""
try:
from wagtail.core.models import Site
except ImportError:
from wagtail.wagtailcore.models import Site
# Create a test Site with a root page
root = models.TestRootPage.objects.create(title='url paths', depth=1, path='0006', slug='url-path-slug')
Site.objects.create(root_page=root)
# Add children to the root
child = root.add_child(
instance=models.TestSlugPage1(title='child', slug='child', depth=2, path='00060001')
)
child.save()
# Add grandchildren to the root
grandchild = child.add_child(
instance=models.TestSlugPage1(title='grandchild', slug='grandchild', depth=2, path='000600010001')
)
grandchild.save()
# check everything is as expected
self.assertEqual(child.url_path_de, '/child/')
self.assertEqual(child.url_path_en, '/child/')
self.assertEqual(grandchild.url_path_de, '/child/grandchild/')
self.assertEqual(grandchild.url_path_en, '/child/grandchild/')
# PAGE SLUG CHANGE
grandchild.slug_de = 'grandchild1'
grandchild.save()
self.assertEqual(grandchild.url_path_de, '/child/grandchild1/')
self.assertEqual(grandchild.url_path_en, '/child/grandchild1/')
grandchild.slug_en = 'grandchild1_en'
grandchild.save()
self.assertEqual(grandchild.url_path_de, '/child/grandchild1/')
self.assertEqual(grandchild.url_path_en, '/child/grandchild1_en/')
# Children url paths should update when parent changes
child.slug_en = 'child_en'
child.save()
self.assertEqual(child.url_path_de, '/child/')
self.assertEqual(child.url_path_en, '/child_en/')
# Retrieve grandchild from DB:
grandchild_new = models.TestSlugPage1.objects.get(id=grandchild.id)
self.assertEqual(grandchild_new.url_path_en, '/child_en/grandchild1_en/')
self.assertEqual(grandchild_new.url_path_de, '/child/grandchild1/')
# Add 2nd child to the root
child2 = root.add_child(
instance=models.TestSlugPage1(title='child2', slug='child2', depth=2, path='00060002')
)
child2.save()
# Add grandchildren
grandchild2 = child2.add_child(
instance=models.TestSlugPage1(title='grandchild2', slug='grandchild2', depth=3, path='000600020001')
)
grandchild2.save()
# PAGE MOVE
child2.move(child, pos='last-child')
# re-fetch child2 to confirm db fields have been updated
child2 = models.TestSlugPage1.objects.get(id=child2.id)
self.assertEqual(child2.depth, 3)
self.assertEqual(child2.get_parent().id, child.id)
self.assertEqual(child2.url_path_de, '/child/child2/')
self.assertEqual(child2.url_path_en, '/child_en/child2/')
# children of child2 should also have been updated
grandchild2 = child2.get_children().get(slug='grandchild2').specific
self.assertEqual(grandchild2.depth, 4)
self.assertEqual(grandchild2.url_path_de, '/child/child2/grandchild2/')
self.assertEqual(grandchild2.url_path_en, '/child_en/child2/grandchild2/')
def test_set_url_path_non_translated_descendants(self):
"""
Assert set_url_path works correctly when a Page with untranslated children
has its translated slug changed.
"""
site_pages = {
'model': models.TestRootPage,
'kwargs': {'title': 'root untranslated', },
'children': {
'child': {
'model': models.TestSlugPage1,
'kwargs': {'title': 'child untranslated'},
'children': {
'grandchild1': {
'model': models.TestSlugPage1,
'kwargs': {'title': 'grandchild1 untranslated'},
'children': {
'grandgrandchild': {
'model': models.TestSlugPage1,
'kwargs': {'title': 'grandgrandchild untranslated'},
},
},
},
'grandchild2': {
'model': models.TestSlugPage2,
'kwargs': {'title': 'grandchild2 untranslated'},
},
},
},
},
}
page_factory.create_page_tree(site_pages)
# Revert grandchild1 and grandgrandchild url_path_en to their initial untranslated states
# to simulate pages that haven't been translated yet
models.TestSlugPage1.objects.filter(slug_de__in=['grandchild1-untranslated', 'grandgrandchild-untranslated'])\
.rewrite(False).update(slug_en=None, url_path_en=None)
# re-fetch to pick up latest from DB
grandchild1 = models.TestSlugPage1.objects.get(slug_de='grandchild1-untranslated')
self.assertEqual(grandchild1.url_path_de, '/root-untranslated/child-untranslated/grandchild1-untranslated/')
self.assertEqual(grandchild1.slug_en, None)
self.assertEqual(grandchild1.url_path_en, None)
grandgrandchild = models.TestSlugPage1.objects.get(slug_de='grandgrandchild-untranslated')
self.assertEqual(grandgrandchild.url_path_de,
'/root-untranslated/child-untranslated/grandchild1-untranslated/grandgrandchild-untranslated/')
self.assertEqual(grandgrandchild.slug_en, None)
self.assertEqual(grandgrandchild.url_path_en, None)
trans_real.activate('en')
child = site_pages['children']['child']['instance']
child.slug_en = 'child-translated'
child.save()
self.assertEqual(child.url_path_de, '/root-untranslated/child-untranslated/')
self.assertEqual(child.url_path_en, '/root-untranslated/child-translated/')
grandchild1 = models.TestSlugPage1.objects.get(slug_de='grandchild1-untranslated')
self.assertEqual(grandchild1.url_path_de, '/root-untranslated/child-untranslated/grandchild1-untranslated/')
self.assertEqual(grandchild1.url_path_en, '/root-untranslated/child-translated/grandchild1-untranslated/')
grandgrandchild = models.TestSlugPage1.objects.get(slug_de='grandgrandchild-untranslated')
self.assertEqual(grandgrandchild.url_path_de,
'/root-untranslated/child-untranslated/grandchild1-untranslated/grandgrandchild-untranslated/')
self.assertEqual(grandgrandchild.url_path_en,
'/root-untranslated/child-translated/grandchild1-untranslated/grandgrandchild-untranslated/')
def test_fetch_translation_records(self):
"""
Assert that saved translation fields are retrieved correctly
See: https://github.com/infoportugal/wagtail-modeltranslation/issues/103#issuecomment-352006610
"""
page = models.StreamFieldPanelPage.objects.create(title_de='Fetch DE', title_en='Fetch EN',
slug_de='fetch_de', slug_en='fetch_en',
body_de=[('text', 'fetch de')], body_en=[('text', 'fetch en')],
depth=1, path='0007')
page.save()
page_db = models.StreamFieldPanelPage.objects.get(id=page.id)
self.assertEqual(page_db.title_de, 'Fetch DE')
self.assertEqual(page_db.slug_de, 'fetch_de')
self.assertEqual(str(page_db.body_de), '<div class="block-text">fetch de</div>')
self.assertEqual(page_db.title_en, 'Fetch EN')
self.assertEqual(page_db.slug_en, 'fetch_en')
self.assertEqual(str(page_db.body_en), '<div class="block-text">fetch en</div>')
def check_route_request(self, root_page, components, expected_page):
request = HttpRequest()
request.path = '/' + '/'.join(components) + '/'
(found_page, args, kwargs) = root_page.route(request, components)
self.assertEqual(found_page, expected_page)
def test_request_routing(self):
"""
Assert .route works for translated slugs
"""
site_pages = {
'model': models.TestRootPage,
'kwargs': {'title': 'root routing', },
'children': {
'child1': {
'model': models.TestSlugPage1,
'kwargs': {'title': 'child1 routing', 'slug_de': 'routing-de-01', 'slug_en': 'routing-en-01'},
'children': {
'grandchild1': {
'model': models.TestSlugPage1,
'kwargs': {'title': 'grandchild1 routing',
'slug_de': 'routing-de-0101', 'slug_en': 'routing-en-0101'},
},
},
},
'child2': {
'model': models.TestSlugPage1,
'kwargs': {'title': 'child2 routing', 'slug': 'routing-de-02'},
'children': {
'grandchild1': {
'model': models.TestSlugPage1,
'kwargs': {'title': 'grandchild1 routing', 'slug': 'routing-de-0201'},
},
},
},
'routable_page': {
'model': models.RoutablePageTest,
'kwargs': {'title': 'Routable Page', 'live': True,
'slug_de': 'routing-de-03', 'slug_en': 'routing-en-03'},
'children': {
'grandchild1': {
'model': models.TestSlugPage1,
'kwargs': {'title': 'grandchild1 routing',
'slug_de': 'routing-de-0301', 'slug_en': 'routing-en-0301'},
},
},
},
},
}
page_factory.create_page_tree(site_pages)
root_page = site_pages['instance']
page_0101 = site_pages['children']['child1']['children']['grandchild1']['instance']
page_0201 = site_pages['children']['child2']['children']['grandchild1']['instance']
page_0301 = site_pages['children']['routable_page']['children']['grandchild1']['instance']
self.check_route_request(root_page, ['routing-de-01', 'routing-de-0101'], page_0101)
self.check_route_request(root_page, ['routing-de-02', 'routing-de-0201'], page_0201)
# routable page test
routable_page = site_pages['children']['routable_page']['instance']
view, args, kwargs = routable_page.resolve_subpage('/archive/year/2014/')
self.assertEqual(view, routable_page.archive_by_year)
self.assertEqual(args, ('2014',))
self.assertEqual(kwargs, {})
self.check_route_request(root_page, ['routing-de-03', 'routing-de-0301'], page_0301)
trans_real.activate('en')
# assert translated slugs fetch the correct page
self.check_route_request(root_page, ['routing-en-01', 'routing-en-0101'], page_0101)
# in the absence of translated slugs assert the default ones work
self.check_route_request(root_page, ['routing-de-02', 'routing-de-0201'], page_0201)
view, args, kwargs = routable_page.resolve_subpage('/archive/year/2014/')
self.assertEqual(view, routable_page.archive_by_year)
self.assertEqual(args, ('2014',))
self.assertEqual(kwargs, {})
self.check_route_request(root_page, ['routing-en-03', 'routing-en-0301'], page_0301)
def test_get_url_parts(self):
site_pages = {
'model': models.TestRootPage,
'kwargs': {'title': 'root URL parts', },
'children': {
'child1': {
'model': models.TestSlugPage1,
'kwargs': {'title': 'child1 URL parts', 'slug_de': 'url-parts-de-01', 'slug_en': 'url-parts-en-01'},
},
'child2': {
'model': models.TestSlugPage1,
'kwargs': {'title': 'child2 URL parts', 'slug': 'url-parts-de-02'},
},
},
}
site = page_factory.create_page_tree(site_pages)
root_page = site_pages['instance']
page_01 = site_pages['children']['child1']['instance']
page_02 = site_pages['children']['child2']['instance']
self.assertEqual(root_page.relative_url(site), '/de/')
self.assertEqual(page_01.relative_url(site), '/de/url-parts-de-01/')
self.assertEqual(page_02.relative_url(site), '/de/url-parts-de-02/')
trans_real.activate('en')
self.assertEqual(root_page.relative_url(site), '/en/')
self.assertEqual(page_01.relative_url(site), '/en/url-parts-en-01/')
self.assertEqual(page_02.relative_url(site), '/en/url-parts-de-02/')
def test_url(self):
site_pages = {
'model': models.TestRootPage,
'kwargs': {'title': 'root URL', },
'children': {
'child1': {
'model': models.TestSlugPage1,
'kwargs': {'title': 'child1 URL', 'slug_de': 'url-de-01', 'slug_en': 'url-en-01'},
},
'child2': {
'model': models.TestSlugPage2,
'kwargs': {'title': 'child2 URL', 'slug': 'url-de-02'},
},
},
}
page_factory.create_page_tree(site_pages)
root_page = site_pages['instance']
page_01 = site_pages['children']['child1']['instance']
page_02 = site_pages['children']['child2']['instance']
self.assertEqual(root_page.url, '/de/')
self.assertEqual(page_01.url, '/de/url-de-01/')
self.assertEqual(page_02.url, '/de/url-de-02/')
trans_real.activate('en')
self.assertEqual(root_page.url, '/en/')
self.assertEqual(page_01.url, '/en/url-en-01/')
self.assertEqual(page_02.url, '/en/url-de-02/')
def test_root_page_slug(self):
site_pages = {
'model': models.TestRootPage,
'kwargs': {'title': 'root URL', 'slug_de': 'root-de', 'slug_en': 'root-en'},
'children': {
'child1': {
'model': models.TestSlugPage1,
'kwargs': {'title': 'child1 URL', 'slug_de': 'url-de-01', 'slug_en': 'url-en-01'},
},
'child2': {
'model': models.TestSlugPage2,
'kwargs': {'title': 'child2 URL', 'slug': 'url-de-02'},
},
'child3': {
'model': models.TestSlugPage2,
'kwargs': {'title': 'child3 URL', 'slug': 'url-de-03'},
},
},
}
page_factory.create_page_tree(site_pages)
request = HttpRequest()
site_root_page = site_pages['instance']
wagtail_page_01 = site_pages['children']['child1']['instance']
wagtail_page_02 = site_pages['children']['child2']['instance']
wagtail_page_03 = site_pages['children']['child3']['instance']
self.assertEqual(wagtail_page_01.url, '/de/url-de-01/')
self.assertEqual(wagtail_page_01.url_path, '/root-de/url-de-01/')
if VERSION >= (1, 11):
self.assertEqual(wagtail_page_02.get_url(request=request), '/de/url-de-02/') # with request
trans_real.activate('en')
self.assertEqual(wagtail_page_01.url, '/en/url-en-01/')
self.assertEqual(wagtail_page_01.url_path, '/root-en/url-en-01/')
if VERSION >= (1, 11):
self.assertEqual(wagtail_page_02.get_url(request=request), '/en/url-de-02/')
trans_real.activate('de')
# new request after changing language
self.assertEqual(wagtail_page_03.url, '/de/url-de-03/')
if VERSION >= (1, 11):
self.assertEqual(wagtail_page_01.get_url(request=HttpRequest()), '/de/url-de-01/')
# URL should not be broken after updating the root_page (ensure the cache is evicted)
self.assertEqual(wagtail_page_01.url, '/de/url-de-01/')
site_root_page.slug = 'new-root-de'
site_root_page.save()
wagtail_page_01_new = site_root_page.get_children().get(id=wagtail_page_01.id)
self.assertEqual(wagtail_page_01_new.url, '/de/url-de-01/')
def test_set_translation_url_paths_command(self):
"""
Assert set_translation_url_paths management command works correctly
"""
site_pages = {
'model': models.TestRootPage,
'kwargs': {'title': 'root untranslated', },
'children': {
'child': {
'model': models.TestSlugPage1,
'kwargs': {'title': 'child untranslated'},
'children': {
'grandchild1': {
'model': models.TestSlugPage1,
'kwargs': {'title': 'grandchild1 untranslated'},
'children': {
'grandgrandchild': {
'model': models.TestSlugPage1,
'kwargs': {'title': 'grandgrandchild untranslated'},
},
},
},
'grandchild2': {
'model': models.TestSlugPage2,
'kwargs': {'title': 'grandchild2 untranslated'},
},
},
},
'child2': {
'model': models.TestSlugPage1,
'kwargs': {'title': 'child2 translated', 'slug_en': 'child2-translated-en'},
'children': {
'grandchild1': {
'model': models.TestSlugPage1,
'kwargs': {'title': 'grandchild1 translated', 'slug_en': 'grandchild1-translated-en'},
'children': {
'grandgrandchild': {
'model': models.TestSlugPage1,
'kwargs': {'title': 'grandgrandchild1 translated',
'slug_en': 'grandgrandchild1-translated-en'},
},
},
},
},
},
},
}
page_factory.create_page_tree(site_pages)
# Revert grandchild1 and grandgrandchild url_path_en to their initial untranslated states
# to simulate pages that haven't been translated yet
models.TestSlugPage1.objects.filter(slug_de__in=['grandchild1-untranslated', 'grandgrandchild-untranslated']) \
.rewrite(False).update(slug_en=None, url_path_en=None)
# re-fetch to pick up latest from DB
grandchild1 = models.TestSlugPage1.objects.get(slug_de='grandchild1-untranslated')
self.assertEqual(grandchild1.url_path_en, None)
grandgrandchild = models.TestSlugPage1.objects.get(slug_de='grandgrandchild-untranslated')
self.assertEqual(grandgrandchild.url_path_en, None)
# change grandchild2 url_path to corrupt it in order to simulate Wagtail's 0.7 corruption bug:
# http://docs.wagtail.io/en/latest/releases/0.8.html#corrupted-url-paths-may-need-fixing
models.TestSlugPage2.objects.filter(slug_de__in=['grandchild2-untranslated',]) \
.rewrite(False).update(url_path='corrupted', url_path_de='corrupted')
grandchild2 = models.TestSlugPage2.objects.get(slug_de='grandchild2-untranslated')
self.assertEqual(grandchild2.__dict__['url_path'], 'corrupted')
call_command('set_translation_url_paths', verbosity=0)
grandchild1 = models.TestSlugPage1.objects.get(slug_de='grandchild1-untranslated')
self.assertEqual(grandchild1.url_path_de, '/root-untranslated/child-untranslated/grandchild1-untranslated/')
self.assertEqual(grandchild1.url_path_en, '/root-untranslated/child-untranslated/grandchild1-untranslated/')
grandgrandchild = models.TestSlugPage1.objects.get(slug_de='grandgrandchild-untranslated')
self.assertEqual(grandgrandchild.url_path_de,
'/root-untranslated/child-untranslated/grandchild1-untranslated/grandgrandchild-untranslated/')
self.assertEqual(grandgrandchild.url_path_en,
'/root-untranslated/child-untranslated/grandchild1-untranslated/grandgrandchild-untranslated/')
grandchild2 = models.TestSlugPage2.objects.get(slug_de='grandchild2-untranslated')
self.assertEqual(grandchild2.__dict__['url_path'], '/root-untranslated/child-untranslated/grandchild2-untranslated/')
self.assertEqual(grandchild2.url_path_de, '/root-untranslated/child-untranslated/grandchild2-untranslated/')
self.assertEqual(grandchild2.url_path_en, '/root-untranslated/child-untranslated/grandchild2-untranslated/')
grandgrandchild_translated = models.TestSlugPage1.objects.get(slug_de='grandgrandchild1-translated')
self.assertEqual(grandgrandchild_translated.url_path_de,
'/root-untranslated/child2-translated/grandchild1-translated/grandgrandchild1-translated/')
self.assertEqual(grandgrandchild_translated.url_path_en,
'/root-untranslated/child2-translated-en/grandchild1-translated-en/grandgrandchild1-translated-en/')