diff options
Diffstat (limited to 'tests/backends/sqlite')
| -rw-r--r-- | tests/backends/sqlite/tests.py | 64 |
1 files changed, 47 insertions, 17 deletions
diff --git a/tests/backends/sqlite/tests.py b/tests/backends/sqlite/tests.py index c82ed1667d..2dcdb8c4f9 100644 --- a/tests/backends/sqlite/tests.py +++ b/tests/backends/sqlite/tests.py @@ -2,7 +2,7 @@ import re import threading import unittest -from django.db import connection +from django.db import connection, transaction from django.db.models import Avg, StdDev, Sum, Variance from django.db.models.fields import CharField from django.db.utils import NotSupportedError @@ -16,22 +16,6 @@ from ..models import Author, Item, Object, Square class Tests(TestCase): longMessage = True - def test_autoincrement(self): - """ - auto_increment fields are created with the AUTOINCREMENT keyword - in order to be monotonically increasing (#10164). - """ - with connection.schema_editor(collect_sql=True) as editor: - editor.create_model(Square) - statements = editor.collected_sql - match = re.search('"id" ([^,]+),', statements[0]) - self.assertIsNotNone(match) - self.assertEqual( - 'integer NOT NULL PRIMARY KEY AUTOINCREMENT', - match.group(1), - 'Wrong SQL used to create an auto-increment column on SQLite' - ) - def test_aggregation(self): """ Raise NotImplementedError when aggregating on date/time fields (#19360). @@ -66,6 +50,52 @@ class SchemaTests(TransactionTestCase): available_apps = ['backends'] + def test_autoincrement(self): + """ + auto_increment fields are created with the AUTOINCREMENT keyword + in order to be monotonically increasing (#10164). + """ + with connection.schema_editor(collect_sql=True) as editor: + editor.create_model(Square) + statements = editor.collected_sql + match = re.search('"id" ([^,]+),', statements[0]) + self.assertIsNotNone(match) + self.assertEqual( + 'integer NOT NULL PRIMARY KEY AUTOINCREMENT', + match.group(1), + 'Wrong SQL used to create an auto-increment column on SQLite' + ) + + def test_disable_constraint_checking_failure_disallowed(self): + """ + SQLite schema editor is not usable within an outer transaction if + foreign key constraint checks are not disabled beforehand. + """ + msg = ( + 'SQLite schema editor cannot be used while foreign key ' + 'constraint checks are enabled. Make sure to disable them ' + 'before entering a transaction.atomic() context because ' + 'SQLite3 does not support disabling them in the middle of ' + 'a multi-statement transaction.' + ) + with self.assertRaisesMessage(NotSupportedError, msg): + with transaction.atomic(), connection.schema_editor(atomic=True): + pass + + def test_constraint_checks_disabled_atomic_allowed(self): + """ + SQLite3 schema editor is usable within an outer transaction as long as + foreign key constraints checks are disabled beforehand. + """ + def constraint_checks_enabled(): + with connection.cursor() as cursor: + return bool(cursor.execute('PRAGMA foreign_keys').fetchone()[0]) + with connection.constraint_checks_disabled(), transaction.atomic(): + with connection.schema_editor(atomic=True): + self.assertFalse(constraint_checks_enabled()) + self.assertFalse(constraint_checks_enabled()) + self.assertTrue(constraint_checks_enabled()) + def test_field_rename_inside_atomic_block(self): """ NotImplementedError is raised when a model field rename is attempted |
