Skip to content

Commit c5292bd

Browse files
authored
Merge pull request #9 from dmsnback/feature/pytest
Feature/pytest
2 parents 4ce99e8 + 6ee7e1d commit c5292bd

4 files changed

Lines changed: 139 additions & 0 deletions

File tree

requirements.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
aiosqlite==0.22.1
12
anyio==4.12.1
23
APScheduler==3.11.2
34
asyncpg==0.31.0
@@ -45,6 +46,7 @@ pyflakes==3.4.0
4546
Pygments==2.19.2
4647
pyOpenSSL==25.3.0
4748
pytest==9.0.2
49+
pytest-asyncio==1.3.0
4850
python-dotenv==1.2.1
4951
python-telegram-bot==22.6
5052
pytokens==0.4.0

tests/conftest.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import pytest
2+
import pytest_asyncio
3+
from db.models import Base, News
4+
from sqlalchemy import create_engine
5+
from sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine
6+
from sqlalchemy.orm import sessionmaker
7+
8+
DATABASE_SYNC_URL = "sqlite:///:memory:"
9+
DATABASE_ASYNC_URL = "sqlite+aiosqlite:///:memory:"
10+
11+
12+
@pytest.fixture
13+
def session():
14+
engine = create_engine(DATABASE_SYNC_URL, echo=False)
15+
Base.metadata.create_all(engine)
16+
Session = sessionmaker(engine)
17+
session = Session()
18+
yield session
19+
session.close()
20+
21+
22+
@pytest_asyncio.fixture
23+
async def async_session():
24+
engine = create_async_engine(DATABASE_ASYNC_URL, echo=False)
25+
async with engine.begin() as conn:
26+
await conn.run_sync(Base.metadata.create_all)
27+
AsyncSession = async_sessionmaker(engine, expire_on_commit=False)
28+
async with AsyncSession() as async_session:
29+
yield async_session
30+
await engine.dispose()
31+
32+
33+
@pytest.fixture
34+
def news():
35+
test_news = {
36+
"url": "https://panorama.pub/test-news",
37+
"title": "Test Title",
38+
"text": "Test Text",
39+
"image": None,
40+
}
41+
return test_news
42+
43+
44+
@pytest_asyncio.fixture
45+
async def news_list(async_session):
46+
first_news = News(
47+
url="https://panorama.pub/test-news_1",
48+
title="Test Title 1",
49+
image=None,
50+
text="Ttest Text_1",
51+
)
52+
second_news = News(
53+
url="https://panorama.pub/test-news_2",
54+
title="Test Title 2",
55+
image=None,
56+
text="Ttest Text_2",
57+
)
58+
59+
async_session.add_all([first_news, second_news])
60+
await async_session.commit()
61+
62+
return [first_news, second_news]

tests/test_bot_storage.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import pytest
2+
from bot.bot_storage import (
3+
get_all_users,
4+
get_last_sent_id,
5+
get_news_after_id,
6+
save_last_sent_news_id,
7+
)
8+
9+
10+
@pytest.mark.asyncio
11+
async def test_get_last_sent_id(async_session):
12+
"""Проверка id последней отправленой новости"""
13+
chat_id = 100
14+
15+
last_id = await get_last_sent_id(chat_id, async_session)
16+
assert (
17+
last_id == 0
18+
), "id последней отпрвленной новости должен быть равен 0, если нет отправленных новостей"
19+
20+
await save_last_sent_news_id(
21+
chat_id=chat_id, last_id=10, session=async_session
22+
)
23+
last_id = await get_last_sent_id(chat_id, async_session)
24+
assert (
25+
last_id == 10
26+
), "id последней отпрвленной новости должен быть равен 10"
27+
28+
29+
@pytest.mark.asyncio
30+
async def test_get_news_after_id(async_session, news_list):
31+
"""Получение новостей"""
32+
news = await get_news_after_id(last_id=0, session=async_session)
33+
assert len(news) == 2, "Должно быть получено 2 новости"
34+
assert (
35+
news[0].title == "Test Title 1"
36+
), "Заголовок первой новости должен быть 'Test Title 1'"
37+
assert (
38+
news[1].title == "Test Title 2"
39+
), "Заголовок второй новости должен быть 'Test Title 2'"
40+
41+
42+
@pytest.mark.asyncio
43+
async def test_get_all_users(async_session):
44+
"""Получение пользователей"""
45+
await save_last_sent_news_id(
46+
chat_id=111, last_id=11, session=async_session
47+
)
48+
await save_last_sent_news_id(
49+
chat_id=222, last_id=22, session=async_session
50+
)
51+
52+
users = await get_all_users(async_session)
53+
assert len(users) == 2, "Должно быть 2 пользователя в базе"
54+
assert users[0] == 111, "id первого юзера должен быть 111"
55+
assert users[1] == 222, "id второго юзеера должен быть 222"

tests/test_spider_storage.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from satire_pulp_parser.spider_storage import is_news_exists, save_news
2+
3+
4+
def test_save_and_check_news(session, news):
5+
"""Проверяет что новостей нет в базе,
6+
сохранение новости
7+
и новость появилась в базе после сохранения."""
8+
assert not is_news_exists(
9+
news["url"], session
10+
), "Перед сохраением новой новости её не должно быть в базе"
11+
save_news(
12+
news["url"],
13+
news["title"],
14+
news["image"],
15+
news["text"],
16+
session=session,
17+
)
18+
assert is_news_exists(
19+
news["url"], session
20+
), "Новость должна появиться в базе после сохранения"

0 commit comments

Comments
 (0)