fix: use proper test fixtures instead of local_session
Some checks failed
Deploy on push / deploy (push) Failing after 2m17s

- Replace local_session() calls with db_session fixture in tests
- Add @pytest.mark.asyncio decorators to async test functions
- Fix test_unpublish_shout.py to use proper test database setup
- Tests now use in-memory SQLite database with proper schema
- All test tables are created automatically via conftest.py fixtures
This commit is contained in:
2025-08-12 13:41:31 +03:00
parent 2fe8145fe2
commit 09dd86b51a
3 changed files with 77 additions and 80 deletions

View File

@@ -1,24 +1,22 @@
import pytest
from services.auth import AuthService
from services.db import local_session
from auth.orm import Author
@pytest.mark.asyncio
async def test_ensure_user_has_reader_role():
async def test_ensure_user_has_reader_role(db_session):
"""Тест добавления роли reader пользователю"""
auth_service = AuthService()
# Создаем тестового пользователя без роли reader
with local_session() as session:
test_author = Author(
email="test_reader_role@example.com",
slug="test_reader_role",
password="test_password"
)
session.add(test_author)
session.commit()
user_id = test_author.id
test_author = Author(
email="test_reader_role@example.com",
slug="test_reader_role",
password="test_password"
)
db_session.add(test_author)
db_session.commit()
user_id = test_author.id
try:
# Проверяем, что роль reader добавляется
@@ -30,8 +28,7 @@ async def test_ensure_user_has_reader_role():
assert result is True
finally:
# Очищаем тестовые данные
with local_session() as session:
test_author = session.query(Author).filter_by(id=user_id).first()
if test_author:
session.delete(test_author)
session.commit()
test_author = db_session.query(Author).filter_by(id=user_id).first()
if test_author:
db_session.delete(test_author)
db_session.commit()

View File

