diff options
| author | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2021-02-02 21:34:36 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-02-02 21:34:36 +0100 |
| commit | f131841c601b9d4884adcdb284b4213c2ad89231 (patch) | |
| tree | 25a00660711853a453a208d88a4affcd751a258f /tests/backends/postgresql/tests.py | |
| parent | f9cfd346f0222d86bfbac26ef5455806965bae6b (diff) | |
Fixed #32403 -- Fixed re-raising DatabaseErrors when using only 'postgres' database.
Thanks Kazantcev Andrey for the report.
Regression in f48f671223a20b161ca819cf7d6298e43b8ba5fe.
Diffstat (limited to 'tests/backends/postgresql/tests.py')
| -rw-r--r-- | tests/backends/postgresql/tests.py | 50 |
1 files changed, 49 insertions, 1 deletions
diff --git a/tests/backends/postgresql/tests.py b/tests/backends/postgresql/tests.py index 94ebfbdaf8..7f27c69ffb 100644 --- a/tests/backends/postgresql/tests.py +++ b/tests/backends/postgresql/tests.py @@ -1,9 +1,10 @@ +import copy import unittest from io import StringIO from unittest import mock from django.core.exceptions import ImproperlyConfigured -from django.db import DatabaseError, connection, connections +from django.db import DEFAULT_DB_ALIAS, DatabaseError, connection, connections from django.db.backends.base.base import BaseDatabaseWrapper from django.test import TestCase, override_settings @@ -54,6 +55,53 @@ class Tests(TestCase): self.assertIsNone(cursor.db.connection) self.assertIsNotNone(cursor.db.settings_dict['NAME']) self.assertEqual(cursor.db.settings_dict['NAME'], connections['other'].settings_dict['NAME']) + # Cursor is yielded only for the first PostgreSQL database. + with self.assertWarnsMessage(RuntimeWarning, msg): + with mock.patch( + 'django.db.backends.base.base.BaseDatabaseWrapper.connect', + side_effect=mocked_connect, + autospec=True, + ): + with connection._nodb_cursor() as cursor: + self.assertIs(cursor.closed, False) + self.assertIsNotNone(cursor.db.connection) + + def test_nodb_cursor_raises_postgres_authentication_failure(self): + """ + _nodb_cursor() re-raises authentication failure to the 'postgres' db + when other connection to the PostgreSQL database isn't available. + """ + def mocked_connect(self): + raise DatabaseError() + + def mocked_all(self): + test_connection = copy.copy(connections[DEFAULT_DB_ALIAS]) + test_connection.settings_dict = copy.deepcopy(connection.settings_dict) + test_connection.settings_dict['NAME'] = 'postgres' + return [test_connection] + + msg = ( + "Normally Django will use a connection to the 'postgres' database " + "to avoid running initialization queries against the production " + "database when it's not needed (for example, when running tests). " + "Django was unable to create a connection to the 'postgres' " + "database and will use the first PostgreSQL database instead." + ) + with self.assertWarnsMessage(RuntimeWarning, msg): + mocker_connections_all = mock.patch( + 'django.utils.connection.BaseConnectionHandler.all', + side_effect=mocked_all, + autospec=True, + ) + mocker_connect = mock.patch( + 'django.db.backends.base.base.BaseDatabaseWrapper.connect', + side_effect=mocked_connect, + autospec=True, + ) + with mocker_connections_all, mocker_connect: + with self.assertRaises(DatabaseError): + with connection._nodb_cursor(): + pass def test_database_name_too_long(self): from django.db.backends.postgresql.base import DatabaseWrapper |
