tests.py 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527
  1. from django.apps import apps
  2. from django.db import models
  3. from django.test import SimpleTestCase, override_settings
  4. from django.test.utils import isolate_lru_cache
  5. class FieldDeconstructionTests(SimpleTestCase):
  6. """
  7. Tests the deconstruct() method on all core fields.
  8. """
  9. def test_name(self):
  10. """
  11. Tests the outputting of the correct name if assigned one.
  12. """
  13. # First try using a "normal" field
  14. field = models.CharField(max_length=65)
  15. name, path, args, kwargs = field.deconstruct()
  16. self.assertIsNone(name)
  17. field.set_attributes_from_name("is_awesome_test")
  18. name, path, args, kwargs = field.deconstruct()
  19. self.assertEqual(name, "is_awesome_test")
  20. # Now try with a ForeignKey
  21. field = models.ForeignKey("some_fake.ModelName", models.CASCADE)
  22. name, path, args, kwargs = field.deconstruct()
  23. self.assertIsNone(name)
  24. field.set_attributes_from_name("author")
  25. name, path, args, kwargs = field.deconstruct()
  26. self.assertEqual(name, "author")
  27. def test_db_tablespace(self):
  28. field = models.Field()
  29. _, _, args, kwargs = field.deconstruct()
  30. self.assertEqual(args, [])
  31. self.assertEqual(kwargs, {})
  32. # With a DEFAULT_DB_TABLESPACE.
  33. with self.settings(DEFAULT_DB_TABLESPACE='foo'):
  34. _, _, args, kwargs = field.deconstruct()
  35. self.assertEqual(args, [])
  36. self.assertEqual(kwargs, {})
  37. # With a db_tablespace.
  38. field = models.Field(db_tablespace='foo')
  39. _, _, args, kwargs = field.deconstruct()
  40. self.assertEqual(args, [])
  41. self.assertEqual(kwargs, {'db_tablespace': 'foo'})
  42. # With a db_tablespace equal to DEFAULT_DB_TABLESPACE.
  43. with self.settings(DEFAULT_DB_TABLESPACE='foo'):
  44. _, _, args, kwargs = field.deconstruct()
  45. self.assertEqual(args, [])
  46. self.assertEqual(kwargs, {'db_tablespace': 'foo'})
  47. def test_auto_field(self):
  48. field = models.AutoField(primary_key=True)
  49. field.set_attributes_from_name("id")
  50. name, path, args, kwargs = field.deconstruct()
  51. self.assertEqual(path, "django.db.models.AutoField")
  52. self.assertEqual(args, [])
  53. self.assertEqual(kwargs, {"primary_key": True})
  54. def test_big_integer_field(self):
  55. field = models.BigIntegerField()
  56. name, path, args, kwargs = field.deconstruct()
  57. self.assertEqual(path, "django.db.models.BigIntegerField")
  58. self.assertEqual(args, [])
  59. self.assertEqual(kwargs, {})
  60. def test_boolean_field(self):
  61. field = models.BooleanField()
  62. name, path, args, kwargs = field.deconstruct()
  63. self.assertEqual(path, "django.db.models.BooleanField")
  64. self.assertEqual(args, [])
  65. self.assertEqual(kwargs, {})
  66. field = models.BooleanField(default=True)
  67. name, path, args, kwargs = field.deconstruct()
  68. self.assertEqual(path, "django.db.models.BooleanField")
  69. self.assertEqual(args, [])
  70. self.assertEqual(kwargs, {"default": True})
  71. def test_char_field(self):
  72. field = models.CharField(max_length=65)
  73. name, path, args, kwargs = field.deconstruct()
  74. self.assertEqual(path, "django.db.models.CharField")
  75. self.assertEqual(args, [])
  76. self.assertEqual(kwargs, {"max_length": 65})
  77. field = models.CharField(max_length=65, null=True, blank=True)
  78. name, path, args, kwargs = field.deconstruct()
  79. self.assertEqual(path, "django.db.models.CharField")
  80. self.assertEqual(args, [])
  81. self.assertEqual(kwargs, {"max_length": 65, "null": True, "blank": True})
  82. def test_char_field_choices(self):
  83. field = models.CharField(max_length=1, choices=(("A", "One"), ("B", "Two")))
  84. name, path, args, kwargs = field.deconstruct()
  85. self.assertEqual(path, "django.db.models.CharField")
  86. self.assertEqual(args, [])
  87. self.assertEqual(kwargs, {"choices": [("A", "One"), ("B", "Two")], "max_length": 1})
  88. def test_csi_field(self):
  89. field = models.CommaSeparatedIntegerField(max_length=100)
  90. name, path, args, kwargs = field.deconstruct()
  91. self.assertEqual(path, "django.db.models.CommaSeparatedIntegerField")
  92. self.assertEqual(args, [])
  93. self.assertEqual(kwargs, {"max_length": 100})
  94. def test_date_field(self):
  95. field = models.DateField()
  96. name, path, args, kwargs = field.deconstruct()
  97. self.assertEqual(path, "django.db.models.DateField")
  98. self.assertEqual(args, [])
  99. self.assertEqual(kwargs, {})
  100. field = models.DateField(auto_now=True)
  101. name, path, args, kwargs = field.deconstruct()
  102. self.assertEqual(path, "django.db.models.DateField")
  103. self.assertEqual(args, [])
  104. self.assertEqual(kwargs, {"auto_now": True})
  105. def test_datetime_field(self):
  106. field = models.DateTimeField()
  107. name, path, args, kwargs = field.deconstruct()
  108. self.assertEqual(path, "django.db.models.DateTimeField")
  109. self.assertEqual(args, [])
  110. self.assertEqual(kwargs, {})
  111. field = models.DateTimeField(auto_now_add=True)
  112. name, path, args, kwargs = field.deconstruct()
  113. self.assertEqual(path, "django.db.models.DateTimeField")
  114. self.assertEqual(args, [])
  115. self.assertEqual(kwargs, {"auto_now_add": True})
  116. # Bug #21785
  117. field = models.DateTimeField(auto_now=True, auto_now_add=True)
  118. name, path, args, kwargs = field.deconstruct()
  119. self.assertEqual(path, "django.db.models.DateTimeField")
  120. self.assertEqual(args, [])
  121. self.assertEqual(kwargs, {"auto_now_add": True, "auto_now": True})
  122. def test_decimal_field(self):
  123. field = models.DecimalField(max_digits=5, decimal_places=2)
  124. name, path, args, kwargs = field.deconstruct()
  125. self.assertEqual(path, "django.db.models.DecimalField")
  126. self.assertEqual(args, [])
  127. self.assertEqual(kwargs, {"max_digits": 5, "decimal_places": 2})
  128. def test_decimal_field_0_decimal_places(self):
  129. """
  130. A DecimalField with decimal_places=0 should work (#22272).
  131. """
  132. field = models.DecimalField(max_digits=5, decimal_places=0)
  133. name, path, args, kwargs = field.deconstruct()
  134. self.assertEqual(path, "django.db.models.DecimalField")
  135. self.assertEqual(args, [])
  136. self.assertEqual(kwargs, {"max_digits": 5, "decimal_places": 0})
  137. def test_email_field(self):
  138. field = models.EmailField()
  139. name, path, args, kwargs = field.deconstruct()
  140. self.assertEqual(path, "django.db.models.EmailField")
  141. self.assertEqual(args, [])
  142. self.assertEqual(kwargs, {"max_length": 254})
  143. field = models.EmailField(max_length=255)
  144. name, path, args, kwargs = field.deconstruct()
  145. self.assertEqual(path, "django.db.models.EmailField")
  146. self.assertEqual(args, [])
  147. self.assertEqual(kwargs, {"max_length": 255})
  148. def test_file_field(self):
  149. field = models.FileField(upload_to="foo/bar")
  150. name, path, args, kwargs = field.deconstruct()
  151. self.assertEqual(path, "django.db.models.FileField")
  152. self.assertEqual(args, [])
  153. self.assertEqual(kwargs, {"upload_to": "foo/bar"})
  154. # Test max_length
  155. field = models.FileField(upload_to="foo/bar", max_length=200)
  156. name, path, args, kwargs = field.deconstruct()
  157. self.assertEqual(path, "django.db.models.FileField")
  158. self.assertEqual(args, [])
  159. self.assertEqual(kwargs, {"upload_to": "foo/bar", "max_length": 200})
  160. def test_file_path_field(self):
  161. field = models.FilePathField(match=r".*\.txt$")
  162. name, path, args, kwargs = field.deconstruct()
  163. self.assertEqual(path, "django.db.models.FilePathField")
  164. self.assertEqual(args, [])
  165. self.assertEqual(kwargs, {"match": r".*\.txt$"})
  166. field = models.FilePathField(recursive=True, allow_folders=True, max_length=123)
  167. name, path, args, kwargs = field.deconstruct()
  168. self.assertEqual(path, "django.db.models.FilePathField")
  169. self.assertEqual(args, [])
  170. self.assertEqual(kwargs, {"recursive": True, "allow_folders": True, "max_length": 123})
  171. def test_float_field(self):
  172. field = models.FloatField()
  173. name, path, args, kwargs = field.deconstruct()
  174. self.assertEqual(path, "django.db.models.FloatField")
  175. self.assertEqual(args, [])
  176. self.assertEqual(kwargs, {})
  177. def test_foreign_key(self):
  178. # Test basic pointing
  179. from django.contrib.auth.models import Permission
  180. field = models.ForeignKey("auth.Permission", models.CASCADE)
  181. field.remote_field.model = Permission
  182. field.remote_field.field_name = "id"
  183. name, path, args, kwargs = field.deconstruct()
  184. self.assertEqual(path, "django.db.models.ForeignKey")
  185. self.assertEqual(args, [])
  186. self.assertEqual(kwargs, {"to": "auth.Permission", "on_delete": models.CASCADE})
  187. self.assertFalse(hasattr(kwargs['to'], "setting_name"))
  188. # Test swap detection for swappable model
  189. field = models.ForeignKey("auth.User", models.CASCADE)
  190. name, path, args, kwargs = field.deconstruct()
  191. self.assertEqual(path, "django.db.models.ForeignKey")
  192. self.assertEqual(args, [])
  193. self.assertEqual(kwargs, {"to": "auth.User", "on_delete": models.CASCADE})
  194. self.assertEqual(kwargs['to'].setting_name, "AUTH_USER_MODEL")
  195. # Test nonexistent (for now) model
  196. field = models.ForeignKey("something.Else", models.CASCADE)
  197. name, path, args, kwargs = field.deconstruct()
  198. self.assertEqual(path, "django.db.models.ForeignKey")
  199. self.assertEqual(args, [])
  200. self.assertEqual(kwargs, {"to": "something.Else", "on_delete": models.CASCADE})
  201. # Test on_delete
  202. field = models.ForeignKey("auth.User", models.SET_NULL)
  203. name, path, args, kwargs = field.deconstruct()
  204. self.assertEqual(path, "django.db.models.ForeignKey")
  205. self.assertEqual(args, [])
  206. self.assertEqual(kwargs, {"to": "auth.User", "on_delete": models.SET_NULL})
  207. # Test to_field preservation
  208. field = models.ForeignKey("auth.Permission", models.CASCADE, to_field="foobar")
  209. name, path, args, kwargs = field.deconstruct()
  210. self.assertEqual(path, "django.db.models.ForeignKey")
  211. self.assertEqual(args, [])
  212. self.assertEqual(kwargs, {"to": "auth.Permission", "to_field": "foobar", "on_delete": models.CASCADE})
  213. # Test related_name preservation
  214. field = models.ForeignKey("auth.Permission", models.CASCADE, related_name="foobar")
  215. name, path, args, kwargs = field.deconstruct()
  216. self.assertEqual(path, "django.db.models.ForeignKey")
  217. self.assertEqual(args, [])
  218. self.assertEqual(kwargs, {"to": "auth.Permission", "related_name": "foobar", "on_delete": models.CASCADE})
  219. # Test related_query_name
  220. field = models.ForeignKey("auth.Permission", models.CASCADE, related_query_name="foobar")
  221. name, path, args, kwargs = field.deconstruct()
  222. self.assertEqual(path, "django.db.models.ForeignKey")
  223. self.assertEqual(args, [])
  224. self.assertEqual(
  225. kwargs,
  226. {"to": "auth.Permission", "related_query_name": "foobar", "on_delete": models.CASCADE}
  227. )
  228. # Test limit_choices_to
  229. field = models.ForeignKey("auth.Permission", models.CASCADE, limit_choices_to={'foo': 'bar'})
  230. name, path, args, kwargs = field.deconstruct()
  231. self.assertEqual(path, "django.db.models.ForeignKey")
  232. self.assertEqual(args, [])
  233. self.assertEqual(
  234. kwargs,
  235. {"to": "auth.Permission", "limit_choices_to": {'foo': 'bar'}, "on_delete": models.CASCADE}
  236. )
  237. # Test unique
  238. field = models.ForeignKey("auth.Permission", models.CASCADE, unique=True)
  239. name, path, args, kwargs = field.deconstruct()
  240. self.assertEqual(path, "django.db.models.ForeignKey")
  241. self.assertEqual(args, [])
  242. self.assertEqual(kwargs, {"to": "auth.Permission", "unique": True, "on_delete": models.CASCADE})
  243. @override_settings(AUTH_USER_MODEL="auth.Permission")
  244. def test_foreign_key_swapped(self):
  245. with isolate_lru_cache(apps.get_swappable_settings_name):
  246. # It doesn't matter that we swapped out user for permission;
  247. # there's no validation. We just want to check the setting stuff works.
  248. field = models.ForeignKey("auth.Permission", models.CASCADE)
  249. name, path, args, kwargs = field.deconstruct()
  250. self.assertEqual(path, "django.db.models.ForeignKey")
  251. self.assertEqual(args, [])
  252. self.assertEqual(kwargs, {"to": "auth.Permission", "on_delete": models.CASCADE})
  253. self.assertEqual(kwargs['to'].setting_name, "AUTH_USER_MODEL")
  254. def test_one_to_one(self):
  255. # Test basic pointing
  256. from django.contrib.auth.models import Permission
  257. field = models.OneToOneField("auth.Permission", models.CASCADE)
  258. field.remote_field.model = Permission
  259. field.remote_field.field_name = "id"
  260. name, path, args, kwargs = field.deconstruct()
  261. self.assertEqual(path, "django.db.models.OneToOneField")
  262. self.assertEqual(args, [])
  263. self.assertEqual(kwargs, {"to": "auth.Permission", "on_delete": models.CASCADE})
  264. self.assertFalse(hasattr(kwargs['to'], "setting_name"))
  265. # Test swap detection for swappable model
  266. field = models.OneToOneField("auth.User", models.CASCADE)
  267. name, path, args, kwargs = field.deconstruct()
  268. self.assertEqual(path, "django.db.models.OneToOneField")
  269. self.assertEqual(args, [])
  270. self.assertEqual(kwargs, {"to": "auth.User", "on_delete": models.CASCADE})
  271. self.assertEqual(kwargs['to'].setting_name, "AUTH_USER_MODEL")
  272. # Test nonexistent (for now) model
  273. field = models.OneToOneField("something.Else", models.CASCADE)
  274. name, path, args, kwargs = field.deconstruct()
  275. self.assertEqual(path, "django.db.models.OneToOneField")
  276. self.assertEqual(args, [])
  277. self.assertEqual(kwargs, {"to": "something.Else", "on_delete": models.CASCADE})
  278. # Test on_delete
  279. field = models.OneToOneField("auth.User", models.SET_NULL)
  280. name, path, args, kwargs = field.deconstruct()
  281. self.assertEqual(path, "django.db.models.OneToOneField")
  282. self.assertEqual(args, [])
  283. self.assertEqual(kwargs, {"to": "auth.User", "on_delete": models.SET_NULL})
  284. # Test to_field
  285. field = models.OneToOneField("auth.Permission", models.CASCADE, to_field="foobar")
  286. name, path, args, kwargs = field.deconstruct()
  287. self.assertEqual(path, "django.db.models.OneToOneField")
  288. self.assertEqual(args, [])
  289. self.assertEqual(kwargs, {"to": "auth.Permission", "to_field": "foobar", "on_delete": models.CASCADE})
  290. # Test related_name
  291. field = models.OneToOneField("auth.Permission", models.CASCADE, related_name="foobar")
  292. name, path, args, kwargs = field.deconstruct()
  293. self.assertEqual(path, "django.db.models.OneToOneField")
  294. self.assertEqual(args, [])
  295. self.assertEqual(kwargs, {"to": "auth.Permission", "related_name": "foobar", "on_delete": models.CASCADE})
  296. # Test related_query_name
  297. field = models.OneToOneField("auth.Permission", models.CASCADE, related_query_name="foobar")
  298. name, path, args, kwargs = field.deconstruct()
  299. self.assertEqual(path, "django.db.models.OneToOneField")
  300. self.assertEqual(args, [])
  301. self.assertEqual(
  302. kwargs,
  303. {"to": "auth.Permission", "related_query_name": "foobar", "on_delete": models.CASCADE}
  304. )
  305. # Test limit_choices_to
  306. field = models.OneToOneField("auth.Permission", models.CASCADE, limit_choices_to={'foo': 'bar'})
  307. name, path, args, kwargs = field.deconstruct()
  308. self.assertEqual(path, "django.db.models.OneToOneField")
  309. self.assertEqual(args, [])
  310. self.assertEqual(
  311. kwargs,
  312. {"to": "auth.Permission", "limit_choices_to": {'foo': 'bar'}, "on_delete": models.CASCADE}
  313. )
  314. # Test unique
  315. field = models.OneToOneField("auth.Permission", models.CASCADE, unique=True)
  316. name, path, args, kwargs = field.deconstruct()
  317. self.assertEqual(path, "django.db.models.OneToOneField")
  318. self.assertEqual(args, [])
  319. self.assertEqual(kwargs, {"to": "auth.Permission", "on_delete": models.CASCADE})
  320. def test_image_field(self):
  321. field = models.ImageField(upload_to="foo/barness", width_field="width", height_field="height")
  322. name, path, args, kwargs = field.deconstruct()
  323. self.assertEqual(path, "django.db.models.ImageField")
  324. self.assertEqual(args, [])
  325. self.assertEqual(kwargs, {"upload_to": "foo/barness", "width_field": "width", "height_field": "height"})
  326. def test_integer_field(self):
  327. field = models.IntegerField()
  328. name, path, args, kwargs = field.deconstruct()
  329. self.assertEqual(path, "django.db.models.IntegerField")
  330. self.assertEqual(args, [])
  331. self.assertEqual(kwargs, {})
  332. def test_ip_address_field(self):
  333. field = models.IPAddressField()
  334. name, path, args, kwargs = field.deconstruct()
  335. self.assertEqual(path, "django.db.models.IPAddressField")
  336. self.assertEqual(args, [])
  337. self.assertEqual(kwargs, {})
  338. def test_generic_ip_address_field(self):
  339. field = models.GenericIPAddressField()
  340. name, path, args, kwargs = field.deconstruct()
  341. self.assertEqual(path, "django.db.models.GenericIPAddressField")
  342. self.assertEqual(args, [])
  343. self.assertEqual(kwargs, {})
  344. field = models.GenericIPAddressField(protocol="IPv6")
  345. name, path, args, kwargs = field.deconstruct()
  346. self.assertEqual(path, "django.db.models.GenericIPAddressField")
  347. self.assertEqual(args, [])
  348. self.assertEqual(kwargs, {"protocol": "IPv6"})
  349. def test_many_to_many_field(self):
  350. # Test normal
  351. field = models.ManyToManyField("auth.Permission")
  352. name, path, args, kwargs = field.deconstruct()
  353. self.assertEqual(path, "django.db.models.ManyToManyField")
  354. self.assertEqual(args, [])
  355. self.assertEqual(kwargs, {"to": "auth.Permission"})
  356. self.assertFalse(hasattr(kwargs['to'], "setting_name"))
  357. # Test swappable
  358. field = models.ManyToManyField("auth.User")
  359. name, path, args, kwargs = field.deconstruct()
  360. self.assertEqual(path, "django.db.models.ManyToManyField")
  361. self.assertEqual(args, [])
  362. self.assertEqual(kwargs, {"to": "auth.User"})
  363. self.assertEqual(kwargs['to'].setting_name, "AUTH_USER_MODEL")
  364. # Test through
  365. field = models.ManyToManyField("auth.Permission", through="auth.Group")
  366. name, path, args, kwargs = field.deconstruct()
  367. self.assertEqual(path, "django.db.models.ManyToManyField")
  368. self.assertEqual(args, [])
  369. self.assertEqual(kwargs, {"to": "auth.Permission", "through": "auth.Group"})
  370. # Test custom db_table
  371. field = models.ManyToManyField("auth.Permission", db_table="custom_table")
  372. name, path, args, kwargs = field.deconstruct()
  373. self.assertEqual(path, "django.db.models.ManyToManyField")
  374. self.assertEqual(args, [])
  375. self.assertEqual(kwargs, {"to": "auth.Permission", "db_table": "custom_table"})
  376. # Test related_name
  377. field = models.ManyToManyField("auth.Permission", related_name="custom_table")
  378. name, path, args, kwargs = field.deconstruct()
  379. self.assertEqual(path, "django.db.models.ManyToManyField")
  380. self.assertEqual(args, [])
  381. self.assertEqual(kwargs, {"to": "auth.Permission", "related_name": "custom_table"})
  382. # Test related_query_name
  383. field = models.ManyToManyField("auth.Permission", related_query_name="foobar")
  384. name, path, args, kwargs = field.deconstruct()
  385. self.assertEqual(path, "django.db.models.ManyToManyField")
  386. self.assertEqual(args, [])
  387. self.assertEqual(kwargs, {"to": "auth.Permission", "related_query_name": "foobar"})
  388. # Test limit_choices_to
  389. field = models.ManyToManyField("auth.Permission", limit_choices_to={'foo': 'bar'})
  390. name, path, args, kwargs = field.deconstruct()
  391. self.assertEqual(path, "django.db.models.ManyToManyField")
  392. self.assertEqual(args, [])
  393. self.assertEqual(kwargs, {"to": "auth.Permission", "limit_choices_to": {'foo': 'bar'}})
  394. @override_settings(AUTH_USER_MODEL="auth.Permission")
  395. def test_many_to_many_field_swapped(self):
  396. with isolate_lru_cache(apps.get_swappable_settings_name):
  397. # It doesn't matter that we swapped out user for permission;
  398. # there's no validation. We just want to check the setting stuff works.
  399. field = models.ManyToManyField("auth.Permission")
  400. name, path, args, kwargs = field.deconstruct()
  401. self.assertEqual(path, "django.db.models.ManyToManyField")
  402. self.assertEqual(args, [])
  403. self.assertEqual(kwargs, {"to": "auth.Permission"})
  404. self.assertEqual(kwargs['to'].setting_name, "AUTH_USER_MODEL")
  405. def test_null_boolean_field(self):
  406. field = models.NullBooleanField()
  407. name, path, args, kwargs = field.deconstruct()
  408. self.assertEqual(path, "django.db.models.NullBooleanField")
  409. self.assertEqual(args, [])
  410. self.assertEqual(kwargs, {})
  411. def test_positive_integer_field(self):
  412. field = models.PositiveIntegerField()
  413. name, path, args, kwargs = field.deconstruct()
  414. self.assertEqual(path, "django.db.models.PositiveIntegerField")
  415. self.assertEqual(args, [])
  416. self.assertEqual(kwargs, {})
  417. def test_positive_small_integer_field(self):
  418. field = models.PositiveSmallIntegerField()
  419. name, path, args, kwargs = field.deconstruct()
  420. self.assertEqual(path, "django.db.models.PositiveSmallIntegerField")
  421. self.assertEqual(args, [])
  422. self.assertEqual(kwargs, {})
  423. def test_positive_big_integer_field(self):
  424. field = models.PositiveBigIntegerField()
  425. name, path, args, kwargs = field.deconstruct()
  426. self.assertEqual(path, 'django.db.models.PositiveBigIntegerField')
  427. self.assertEqual(args, [])
  428. self.assertEqual(kwargs, {})
  429. def test_slug_field(self):
  430. field = models.SlugField()
  431. name, path, args, kwargs = field.deconstruct()
  432. self.assertEqual(path, "django.db.models.SlugField")
  433. self.assertEqual(args, [])
  434. self.assertEqual(kwargs, {})
  435. field = models.SlugField(db_index=False, max_length=231)
  436. name, path, args, kwargs = field.deconstruct()
  437. self.assertEqual(path, "django.db.models.SlugField")
  438. self.assertEqual(args, [])
  439. self.assertEqual(kwargs, {"db_index": False, "max_length": 231})
  440. def test_small_integer_field(self):
  441. field = models.SmallIntegerField()
  442. name, path, args, kwargs = field.deconstruct()
  443. self.assertEqual(path, "django.db.models.SmallIntegerField")
  444. self.assertEqual(args, [])
  445. self.assertEqual(kwargs, {})
  446. def test_text_field(self):
  447. field = models.TextField()
  448. name, path, args, kwargs = field.deconstruct()
  449. self.assertEqual(path, "django.db.models.TextField")
  450. self.assertEqual(args, [])
  451. self.assertEqual(kwargs, {})
  452. def test_time_field(self):
  453. field = models.TimeField()
  454. name, path, args, kwargs = field.deconstruct()
  455. self.assertEqual(path, "django.db.models.TimeField")
  456. self.assertEqual(args, [])
  457. self.assertEqual(kwargs, {})
  458. field = models.TimeField(auto_now=True)
  459. name, path, args, kwargs = field.deconstruct()
  460. self.assertEqual(args, [])
  461. self.assertEqual(kwargs, {'auto_now': True})
  462. field = models.TimeField(auto_now_add=True)
  463. name, path, args, kwargs = field.deconstruct()
  464. self.assertEqual(args, [])
  465. self.assertEqual(kwargs, {'auto_now_add': True})
  466. def test_url_field(self):
  467. field = models.URLField()
  468. name, path, args, kwargs = field.deconstruct()
  469. self.assertEqual(path, "django.db.models.URLField")
  470. self.assertEqual(args, [])
  471. self.assertEqual(kwargs, {})
  472. field = models.URLField(max_length=231)
  473. name, path, args, kwargs = field.deconstruct()
  474. self.assertEqual(path, "django.db.models.URLField")
  475. self.assertEqual(args, [])
  476. self.assertEqual(kwargs, {"max_length": 231})
  477. def test_binary_field(self):
  478. field = models.BinaryField()
  479. name, path, args, kwargs = field.deconstruct()
  480. self.assertEqual(path, "django.db.models.BinaryField")
  481. self.assertEqual(args, [])
  482. self.assertEqual(kwargs, {})
  483. field = models.BinaryField(editable=True)
  484. name, path, args, kwargs = field.deconstruct()
  485. self.assertEqual(args, [])
  486. self.assertEqual(kwargs, {'editable': True})