Project

General

Profile

Statistics
| Branch: | Revision:

root / env / lib / python2.7 / site-packages / south / tests / autodetection.py @ d1a4905f

History | View | Annotate | Download (11.5 KB)

1
from south.tests import unittest
2

    
3
from south.creator.changes import AutoChanges, InitialChanges
4
from south.migration.base import Migrations
5
from south.tests import Monkeypatcher
6
from south.creator import freezer
7
from south.orm import FakeORM
8
from south.v2 import SchemaMigration
9

    
10
class TestComparison(unittest.TestCase):
11
    
12
    """
13
    Tests the comparison methods of startmigration.
14
    """
15
    
16
    def test_no_change(self):
17
        "Test with a completely unchanged definition."
18
        
19
        self.assertEqual(
20
            AutoChanges.different_attributes(
21
                ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['southdemo.Lizard']"}),
22
                ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['southdemo.Lizard']"}),
23
            ),
24
            False,
25
        )
26
        
27
        self.assertEqual(
28
            AutoChanges.different_attributes(
29
                ('django.db.models.fields.related.ForeignKey', ['ohhai', 'there'], {'to': "somewhere", "from": "there"}),
30
                ('django.db.models.fields.related.ForeignKey', ['ohhai', 'there'], {"from": "there", 'to': "somewhere"}),
31
            ),
32
            False,
33
        )
34
    
35
    
36
    def test_pos_change(self):
37
        "Test with a changed positional argument."
38
        
39
        self.assertEqual(
40
            AutoChanges.different_attributes(
41
                ('django.db.models.fields.CharField', ['hi'], {'to': "foo"}),
42
                ('django.db.models.fields.CharField', [], {'to': "foo"}),
43
            ),
44
            True,
45
        )
46
        
47
        self.assertEqual(
48
            AutoChanges.different_attributes(
49
                ('django.db.models.fields.CharField', [], {'to': "foo"}),
50
                ('django.db.models.fields.CharField', ['bye'], {'to': "foo"}),
51
            ),
52
            True,
53
        )
54
        
55
        self.assertEqual(
56
            AutoChanges.different_attributes(
57
                ('django.db.models.fields.CharField', ['pi'], {'to': "foo"}),
58
                ('django.db.models.fields.CharField', ['pi'], {'to': "foo"}),
59
            ),
60
            False,
61
        )
62
        
63
        self.assertEqual(
64
            AutoChanges.different_attributes(
65
                ('django.db.models.fields.CharField', ['pisdadad'], {'to': "foo"}),
66
                ('django.db.models.fields.CharField', ['pi'], {'to': "foo"}),
67
            ),
68
            True,
69
        )
70
        
71
        self.assertEqual(
72
            AutoChanges.different_attributes(
73
                ('django.db.models.fields.CharField', ['hi'], {}),
74
                ('django.db.models.fields.CharField', [], {}),
75
            ),
76
            True,
77
        )
78
        
79
        self.assertEqual(
80
            AutoChanges.different_attributes(
81
                ('django.db.models.fields.CharField', [], {}),
82
                ('django.db.models.fields.CharField', ['bye'], {}),
83
            ),
84
            True,
85
        )
86
        
87
        self.assertEqual(
88
            AutoChanges.different_attributes(
89
                ('django.db.models.fields.CharField', ['pi'], {}),
90
                ('django.db.models.fields.CharField', ['pi'], {}),
91
            ),
92
            False,
93
        )
94
        
95
        self.assertEqual(
96
            AutoChanges.different_attributes(
97
                ('django.db.models.fields.CharField', ['pi'], {}),
98
                ('django.db.models.fields.CharField', ['45fdfdf'], {}),
99
            ),
100
            True,
101
        )
102
    
103
    
104
    def test_kwd_change(self):
105
        "Test a changed keyword argument"
106
        
107
        self.assertEqual(
108
            AutoChanges.different_attributes(
109
                ('django.db.models.fields.CharField', ['pi'], {'to': "foo"}),
110
                ('django.db.models.fields.CharField', ['pi'], {'to': "blue"}),
111
            ),
112
            True,
113
        )