@@ -247,14 +247,9 @@ with (
from orm.community import Community, CommunityAuthor
@pytest.fixture
def oauth_db_session():
def oauth_db_session(db_session):
"""Фикстура для сессии базы данных в OAuth тестах"""
from services.db import local_session
session = local_session()
try:
yield session
finally:
session.close()
return db_session
@pytest.fixture
def simple_user(oauth_db_session):

View File

@@ -14,6 +14,7 @@ import logging
import sys
import time
from pathlib import Path
import pytest
sys.path.append(str(Path(__file__).parent))
@@ -47,69 +48,69 @@ class MockInfo:
}
async def setup_test_data() -> tuple[Author, Shout, Author]:
async def setup_test_data(db_session) -> tuple[Author, Shout, Author]:
"""Создаем тестовые данные: автора, публикацию и другого автора"""
logger.info("🔧 Настройка тестовых данных")
current_time = int(time.time())
with local_session() as session:
# Создаем первого автора (владельца публикации)
test_author = session.query(Author).where(Author.email == "test_author@example.com").first()
if not test_author:
test_author = Author(email="test_author@example.com", name="Test Author", slug="test-author")
test_author.set_password("password123")
session.add(test_author)
session.flush() # Получаем ID
# Создаем первого автора (владельца публикации)
test_author = db_session.query(Author).where(Author.email == "test_author@example.com").first()
if not test_author:
test_author = Author(email="test_author@example.com", name="Test Author", slug="test-author")
test_author.set_password("password123")
db_session.add(test_author)
db_session.flush() # Получаем ID
# Создаем второго автора (не владельца)
other_author = session.query(Author).where(Author.email == "other_author@example.com").first()
if not other_author:
other_author = Author(email="other_author@example.com", name="Other Author", slug="other-author")
other_author.set_password("password456")
session.add(other_author)
session.flush()
# Создаем второго автора (не владельца)
other_author = db_session.query(Author).where(Author.email == "other_author@example.com").first()
if not other_author:
other_author = Author(email="other_author@example.com", name="Other Author", slug="other-author")
other_author.set_password("password456")
db_session.add(other_author)
db_session.flush()
# Создаем опубликованную публикацию
test_shout = session.query(Shout).where(Shout.slug == "test-shout-published").first()
if not test_shout:
test_shout = Shout(
title="Test Published Shout",
slug="test-shout-published",
body="This is a test published shout content",
layout="article",
created_by=test_author.id,
created_at=current_time,
published_at=current_time, # Публикация опубликована
community=1,
seo="Test shout for unpublish testing",
)
session.add(test_shout)
else:
# Убедимся что публикация опубликована
test_shout.published_at = current_time
session.add(test_shout)
session.commit()
# Добавляем роли пользователям в БД
assign_role_to_user(test_author.id, "reader")
assign_role_to_user(test_author.id, "author")
assign_role_to_user(other_author.id, "reader")
assign_role_to_user(other_author.id, "author")
logger.info(
f" ✅ Созданы: автор {test_author.id}, другой автор {other_author.id}, публикация {test_shout.id}"
# Создаем опубликованную публикацию
test_shout = db_session.query(Shout).where(Shout.slug == "test-shout-published").first()
if not test_shout:
test_shout = Shout(
title="Test Published Shout",
slug="test-shout-published",
body="This is a test published shout content",
layout="article",
created_by=test_author.id,
created_at=current_time,
published_at=current_time, # Публикация опубликована
community=1,
seo="Test shout for unpublish testing",
)
db_session.add(test_shout)
else:
# Убедимся что публикация опубликована
test_shout.published_at = current_time
db_session.add(test_shout)
return test_author, test_shout, other_author
db_session.commit()
# Добавляем роли пользователям в БД
assign_role_to_user(test_author.id, "reader")
assign_role_to_user(test_author.id, "author")
assign_role_to_user(other_author.id, "reader")
assign_role_to_user(other_author.id, "author")
logger.info(
f" ✅ Созданы: автор {test_author.id}, другой автор {other_author.id}, публикация {test_shout.id}"
)
return test_author, test_shout, other_author
async def test_successful_unpublish_by_author() -> None:
@pytest.mark.asyncio
async def test_successful_unpublish_by_author(db_session) -> None:
"""Тестируем успешное снятие публикации автором"""
logger.info("📰 Тестирование успешного снятия публикации автором")
test_author, test_shout, _ = await setup_test_data()
test_author, test_shout, _ = await setup_test_data(db_session)
# Тест 1: Успешное снятие публикации автором
logger.info(" 📝 Тест 1: Снятие публикации автором")
@@ -138,11 +139,12 @@ async def test_successful_unpublish_by_author() -> None:
logger.error(f" ❌ Ошибка снятия публикации: {result.error}")
async def test_unpublish_by_editor() -> None:
@pytest.mark.asyncio
async def test_unpublish_by_editor(db_session) -> None:
"""Тестируем снятие публикации редактором"""
logger.info("👨‍💼 Тестирование снятия публикации редактором")
test_author, test_shout, other_author = await setup_test_data()
test_author, test_shout, other_author = await setup_test_data(db_session)
# Восстанавливаем публикацию для теста
with local_session() as session:
@@ -177,11 +179,12 @@ async def test_unpublish_by_editor() -> None:
logger.error(f" ❌ Ошибка снятия публикации редактором: {result.error}")
async def test_access_denied_scenarios() -> None:
@pytest.mark.asyncio
async def test_access_denied_scenarios(db_session) -> None:
"""Тестируем сценарии отказа в доступе"""
logger.info("🚫 Тестирование отказа в доступе")
test_author, test_shout, other_author = await setup_test_data()
test_author, test_shout, other_author = await setup_test_data(db_session)
# Восстанавливаем публикацию для теста
with local_session() as session:
@@ -219,11 +222,12 @@ async def test_access_denied_scenarios() -> None:
logger.error(f" ❌ Неожиданный результат для не-автора: {result.error}")
async def test_nonexistent_shout() -> None:
@pytest.mark.asyncio
async def test_nonexistent_shout(db_session) -> None:
"""Тестируем обработку несуществующих публикаций"""
logger.info("👻 Тестирование несуществующих публикаций")
test_author, _, _ = await setup_test_data()
test_author, _, _ = await setup_test_data(db_session)
logger.info(" 📝 Тест: Несуществующая публикация")
info = MockInfo(test_author.id)
@@ -238,11 +242,12 @@ async def test_nonexistent_shout() -> None:
logger.error(f" ❌ Неожиданный результат для несуществующей публикации: {result.error}")
async def test_already_unpublished_shout() -> None:
@pytest.mark.asyncio
async def test_already_unpublished_shout(db_session) -> None:
"""Тестируем снятие публикации с уже неопубликованной публикации"""
logger.info("📝 Тестирование уже неопубликованной публикации")
test_author, test_shout, _ = await setup_test_data()
test_author, test_shout, _ = await setup_test_data(db_session)
# Убеждаемся что публикация не опубликована
with local_session() as session: