PageRenderTime 53ms CodeModel.GetById 31ms RepoModel.GetById 1ms app.codeStats 0ms

/view_shortcuts/tests.py

https://bitbucket.org/neithere/django-view-shortcuts/
Python | 252 lines | 250 code | 1 blank | 1 comment | 0 complexity | ca1f37d3077543b4c92f23fc7068dee7 MD5 | raw file
Possible License(s): LGPL-3.0
  1. # -*- coding: utf-8 -*-
  2. __doc__="""
  3. >>> c1 = Category.objects.create(title='News', slug='news')
  4. >>> c2 = Category.objects.create(title='Misc', slug='misc')
  5. >>> a1 = Author.objects.create(name='John')
  6. >>> a2 = Author.objects.create(name='Mary')
  7. >>> a3 = Author.objects.create(name='joe')
  8. >>> s1 = Story(title='s1', text='test', status=Story.PUBLISHED, paid=True)
  9. >>> s1.save()
  10. >>> s1.author=a1
  11. >>> s1.categories=[c1,c2]
  12. >>> s1.save()
  13. >>> s2 = Story(title='s2', text='test', status=Story.PUBLISHED, paid=False)
  14. >>> s2.save()
  15. >>> s2.author=a2
  16. >>> s2.categories=[c1]
  17. >>> s2.save()
  18. >>> s3 = Story(title='s3', text='test', status=Story.DRAFT, paid=True)
  19. >>> s3.save()
  20. >>> s3.author=a1
  21. >>> s3.categories=[c2]
  22. >>> s3.save()
  23. >>> qs = Story.objects.all()
  24. >>> from view_shortcuts.filters import FilterList, facet, RelationFilter
  25. >>> filter_settings = (
  26. ... facet('categories__slug'),
  27. ... facet('author'),
  28. ... facet('status'),
  29. ... facet('paid')
  30. ... )
  31. >>> request = mock_request()
  32. >>> filters = FilterList(request, qs, filter_settings)
  33. >>> isinstance(filters, FilterList)
  34. True
  35. >>> len(filters)
  36. 4
  37. >>> filters.active
  38. []
  39. >>> filters
  40. [<RelationFilter "categories__slug": False>, <RelationFilter "author": False>, <AllValuesFilter "status": False>, <BooleanFilter "paid": False>]
  41. >>> filters.object_list
  42. [<Story: s1>, <Story: s2>, <Story: s3>]
  43. >>> request = mock_request(author=a1.pk)
  44. >>> filters = FilterList(request, qs, filter_settings)
  45. >>> filters
  46. [<RelationFilter "categories__slug": False>, <RelationFilter "author": True>, <AllValuesFilter "status": False>, <BooleanFilter "paid": False>]
  47. >>> filters.active
  48. [<RelationFilter "author": True>]
  49. >>> filters.urlencode
  50. 'author=1'
  51. >>> filters.object_list
  52. [<Story: s1>, <Story: s3>]
  53. >>> request = mock_request(author=a1.pk, status=Story.PUBLISHED)
  54. >>> filters = FilterList(request, qs, filter_settings)
  55. >>> filters.active
  56. [<RelationFilter "author": True>, <AllValuesFilter "status": True>]
  57. >>> filters.urlencode
  58. 'author=1&status=pub'
  59. >>> filters = FilterList(request, qs, filter_settings)
  60. >>> filters
  61. [<RelationFilter "categories__slug": False>, <RelationFilter "author": True>, <AllValuesFilter "status": True>, <BooleanFilter "paid": False>]
  62. >>> filters.object_list
  63. [<Story: s1>]
  64. >>> flt_author = filters[1]
  65. >>> flt_author
  66. <RelationFilter "author": True>
  67. >>> flt_author.active
  68. True
  69. >>> flt_author.title
  70. u'Written by'
  71. >>> flt_author.urlencode
  72. 'author=1'
  73. >>> flt_author.choices
  74. [<Choice author="1">, <Choice author="2">]
  75. >>> [c.title for c in flt_author.choices]
  76. [u'John', u'Mary']
  77. >>> [c for c in flt_author.get_active_choices()]
  78. [<Choice author="1">]
  79. >>> c_a1 = flt_author.get_first_active_choice()
  80. >>> c_a1
  81. <Choice author="1">
  82. >>> c_a1.title
  83. u'John'
  84. >>> c_a1.urlencode
  85. 'author=1'
  86. >>> c_a1.items_count
  87. 2
  88. >>> for f in filters:
  89. ... print u'%s: [%s]' % (f.title, f.urlencode)
  90. ... for c in f.choices:
  91. ... print u' - %s (%s) --> [%s]' % (c.title, c.items_count, c.urlencode)
  92. Category: [categories__slug=None]
  93. - News (2) --> [categories__slug=news]
  94. - Misc (2) --> [categories__slug=misc]
  95. Written by: [author=1]
  96. - John (2) --> [author=1]
  97. - Mary (1) --> [author=2]
  98. Status: [status=pub]
  99. - Published (2) --> [status=pub]
  100. - Draft (1) --> [status=draft]
  101. Paid: [paid=None]
  102. - yes (2) --> [paid=True]
  103. - no (1) --> [paid=False]
  104. >>> qs_predefined = Story.objects.filter(status=Story.PUBLISHED)
  105. >>> filters = FilterList(request, qs_predefined, filter_settings)
  106. >>> for f in filters:
  107. ... print u'%s: [%s]' % (f.title, f.urlencode)
  108. ... for c in f.choices:
  109. ... print u' - %s (%s) --> [%s]' % (c.title, c.items_count, c.urlencode)
  110. Category: [categories__slug=None]
  111. - News (2) --> [categories__slug=news]
  112. - Misc (1) --> [categories__slug=misc]
  113. Written by: [author=1]
  114. - John (1) --> [author=1]
  115. - Mary (1) --> [author=2]
  116. Status: [status=pub]
  117. - Published (2) --> [status=pub]
  118. Paid: [paid=None]
  119. - yes (1) --> [paid=True]
  120. - no (1) --> [paid=False]
  121. >>> qs_predefined = Story.objects.filter(author__name__contains='J')
  122. >>> filters = FilterList(mock_request(status=Story.PUBLISHED), qs_predefined, filter_settings)
  123. >>> filters._qs # predefined query
  124. [<Story: s1>, <Story: s3>]
  125. >>> filters.clean_query # query made from scratch, no traces of predefined stuff
  126. [<Story: s1>, <Story: s2>]
  127. >>> filters.object_list # intersection between the two
  128. [<Story: s1>]
  129. >>> request = mock_request(categories__slug='news')
  130. >>> filters = FilterList(request, qs, filter_settings)
  131. >>> filters
  132. [<RelationFilter "categories__slug": True>, <RelationFilter "author": False>, <AllValuesFilter "status": False>, <BooleanFilter "paid": False>]
  133. >>> filters.active
  134. [<RelationFilter "categories__slug": True>]
  135. >>> filters.object_list
  136. [<Story: s1>, <Story: s2>]
  137. # Test custom filters
  138. >>> from view_shortcuts.filters import AlphabeticFilter
  139. >>> filter_settings = (
  140. ... facet('name', 'name', AlphabeticFilter),
  141. ... )
  142. >>> request = mock_request()
  143. >>> qs = Author.objects.all()
  144. >>> filters = FilterList(request, qs, filter_settings)
  145. >>> filters
  146. [<AlphabeticFilter "name": False>]
  147. >>> f = filters[0]
  148. >>> f.choices
  149. [<Choice name="j">, <Choice name="m">]
  150. >>> for c in f.choices:
  151. ... print "%s --> %s" % (c.title, c.urlencode)
  152. J --> name=j
  153. M --> name=m
  154. >>> for value in 'j', 'm':
  155. ... request = mock_request(name=value)
  156. ... filters = FilterList(request, qs, filter_settings)
  157. ... print "value:", value
  158. ... for choice in filters[0].get_active_choices():
  159. ... print ' title "%s", value "%s", %d items' % (choice.title, choice.value, choice.items_count)
  160. value: j
  161. title "J", value "j", 2 items
  162. value: m
  163. title "M", value "m", 1 items
  164. """
  165. import urllib
  166. from django.test import Client
  167. from django.core.handlers.wsgi import WSGIRequest
  168. from django.core.urlresolvers import reverse
  169. from django.db.models import BooleanField, CharField, ForeignKey, IntegerField, \
  170. ManyToManyField, Model, SlugField, TextField
  171. from django.utils.translation import ugettext_lazy as _
  172. class Author(Model):
  173. name = CharField(max_length=255)
  174. __unicode__ = lambda s: s.name
  175. class Category(Model):
  176. title = CharField(max_length=255)
  177. slug = SlugField()
  178. __unicode__ = lambda s: s.title
  179. class Story(Model):
  180. DRAFT, PUBLISHED = 'draft', 'pub'
  181. STORY_STATUS_CHOICES = (
  182. (DRAFT, _('Draft')),
  183. (PUBLISHED, _('Published')),
  184. )
  185. title = CharField(max_length=255)
  186. status = CharField(_('Status'), max_length=255,
  187. choices=STORY_STATUS_CHOICES, default=DRAFT)
  188. author = ForeignKey(Author, related_name='stories', null=True,
  189. verbose_name=_('Written by'))
  190. categories = ManyToManyField(Category, null=True, related_name='stories',
  191. verbose_name=_('Category'))
  192. text = TextField()
  193. paid = BooleanField(_('Paid'))
  194. __unicode__ = lambda s: s.title
  195. get_url = lambda s: reverse('example-story-detail',
  196. urlconf=None, args=None,
  197. kwargs=dict(object_id=s.pk))
  198. class RequestFactory(Client):
  199. """
  200. Class that lets you create mock Request objects for use in testing.
  201. Usage:
  202. rf = RequestFactory()
  203. get_request = rf.get('/hello/')
  204. post_request = rf.post('/submit/', {'foo': 'bar'})
  205. This class re-uses the django.test.client.Client interface, docs here:
  206. http://www.djangoproject.com/documentation/testing/#the-test-client
  207. Once you have a request object you can pass it to any view function,
  208. just as if that view had been hooked up using a URLconf.
  209. Source: http://www.djangosnippets.org/snippets/963/
  210. """
  211. def request(self, **request):
  212. """
  213. Similar to parent class, but returns the request object as soon as it
  214. has created it.
  215. """
  216. environ = {
  217. 'HTTP_COOKIE': self.cookies,
  218. 'PATH_INFO': '/',
  219. 'QUERY_STRING': '',
  220. 'REQUEST_METHOD': 'GET',
  221. 'SCRIPT_NAME': '',
  222. 'SERVER_NAME': 'testserver',
  223. 'SERVER_PORT': 80,
  224. 'SERVER_PROTOCOL': 'HTTP/1.1',
  225. }
  226. environ.update(self.defaults)
  227. environ.update(request)
  228. return WSGIRequest(environ)
  229. def mock_request(**kw):
  230. return RequestFactory().request(QUERY_STRING=urllib.urlencode(kw))