Почему 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'.