/scrumdo-web/apps/django_evolution/tests/delete_field.py

https://github.com/abstract-open-solutions/ScrumDo
Python | 268 lines | 267 code | 1 blank | 0 comment | 0 complexity | d84e41a62f31144b57d7c3d8e402fbff MD5 | raw file
  1. from django_evolution.tests.utils import test_sql_mapping
  2. tests = r"""
  3. >>> from django.db import models
  4. >>> from django_evolution.mutations import DeleteField
  5. >>> from django_evolution.tests.utils import test_proj_sig, execute_test_sql, register_models, deregister_models
  6. >>> from django_evolution.diff import Diff
  7. >>> import copy
  8. # All Fields
  9. # db index (ignored for now)
  10. # db tablespace (ignored for now)
  11. # db column
  12. # primary key
  13. # unique
  14. # M2M Fields
  15. # to field
  16. # db table
  17. # Model Meta
  18. # db table
  19. # db tablespace (ignored for now)
  20. # unique together (ignored for now)
  21. # Now, a useful test model we can use for evaluating diffs
  22. >>> class DeleteAnchor1(models.Model):
  23. ... value = models.IntegerField()
  24. >>> class DeleteAnchor2(models.Model):
  25. ... value = models.IntegerField()
  26. >>> class DeleteAnchor3(models.Model):
  27. ... value = models.IntegerField()
  28. >>> class DeleteAnchor4(models.Model):
  29. ... value = models.IntegerField()
  30. >>> class DeleteBaseModel(models.Model):
  31. ... my_id = models.AutoField(primary_key=True)
  32. ... char_field = models.CharField(max_length=20)
  33. ... int_field = models.IntegerField()
  34. ... int_field2 = models.IntegerField(db_column='non-default_db_column')
  35. ... int_field3 = models.IntegerField(unique=True)
  36. ... fk_field1 = models.ForeignKey(DeleteAnchor1)
  37. ... m2m_field1 = models.ManyToManyField(DeleteAnchor3)
  38. ... m2m_field2 = models.ManyToManyField(DeleteAnchor4, db_table='non-default_m2m_table')
  39. >>> class CustomTableModel(models.Model):
  40. ... value = models.IntegerField()
  41. ... alt_value = models.CharField(max_length=20)
  42. ... class Meta:
  43. ... db_table = 'custom_table_name'
  44. # Store the base signatures
  45. >>> anchors = (
  46. ... ('DeleteAnchor1', DeleteAnchor1),
  47. ... ('DeleteAnchor2', DeleteAnchor2),
  48. ... ('DeleteAnchor3', DeleteAnchor3),
  49. ... ('DeleteAnchor4', DeleteAnchor4),
  50. ... )
  51. >>> custom_model = ('CustomTableModel', CustomTableModel)
  52. >>> custom = register_models(custom_model)
  53. >>> custom_sig = test_proj_sig(custom_model)
  54. >>> test_model = ('TestModel', DeleteBaseModel)
  55. >>> start = register_models(*anchors)
  56. >>> start.update(register_models(test_model))
  57. >>> start_sig = test_proj_sig(test_model, *anchors)
  58. # Deleting a default named column
  59. >>> class DefaultNamedColumnModel(models.Model):
  60. ... my_id = models.AutoField(primary_key=True)
  61. ... char_field = models.CharField(max_length=20)
  62. ... int_field2 = models.IntegerField(db_column='non-default_db_column')
  63. ... int_field3 = models.IntegerField(unique=True)
  64. ... fk_field1 = models.ForeignKey(DeleteAnchor1)
  65. ... m2m_field1 = models.ManyToManyField(DeleteAnchor3)
  66. ... m2m_field2 = models.ManyToManyField(DeleteAnchor4, db_table='non-default_m2m_table')
  67. >>> end = register_models(('TestModel', DefaultNamedColumnModel), *anchors)
  68. >>> end_sig = test_proj_sig(('TestModel', DefaultNamedColumnModel), *anchors)
  69. >>> d = Diff(start_sig, end_sig)
  70. >>> print [str(e) for e in d.evolution()['tests']]
  71. ["DeleteField('TestModel', 'int_field')"]
  72. >>> test_sig = copy.deepcopy(start_sig)
  73. >>> test_sql = []
  74. >>> for mutation in d.evolution()['tests']:
  75. ... test_sql.extend(mutation.mutate('tests', test_sig))
  76. ... mutation.simulate('tests', test_sig)
  77. >>> Diff(test_sig, end_sig).is_empty()
  78. True
  79. >>> execute_test_sql(start, end, test_sql) #DefaultNamedColumnModel
  80. %(DefaultNamedColumnModel)s
  81. # Deleting a non-default named column
  82. >>> class NonDefaultNamedColumnModel(models.Model):
  83. ... my_id = models.AutoField(primary_key=True)
  84. ... char_field = models.CharField(max_length=20)
  85. ... int_field = models.IntegerField()
  86. ... int_field3 = models.IntegerField(unique=True)
  87. ... fk_field1 = models.ForeignKey(DeleteAnchor1)
  88. ... m2m_field1 = models.ManyToManyField(DeleteAnchor3)
  89. ... m2m_field2 = models.ManyToManyField(DeleteAnchor4, db_table='non-default_m2m_table')
  90. >>> end = register_models(('TestModel', NonDefaultNamedColumnModel), *anchors)
  91. >>> end_sig = test_proj_sig(('TestModel', NonDefaultNamedColumnModel), *anchors)
  92. >>> d = Diff(start_sig, end_sig)
  93. >>> print [str(e) for e in d.evolution()['tests']]
  94. ["DeleteField('TestModel', 'int_field2')"]
  95. >>> test_sig = copy.deepcopy(start_sig)
  96. >>> test_sql = []
  97. >>> for mutation in d.evolution()['tests']:
  98. ... test_sql.extend(mutation.mutate('tests', test_sig))
  99. ... mutation.simulate('tests', test_sig)
  100. >>> Diff(test_sig, end_sig).is_empty()
  101. True
  102. >>> execute_test_sql(start, end, test_sql) #NonDefaultNamedColumnModel
  103. %(NonDefaultNamedColumnModel)s
  104. # Deleting a column with database constraints (unique)
  105. # TODO: Verify that the produced SQL is actually correct
  106. # -- BK
  107. >>> class ConstrainedColumnModel(models.Model):
  108. ... my_id = models.AutoField(primary_key=True)
  109. ... char_field = models.CharField(max_length=20)
  110. ... int_field = models.IntegerField()
  111. ... int_field2 = models.IntegerField(db_column='non-default_db_column')
  112. ... fk_field1 = models.ForeignKey(DeleteAnchor1)
  113. ... m2m_field1 = models.ManyToManyField(DeleteAnchor3)
  114. ... m2m_field2 = models.ManyToManyField(DeleteAnchor4, db_table='non-default_m2m_table')
  115. >>> end = register_models(('TestModel', ConstrainedColumnModel), *anchors)
  116. >>> end_sig = test_proj_sig(('TestModel', ConstrainedColumnModel), *anchors)
  117. >>> d = Diff(start_sig, end_sig)
  118. >>> print [str(e) for e in d.evolution()['tests']]
  119. ["DeleteField('TestModel', 'int_field3')"]
  120. >>> test_sig = copy.deepcopy(start_sig)
  121. >>> test_sql = []
  122. >>> for mutation in d.evolution()['tests']:
  123. ... test_sql.extend(mutation.mutate('tests', test_sig))
  124. ... mutation.simulate('tests', test_sig)
  125. >>> Diff(test_sig, end_sig).is_empty()
  126. True
  127. >>> execute_test_sql(start, end, test_sql) #ConstrainedColumnModel
  128. %(ConstrainedColumnModel)s
  129. # Deleting a default m2m
  130. >>> class DefaultM2MModel(models.Model):
  131. ... my_id = models.AutoField(primary_key=True)
  132. ... char_field = models.CharField(max_length=20)
  133. ... int_field = models.IntegerField()
  134. ... int_field2 = models.IntegerField(db_column='non-default_db_column')
  135. ... int_field3 = models.IntegerField(unique=True)
  136. ... fk_field1 = models.ForeignKey(DeleteAnchor1)
  137. ... m2m_field2 = models.ManyToManyField(DeleteAnchor4, db_table='non-default_m2m_table')
  138. >>> end = register_models(('TestModel', DefaultM2MModel), *anchors)
  139. >>> end_sig = test_proj_sig(('TestModel', DefaultM2MModel), *anchors)
  140. >>> d = Diff(start_sig, end_sig)
  141. >>> print [str(e) for e in d.evolution()['tests']]
  142. ["DeleteField('TestModel', 'm2m_field1')"]
  143. >>> test_sig = copy.deepcopy(start_sig)
  144. >>> test_sql = []
  145. >>> for mutation in d.evolution()['tests']:
  146. ... test_sql.extend(mutation.mutate('tests', test_sig))
  147. ... mutation.simulate('tests', test_sig)
  148. >>> Diff(test_sig, end_sig).is_empty()
  149. True
  150. >>> execute_test_sql(start, end, test_sql) #DefaultManyToManyModel
  151. %(DefaultManyToManyModel)s
  152. # Deleting a m2m stored in a non-default table
  153. >>> class NonDefaultM2MModel(models.Model):
  154. ... my_id = models.AutoField(primary_key=True)
  155. ... char_field = models.CharField(max_length=20)
  156. ... int_field = models.IntegerField()
  157. ... int_field2 = models.IntegerField(db_column='non-default_db_column')
  158. ... int_field3 = models.IntegerField(unique=True)
  159. ... fk_field1 = models.ForeignKey(DeleteAnchor1)
  160. ... m2m_field1 = models.ManyToManyField(DeleteAnchor3)
  161. >>> end = register_models(('TestModel', NonDefaultM2MModel), *anchors)
  162. >>> end_sig = test_proj_sig(('TestModel', NonDefaultM2MModel), *anchors)
  163. >>> d = Diff(start_sig, end_sig)
  164. >>> print [str(e) for e in d.evolution()['tests']]
  165. ["DeleteField('TestModel', 'm2m_field2')"]
  166. >>> test_sig = copy.deepcopy(start_sig)
  167. >>> test_sql = []
  168. >>> for mutation in d.evolution()['tests']:
  169. ... test_sql.extend(mutation.mutate('tests', test_sig))
  170. ... mutation.simulate('tests', test_sig)
  171. >>> Diff(test_sig, end_sig).is_empty()
  172. True
  173. >>> execute_test_sql(start, end, test_sql) #NonDefaultManyToManyModel
  174. %(NonDefaultManyToManyModel)s
  175. # Delete a foreign key
  176. >>> class DeleteForeignKeyModel(models.Model):
  177. ... my_id = models.AutoField(primary_key=True)
  178. ... char_field = models.CharField(max_length=20)
  179. ... int_field = models.IntegerField()
  180. ... int_field2 = models.IntegerField(db_column='non-default_db_column')
  181. ... int_field3 = models.IntegerField(unique=True)
  182. ... m2m_field1 = models.ManyToManyField(DeleteAnchor3)
  183. ... m2m_field2 = models.ManyToManyField(DeleteAnchor4, db_table='non-default_m2m_table')
  184. >>> end = register_models(('TestModel', DeleteForeignKeyModel), *anchors)
  185. >>> end_sig = test_proj_sig(('TestModel', DeleteForeignKeyModel), *anchors)
  186. >>> d = Diff(start_sig, end_sig)
  187. >>> print [str(e) for e in d.evolution()['tests']]
  188. ["DeleteField('TestModel', 'fk_field1')"]
  189. >>> test_sig = copy.deepcopy(start_sig)
  190. >>> test_sql = []
  191. >>> for mutation in d.evolution()['tests']:
  192. ... test_sql.extend(mutation.mutate('tests', test_sig))
  193. ... mutation.simulate('tests', test_sig)
  194. >>> Diff(test_sig, end_sig).is_empty()
  195. True
  196. >>> execute_test_sql(start, end, test_sql) #DeleteForeignKeyModel
  197. %(DeleteForeignKeyModel)s
  198. # Deleting a column from a non-default table
  199. >>> class DeleteColumnCustomTableModel(models.Model):
  200. ... alt_value = models.CharField(max_length=20)
  201. ... class Meta:
  202. ... db_table = 'custom_table_name'
  203. >>> end = register_models(('CustomTableModel', DeleteColumnCustomTableModel))
  204. >>> end_sig = test_proj_sig(('CustomTableModel', DeleteColumnCustomTableModel))
  205. >>> d = Diff(custom_sig, end_sig)
  206. >>> print [str(e) for e in d.evolution()['tests']]
  207. ["DeleteField('CustomTableModel', 'value')"]
  208. >>> test_sig = copy.deepcopy(custom_sig)
  209. >>> test_sql = []
  210. >>> for mutation in d.evolution()['tests']:
  211. ... test_sql.extend(mutation.mutate('tests', test_sig))
  212. ... mutation.simulate('tests', test_sig)
  213. >>> Diff(test_sig, end_sig).is_empty()
  214. True
  215. >>> execute_test_sql(custom, end, test_sql) #DeleteColumnCustomTableModel
  216. %(DeleteColumnCustomTableModel)s
  217. # Clean up after the applications that were installed
  218. >>> deregister_models()
  219. """ % test_sql_mapping('delete_field')