forked from cardosofelipe/fast-next-template
Add pyproject.toml for consolidated project configuration and replace Black, isort, and Flake8 with Ruff
- Introduced `pyproject.toml` to centralize backend tool configurations (e.g., Ruff, mypy, coverage, pytest). - Replaced Black, isort, and Flake8 with Ruff for linting, formatting, and import sorting. - Updated `requirements.txt` to include Ruff and remove replaced tools. - Added `Makefile` to streamline development workflows with commands for linting, formatting, type-checking, testing, and cleanup.
This commit is contained in:
@@ -2,12 +2,13 @@
|
||||
"""
|
||||
Tests for database initialization script.
|
||||
"""
|
||||
import pytest
|
||||
import pytest_asyncio
|
||||
from unittest.mock import AsyncMock, patch
|
||||
|
||||
from app.init_db import init_db
|
||||
from unittest.mock import patch
|
||||
|
||||
import pytest
|
||||
|
||||
from app.core.config import settings
|
||||
from app.init_db import init_db
|
||||
|
||||
|
||||
class TestInitDb:
|
||||
@@ -16,69 +17,86 @@ class TestInitDb:
|
||||
@pytest.mark.asyncio
|
||||
async def test_init_db_creates_superuser_when_not_exists(self, async_test_db):
|
||||
"""Test that init_db creates a superuser when one doesn't exist."""
|
||||
test_engine, SessionLocal = async_test_db
|
||||
_test_engine, SessionLocal = async_test_db
|
||||
|
||||
# Mock the SessionLocal to use our test database
|
||||
with patch('app.init_db.SessionLocal', SessionLocal):
|
||||
with patch("app.init_db.SessionLocal", SessionLocal):
|
||||
# Mock settings to provide test credentials
|
||||
with patch.object(settings, 'FIRST_SUPERUSER_EMAIL', 'test_admin@example.com'):
|
||||
with patch.object(settings, 'FIRST_SUPERUSER_PASSWORD', 'TestAdmin123!'):
|
||||
with patch.object(
|
||||
settings, "FIRST_SUPERUSER_EMAIL", "test_admin@example.com"
|
||||
):
|
||||
with patch.object(
|
||||
settings, "FIRST_SUPERUSER_PASSWORD", "TestAdmin123!"
|
||||
):
|
||||
# Run init_db
|
||||
user = await init_db()
|
||||
|
||||
# Verify superuser was created
|
||||
assert user is not None
|
||||
assert user.email == 'test_admin@example.com'
|
||||
assert user.email == "test_admin@example.com"
|
||||
assert user.is_superuser is True
|
||||
assert user.first_name == 'Admin'
|
||||
assert user.last_name == 'User'
|
||||
assert user.first_name == "Admin"
|
||||
assert user.last_name == "User"
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_init_db_returns_existing_superuser(self, async_test_db, async_test_user):
|
||||
async def test_init_db_returns_existing_superuser(
|
||||
self, async_test_db, async_test_user
|
||||
):
|
||||
"""Test that init_db returns existing superuser instead of creating duplicate."""
|
||||
test_engine, SessionLocal = async_test_db
|
||||
_test_engine, SessionLocal = async_test_db
|
||||
|
||||
# Mock the SessionLocal to use our test database
|
||||
with patch('app.init_db.SessionLocal', SessionLocal):
|
||||
with patch("app.init_db.SessionLocal", SessionLocal):
|
||||
# Mock settings to match async_test_user's email
|
||||
with patch.object(settings, 'FIRST_SUPERUSER_EMAIL', 'testuser@example.com'):
|
||||
with patch.object(settings, 'FIRST_SUPERUSER_PASSWORD', 'TestPassword123!'):
|
||||
with patch.object(
|
||||
settings, "FIRST_SUPERUSER_EMAIL", "testuser@example.com"
|
||||
):
|
||||
with patch.object(
|
||||
settings, "FIRST_SUPERUSER_PASSWORD", "TestPassword123!"
|
||||
):
|
||||
# Run init_db
|
||||
user = await init_db()
|
||||
|
||||
# Verify it returns the existing user
|
||||
assert user is not None
|
||||
assert user.id == async_test_user.id
|
||||
assert user.email == 'testuser@example.com'
|
||||
assert user.email == "testuser@example.com"
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_init_db_uses_default_credentials(self, async_test_db):
|
||||
"""Test that init_db uses default credentials when env vars not set."""
|
||||
test_engine, SessionLocal = async_test_db
|
||||
_test_engine, SessionLocal = async_test_db
|
||||
|
||||
# Mock the SessionLocal to use our test database
|
||||
with patch('app.init_db.SessionLocal', SessionLocal):
|
||||
with patch("app.init_db.SessionLocal", SessionLocal):
|
||||
# Mock settings to have None values (not configured)
|
||||
with patch.object(settings, 'FIRST_SUPERUSER_EMAIL', None):
|
||||
with patch.object(settings, 'FIRST_SUPERUSER_PASSWORD', None):
|
||||
with patch.object(settings, "FIRST_SUPERUSER_EMAIL", None):
|
||||
with patch.object(settings, "FIRST_SUPERUSER_PASSWORD", None):
|
||||
# Run init_db
|
||||
user = await init_db()
|
||||
|
||||
# Verify superuser was created with defaults
|
||||
assert user is not None
|
||||
assert user.email == 'admin@example.com'
|
||||
assert user.email == "admin@example.com"
|
||||
assert user.is_superuser is True
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_init_db_handles_database_errors(self, async_test_db):
|
||||
"""Test that init_db handles database errors gracefully."""
|
||||
test_engine, SessionLocal = async_test_db
|
||||
_test_engine, SessionLocal = async_test_db
|
||||
|
||||
# Mock user_crud.get_by_email to raise an exception
|
||||
with patch('app.init_db.user_crud.get_by_email', side_effect=Exception("Database error")):
|
||||
with patch('app.init_db.SessionLocal', SessionLocal):
|
||||
with patch.object(settings, 'FIRST_SUPERUSER_EMAIL', 'test@example.com'):
|
||||
with patch.object(settings, 'FIRST_SUPERUSER_PASSWORD', 'TestPassword123!'):
|
||||
with patch(
|
||||
"app.init_db.user_crud.get_by_email",
|
||||
side_effect=Exception("Database error"),
|
||||
):
|
||||
with patch("app.init_db.SessionLocal", SessionLocal):
|
||||
with patch.object(
|
||||
settings, "FIRST_SUPERUSER_EMAIL", "test@example.com"
|
||||
):
|
||||
with patch.object(
|
||||
settings, "FIRST_SUPERUSER_PASSWORD", "TestPassword123!"
|
||||
):
|
||||
# Run init_db and expect it to raise
|
||||
with pytest.raises(Exception, match="Database error"):
|
||||
await init_db()
|
||||
|
||||
Reference in New Issue
Block a user