root/trunk/blog/tests.py

Revision 55, 20.3 kB (checked in by nobu, 9 months ago)

fixed #17 コメントのカウント数を一覧に表示

  • これに伴ってDBの構造も変更。
  • Comment, TrackBackにpre_deleteのフックを追加。
Line 
1 # vim: encoding=utf-8 :
2
3 from urlparse import urlparse
4
5 from lxml import etree
6
7 from django.contrib.sites.models import Site
8 from django.test import TestCase
9
10 from blog.models import Tag, Entry, Comment
11 from blog.views import DEFAULT_PAGINATION_PER_PAGE
12
13 SITE_NAME = Site.objects.get_current().name
14
15
16 class SimpleTest(TestCase):
17     """
18     blog's test.
19     """
20     def test_entry_list(self):
21         """
22         Test blog.views.entry_list.
23         """
24         url = u'/'
25         parameters = (
26             (None, 200),
27             (1, 200),
28             (2, 200),
29             (3, 200),
30         )
31         for page, status_code in parameters:
32             if page is not None:
33                 p = {'page' : page}
34             else:
35                 p = {}
36             #   send request.
37             response = self.client.get(url, p)
38             #   check response code.
39             self.assertEqual(response.status_code, status_code)
40             #   check template name(s).
41             for template_name in (u'blog/entry_list.html', u'blog/base.html', u'base.html'):
42                 self.assertTemplateUsed(response, template_name)
43             #   parse contents.
44             html = etree.fromstring(response.content, parser=etree.HTMLParser())
45             #   check title.
46             self.assertEqual(html.xpath('//head/title/text()')[0],
47                              u'Latest entries - %s' % SITE_NAME)
48             #   check context.
49             context = response.context[0]
50             #   check object_list.
51             self.assertTrue(context.has_key('obj_list'))
52             obj_list = context['obj_list']
53             if page is None:
54                 page = 1
55             endswith = page * DEFAULT_PAGINATION_PER_PAGE
56             startswith = endswith - DEFAULT_PAGINATION_PER_PAGE
57             checked_list = Entry.objects.filter(is_published__exact=True)\
58                                         .filter(is_active__exact=True)[startswith:endswith]
59             self.assertEqual([o.id for o in obj_list], [c.id for c in checked_list])
60
61
62     def test_entry_tag(self):
63         """
64         Test blog.views.entry_tag.
65         """
66         url = u'/tag/%s/'
67         parameters = (
68             (u'Python', None, 200),
69             (u'Python', 2, 200),
70             (u'Spam', 3, 200),
71             (u'Spam', 4, 200),
72             (u'NotExist', None, 404),
73         )
74         for tag, page, status_code in parameters:
75             if page is not None:
76                 p = {'page':page}
77             else:
78                 p = {}
79             #   send request.
80             target = url % tag
81             response = self.client.get(target, p)
82             #   check status code.
83             self.assertEqual(response.status_code, status_code)
84             if status_code != 200:
85                 continue
86             #   check template name(s).
87             for template_name in (u'blog/entry_list.html', u'blog/base.html', u'base.html'):
88                 self.assertTemplateUsed(response, template_name)
89             #   parse contents.
90             html = etree.fromstring(response.content, parser=etree.HTMLParser())
91             #   check title.
92             self.assertEqual(html.xpath('//head/title/text()')[0],
93                              u'Tag/%s - %s' % (tag, SITE_NAME))
94             #   check context.
95             context = response.context[0]
96             #   check object_list.
97             self.assertTrue(context.has_key('obj_list'))
98             obj_list = context['obj_list']
99             if page is None:
100                 page = 1
101             endswith = page * DEFAULT_PAGINATION_PER_PAGE
102             startswith = endswith - DEFAULT_PAGINATION_PER_PAGE
103             obj = Tag.objects.get(label__exact=tag)
104             checked_list = obj.entry_set.filter(is_published__exact=True)\
105                                         .filter(is_active__exact=True)[startswith:endswith]
106             self.assertEqual([o.id for o in obj_list], [c.id for c in checked_list])
107
108
109
110     def test_entry_search(self):
111         """
112         Test blog.views.entry_search.
113         """
114         url = '/search/'
115         parameters = (
116             (u'\u30c6\u30b9\u30c8', None, 200),
117             (u'\u30c6\u30b9\u30c8', 1, 200),
118             (u'\u30c6\u30b9\u30c8', 2, 200),
119             (u'\u30c6\u30b9\u30c8\u30a8\u30f3\u30c8\u30ea\u30fc', None, 200),
120             (u'\u30c6\u30b9\u30c8\u30a8\u30f3\u30c8\u30ea\u30fc', 1, 200),
121             (u'\u30c6\u30b9\u30c8\u30a8\u30f3\u30c8\u30ea\u30fc', 2, 200),
122         )
123         for query, page, status_code in parameters:
124             #   send request.
125             response = self.client.get(url, {'query': query})
126             #   check status code.
127             self.assertEqual(response.status_code, 302)
128             #   check header.
129             self.assertTrue(response.has_header('Location'))
130             parsed = urlparse(response['Location'])
131             #   send request.
132             if page is not None:
133                 p = {'page': page}
134             else:
135                 p = {}
136             response = self.client.get(parsed[2], p)
137             #   check status code.
138             self.assertEqual(response.status_code, status_code)
139             #   check template name(s).
140             for template_name in (u'blog/entry_list.html', u'blog/base.html', u'base.html'):
141                 self.assertTemplateUsed(response, template_name)
142             #   parse content.
143             html = etree.fromstring(response.content, parser=etree.HTMLParser())
144             #   check title.
145             self.assertEqual(html.xpath('//head/title/text()')[0],
146                              u'Search/%s - %s' % (query, SITE_NAME))
147             #   check context
148             context = response.context[0]
149             #   check object_list
150             self.assertTrue(context.has_key('obj_list'))
151             obj_list = context['obj_list']
152             if page is None:
153                 page = 1
154             endswith = page * DEFAULT_PAGINATION_PER_PAGE
155             startswith = endswith - DEFAULT_PAGINATION_PER_PAGE
156             checked_list = Entry.objects.filter(description__search=u'*D+ %s' % query)\
157                                         .filter(is_published__exact=True)\
158                                         .filter(is_active__exact=True)[startswith:endswith]
159             self.assertEqual([o.id for o in obj_list], [c.id for c in checked_list])
160
161
162     def test_entry_detail(self):
163         """
164         Test blog.views.entry_detail.
165         """
166         #   target url (not published)
167         url = '/2008/03/02/testentry-1/'
168         #   send request.
169         response = self.client.get(url)
170         #   check status code.
171         self.assertEqual(response.status_code, 404)
172         #   check template name(s).
173         for template_name in (u'error.html', u'base.html'):
174             self.assertTemplateUsed(response, template_name)
175         #   parse content.
176         html = etree.fromstring(response.content, parser=etree.HTMLParser())
177         #   check title.
178         self.assertEqual(html.xpath('//head/title/text()')[0],
179                          u'Not found - %s' % SITE_NAME)
180         #   target url (published)
181         url = '/2008/03/02/testentry-2/'
182         #   send request.
183         response = self.client.get(url)
184         #   check status code.
185         self.assertEqual(response.status_code, 200)
186         #   check template name(s).
187         for template_name in (u'blog/entry_detail.html', u'blog/base.html', u'base.html'):
188             self.assertTemplateUsed(response, template_name)
189         #   parse contents.
190         html = etree.fromstring(response.content, parser=etree.HTMLParser())
191         #   check title.
192         self.assertEqual(html.xpath('//head/title/text()')[0],
193                          u'\u30c6\u30b9\u30c8\u30a8\u30f3\u30c8\u30ea\u30fc2 - %s' % SITE_NAME)
194         #   check context.
195         context = response.context[0]
196         #   check object.
197         self.assertTrue(context.has_key('obj'))
198         ps = url[1:-1].split('/')
199         checked = Entry.objects.get(published_at__year=ps[0],
200                                     published_at__month=ps[1],
201                                     published_at__day=ps[2],
202                                     slug__exact=ps[3],
203                                     is_published__exact=True,
204                                     is_active__exact=True)
205         self.assertEqual(context['obj'], checked)
206
207
208     def test_comment_create(self):
209         """
210         Test blog.views.entry_detail (comment)
211         """
212         url = '/2008/03/02/testentry-2/'
213         templates = (u'blog/entry_detail.html', u'blog/base.html', u'base.html')
214         #   send request.
215         response = self.client.post(url)
216         #   check statuc code.
217         self.assertEqual(response.status_code, 403)
218         #   check template name(s).
219         for template_name in templates:
220             self.assertTemplateUsed(response, template_name)
221         #   check context.
222         context = response.context[0]
223         #   check entry
224         self.assertTrue(context.has_key('obj'))
225         obj = context['obj']
226         self.assertEqual(obj.comments_count, 12)
227         #   ckeck form.
228         self.assertTrue(context.has_key('form'))
229         form = context['form']
230         self.assertFalse(form.is_bound)
231         self.assertFalse(form.is_valid())
232         self.assertEqual(len(form.errors), 0)
233        
234         #   fix parameters. (invalid)
235         p = {
236             'name': u'',
237             'email': u'',   #   not required.
238             'url': u'',     #   not required.
239             'description': u'',
240         }
241         #   send request.
242         response = self.client.post(url, p)
243         #   check status code.
244         self.assertEqual(response.status_code, 403)
245         #   check template name.
246         for template_name in templates:
247             self.assertTemplateUsed(response, template_name)
248         #   check context.
249         context = response.context[0]
250         #   check form.
251         self.assertTrue(context.has_key('form'))
252         form = context['form']
253         self.assertTrue(form.is_bound)
254         self.assertFalse(form.is_valid())
255         self.assertEqual(len(form.errors), 2)
256
257         #   fix parameters. (invalid)
258         p = {
259             'name': u'',
260             'email': u'hoge',       #   invalid email address.
261             'url': u'hoge',         #   invalid URL.
262             'description': u'test', #   multibyte 2character required.
263         }
264         #   send request.
265         response = self.client.post(url, p)
266         #   check status code.
267         self.assertEqual(response.status_code, 403)
268         #   check template name.
269         for template_name in templates:
270             self.assertTemplateUsed(response, template_name)
271         #   check context.
272         context = response.context[0]
273         #   check form.
274         self.assertTrue(context.has_key('form'))
275         form = context['form']
276         self.assertTrue(form.is_bound)
277         self.assertFalse(form.is_valid())
278         self.assertEqual(len(form.errors), 4)
279
280         #   fix parameters. (valid)
281         p = {
282             'name': u'test',
283             'email': u'test@example.com',
284             'url': u'http://example.com/',
285             'description': u'\u307b\u3052',
286         }
287         #   send request.
288         response = self.client.post(url, p)
289         #   check status code.
290         self.assertEqual(response.status_code, 302)
291         #   check header.
292         self.assertTrue(response.has_header('Location'))
293         #   parse location.
294         parsed = urlparse(response['Location'])
295         #   send request.
296         response = self.client.get(parsed[2])
297         #   check status code.
298         self.assertEqual(response.status_code, 200)
299         #   check context.
300         context = response.context[0]
301         #   check entry
302         self.assertTrue(context.has_key('obj'))
303         obj = context['obj']
304         self.assertEqual(obj.comments_count, 13)
305
306
307     def test_entry_from_id(self):
308         """
309         Test blog.views.entry_from_id.
310         """
311         url = '/detail/1/'
312         #   send request.
313         response = self.client.get(url)
314         #   check status code.
315         self.assertEqual(response.status_code, 404)
316         #   check template name(s).
317         for template_name in (u'error.html', u'base.html'):
318             self.assertTemplateUsed(response, template_name)
319         #   parse content.
320         html = etree.fromstring(response.content, parser=etree.HTMLParser())
321         #   check title.
322         self.assertEqual(html.xpath('//head/title/text()')[0],
323                          u'Not found - %s' % SITE_NAME)
324         #   log in.
325         self.assertTrue(self.client.login(username='tester', password='tester'))
326         #   send request.
327         response = self.client.get(url)
328         #   check status code.
329         self.assertEqual(response.status_code, 200)
330         #   check template name(s).
331         for template_name in (u'blog/entry_detail.html', u'blog/base.html', u'base.html'):
332             self.assertTemplateUsed(response, template_name)
333         #   parse content.
334         html = etree.fromstring(response.content, parser=etree.HTMLParser())
335         #   check title.
336         self.assertEqual(html.xpath('//head/title/text()')[0],
337                          u'\u30c6\u30b9\u30c8\u30a8\u30f3\u30c8\u30ea\u30fc1 - %s' % SITE_NAME)
338         #   check context.
339         context = response.context[0]
340         #   ckeck object.
341         self.assertTrue(context.has_key('obj'))
342         obj = context['obj']
343         checked = Entry.objects.get(pk=1)
344         self.assertEqual(obj, checked)
345
346
347     def test_trackback_create(self):
348         """
349         Test blog.views.trackback_create.
350         """
351         url = '/2008/03/02/testentry-2/trackback/'
352         location = '/2008/03/02/testentry-2/'
353         #   send request.
354         response = self.client.get(url)
355         #   check status code.
356         self.assertEqual(response.status_code, 302)
357         #   check header.
358         self.assertTrue(response.has_header('Location'))
359         parsed = urlparse(response['Location'])
360         self.assertEqual(parsed[2], location)
361         #   send request.
362         response = self.client.post(url, {
363             'url': u'',
364         })
365         #   check status code.
366         self.assertEqual(response.status_code, 403)
367         #   parse content.
368         xml = etree.fromstring(response.content, parser=etree.XMLParser())
369         #   check error code.
370         self.assertEqual(xml.xpath('/response/error/text()')[0], '1')
371         #   FIXME:
372
373
374     def test_archive_day(self):
375         """
376         Test blog.views.archive_day.
377         """
378         url = '/2008/03/02/'
379         parameters = (
380             (None, 200),
381             (1, 200),
382             (2, 200),
383         )
384         for page, status_code in parameters:
385             if page is not None:
386                 p = {'page': page}
387             else:
388                 p = {}
389             #   send request.
390             response = self.client.get(url, p)
391             #   check status code.
392             self.assertEqual(response.status_code, status_code)
393             #   check template name(s).
394             for template_name in (u'blog/entry_list.html', u'blog/base.html', u'base.html'):
395                 self.assertTemplateUsed(response, template_name)
396             #   parse contents.
397             html = etree.fromstring(response.content, parser=etree.HTMLParser())
398             #   check title.
399             self.assertEqual(html.xpath('//head/title/text()')[0],
400                              'Archive@2008/03/02 - %s' % SITE_NAME)
401             #   check context
402             context = response.context[0]
403             #   check object_list
404             self.assertTrue(context.has_key('obj_list'))
405             obj_list = context['obj_list']
406             if page is None:
407                 page = 1
408             endswith = page * DEFAULT_PAGINATION_PER_PAGE
409             startswith = endswith - DEFAULT_PAGINATION_PER_PAGE
410             ps = url[1:-1].split('/')
411             checked_list = Entry.objects.filter(published_at__year=ps[0],
412                                                 published_at__month=ps[1],
413                                                 published_at__day=ps[2],
414                                                 is_published__exact=True,
415                                                 is_active__exact=True)[startswith:endswith]
416             self.assertEqual([o.id for o in obj_list], [c.id for c in checked_list])
417
418
419     def test_archive_month(self):
420         """
421         Test blog.views.archive_month.
422         """
423         url = '/2008/03/'
424         parameters = (
425             (None, 200),
426             (1, 200),
427             (2, 200),
428         )
429         for page, status_code in parameters:
430             if page is not None:
431                 p = {'page': page}
432             else:
433                 p = {}
434             #   send request.
435             response = self.client.get(url, p)
436             #   check status code.
437             self.assertEqual(response.status_code, status_code)
438             #   check template name(s).
439             for template_name in (u'blog/entry_list.html', u'blog/base.html', u'base.html'):
440                 self.assertTemplateUsed(response, template_name)
441             #   parse contents.
442             html = etree.fromstring(response.content, parser=etree.HTMLParser())
443             #   check title.
444             self.assertEqual(html.xpath('//head/title/text()')[0],
445                              u'Archive@2008/03 - %s' % SITE_NAME)
446             #   check context
447             context = response.context[0]
448             #   check object_list
449             self.assertTrue(context.has_key('obj_list'))
450             obj_list = context['obj_list']
451             if page is None:
452                 page = 1
453             endswith = page * DEFAULT_PAGINATION_PER_PAGE
454             startswith = endswith - DEFAULT_PAGINATION_PER_PAGE
455             ps = url[1:-1].split('/')
456             checked_list = Entry.objects.filter(published_at__year=ps[0],
457                                                 published_at__month=ps[1],
458                                                 is_published__exact=True,
459                                                 is_active__exact=True)[startswith:endswith]
460             self.assertEqual([o.id for o in obj_list], [c.id for c in checked_list])
461
462
463     def test_archive_year(self):
464         """
465         Test blog.views.archive_year.
466         """
467         url = '/2008/'
468         parameters = (
469             (None, 200),
470             (1, 200),
471             (2, 200),
472         )
473         for page, status_code in parameters:
474             if page is not None:
475                 p = {'page': page}
476             else:
477                 p = {}
478             #   send request.
479             response = self.client.get(url, p)
480             #   check status code.
481             self.assertEqual(response.status_code, status_code)
482             #   check template name(s).
483             for template_name in (u'blog/entry_list.html', u'blog/base.html', u'base.html'):
484                 self.assertTemplateUsed(response, template_name)
485             #   parse contents.
486             html = etree.fromstring(response.content, parser=etree.HTMLParser())
487             #   check title.
488             self.assertEqual(html.xpath('//head/title/text()')[0],
489                              u'Archive@2008 - %s' % SITE_NAME)
490             #   check context
491             context = response.context[0]
492             #   check object_list
493             self.assertTrue(context.has_key('obj_list'))
494             obj_list = context['obj_list']
495             if page is None:
496                 page = 1
497             endswith