1
|
|
|
from django.test import TestCase |
2
|
|
|
from pages.cache import cache |
3
|
|
|
from pages.models import Page, Content |
4
|
|
|
from pages import settings as pages_settings |
5
|
|
|
from pages.testproj import test_settings |
6
|
|
|
from django.conf import settings |
7
|
|
|
from django.contrib.auth import get_user_model |
8
|
|
|
from django.core.urlresolvers import reverse |
9
|
|
|
from django.template import TemplateDoesNotExist, Engine |
10
|
|
|
from django.contrib.sites.models import Site |
11
|
|
|
from importlib import import_module |
12
|
|
|
from django.core.urlresolvers import clear_url_caches |
13
|
|
|
from six.moves import reload_module |
14
|
|
|
|
15
|
|
|
|
16
|
|
|
class MockRequest: |
17
|
|
|
|
18
|
|
|
def __init__(self): |
19
|
|
|
self.REQUEST = {'language': 'en'} |
20
|
|
|
self.GET = {} |
21
|
|
|
self.META = {} |
22
|
|
|
self.COOKIES = {} |
23
|
|
|
|
24
|
|
|
|
25
|
|
|
class Error404Expected(Exception): |
26
|
|
|
""" |
27
|
|
|
A 404 error was expected." |
28
|
|
|
""" |
29
|
|
|
pass |
30
|
|
|
|
31
|
|
|
|
32
|
|
|
def new_page(content={'title': 'test-page', 'slug': 'test-page-slug'}, |
33
|
|
|
parent=None, language='en-us', template='pages/examples/index.html'): |
34
|
|
|
author = get_user_model().objects.all()[0] |
35
|
|
|
page = Page.objects.create(author=author, status=Page.PUBLISHED, |
36
|
|
|
template=template, parent=parent) |
37
|
|
|
if pages_settings.PAGE_USE_SITE_ID: |
38
|
|
|
page.sites.add(Site.objects.get(id=1)) |
39
|
|
|
# necessary to clear old URL cache |
40
|
|
|
page.invalidate() |
41
|
|
|
for key, value in list(content.items()): |
42
|
|
|
Content(page=page, language='en-us', type=key, body=value).save() |
43
|
|
|
return page |
44
|
|
|
|
45
|
|
|
|
46
|
|
|
class TestCase(TestCase): |
47
|
|
|
"""Django page CMS test suite class""" |
48
|
|
|
fixtures = ['pages_tests.json'] |
49
|
|
|
counter = 1 |
50
|
|
|
settings_to_reset = {} |
51
|
|
|
old_url_conf = None |
52
|
|
|
|
53
|
|
|
def setUp(self): |
54
|
|
|
# useful to make sure the tests will be properly |
55
|
|
|
# executed in an exotic project. |
56
|
|
|
self.set_setting('PAGE_TEMPLATES', |
57
|
|
|
test_settings.PAGE_TEMPLATES) |
58
|
|
|
self.set_setting('PAGE_DEFAULT_TEMPLATE', |
59
|
|
|
test_settings.PAGE_DEFAULT_TEMPLATE) |
60
|
|
|
|
61
|
|
|
self.old_url_conf = getattr(settings, 'ROOT_URLCONF') |
62
|
|
|
setattr(settings, 'ROOT_URLCONF', 'pages.testproj.urls') |
63
|
|
|
clear_url_caches() |
64
|
|
|
cache.clear() |
65
|
|
|
|
66
|
|
|
def tearDown(self): |
67
|
|
|
setattr(settings, 'ROOT_URLCONF', self.old_url_conf) |
68
|
|
|
for name, value in list(self.settings_to_reset.items()): |
69
|
|
|
setattr(pages_settings, name, value) |
70
|
|
|
self.reset_urlconf() |
71
|
|
|
self.settings_to_reset = {} |
72
|
|
|
|
73
|
|
|
def set_setting(self, name, value): |
74
|
|
|
old_value = getattr(pages_settings, name) |
75
|
|
|
setattr(pages_settings, name, value) |
76
|
|
|
if name == 'PAGE_USE_LANGUAGE_PREFIX': |
77
|
|
|
self.reset_urlconf() |
78
|
|
|
if name not in self.settings_to_reset: |
79
|
|
|
self.settings_to_reset[name] = old_value |
80
|
|
|
|
81
|
|
|
def assert404(self, func): |
82
|
|
|
try: |
83
|
|
|
response = func() |
84
|
|
|
if response.status_code != 404: |
85
|
|
|
raise Error404Expected |
86
|
|
|
except TemplateDoesNotExist: |
87
|
|
|
pass |
88
|
|
|
|
89
|
|
|
def get_admin_client(self): |
90
|
|
|
from django.test.client import Client |
91
|
|
|
client = Client() |
92
|
|
|
client.login(username='admin', password='b') |
93
|
|
|
return client |
94
|
|
|
|
95
|
|
|
def get_page_url(self, path=''): |
96
|
|
|
return reverse('pages-details-by-path', args=[path]) |
97
|
|
|
|
98
|
|
|
def get_template_from_string(self, tpl): |
99
|
|
|
return Engine.get_default().from_string(tpl) |
100
|
|
|
|
101
|
|
|
def reset_urlconf(self): |
102
|
|
|
url_conf = getattr(settings, 'ROOT_URLCONF', False) |
103
|
|
|
if url_conf: |
104
|
|
|
try: |
105
|
|
|
reload(import_module(url_conf)) |
106
|
|
|
except: |
107
|
|
|
pass |
108
|
|
|
reload_module(import_module('pages.urls')) |
109
|
|
|
reload_module(import_module('pages.testproj.urls')) |
110
|
|
|
clear_url_caches() |
111
|
|
|
|
112
|
|
|
def get_new_page_data(self, draft=False): |
113
|
|
|
"""Helper method for creating page datas""" |
114
|
|
|
page_data = { |
115
|
|
|
'title': 'test page %d' % self.counter, |
116
|
|
|
'slug': 'test-page-%d' % self.counter, 'language': 'en-us', |
117
|
|
|
'sites': [1], 'status': Page.DRAFT if draft else Page.PUBLISHED, |
118
|
|
|
# used to disable an error with connected models |
119
|
|
|
'document_set-TOTAL_FORMS': 0, 'document_set-INITIAL_FORMS': 0, |
120
|
|
|
} |
121
|
|
|
self.counter = self.counter + 1 |
122
|
|
|
return page_data |
123
|
|
|
|
124
|
|
|
def new_page(self, *args, **kwargs): |
125
|
|
|
new_page(*args, **kwargs) |
126
|
|
|
|
127
|
|
|
def create_new_page(self, client=None, draft=False): |
128
|
|
|
if not client: |
129
|
|
|
client = self.get_admin_client() |
130
|
|
|
page_data = self.get_new_page_data(draft=draft) |
131
|
|
|
response = client.post(reverse("admin:pages_page_add"), page_data) |
132
|
|
|
self.assertRedirects(response, reverse("admin:pages_page_changelist")) |
133
|
|
|
slug_content = Content.objects.get_content_slug_by_slug( |
134
|
|
|
page_data['slug']) |
135
|
|
|
return slug_content.page |
136
|
|
|
|