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