Context is updated, return it. Also avoid recursion error.
[django-pagination.git] / linaro_django_pagination / tests.py
1 # Copyright (c) 2008, Eric Florenzano
2 # Copyright (c) 2010, 2011 Linaro Limited
3 # All rights reserved.
4 #
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions are
7 # met:
8 #
9 #     * Redistributions of source code must retain the above copyright
10 #       notice, this list of conditions and the following disclaimer.
11 #     * Redistributions in binary form must reproduce the above
12 #       copyright notice, this list of conditions and the following
13 #       disclaimer in the documentation and/or other materials provided
14 #       with the distribution.
15 #     * Neither the name of the author nor the names of other
16 #       contributors may be used to endorse or promote products derived
17 #       from this software without specific prior written permission.
18 #
19 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31
32 """
33 >>> from django.core.paginator import Paginator
34 >>> from linaro_django_pagination.templatetags.pagination_tags import paginate
35 >>> from django.template import Template, Context
36
37 >>> p = Paginator(range(15), 2)
38 >>> pg = paginate({'paginator': p, 'page_obj': p.page(1)})
39 >>> pg['pages']
40 [1, 2, 3, 4, 5, 6, 7, 8]
41 >>> pg['records']['first']
42 1
43 >>> pg['records']['last']
44 2
45
46 >>> p = Paginator(range(15), 2)
47 >>> pg = paginate({'paginator': p, 'page_obj': p.page(8)})
48 >>> pg['pages']
49 [1, 2, 3, 4, 5, 6, 7, 8]
50 >>> pg['records']['first']
51 15
52 >>> pg['records']['last']
53 15
54
55 >>> p = Paginator(range(17), 2)
56 >>> paginate({'paginator': p, 'page_obj': p.page(1)})['pages']
57 [1, 2, 3, 4, 5, 6, 7, 8, 9]
58
59
60 # on start
61 # moving the window from 1 ... to end
62 # window size = 2, margin = 2
63 # [1] 2 3 4 5 ... 15, 16
64 # 1 [2] 3 4 5 ... 15, 16
65 # 1 2 [3] 4 5 ... 15, 16
66 # 1 2 3 [4] 5 6 ... 15, 16
67 # 1 2 3 4 [5] 6 7 ... 15, 16
68 # 1 2 3 4 5 [6] 7 8 ... 15, 16
69 # 1 2 ... 5 6 [7] 8 9 ... 15, 16
70
71 # window = 2 -> show 5 pages
72 >>> p = Paginator(range(31), 2)
73 >>> paginate({'paginator': p, 'page_obj': p.page(1)}, 2, 2)['pages']
74 [1, 2, 3, 4, 5, None, 15, 16]
75
76 >>> p = Paginator(range(31), 2)
77 >>> paginate({'paginator': p, 'page_obj': p.page(2)}, 2, 2)['pages']
78 [1, 2, 3, 4, 5, None, 15, 16]
79
80 >>> p = Paginator(range(31), 2)
81 >>> paginate({'paginator': p, 'page_obj': p.page(3)}, 2, 2)['pages']
82 [1, 2, 3, 4, 5, None, 15, 16]
83
84 >>> p = Paginator(range(31), 2)
85 >>> paginate({'paginator': p, 'page_obj': p.page(4)}, 2, 2)['pages']
86 [1, 2, 3, 4, 5, 6, None, 15, 16]
87
88 >>> p = Paginator(range(31), 2)
89 >>> paginate({'paginator': p, 'page_obj': p.page(5)}, 2, 2)['pages']
90 [1, 2, 3, 4, 5, 6, 7, None, 15, 16]
91
92 # in the middle
93 >>> p = Paginator(range(31), 2)
94 >>> paginate({'paginator': p, 'page_obj': p.page(7)}, 2, 2)['pages']
95 [1, 2, None, 5, 6, 7, 8, 9, None, 15, 16]
96
97 # on end
98 >>> p = Paginator(range(31), 2)
99 >>> paginate({'paginator': p, 'page_obj': p.page(16)}, 2, 2)['pages']
100 [1, 2, None, 12, 13, 14, 15, 16]
101
102 >>> p = Paginator(range(31), 2)
103 >>> paginate({'paginator': p, 'page_obj': p.page(13)}, 2, 2)['pages']
104 [1, 2, None, 11, 12, 13, 14, 15, 16]
105
106
107 >>> p = Paginator(range(0), 2)
108 >>> paginate({'paginator': p, 'page_obj': p.page(1)})['pages']
109 [1]
110
111
112
113 # no margin
114 >>> p = Paginator(range(31), 2)
115 >>> paginate({'paginator': p, 'page_obj': p.page(3)}, 2, 0)['pages']
116 [1, 2, 3, 4, 5, None]
117
118 >>> p = Paginator(range(31), 2)
119 >>> paginate({'paginator': p, 'page_obj': p.page(5)}, 2, 0)['pages']
120 [None, 3, 4, 5, 6, 7, None]
121
122 >>> p = Paginator(range(31), 2)
123 >>> paginate({'paginator': p, 'page_obj': p.page(16)}, 2, 0)['pages']
124 [None, 12, 13, 14, 15, 16]
125
126
127 # special
128 # zero window, zero margin
129 >>> p = Paginator(range(31), 2)
130 >>> paginate({'paginator': p, 'page_obj': p.page(1)}, 0, 0)['pages']
131 [1, None]
132
133 >>> p = Paginator(range(31), 2)
134 >>> paginate({'paginator': p, 'page_obj': p.page(2)}, 0, 0)['pages']
135 [None, 2, None]
136
137 >>> p = Paginator(range(31), 2)
138 >>> paginate({'paginator': p, 'page_obj': p.page(3)}, 0, 0)['pages']
139 [None, 3, None]
140
141 >>> p = Paginator(range(31), 2)
142 >>> paginate({'paginator': p, 'page_obj': p.page(10)}, 0, 0)['pages']
143 [None, 10, None]
144
145 >>> p = Paginator(range(31), 2)
146 >>> paginate({'paginator': p, 'page_obj': p.page(14)}, 0, 0)['pages']
147 [None, 14, None]
148
149 >>> p = Paginator(range(31), 2)
150 >>> paginate({'paginator': p, 'page_obj': p.page(15)}, 0, 0)['pages']
151 [None, 15, None]
152
153 >>> p = Paginator(range(31), 2)
154 >>> paginate({'paginator': p, 'page_obj': p.page(16)}, 0, 0)['pages']
155 [None, 16]
156
157 >>> p = Paginator(range(31), 2)
158 >>> paginate({'paginator': p, 'page_obj': p.page(5)}, 0, 1)['pages']
159 [1, None, 5, None, 16]
160
161 >>> p = Paginator(range(21), 2, 1)
162 >>> paginate({'paginator': p, 'page_obj': p.page(1)}, 0, 4)['pages']
163 [1, 2, 3, 4, None, 7, 8, 9, 10]
164
165 # Testing template rendering
166
167 >>> t = Template("{% load pagination_tags %}{% autopaginate var 2 %}{% paginate %}")
168
169 >>> from django.http import HttpRequest as DjangoHttpRequest
170 >>> class HttpRequest(DjangoHttpRequest):
171 ...     page = lambda self, suffix: 1
172
173 >>> t.render(Context({'var': range(21), 'request': HttpRequest()}))
174 u'\\n...\\n...<div class="pagination">...
175 >>>
176 >>> t = Template("{% load pagination_tags %}{% autopaginate var %}{% paginate %}")
177 >>> t.render(Context({'var': range(21), 'request': HttpRequest()}))
178 u'\\n...\\n...<div class="pagination">...
179 >>> t = Template("{% load pagination_tags %}{% autopaginate var 20 %}{% paginate %}")
180 >>> t.render(Context({'var': range(21), 'request': HttpRequest()}))
181 u'\\n...\\n...<div class="pagination">...
182 >>> t = Template("{% load pagination_tags %}{% autopaginate var by %}{% paginate %}")
183 >>> t.render(Context({'var': range(21), 'by': 20, 'request': HttpRequest()}))
184 u'\\n...\\n...<div class="pagination">...<a href="?page=2"...
185 >>> t = Template("{% load pagination_tags %}{% autopaginate var by as foo %}{{ foo }}")
186 >>> t.render(Context({'var': range(21), 'by': 20, 'request': HttpRequest()}))
187 u'[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]'
188 >>>
189 >>> t = Template("{% load pagination_tags %}{% autopaginate var2 by as foo2 %}{% paginate %}{% autopaginate var by as foo %}{% paginate %}")
190 >>> t.render(Context({'var': range(21), 'var2': range(50, 121), 'by': 20, 'request': HttpRequest()}))
191 u'\\n...\\n...<div class="pagination">...<a href="?page_var2=2"...<a href="?page_var=2"...
192 >>>
193
194 # Testing InfinitePaginator
195
196 >>> from paginator import InfinitePaginator
197
198 >>> InfinitePaginator
199 <class 'linaro_django_pagination.paginator.InfinitePaginator'>
200 >>> p = InfinitePaginator(range(20), 2, link_template='/bacon/page/%d')
201 >>> p.validate_number(2)
202 2
203 >>> p.orphans
204 0
205 >>> p3 = p.page(3)
206 >>> p3
207 <Page 3>
208 >>> p3.end_index()
209 6
210 >>> p3.has_next()
211 True
212 >>> p3.has_previous()
213 True
214 >>> p.page(10).has_next()
215 False
216 >>> p.page(1).has_previous()
217 False
218 >>> p3.next_link()
219 '/bacon/page/4'
220 >>> p3.previous_link()
221 '/bacon/page/2'
222
223 # Testing FinitePaginator
224
225 >>> from paginator import FinitePaginator
226
227 >>> FinitePaginator
228 <class 'linaro_django_pagination.paginator.FinitePaginator'>
229 >>> p = FinitePaginator(range(20), 2, offset=10, link_template='/bacon/page/%d')
230 >>> p.validate_number(2)
231 2
232 >>> p.orphans
233 0
234 >>> p3 = p.page(3)
235 >>> p3
236 <Page 3>
237 >>> p3.start_index()
238 10
239 >>> p3.end_index()
240 6
241 >>> p3.has_next()
242 True
243 >>> p3.has_previous()
244 True
245 >>> p3.next_link()
246 '/bacon/page/4'
247 >>> p3.previous_link()
248 '/bacon/page/2'
249
250 >>> p = FinitePaginator(range(20), 20, offset=10, link_template='/bacon/page/%d')
251 >>> p2 = p.page(2)
252 >>> p2
253 <Page 2>
254 >>> p2.has_next()
255 False
256 >>> p3.has_previous()
257 True
258 >>> p2.next_link()
259
260 >>> p2.previous_link()
261 '/bacon/page/1'
262
263 >>> from linaro_django_pagination.middleware import PaginationMiddleware
264 >>> from django.core.handlers.wsgi import WSGIRequest
265 >>> from StringIO import StringIO
266 >>> middleware = PaginationMiddleware()
267 >>> request = WSGIRequest({'REQUEST_METHOD': 'POST', 'CONTENT_TYPE': 'multipart', 'wsgi.input': StringIO()})
268 >>> middleware.process_request(request)
269 >>> request.upload_handlers.append('asdf')
270 """