Skip to content

Commit 7ccc140

Browse files
committed
added additional tests
1 parent 66acaf4 commit 7ccc140

4 files changed

Lines changed: 102 additions & 1 deletion

File tree

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,6 @@
44
**/__pycache__/
55
.idea/
66
venv/
7-
migrations/
7+
migrations/
8+
.coverage
9+
coverage.xml

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
[tool.pytest.ini_options]
22
testpaths = ["tests"]
3+
addopts = "--cov=src --cov-report=html"
34
pythonpath = ["src"]
45

56
[build-system]

tests/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
from .test_connection import test_connection
22
from .test_session_manager import test_session_manager
3+
from .test_additional import (
4+
test_session_manager_rollback_on_exception,
5+
test_session_generator,
6+
)
37

48
__all__ = ['test_connection', 'test_session_manager']

tests/test_additional.py

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import pytest
2+
from unittest.mock import patch
3+
from sqlalchemy.ext.asyncio import AsyncSession, AsyncConnection, async_sessionmaker
4+
from src.db import Database
5+
from src.db.config import Config
6+
7+
8+
@pytest.mark.asyncio
9+
async def test_session_generator():
10+
"""
11+
Проверка, что session() возвращает асинхронный генератор.
12+
"""
13+
db = Database.from_obj(Config)
14+
15+
gen = db.session()
16+
# Проверка типа
17+
assert hasattr(gen, '__aiter__')
18+
19+
# Проверка работы генератора
20+
async for session in gen:
21+
assert isinstance(session, AsyncSession)
22+
break
23+
24+
@pytest.mark.asyncio
25+
async def test_base_name():
26+
"""
27+
Проверка метода base_name возвращает правильное значение
28+
"""
29+
db = Database.from_obj(Config)
30+
31+
assert db.base_name == Config.database
32+
33+
@pytest.mark.asyncio
34+
async def test_connection_type():
35+
"""
36+
Проверка генератора connection и типа данных, возвращаемых генератором
37+
"""
38+
db = Database.from_obj(Config)
39+
40+
gen = db.connection()
41+
42+
# Проверка типа
43+
assert hasattr(gen, '__aiter__')
44+
45+
# Проверка работы генератора
46+
async for conn in gen:
47+
assert isinstance(conn, AsyncConnection)
48+
break
49+
50+
@pytest.mark.asyncio
51+
async def test_session_factory_type():
52+
"""
53+
Проверка соответствия типа данных фабрики сессий
54+
"""
55+
db = Database.from_obj(Config)
56+
57+
assert isinstance(db.session_factory, async_sessionmaker)
58+
59+
@pytest.mark.asyncio
60+
async def test_session_manager_rollback_on_exception():
61+
"""
62+
Проверка rollback при возникновении исключения.
63+
"""
64+
db = Database.from_obj(Config)
65+
66+
class DummySession:
67+
def __init__(self):
68+
self.committed = False
69+
self.rolled_back = False
70+
self.closed = False
71+
72+
async def execute(self, stmt):
73+
pass
74+
75+
async def commit(self):
76+
self.committed = True
77+
78+
async def rollback(self):
79+
self.rolled_back = True
80+
81+
async def close(self):
82+
self.closed = True
83+
84+
dummy_session = DummySession()
85+
86+
with patch.object(db, '_session_factory', return_value=dummy_session):
87+
with pytest.raises(Exception):
88+
async with db.session_manager() as session:
89+
# Возбуждаем исключение
90+
raise RuntimeError("Test exception")
91+
# Проверяем, что rollback вызван
92+
assert dummy_session.rolled_back
93+
# Проверяем, что сессия закрыта
94+
assert dummy_session.closed

0 commit comments

Comments
 (0)