PageRenderTime 27ms CodeModel.GetById 30ms RepoModel.GetById 0ms app.codeStats 0ms

/python/Lib/site-packages/south-0.7.6-py2.7.egg/south/tests/db_mysql.py

https://gitlab.com/pmuontains/Odoo
Python | 165 lines | 154 code | 6 blank | 5 comment | 0 complexity | 9e65342612d0ac7c8eb8575badb6fd01 MD5 | raw file
  1. # Additional MySQL-specific tests
  2. # Written by: F. Gabriel Gosselin <gabrielNOSPAM@evidens.ca>
  3. # Based on tests by: aarranz
  4. from south.tests import unittest
  5. from south.db import db, generic, mysql
  6. from django.db import connection, models
  7. class TestMySQLOperations(unittest.TestCase):
  8. """MySQL-specific tests"""
  9. def setUp(self):
  10. db.debug = False
  11. db.clear_deferred_sql()
  12. def tearDown(self):
  13. pass
  14. def _create_foreign_tables(self, main_name, reference_name):
  15. # Create foreign table and model
  16. Foreign = db.mock_model(model_name='Foreign', db_table=reference_name,
  17. db_tablespace='', pk_field_name='id',
  18. pk_field_type=models.AutoField,
  19. pk_field_args=[])
  20. db.create_table(reference_name, [
  21. ('id', models.AutoField(primary_key=True)),
  22. ])
  23. # Create table with foreign key
  24. db.create_table(main_name, [
  25. ('id', models.AutoField(primary_key=True)),
  26. ('foreign', models.ForeignKey(Foreign)),
  27. ])
  28. return Foreign
  29. def test_constraint_references(self):
  30. """Tests that referred table is reported accurately"""
  31. if db.backend_name != "mysql":
  32. return
  33. main_table = 'test_cns_ref'
  34. reference_table = 'test_cr_foreign'
  35. db.start_transaction()
  36. self._create_foreign_tables(main_table, reference_table)
  37. db.execute_deferred_sql()
  38. constraint = db._find_foreign_constraints(main_table, 'foreign_id')[0]
  39. constraint_name = 'foreign_id_refs_id_%x' % (abs(hash((main_table,
  40. reference_table))))
  41. self.assertEquals(constraint_name, constraint)
  42. references = db._lookup_constraint_references(main_table, constraint)
  43. self.assertEquals((reference_table, 'id'), references)
  44. db.delete_table(main_table)
  45. db.delete_table(reference_table)
  46. def test_reverse_column_constraint(self):
  47. """Tests that referred column in a foreign key (ex. id) is found"""
  48. if db.backend_name != "mysql":
  49. return
  50. main_table = 'test_reverse_ref'
  51. reference_table = 'test_rr_foreign'
  52. db.start_transaction()
  53. self._create_foreign_tables(main_table, reference_table)
  54. db.execute_deferred_sql()
  55. inverse = db._lookup_reverse_constraint(reference_table, 'id')
  56. (cname, rev_table, rev_column) = inverse[0]
  57. self.assertEquals(main_table, rev_table)
  58. self.assertEquals('foreign_id', rev_column)
  59. db.delete_table(main_table)
  60. db.delete_table(reference_table)
  61. def test_delete_fk_column(self):
  62. if db.backend_name != "mysql":
  63. return
  64. main_table = 'test_drop_foreign'
  65. ref_table = 'test_df_ref'
  66. self._create_foreign_tables(main_table, ref_table)
  67. db.execute_deferred_sql()
  68. constraints = db._find_foreign_constraints(main_table, 'foreign_id')
  69. self.assertEquals(len(constraints), 1)
  70. db.delete_column(main_table, 'foreign_id')
  71. constraints = db._find_foreign_constraints(main_table, 'foreign_id')
  72. self.assertEquals(len(constraints), 0)
  73. db.delete_table(main_table)
  74. db.delete_table(ref_table)
  75. def test_rename_fk_column(self):
  76. if db.backend_name != "mysql":
  77. return
  78. main_table = 'test_rename_foreign'
  79. ref_table = 'test_rf_ref'
  80. self._create_foreign_tables(main_table, ref_table)
  81. db.execute_deferred_sql()
  82. constraints = db._find_foreign_constraints(main_table, 'foreign_id')
  83. self.assertEquals(len(constraints), 1)
  84. db.rename_column(main_table, 'foreign_id', 'reference_id')
  85. db.execute_deferred_sql() #Create constraints
  86. constraints = db._find_foreign_constraints(main_table, 'reference_id')
  87. self.assertEquals(len(constraints), 1)
  88. db.delete_table(main_table)
  89. db.delete_table(ref_table)
  90. def test_rename_fk_inbound(self):
  91. """
  92. Tests that the column referred to by an external column can be renamed.
  93. Edge case, but also useful as stepping stone to renaming tables.
  94. """
  95. if db.backend_name != "mysql":
  96. return
  97. main_table = 'test_rename_fk_inbound'
  98. ref_table = 'test_rfi_ref'
  99. self._create_foreign_tables(main_table, ref_table)
  100. db.execute_deferred_sql()
  101. constraints = db._lookup_reverse_constraint(ref_table, 'id')
  102. self.assertEquals(len(constraints), 1)
  103. db.rename_column(ref_table, 'id', 'rfi_id')
  104. db.execute_deferred_sql() #Create constraints
  105. constraints = db._lookup_reverse_constraint(ref_table, 'rfi_id')
  106. self.assertEquals(len(constraints), 1)
  107. cname = db._find_foreign_constraints(main_table, 'foreign_id')[0]
  108. (rtable, rcolumn) = db._lookup_constraint_references(main_table, cname)
  109. self.assertEquals(rcolumn, 'rfi_id')
  110. db.delete_table(main_table)
  111. db.delete_table(ref_table)
  112. def test_rename_constrained_table(self):
  113. """Renames a table with a foreign key column (towards another table)"""
  114. if db.backend_name != "mysql":
  115. return
  116. main_table = 'test_rn_table'
  117. ref_table = 'test_rt_ref'
  118. renamed_table = 'test_renamed_table'
  119. self._create_foreign_tables(main_table, ref_table)
  120. db.execute_deferred_sql()
  121. constraints = db._find_foreign_constraints(main_table, 'foreign_id')
  122. self.assertEquals(len(constraints), 1)
  123. db.rename_table(main_table, renamed_table)
  124. db.execute_deferred_sql() #Create constraints
  125. constraints = db._find_foreign_constraints(renamed_table, 'foreign_id')
  126. self.assertEquals(len(constraints), 1)
  127. (rtable, rcolumn) = db._lookup_constraint_references(
  128. renamed_table, constraints[0])
  129. self.assertEquals(rcolumn, 'id')
  130. db.delete_table(renamed_table)
  131. db.delete_table(ref_table)
  132. def test_renamed_referenced_table(self):
  133. """Rename a table referred to in a foreign key"""
  134. if db.backend_name != "mysql":
  135. return
  136. main_table = 'test_rn_refd_table'
  137. ref_table = 'test_rrt_ref'
  138. renamed_table = 'test_renamed_ref'
  139. self._create_foreign_tables(main_table, ref_table)
  140. db.execute_deferred_sql()
  141. constraints = db._lookup_reverse_constraint(ref_table)
  142. self.assertEquals(len(constraints), 1)
  143. db.rename_table(ref_table, renamed_table)
  144. db.execute_deferred_sql() #Create constraints
  145. constraints = db._find_foreign_constraints(main_table, 'foreign_id')
  146. self.assertEquals(len(constraints), 1)
  147. (rtable, rcolumn) = db._lookup_constraint_references(
  148. main_table, constraints[0])
  149. self.assertEquals(renamed_table, rtable)
  150. db.delete_table(main_table)
  151. db.delete_table(renamed_table)