Commit 3543fec3 authored by Riccardo Magliocchetti's avatar Riccardo Magliocchetti Committed by Tim Graham
Browse files

Refs #12118 -- Allowed "mode=memory" in SQLite test database names.

parent 6afa6818
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -11,14 +11,16 @@ class DatabaseCreation(BaseDatabaseCreation):

    def _get_test_db_name(self):
        test_database_name = self.connection.settings_dict['TEST']['NAME']
        can_share_in_memory_db = self.connection.features.can_share_in_memory_db
        if test_database_name and test_database_name != ':memory:':
            if 'mode=memory' in test_database_name:
            if 'mode=memory' in test_database_name and not can_share_in_memory_db:
                raise ImproperlyConfigured(
                    "Using `mode=memory` parameter in the database name is not allowed, "
                    "Using a shared memory database with `mode=memory` in the "
                    "database name is not supported in your environment, "
                    "use `:memory:` instead."
                )
            return test_database_name
        if self.connection.features.can_share_in_memory_db:
        if can_share_in_memory_db:
            return 'file:memorydb_%s?mode=memory&cache=shared' % self.connection.alias
        return ':memory:'

+3 −0
Original line number Diff line number Diff line
@@ -11,3 +11,6 @@ Bugfixes

* Fixed a regression causing ``ModelChoiceField`` to ignore
  ``prefetch_related()`` on its queryset (:ticket:`25496`).

* Allowed "mode=memory" in SQLite test database name if supported
  (:ticket:`12118`).
+24 −0
Original line number Diff line number Diff line
@@ -142,6 +142,30 @@ class SQLiteTests(TestCase):
                models.Item.objects.all().aggregate,
                **{'complex': aggregate('last_modified') + aggregate('last_modified')})

    def test_memory_db_test_name(self):
        """
        A named in-memory db should be allowed where supported.
        """
        from django.db.backends.sqlite3.base import DatabaseWrapper
        settings_dict = {
            'TEST': {
                'NAME': 'file:memorydb_test?mode=memory&cache=shared',
            }
        }
        wrapper = DatabaseWrapper(settings_dict)
        creation = wrapper.creation
        if creation.connection.features.can_share_in_memory_db:
            expected = creation.connection.settings_dict['TEST']['NAME']
            self.assertEqual(creation._get_test_db_name(), expected)
        else:
            msg = (
                "Using a shared memory database with `mode=memory` in the "
                "database name is not supported in your environment, "
                "use `:memory:` instead."
            )
            with self.assertRaisesMessage(ImproperlyConfigured, msg):
                creation._get_test_db_name()


@unittest.skipUnless(connection.vendor == 'postgresql', "Test only for PostgreSQL")
class PostgreSQLTests(TestCase):