from unittest import mock from django.db import connections from django.test import TestCase, TransactionTestCase, override_settings from django.test.testcases import DatabaseOperationForbidden from .models import Car class TestSerializedRollbackInhibitsPostMigrate(TransactionTestCase): """ TransactionTestCase._fixture_teardown() inhibits the post_migrate signal for test classes with serialized_rollback=True. """ available_apps = ["test_utils"] serialized_rollback = True def setUp(self): # self.available_apps must be None to test the serialized_rollback # condition. self.available_apps = None def tearDown(self): self.available_apps = ["test_utils"] @mock.patch("django.test.testcases.call_command") def test(self, call_command): # with a mocked call_command(), this doesn't have any effect. self._fixture_teardown() call_command.assert_called_with( "flush", interactive=False, allow_cascade=False, reset_sequences=False, inhibit_post_migrate=True, database="default", verbosity=0, ) @override_settings(DEBUG=True) # Enable query logging for test_queries_cleared class TransactionTestCaseDatabasesTests(TestCase): available_apps = [] databases = {"default", "other"} def test_queries_cleared(self): """ TransactionTestCase._pre_setup() clears the connections' queries_log so that it's less likely to overflow. An overflow causes assertNumQueries() to fail. """ for alias in self.databases: self.assertEqual( len(connections[alias].queries_log), 0, "Failed for alias %s" % alias ) class DisallowedDatabaseQueriesTests(TransactionTestCase): available_apps = ["test_utils"] def test_disallowed_database_queries(self): message = ( "Database queries to 'other' are not allowed in this test. " "Add 'other' to test_utils.test_transactiontestcase." "DisallowedDatabaseQueriesTests.databases to ensure proper test " "isolation and silence this failure." ) with self.assertRaisesMessage(DatabaseOperationForbidden, message): Car.objects.using("other").get()