test_filefield.py 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import pickle
  2. from django.core.exceptions import ValidationError
  3. from django.core.files.uploadedfile import SimpleUploadedFile
  4. from django.forms import FileField
  5. from django.test import SimpleTestCase
  6. class FileFieldTest(SimpleTestCase):
  7. def test_filefield_1(self):
  8. f = FileField()
  9. with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
  10. f.clean('')
  11. with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
  12. f.clean('', '')
  13. self.assertEqual('files/test1.pdf', f.clean('', 'files/test1.pdf'))
  14. with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
  15. f.clean(None)
  16. with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
  17. f.clean(None, '')
  18. self.assertEqual('files/test2.pdf', f.clean(None, 'files/test2.pdf'))
  19. no_file_msg = "'No file was submitted. Check the encoding type on the form.'"
  20. with self.assertRaisesMessage(ValidationError, no_file_msg):
  21. f.clean(SimpleUploadedFile('', b''))
  22. with self.assertRaisesMessage(ValidationError, no_file_msg):
  23. f.clean(SimpleUploadedFile('', b''), '')
  24. self.assertEqual('files/test3.pdf', f.clean(None, 'files/test3.pdf'))
  25. with self.assertRaisesMessage(ValidationError, no_file_msg):
  26. f.clean('some content that is not a file')
  27. with self.assertRaisesMessage(ValidationError, "'The submitted file is empty.'"):
  28. f.clean(SimpleUploadedFile('name', None))
  29. with self.assertRaisesMessage(ValidationError, "'The submitted file is empty.'"):
  30. f.clean(SimpleUploadedFile('name', b''))
  31. self.assertEqual(SimpleUploadedFile, type(f.clean(SimpleUploadedFile('name', b'Some File Content'))))
  32. self.assertIsInstance(
  33. f.clean(SimpleUploadedFile('我隻氣墊船裝滿晒鱔.txt', 'मेरी मँडराने वाली नाव सर्पमीनों से भरी ह'.encode())),
  34. SimpleUploadedFile
  35. )
  36. self.assertIsInstance(
  37. f.clean(SimpleUploadedFile('name', b'Some File Content'), 'files/test4.pdf'),
  38. SimpleUploadedFile
  39. )
  40. def test_filefield_2(self):
  41. f = FileField(max_length=5)
  42. with self.assertRaisesMessage(ValidationError, "'Ensure this filename has at most 5 characters (it has 18).'"):
  43. f.clean(SimpleUploadedFile('test_maxlength.txt', b'hello world'))
  44. self.assertEqual('files/test1.pdf', f.clean('', 'files/test1.pdf'))
  45. self.assertEqual('files/test2.pdf', f.clean(None, 'files/test2.pdf'))
  46. self.assertIsInstance(f.clean(SimpleUploadedFile('name', b'Some File Content')), SimpleUploadedFile)
  47. def test_filefield_3(self):
  48. f = FileField(allow_empty_file=True)
  49. self.assertIsInstance(f.clean(SimpleUploadedFile('name', b'')), SimpleUploadedFile)
  50. def test_filefield_changed(self):
  51. """
  52. The value of data will more than likely come from request.FILES. The
  53. value of initial data will likely be a filename stored in the database.
  54. Since its value is of no use to a FileField it is ignored.
  55. """
  56. f = FileField()
  57. # No file was uploaded and no initial data.
  58. self.assertFalse(f.has_changed('', None))
  59. # A file was uploaded and no initial data.
  60. self.assertTrue(f.has_changed('', {'filename': 'resume.txt', 'content': 'My resume'}))
  61. # A file was not uploaded, but there is initial data
  62. self.assertFalse(f.has_changed('resume.txt', None))
  63. # A file was uploaded and there is initial data (file identity is not dealt
  64. # with here)
  65. self.assertTrue(f.has_changed('resume.txt', {'filename': 'resume.txt', 'content': 'My resume'}))
  66. def test_disabled_has_changed(self):
  67. f = FileField(disabled=True)
  68. self.assertIs(f.has_changed('x', 'y'), False)
  69. def test_file_picklable(self):
  70. self.assertIsInstance(pickle.loads(pickle.dumps(FileField())), FileField)