114
        
115
        self.assertEqual(
116
            AutoChanges.different_attributes(
117
                ('django.db.models.fields.CharField', [], {'to': "foo"}),
118
                ('django.db.models.fields.CharField', [], {'to': "blue"}),
119
            ),
120
            True,
121
        )
122
        
123
        self.assertEqual(
124
            AutoChanges.different_attributes(
125
                ('django.db.models.fields.CharField', ['b'], {'to': "foo"}),
126
                ('django.db.models.fields.CharField', ['b'], {'to': "blue"}),
127
            ),
128
            True,
129
        )
130
        
131
        self.assertEqual(
132
            AutoChanges.different_attributes(
133
                ('django.db.models.fields.CharField', [], {'to': "foo"}),
134
                ('django.db.models.fields.CharField', [], {}),
135
            ),
136
            True,
137
        )
138
        
139
        self.assertEqual(
140
            AutoChanges.different_attributes(
141
                ('django.db.models.fields.CharField', ['a'], {'to': "foo"}),
142
                ('django.db.models.fields.CharField', ['a'], {}),
143
            ),
144
            True,
145
        )
146
        
147
        self.assertEqual(
148
            AutoChanges.different_attributes(
149
                ('django.db.models.fields.CharField', [], {}),
150
                ('django.db.models.fields.CharField', [], {'to': "foo"}),
151
            ),
152
            True,
153
        )
154
        
155
        self.assertEqual(
156
            AutoChanges.different_attributes(
157
                ('django.db.models.fields.CharField', ['a'], {}),
158
                ('django.db.models.fields.CharField', ['a'], {'to': "foo"}),
159
            ),
160
            True,
161
        )
162
        
163
    
164
    
165
    def test_backcompat_nochange(self):
166
        "Test that the backwards-compatable comparison is working"
167
        
168
        self.assertEqual(
169
            AutoChanges.different_attributes(
170
                ('models.CharField', [], {}),
171
                ('django.db.models.fields.CharField', [], {}),
172
            ),
173
            False,
174
        )
175
        
176
        self.assertEqual(
177
            AutoChanges.different_attributes(
178
                ('models.CharField', ['ack'], {}),
179
                ('django.db.models.fields.CharField', ['ack'], {}),
180
            ),
181
            False,
182
        )
183
        
184
        self.assertEqual(
185
            AutoChanges.different_attributes(
186
                ('models.CharField', [], {'to':'b'}),
187
                ('django.db.models.fields.CharField', [], {'to':'b'}),
188
            ),
189
            False,
190
        )
191
        
192
        self.assertEqual(
193
            AutoChanges.different_attributes(
194
                ('models.CharField', ['hah'], {'to':'you'}),
195
                ('django.db.models.fields.CharField', ['hah'], {'to':'you'}),
196
            ),
197
            False,
198
        )
199
        
200
        self.assertEqual(
201
            AutoChanges.different_attributes(
202
                ('models.CharField', ['hah'], {'to':'you'}),
203
                ('django.db.models.fields.CharField', ['hah'], {'to':'heh'}),
204
            ),
205
            True,
206
        )
207
        
208
        self.assertEqual(
209
            AutoChanges.different_attributes(
210
                ('models.CharField', ['hah'], {}),
211
                ('django.db.models.fields.CharField', [], {'to':"orm['appname.hah']"}),
212
            ),
213
            False,
214
        )
215
        
216
        self.assertEqual(
217
            AutoChanges.different_attributes(
218
                ('models.CharField', ['hah'], {}),
219
                ('django.db.models.fields.CharField', [], {'to':'hah'}),
220
            ),
221
            True,
222
        )
223
        
224
        self.assertEqual(
225
            AutoChanges.different_attributes(
226
                ('models.CharField', ['hah'], {}),
227
                ('django.db.models.fields.CharField', [], {'to':'rrr'}),
228
            ),
229
            True,
230
        )
231
        
