forked from django-cms/django-cms
/
test_sitemap.py
154 lines (135 loc) · 6.37 KB
/
test_sitemap.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# -*- coding: utf-8 -*-
from cms.models import Title, Page
from cms.sitemaps import CMSSitemap
from cms.test_utils.testcases import CMSTestCase
from cms.api import create_page, create_title
from cms.test_utils.util.context_managers import SettingsOverride
class SitemapTestCase(CMSTestCase):
def setUp(self):
"""
Tree from fixture:
+ P1 (de, en)
| + P2 (de, en)
| + P3 (de, en)
| + P9 (de unpublished, en)
| + P10 unpublished (de, en)
| + P11 (en)
+ P4 (de, en)
| + P5 (de, en)
+ P6 (de, en) (not in menu)
+ P7 (de, en)
+ P8 (de, en)
"""
defaults = {
'template': 'nav_playground.html',
'language': 'en',
}
with SettingsOverride(CMS_PERMISSION=False):
p1 = create_page('P1', published=True, in_navigation=True, **defaults)
create_title(language='de', title="other title %s" % p1.get_title('en'), page=p1)
p4 = create_page('P4', published=True, in_navigation=True, **defaults)
create_title(language='de', title="other title %s" % p4.get_title('en'), page=p4)
p6 = create_page('P6', published=True, in_navigation=False, **defaults)
create_title(language='de', title="other title %s" % p6.get_title('en'), page=p6)
p2 = create_page('P2', published=True, in_navigation=True, parent=p1, **defaults)
create_title(language='de', title="other title %s" % p2.get_title('en'), page=p2)
p3 = create_page('P3', published=True, in_navigation=True, parent=p2, **defaults)
create_title(language='de', title="other title %s" % p3.get_title('en'), page=p3)
p5 = create_page('P5', published=True, in_navigation=True, parent=p4, **defaults)
create_title(language='de', title="other title %s" % p5.get_title('en'), page=p5)
p7 = create_page('P7', published=True, in_navigation=True, parent=p6, **defaults)
create_title(language='de', title="other title %s" % p7.get_title('en'), page=p7)
p8 = create_page('P8', published=True, in_navigation=True, parent=p6, **defaults)
create_title(language='de', title="other title %s" % p8.get_title('en'), page=p8)
p9 = create_page('P9', published=True, in_navigation=True, parent=p1, **defaults)
create_title(language='de', title="other title %s" % p9.get_title('en'), page=p9)
p10 = create_page('P10', published=False, in_navigation=True, parent=p9, **defaults)
create_title(language='de', title="other title %s" % p10.get_title('en'), page=p10)
create_page('P11', published=True, in_navigation=True, parent=p9, **defaults)
p1 = p1.reload()
p2 = p2.reload()
p3 = p3.reload()
p4 = p4.reload()
p5 = p5.reload()
p6 = p6.reload()
p7 = p7.reload()
p8 = p8.reload()
p8.publish('de')
p7.publish('de')
p5.publish('de')
p3.publish('de')
p2.publish('de')
p6.publish('de')
p4.publish('de')
p1.publish('de')
self.assertEqual(Title.objects.filter(published=True, publisher_is_draft=False).count(), 18)
def test_sitemap_count(self):
"""
Has the sitemap the correct number of elements?
"""
sitemap = CMSSitemap()
# 8 pages with en and de titles published
# 1 page published only in english(with existsing de title)
# 1 page with both titles but unpublished
# 1 page with only english title
self.assertEqual(sitemap.items().count(), 18)
def test_sitemap_items_location(self):
"""
Check the correct URL in location, recreating it according to the title
attributes (instead of using Page.get_absolute_url) for a lower level
check
"""
sitemap = CMSSitemap()
urlset = sitemap.get_urls()
for item in urlset:
if item['item'].path:
url = 'http://example.com/%s/%s/' % (item['item'].language, item['item'].path)
else:
url = 'http://example.com/%s/%s' % (item['item'].language, item['item'].path)
self.assertEqual(item['location'], url)
def test_sitemap_published_titles(self):
"""
Check that published titles are in the urls
"""
sitemap = CMSSitemap()
locations = []
urlset = sitemap.get_urls()
for item in urlset:
locations.append(item['location'])
for title in Title.objects.public():
page = title.page.get_public_object()
if title.path:
url = 'http://example.com/%s/%s/' % (title.language, title.path)
else:
url = 'http://example.com/%s/%s' % (title.language, title.path)
if page.is_published('en') and not page.publisher_is_draft:
self.assertTrue(url in locations)
else:
self.assertFalse(url in locations)
def test_sitemap_unpublished_titles(self):
"""
Check that titles attached to unpublished pages are not in the urlset.
As titles are 'published' depending on their attached page, we create a
set of unpublished titles by checking titles attached to the draft and
public version of each page
"""
sitemap = CMSSitemap()
locations = []
urlset = sitemap.get_urls()
unpublished_titles = set()
for item in urlset:
locations.append(item['location'])
for page in Page.objects.drafts():
if page.get_public_object():
set1 = set(page.get_public_object().title_set.values_list('path', flat=True))
set2 = set(page.title_set.values_list('path', flat=True))
unpublished_titles.update(set2.difference(set1))
else:
unpublished_titles.update(page.title_set.values_list('path', flat=True))
for path in unpublished_titles:
title = Title.objects.get(path=path)
if title.path:
url = 'http://example.com/%s/%s/' % (title.language, title.path)
else:
url = 'http://example.com/%s/%s' % (title.language, title.path)
self.assertFalse(url in locations)