summaryrefslogtreecommitdiff
path: root/tests/schema
diff options
context:
space:
mode:
Diffstat (limited to 'tests/schema')
-rw-r--r--tests/schema/tests.py96
1 files changed, 55 insertions, 41 deletions
diff --git a/tests/schema/tests.py b/tests/schema/tests.py
index 450362ecda..a502ef6002 100644
--- a/tests/schema/tests.py
+++ b/tests/schema/tests.py
@@ -37,38 +37,38 @@ class SchemaTests(TransactionTestCase):
def delete_tables(self):
"Deletes all model tables for our models for a clean test environment"
- cursor = connection.cursor()
- connection.disable_constraint_checking()
- table_names = connection.introspection.table_names(cursor)
- for model in self.models:
- # Remove any M2M tables first
- for field in model._meta.local_many_to_many:
+ with connection.cursor() as cursor:
+ connection.disable_constraint_checking()
+ table_names = connection.introspection.table_names(cursor)
+ for model in self.models:
+ # Remove any M2M tables first
+ for field in model._meta.local_many_to_many:
+ with atomic():
+ tbl = field.rel.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 = field.rel.through._meta.db_table
+ tbl = 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)
- # Then remove the main tables
- with atomic():
- tbl = 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()
def column_classes(self, model):
- cursor = connection.cursor()
- columns = dict(
- (d[0], (connection.introspection.get_field_type(d[1], d), d))
- for d in connection.introspection.get_table_description(
- cursor,
- model._meta.db_table,
+ with connection.cursor() as cursor:
+ columns = dict(
+ (d[0], (connection.introspection.get_field_type(d[1], d), d))
+ for d in connection.introspection.get_table_description(
+ cursor,
+ model._meta.db_table,
+ )
)
- )
# SQLite has a different format for field_type
for name, (type, desc) in columns.items():
if isinstance(type, tuple):
@@ -78,6 +78,20 @@ class SchemaTests(TransactionTestCase):
raise DatabaseError("Table does not exist (empty pragma)")
return columns
+ def get_indexes(self, table):
+ """
+ Get the indexes on the table using a new cursor.
+ """
+ with connection.cursor() as cursor:
+ return connection.introspection.get_indexes(cursor, table)
+
+ def get_constraints(self, table):
+ """
+ Get the constraints on a table using a new cursor.
+ """
+ with connection.cursor() as cursor:
+ return connection.introspection.get_constraints(cursor, table)
+
# Tests
def test_creation_deletion(self):
@@ -127,7 +141,7 @@ class SchemaTests(TransactionTestCase):
strict=True,
)
# Make sure the new FK constraint is present
- constraints = connection.introspection.get_constraints(connection.cursor(), Book._meta.db_table)
+ constraints = self.get_constraints(Book._meta.db_table)
for name, details in constraints.items():
if details['columns'] == ["author_id"] and details['foreign_key']:
self.assertEqual(details['foreign_key'], ('schema_tag', 'id'))
@@ -342,7 +356,7 @@ class SchemaTests(TransactionTestCase):
editor.create_model(TagM2MTest)
editor.create_model(UniqueTest)
# Ensure the M2M exists and points to TagM2MTest
- constraints = connection.introspection.get_constraints(connection.cursor(), BookWithM2M._meta.get_field_by_name("tags")[0].rel.through._meta.db_table)
+ constraints = self.get_constraints(BookWithM2M._meta.get_field_by_name("tags")[0].rel.through._meta.db_table)
if connection.features.supports_foreign_keys:
for name, details in constraints.items():
if details['columns'] == ["tagm2mtest_id"] and details['foreign_key']:
@@ -363,7 +377,7 @@ class SchemaTests(TransactionTestCase):
# Ensure old M2M is gone
self.assertRaises(DatabaseError, self.column_classes, BookWithM2M._meta.get_field_by_name("tags")[0].rel.through)
# Ensure the new M2M exists and points to UniqueTest
- constraints = connection.introspection.get_constraints(connection.cursor(), new_field.rel.through._meta.db_table)
+ constraints = self.get_constraints(new_field.rel.through._meta.db_table)
if connection.features.supports_foreign_keys:
for name, details in constraints.items():
if details['columns'] == ["uniquetest_id"] and details['foreign_key']:
@@ -388,7 +402,7 @@ class SchemaTests(TransactionTestCase):
with connection.schema_editor() as editor:
editor.create_model(Author)
# Ensure the constraint exists
- constraints = connection.introspection.get_constraints(connection.cursor(), Author._meta.db_table)
+ constraints = self.get_constraints(Author._meta.db_table)
for name, details in constraints.items():
if details['columns'] == ["height"] and details['check']:
break
@@ -404,7 +418,7 @@ class SchemaTests(TransactionTestCase):
new_field,
strict=True,
)
- constraints = connection.introspection.get_constraints(connection.cursor(), Author._meta.db_table)
+ constraints = self.get_constraints(Author._meta.db_table)
for name, details in constraints.items():
if details['columns'] == ["height"] and details['check']:
self.fail("Check constraint for height found")
@@ -416,7 +430,7 @@ class SchemaTests(TransactionTestCase):
Author._meta.get_field_by_name("height")[0],
strict=True,
)
- constraints = connection.introspection.get_constraints(connection.cursor(), Author._meta.db_table)
+ constraints = self.get_constraints(Author._meta.db_table)
for name, details in constraints.items():
if details['columns'] == ["height"] and details['check']:
break
@@ -527,7 +541,7 @@ class SchemaTests(TransactionTestCase):
False,
any(
c["index"]
- for c in connection.introspection.get_constraints(connection.cursor(), "schema_tag").values()
+ for c in self.get_constraints("schema_tag").values()
if c['columns'] == ["slug", "title"]
),
)
@@ -543,7 +557,7 @@ class SchemaTests(TransactionTestCase):
True,
any(
c["index"]
- for c in connection.introspection.get_constraints(connection.cursor(), "schema_tag").values()
+ for c in self.get_constraints("schema_tag").values()
if c['columns'] == ["slug", "title"]
),
)
@@ -561,7 +575,7 @@ class SchemaTests(TransactionTestCase):
False,
any(
c["index"]
- for c in connection.introspection.get_constraints(connection.cursor(), "schema_tag").values()
+ for c in self.get_constraints("schema_tag").values()
if c['columns'] == ["slug", "title"]
),
)
@@ -578,7 +592,7 @@ class SchemaTests(TransactionTestCase):
True,
any(
c["index"]
- for c in connection.introspection.get_constraints(connection.cursor(), "schema_tagindexed").values()
+ for c in self.get_constraints("schema_tagindexed").values()
if c['columns'] == ["slug", "title"]
),
)
@@ -627,7 +641,7 @@ class SchemaTests(TransactionTestCase):
# Ensure the table is there and has the right index
self.assertIn(
"title",
- connection.introspection.get_indexes(connection.cursor(), Book._meta.db_table),
+ self.get_indexes(Book._meta.db_table),
)
# Alter to remove the index
new_field = CharField(max_length=100, db_index=False)
@@ -642,7 +656,7 @@ class SchemaTests(TransactionTestCase):
# Ensure the table is there and has no index
self.assertNotIn(
"title",
- connection.introspection.get_indexes(connection.cursor(), Book._meta.db_table),
+ self.get_indexes(Book._meta.db_table),
)
# Alter to re-add the index
with connection.schema_editor() as editor:
@@ -655,7 +669,7 @@ class SchemaTests(TransactionTestCase):
# Ensure the table is there and has the index again
self.assertIn(
"title",
- connection.introspection.get_indexes(connection.cursor(), Book._meta.db_table),
+ self.get_indexes(Book._meta.db_table),
)
# Add a unique column, verify that creates an implicit index
with connection.schema_editor() as editor:
@@ -665,7 +679,7 @@ class SchemaTests(TransactionTestCase):
)
self.assertIn(
"slug",
- connection.introspection.get_indexes(connection.cursor(), Book._meta.db_table),
+ self.get_indexes(Book._meta.db_table),
)
# Remove the unique, check the index goes with it
new_field2 = CharField(max_length=20, unique=False)
@@ -679,7 +693,7 @@ class SchemaTests(TransactionTestCase):
)
self.assertNotIn(
"slug",
- connection.introspection.get_indexes(connection.cursor(), Book._meta.db_table),
+ self.get_indexes(Book._meta.db_table),
)
def test_primary_key(self):
@@ -691,7 +705,7 @@ class SchemaTests(TransactionTestCase):
editor.create_model(Tag)
# Ensure the table is there and has the right PK
self.assertTrue(
- connection.introspection.get_indexes(connection.cursor(), Tag._meta.db_table)['id']['primary_key'],
+ self.get_indexes(Tag._meta.db_table)['id']['primary_key'],
)
# Alter to change the PK
new_field = SlugField(primary_key=True)
@@ -707,10 +721,10 @@ class SchemaTests(TransactionTestCase):
# Ensure the PK changed
self.assertNotIn(
'id',
- connection.introspection.get_indexes(connection.cursor(), Tag._meta.db_table),
+ self.get_indexes(Tag._meta.db_table),
)
self.assertTrue(
- connection.introspection.get_indexes(connection.cursor(), Tag._meta.db_table)['slug']['primary_key'],
+ self.get_indexes(Tag._meta.db_table)['slug']['primary_key'],
)
def test_context_manager_exit(self):
@@ -741,7 +755,7 @@ class SchemaTests(TransactionTestCase):
# Ensure the table is there and has an index on the column
self.assertIn(
column_name,
- connection.introspection.get_indexes(connection.cursor(), BookWithLongName._meta.db_table),
+ self.get_indexes(BookWithLongName._meta.db_table),
)
def test_creation_deletion_reserved_names(self):