Почему Django REST Framework APITestCase не может создать тестовую базу данных, которая размещена на ElephantSQL?

В настоящее время я пытаюсь научиться запускать тесты в Python/Django REST Framework. Я создал базу данных, которая хранится на ElephantSQL, используя их бесплатный тарифный план (tiny turtle). Я успешно подключил базу данных и смог создать в ней таблицы.

Однако я пытаюсь освоить модульное тестирование, поэтому сейчас я пытаюсь использовать APITestCase для тестирования представления регистра. Мой тест написан следующим образом:

import json
from django.contrib.auth.models import User
from django.urls import reverse
from rest_framework.authtoken.models import Token
from rest_framework.test import APITestCase
from rest_framework import status
from users.serializers.common import RegistrationSerializer, UserSerializer

class RegistrationTestCase(APITestCase):

  def test_registration(self):
    data = {'username': 'testuser', 'email': 'test@email.com', 'password': 'super_unique_password', 'password_confirmation': 'super_unique_password'}
    # Add a test user to database
    response = self.client.post('/api/auth/register/', data)
    # Test that 201 status is receieved
    self.assertEqual(response.status_code, status.HTTP_201_CREATED)

Мои базы данных в settings.py настроены следующим образом:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': env('DATABASE_NAME'),
        'HOST': env('DATABASE_HOST'),
        'PORT': 5432,
            'USER': env('DATABASE_USER'),
            'PASSWORD': env('DATABASE_PASS'),
    },
    'test': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': env('DATABASE_NAME'),
        'HOST': env('DATABASE_HOST'),
        'PORT': 5432,
            'USER': env('DATABASE_USER'),
            'PASSWORD': env('DATABASE_PASS'),
    }
}

Когда я запускаю python manage.py test --verbosity=2, я получаю следующую ошибку:

Found 1 test(s).
Skipping setup of unused database(s): test.
Creating test database for alias 'default' ('test_<database_name_here>')...
/home/ben_kelly/.local/share/virtualenvs/Siege_of_the_Citadel_Companion-eBaHHEGM/lib/python3.10/site-packages/django/db/backends/postgresql/base.py:407: RuntimeWarning: 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.
  warnings.warn(
Got an error creating the test database: permission denied to create database

Я убедился, что пользователь pqsl является суперпользователем и имеет права на CREATEDB.

Я также попробовал сделать это без "тестовой" базы данных в settings.py, но это также дало ту же ошибку.

Кажется, что проблема может быть связана с тем, что тестовая база данных префиксирует имя базы данных с "test_", однако когда я меняю имя базы данных в базе данных "test" в settings.py, это не меняет вывод после "creating test database for alias 'default'".

Я попытался посмотреть, к какой базе данных обращается default, используя приведенный ниже пример в классе RegistrationTestCase, однако печати не происходит, так что, предположительно, код не доходит до этого места.

 def test_database_alias(self):
      database_alias = self.client._db or 'default'
      print("Using database alias:", database_alias)

Любая помощь будет очень признательна!

Кажется, я решил свою проблему.

Измените базы данных settings.py на:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': env('DATABASE_NAME'),
        'HOST': env('DATABASE_HOST'),
        'PORT': 5432,
            'USER': env('DATABASE_USER'),
            'PASSWORD': env('DATABASE_PASS'),
        'TEST': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': env('DATABASE_NAME'),
            'HOST': env('DATABASE_HOST'),
            'PORT': 5432,
            'USER': env('DATABASE_USER'),
            'PASSWORD': env('DATABASE_PASS'),
        }
    },
}

Позволяет коду обращаться к базе данных без добавления к ней префикса 'test_'.

Тогда выполнение python manage.py test --keepdb предотвращает ошибку 'permission denied to create database'.

Вернуться на верх