232
        self.assertEqual(
233
            AutoChanges.different_attributes(
234
                ('models.CharField', ['hah'], {}),
235
                ('django.db.models.fields.IntField', [], {'to':'hah'}),
236
            ),
237
            True,
238
        )
239

    
240
class TestNonManagedIgnored(Monkeypatcher):
241
    
242
    installed_apps = ["non_managed"]
243

    
244
    full_defs = {
245
        'non_managed.legacy': {
246
            'Meta': {'object_name': 'Legacy', 'db_table': "'legacy_table'", 'managed': 'False'},
247
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
248
            'name': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True'}),
249
            'size': ('django.db.models.fields.IntegerField', [], {})
250
        }
251
    } 
252

    
253
    def test_not_added_init(self):
254
        
255
        migrations = Migrations("non_managed")
256
        changes = InitialChanges(migrations)
257
        change_list = changes.get_changes()
258
        if list(change_list):
259
            self.fail("Initial migration creates table for non-managed model")
260

    
261
    def test_not_added_auto(self):
262

    
263
        empty_defs = { }
264
        class EmptyMigration(SchemaMigration):
265
            "Serves as fake previous migration"
266
        
267
            def forwards(self, orm):
268
                pass
269
        
270
            def backwards(self, orm):
271
                pass
272
        
273
            models = empty_defs
274

    
275
            complete_apps = ['non_managed']
276
                    
277
        migrations = Migrations("non_managed")
278
        empty_orm = FakeORM(EmptyMigration, "non_managed")
279
        changes = AutoChanges(
280
            migrations = migrations,
281
            old_defs = empty_defs,
282
            old_orm = empty_orm,
283
            new_defs = self.full_defs,
284
        )
285
        change_list = changes.get_changes()
286
        if list(change_list):
287
            self.fail("Auto migration creates table for non-managed model")
288

    
289
    def test_not_deleted_auto(self):
290

    
291
        empty_defs = { }
292
        old_defs = freezer.freeze_apps(["non_managed"])
293
        class InitialMigration(SchemaMigration):
294
            "Serves as fake previous migration"
295
        
296
            def forwards(self, orm):
297
                pass
298
        
299
            def backwards(self, orm):
300
                pass
301
        
302
            models = self.full_defs
303

    
304
            complete_apps = ['non_managed']
305
                    
306
        migrations = Migrations("non_managed")
307
        initial_orm = FakeORM(InitialMigration, "non_managed")
308
        changes = AutoChanges(
309
            migrations = migrations,
310
            old_defs = self.full_defs,
311
            old_orm = initial_orm,
312
            new_defs = empty_defs,
313
        )
314
        change_list = changes.get_changes()
315
        if list(change_list):
316
            self.fail("Auto migration deletes table for non-managed model")
317

    
318
    def test_not_modified_auto(self):
319

    
320
        fake_defs = {
321
            'non_managed.legacy': {
322
                'Meta': {'object_name': 'Legacy', 'db_table': "'legacy_table'", 'managed': 'False'},
323
                'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
324
                'name': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True'}),
325
                #'size': ('django.db.models.fields.IntegerField', [], {}) # The "change" is the addition of this field
326
            }
327
        } 
328
        class InitialMigration(SchemaMigration):
329
            "Serves as fake previous migration"
330
        
331
            def forwards(self, orm):
332
                pass
333
        
334
            def backwards(self, orm):
335
                pass
336
        
337
            models = fake_defs
338

    
339
            complete_apps = ['non_managed']
340
                    
341
        from non_managed import models as dummy_import_to_force_loading_models # TODO: Does needing this indicate a bug in MokeyPatcher? 
342
        
343
        migrations = Migrations("non_managed")
344
        initial_orm = FakeORM(InitialMigration, "non_managed")
345
        changes = AutoChanges(
346
            migrations = migrations,
347
            old_defs = fake_defs,
348
            old_orm = initial_orm,
349
            new_defs = self.full_defs
350
        )
351
        change_list = changes.get_changes()
352
        if list(change_list):
353
            self.fail("Auto migration changes table for non-managed model")