Ticket #1553: new-fields.py

File new-fields.py, 12.9 KB (added by Nebojsa Djordjevic <nesh at studioquattro dot co dot yu>, 18 years ago)

new unittests (I can't replace old ;( )

Line 
1# test/othertests/fields.py
2from django.core import validators
3from django.db.models.fields import *
4import random
5import unittest
6import datetime, time
7from decimal import Decimal
8import re
9
10errors = 0
11failures = 0
12def run_test(test):
13 if __name__ == '__main__': return
14 global errors, failures
15 suite = unittest.makeSuite(test)
16 ret = unittest.TextTestRunner().run(suite)
17 errors += len(ret.errors)
18 failures += len(ret.failures)
19#
20
21# TODO: AutoField
22class TestAutoField(unittest.TestCase):
23 def setUp(self):
24 self.klass = AutoField
25 #
26#
27run_test(TestAutoField)
28
29class TestBooleanField(unittest.TestCase):
30 def setUp(self):
31 self.klass = BooleanField
32 #
33 def test_create(self):
34 """ BooleanField:: create """
35 try:
36 self.klass(null=True)
37 self.assert_('No Assertion error for null=True')
38 except AssertionError:
39 pass
40 #
41
42 def test_conversion(self):
43 """ BooleanField:: conversion """
44 cf = self.klass()
45 self.assertEqual(cf.to_python('t'), True)
46 self.assertEqual(cf.to_python('f'), False)
47 self.assertEqual(cf.to_python(True), True)
48 self.assertEqual(cf.to_python(False), False)
49 self.assertEqual(cf.to_python(''), False)
50 self.assertRaises(validators.ValidationError, cf.to_python, None)
51 self.assertRaises(validators.ValidationError, cf.to_python, 'asd')
52 self.assertRaises(validators.ValidationError, cf.to_python, 10)
53 #
54#
55run_test(TestBooleanField)
56
57class TestNullBooleanField(unittest.TestCase):
58 def setUp(self):
59 self.klass = NullBooleanField
60 #
61
62 def test_conversion(self):
63 """ NullBooleanField:: conversion """
64 cf = self.klass()
65 self.assertEqual(cf.to_python('t'), True)
66 self.assertEqual(cf.to_python('f'), False)
67 self.assertEqual(cf.to_python(True), True)
68 self.assertEqual(cf.to_python(False), False)
69 self.assertEqual(cf.to_python(''), None)
70 self.assertEqual(cf.to_python(None), None)
71 self.assertRaises(validators.ValidationError, cf.to_python, 'asd')
72 self.assertRaises(validators.ValidationError, cf.to_python, 10)
73 #
74#
75run_test(TestNullBooleanField)
76
77class TestCommaSeparatedIntegerField(unittest.TestCase):
78 def setUp(self):
79 self.klass = CommaSeparatedIntegerField
80 #
81
82 def test_validate_maxlength(self):
83 """ CommaSeparatedIntegerField:: maxlength validation """
84 cf = self.klass(maxlength=2)
85 data = [1, 2, 3]
86 self.assertRaises(validators.ValidationError, cf.validate, data, {})
87 cf = self.klass(maxlength=3)
88 cf.validate(data, {})
89 #
90
91 def test_conversion(self):
92 """ CommaSeparatedIntegerField:: conversion """
93 cf = self.klass()
94 self.assertEqual(cf.to_python('1, 2, 3'), [1, 2, 3])
95 self.assertEqual(cf.to_python(''), [])
96 self.assertEqual(cf.to_python(None), [])
97 self.assertRaises(validators.ValidationError, cf.validate, '1, a, 3', {})
98 #
99#
100run_test(TestCommaSeparatedIntegerField)
101
102class TestCharField(unittest.TestCase):
103 def setUp(self):
104 self.klass = CharField
105 #
106
107 def test_conversion(self):
108 """ CharField:: conversion """
109 cf = self.klass()
110 self.assertEqual(cf.to_python(1), '1')
111 self.assertEqual(cf.to_python('10'), '10')
112 self.assertEqual(cf.to_python(''), '')
113 self.assertEqual(cf.to_python(None), None)
114 #
115
116 # I don't need to test null/blank validation, to_pyhon takes care of that
117 def test_validate_maxlength(self):
118 """ CharField:: maxlength validation """
119 cf = self.klass(maxlength=10)
120 self.assertRaises(validators.ValidationError, cf.validate, 'a' * 11, {})
121 cf.validate('b' * 10, {})
122 #
123#
124run_test(TestCharField)
125
126class TestDateField(unittest.TestCase):
127 # TODO: auto_now stuff tests
128 def setUp(self):
129 self.klass = DateField
130 self.data = '2006-10-15'
131 self.ret = datetime.date(*time.strptime(self.data, '%Y-%m-%d')[:3])
132 #
133
134 def test_conversion(self):
135 """ DateField:: conversion """
136 cf = self.klass()
137 self.assert_(isinstance(cf.to_python(self.data), datetime.date))
138 self.assertEqual(cf.to_python(''), None)
139 self.assertEqual(cf.to_python(None), None)
140 # TODO: support for other date formats??
141 #
142#
143run_test(TestDateField)
144
145class TestDateTimeField(unittest.TestCase):
146 # TODO: auto_now stuff tests
147 def setUp(self):
148 self.klass = DateTimeField
149 self.data = '2006-10-15 13:15:23'
150 self.ret = datetime.datetime(*time.strptime(self.data, '%Y-%m-%d %H:%M:%S')[:6])
151 #
152
153 def test_conversion(self):
154 """ DateTimeField:: conversion """
155 cf = self.klass()
156 self.assert_(isinstance(cf.to_python(self.data), datetime.date))
157 self.assertEqual(cf.to_python(''), None)
158 self.assertEqual(cf.to_python(None), None)
159 # TODO: support for other date formats??
160 #
161#
162run_test(TestDateTimeField)
163
164
165class TestEmailField(unittest.TestCase):
166 # TODO: auto_now stuff tests
167 def setUp(self):
168 self.klass = EmailField
169 #
170
171 def test_conversion(self):
172 """ EmailField:: conversion """
173 cf = self.klass()
174 self.assertEqual(cf.to_python('a@bc.de'), 'a@bc.de')
175 self.assertEqual(cf.to_python(''), '')
176 self.assertEqual(cf.to_python(None), None)
177 #
178
179 def test_validate(self):
180 """ EmailField:: validate """
181 cf = self.klass()
182 self.assertRaises(validators.ValidationError, cf.validate, 'a-b-c', {})
183 cf.validate('a@bc.de', {})
184 #
185#
186run_test(TestEmailField)
187
188# TODO: FileField
189class TestFileField(unittest.TestCase):
190 def setUp(self):
191 self.klass = FileField
192 #
193#
194run_test(TestFileField)
195# TODO: FilePathField
196class TestFilePathField(unittest.TestCase):
197 def setUp(self):
198 self.klass = FilePathField
199 #
200#
201run_test(TestFilePathField)
202
203class TestFloatField(unittest.TestCase):
204 def setUp(self):
205 self.klass = FloatField
206 #
207 def test_conversion(self):
208 """ FloatField:: conversion """
209 cf = self.klass()
210 self.assertEqual(cf.to_python('1.0'), Decimal('1.0'))
211 #
212
213 def test_validate(self):
214 """ FloatField:: validate """
215 cf = self.klass(max_digits=2)
216 self.assertRaises(validators.ValidationError, cf.validate, Decimal('132.21'), {})
217 cf.validate(Decimal('12.1223'), {})
218 self.assertEqual(cf.to_python(''), None)
219 self.assertEqual(cf.to_python(None), None)
220 #
221#
222run_test(TestFloatField)
223# TODO: ImageField
224class TestImageField(unittest.TestCase):
225 def setUp(self):
226 self.klass = ImageField
227 #
228#
229run_test(TestImageField)
230
231class TestIntegerField(unittest.TestCase):
232 def setUp(self):
233 self.klass = IntegerField
234 #
235 def test_conversion(self):
236 """ IntegerField:: conversion """
237 cf = self.klass()
238 self.assertEqual(cf.to_python('22'), 22)
239 self.assertEqual(cf.to_python(''), None)
240 self.assertEqual(cf.to_python(None), None)
241 #
242#
243run_test(TestIntegerField)
244
245class TestIPAddressField(unittest.TestCase):
246 def setUp(self):
247 self.klass = IPAddressField
248 #
249 def test_validate(self):
250 """ IPAddressField:: validate """
251 cf = self.klass()
252 self.assertRaises(validators.ValidationError, cf.validate, '12.13.4.257', {})
253 cf.validate('1.2.3.4', {})
254 #
255
256 def test_conversion(self):
257 """ IPAddressField:: conversion """
258 cf = self.klass()
259 self.assertEqual(cf.to_python('1.2.3.4'), '1.2.3.4')
260 self.assertEqual(cf.to_python(''), '')
261 self.assertEqual(cf.to_python(None), None)
262 #
263#
264run_test(TestIPAddressField)
265# TODO: PhoneNumberField
266# XXX Maybe this is more for contrib than trunk?
267class TestPhoneNumberField(unittest.TestCase):
268 def setUp(self):
269 self.klass = PhoneNumberField
270 #
271#
272run_test(TestPhoneNumberField)
273
274class TestPositiveIntegerField(unittest.TestCase):
275 def setUp(self):
276 self.klass = PositiveIntegerField
277 #
278 def test_conversion(self):
279 """ PositiveIntegerField:: conversion """
280 cf = self.klass()
281 self.assertEqual(cf.to_python('22'), 22)
282 self.assertEqual(cf.to_python(''), None)
283 self.assertEqual(cf.to_python(None), None)
284 #
285
286 def test_validate(self):
287 """ PositiveIntegerField:: validate """
288 cf = self.klass()
289 self.assertRaises(validators.ValidationError, cf.validate, -1, {})
290 cf.validate(1, {})
291 #
292#
293run_test(TestPositiveIntegerField)
294
295class TestPositiveSmallIntegerField(unittest.TestCase):
296 def setUp(self):
297 self.klass = PositiveSmallIntegerField
298 #
299
300 def test_conversion(self):
301 """ PositiveSmallIntegerField:: conversion """
302 cf = self.klass()
303 self.assertEqual(cf.to_python('22'), 22)
304 self.assertEqual(cf.to_python(''), None)
305 self.assertEqual(cf.to_python(None), None)
306 #
307
308 def test_validate(self):
309 """ PositiveSmallIntegerField:: validate """
310 cf = self.klass()
311 self.assertRaises(validators.ValidationError, cf.validate, -1, {})
312 cf.validate(1, {})
313 #
314#
315run_test(TestPositiveSmallIntegerField)
316
317class TestSlugField(unittest.TestCase):
318 def setUp(self):
319 self.klass = SlugField
320 #
321 def test_validate(self):
322 """ SlugField:: validate """
323 cf = self.klass()
324 self.assertRaises(validators.ValidationError, cf.validate, 'asAD d-ad_ad', {})
325 self.assertRaises(validators.ValidationError, cf.validate, '1 bad-start', {})
326 self.assertRaises(validators.ValidationError, cf.validate, 'bad-end 2', {})
327 cf.validate('valid-slug_', {})
328 #
329
330 def test_conversion(self):
331 """ SlugField:: conversion """
332 cf = self.klass()
333 self.assertEqual(cf.to_python('valid-slug'), 'valid-slug')
334 self.assertEqual(cf.to_python(''), '')
335 self.assertEqual(cf.to_python(None), None)
336 #
337#
338run_test(TestSlugField)
339
340class TestSmallIntegerField(unittest.TestCase):
341 def setUp(self):
342 self.klass = SmallIntegerField
343 #
344
345 def test_conversion(self):
346 """ SmallIntegerField:: conversion """
347 cf = self.klass()
348 self.assertEqual(cf.to_python('22'), 22)
349 self.assertEqual(cf.to_python(''), None)
350 self.assertEqual(cf.to_python(None), None)
351 #
352#
353run_test(TestSmallIntegerField)
354
355class TestTextField(unittest.TestCase):
356 def setUp(self):
357 self.klass = TextField
358 #
359
360 def test_conversion(self):
361 """ TextField:: conversion """
362 cf = self.klass()
363 self.assertEqual(cf.to_python('12sa asd asd azxc'), '12sa asd asd azxc')
364 self.assertEqual(cf.to_python(''), '')
365 self.assertEqual(cf.to_python(None), None)
366 #
367#
368run_test(TestTextField)
369
370class TestTimeField(unittest.TestCase):
371 def setUp(self):
372 self.klass = TimeField
373 self.data = '13:45:16'
374 self.ret = time.strptime(self.data, '%H:%M:%S')
375 #
376
377 def test_conversion(self):
378 """ TimeField:: conversion """
379 cf = self.klass()
380 ret = cf.to_python(self.data)
381 self.assert_(isinstance(ret, datetime.time), '%s != %s' % (type(ret), datetime.time))
382 self.assertEqual(cf.to_python(''), None)
383 self.assertEqual(cf.to_python(None), None)
384 # TODO: test other time formats and TZ info
385 #
386#
387run_test(TestTimeField)
388
389class TestURLField(unittest.TestCase):
390 def setUp(self):
391 self.klass = URLField
392 #
393
394 def test_conversion(self):
395 """ URLField:: conversion """
396 cf = self.klass()
397 self.assertEqual(cf.to_python('www.djangoproject.com'), 'www.djangoproject.com')
398 self.assertEqual(cf.to_python(''), '')
399 self.assertEqual(cf.to_python(None), None)
400 #
401
402 def test_validate(self):
403 """ URLField:: validate (this can fail if you don't have internet connection)"""
404 cf = self.klass(verify_exists=False)
405 self.assertRaises(validators.ValidationError, cf.validate, 'this.not.exists', {})
406 cf.validate('http://www.djangoproject.com', {})
407 #
408
409 def test_validate_exists(self):
410 """ URLField:: validate """
411 cf = self.klass(verify_exists=True)
412 self.assertRaises(validators.ValidationError, cf.validate, 'http://this.not.exists', {})
413 cf.validate('http://www.djangoproject.com', {})
414 #
415#
416run_test(TestURLField)
417
418# TODO: USStateField
419# XXX Maybe this is more for contrib than trunk?
420class TestUSStateField(unittest.TestCase):
421 def setUp(self):
422 self.klass = USStateField
423 #
424#
425run_test(TestUSStateField)
426# TODO: XMLField
427class TestXMLField(unittest.TestCase):
428 def setUp(self):
429 self.klass = XMLField
430 #
431#
432run_test(TestXMLField)
433
434# THE BIG TODO
435# TODO: OrderingField
436# TODO: ForeignKey
437# TODO: OneToOneField
438# TODO: ManyToManyField
439
440if __name__ != '__main__':
441 # for django runtests.py
442 if errors or failures:
443 assert False, 'some tests are failed (E: %d, F:%d)' % (errors, failures)
444else:
445 unittest.main()
Back to Top