fire-planner/tests/test_examples_praw_source.py
Viktor Barzin 8fc0fd7646
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
examples: async PRAW wrapper → RawPost
2026-05-28 22:16:53 +00:00

58 lines
1.6 KiB
Python

"""Tests for the asyncpraw wrapper — uses an in-test fake Submission iterator."""
from __future__ import annotations
from collections.abc import AsyncIterator
from dataclasses import dataclass
from datetime import datetime
from unittest.mock import AsyncMock, MagicMock
import pytest
from fire_planner.examples.praw_source import fetch_top
@dataclass
class _FakeSub:
id: str
title: str
selftext: str
permalink: str
created_utc: float
def _async_iter(items: list[_FakeSub]) -> AsyncIterator[_FakeSub]:
async def _gen() -> AsyncIterator[_FakeSub]:
for it in items:
yield it
return _gen()
@pytest.mark.asyncio
async def test_fetch_top_normalises_submissions() -> None:
fakes = [
_FakeSub(
id="abc1",
title="t1",
selftext="b1",
permalink="/r/financialindependence/comments/abc1/",
created_utc=datetime(2026, 1, 1).timestamp(),
),
_FakeSub(
id="abc2",
title="t2",
selftext="b2",
permalink="/r/financialindependence/comments/abc2/",
created_utc=datetime(2026, 2, 1).timestamp(),
),
]
mock_subreddit = MagicMock()
mock_subreddit.top = MagicMock(return_value=_async_iter(fakes))
mock_reddit = MagicMock()
mock_reddit.subreddit = AsyncMock(return_value=mock_subreddit)
posts = [p async for p in fetch_top(mock_reddit, "financialindependence", "all", limit=1000)]
assert len(posts) == 2
assert posts[0].reddit_id == "abc1"
assert posts[0].url.endswith("/r/financialindependence/comments/abc1/")
assert posts[1].title == "t2"