Skip to content

Commit

Permalink
[1.9.x] Used SchemaEditor.delete_model() for teardown in schema tests.
Browse files Browse the repository at this point in the history
Some third-party database backends (MSSQL) have custom
delete_model() requirements that must be executed.

Thanks Michael Manfre for the initial patch and review.

Backport of 4dcc2a1 from master
  • Loading branch information
timgraham committed Oct 16, 2015
1 parent d1ccf7b commit faafd55
Showing 1 changed file with 27 additions and 33 deletions.
60 changes: 27 additions & 33 deletions tests/schema/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,28 +69,16 @@ def tearDown(self):
def delete_tables(self):
"Deletes all model tables for our models for a clean test environment"
converter = connection.introspection.table_name_converter
with connection.cursor() as cursor:
with atomic():
connection.disable_constraint_checking()
table_names = connection.introspection.table_names(cursor)
table_names = connection.introspection.table_names()
for model in itertools.chain(SchemaTests.models, self.local_models):
# Remove any M2M tables first
for field in model._meta.local_many_to_many:
with atomic():
tbl = converter(field.remote_field.through._meta.db_table)
if tbl in table_names:
cursor.execute(connection.schema_editor().sql_delete_table % {
"table": connection.ops.quote_name(tbl),
})
table_names.remove(tbl)
# Then remove the main tables
with atomic():
tbl = converter(model._meta.db_table)
if tbl in table_names:
cursor.execute(connection.schema_editor().sql_delete_table % {
"table": connection.ops.quote_name(tbl),
})
table_names.remove(tbl)
connection.enable_constraint_checking()
tbl = converter(model._meta.db_table)
if tbl in table_names:
with connection.schema_editor() as editor:
editor.delete_model(model)
table_names.remove(tbl)
connection.enable_constraint_checking()

def column_classes(self, model):
with connection.cursor() as cursor:
Expand Down Expand Up @@ -945,11 +933,7 @@ class LocalBookWithM2M(Model):
class Meta:
app_label = 'schema'
apps = new_apps

self.local_models = [
LocalBookWithM2M,
LocalBookWithM2M._meta.get_field('tags').remote_field.through,
]
self.local_models = [LocalBookWithM2M]
# Create the tables
with connection.schema_editor() as editor:
editor.create_model(Author)
Expand Down Expand Up @@ -1028,7 +1012,6 @@ class Meta:
# Create an M2M field
new_field = M2MFieldClass("schema.TagM2MTest", related_name="authors")
new_field.contribute_to_class(LocalAuthorWithM2M, "tags")
self.local_models += [new_field.remote_field.through]
# Ensure there's no m2m table there
self.assertRaises(DatabaseError, self.column_classes, new_field.remote_field.through)
# Add the field
Expand All @@ -1048,6 +1031,14 @@ class Meta:
# Ensure there's no m2m table there
self.assertRaises(DatabaseError, self.column_classes, new_field.remote_field.through)

# Need to tear down using a model without the added M2M field that's
# been removed.
class LocalAuthorWithM2M(Model):
class Meta:
app_label = 'schema'
apps = new_apps
self.local_models = [LocalAuthorWithM2M]

def test_m2m(self):
self._test_m2m(ManyToManyField)

Expand Down Expand Up @@ -1117,12 +1108,7 @@ class LocalBookWithM2M(Model):
class Meta:
app_label = 'schema'
apps = new_apps

self.local_models = [
LocalBookWithM2M,
LocalBookWithM2M._meta.get_field('tags').remote_field.through,
]

self.local_models = [LocalBookWithM2M]
# Create the tables
with connection.schema_editor() as editor:
editor.create_model(Author)
Expand All @@ -1144,14 +1130,22 @@ class Meta:
old_field = LocalBookWithM2M._meta.get_field("tags")
new_field = M2MFieldClass(UniqueTest)
new_field.contribute_to_class(LocalBookWithM2M, "uniques")
self.local_models += [new_field.remote_field.through]
with connection.schema_editor() as editor:
editor.alter_field(LocalBookWithM2M, old_field, new_field)
# Ensure old M2M is gone
self.assertRaises(
DatabaseError,
self.column_classes, LocalBookWithM2M._meta.get_field("tags").remote_field.through
)

# This model looks like the new model and is used for teardown.
class LocalBookWithM2M(Model):
uniques = M2MFieldClass(UniqueTest)

class Meta:
app_label = 'schema'
apps = new_apps
self.local_models = [LocalBookWithM2M]
# Ensure the new M2M exists and points to UniqueTest
constraints = self.get_constraints(new_field.remote_field.through._meta.db_table)
if connection.features.supports_foreign_keys:
Expand Down

0 comments on commit faafd55

Please sign in to comment.