Project

General

Profile

Statistics
| Branch: | Revision:

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