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") |