From d4c84e8ad4db88b56ffed3d2040e541cc376c78a Mon Sep 17 00:00:00 2001 From: aturret Date: Mon, 25 Nov 2024 20:44:27 -0500 Subject: [PATCH] Add pytest as test framework --- poetry.lock | 74 +++++++++++++++++++++++++++++++++++++++--- pyproject.toml | 2 ++ tests/cases/bluesky.py | 4 +++ tests/test_bluesky.py | 36 ++++++++++++++++++++ 4 files changed, 111 insertions(+), 5 deletions(-) create mode 100644 tests/cases/bluesky.py create mode 100644 tests/test_bluesky.py diff --git a/poetry.lock b/poetry.lock index fc8b8f3..b1815e0 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1215,6 +1215,17 @@ files = [ [package.extras] all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + [[package]] name = "jinja2" version = "3.1.4" @@ -2008,6 +2019,21 @@ files = [ greenlet = "3.1.1" pyee = "12.0.0" +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + [[package]] name = "propcache" version = "0.2.0" @@ -2444,6 +2470,44 @@ docs = ["myst_parser", "sphinx", "sphinx_rtd_theme"] full = ["Pillow (>=8.0.0)", "cryptography"] image = ["Pillow (>=8.0.0)"] +[[package]] +name = "pytest" +version = "8.3.3" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"}, + {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=1.5,<2" + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-asyncio" +version = "0.24.0" +description = "Pytest support for asyncio" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest_asyncio-0.24.0-py3-none-any.whl", hash = "sha256:a811296ed596b69bf0b6f3dc40f83bcaf341b155a269052d82efa2b25ac7037b"}, + {file = "pytest_asyncio-0.24.0.tar.gz", hash = "sha256:d081d828e576d85f875399194281e92bf8a68d60d72d1a2faf2feddb6c46b276"}, +] + +[package.dependencies] +pytest = ">=8.2,<9" + +[package.extras] +docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] +testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] + [[package]] name = "python-bidi" version = "0.6.3" @@ -2974,20 +3038,20 @@ files = [ [[package]] name = "tqdm" -version = "4.67.0" +version = "4.67.1" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.67.0-py3-none-any.whl", hash = "sha256:0cd8af9d56911acab92182e88d763100d4788bdf421d251616040cc4d44863be"}, - {file = "tqdm-4.67.0.tar.gz", hash = "sha256:fe5a6f95e6fe0b9755e9469b77b9c3cf850048224ecaa8293d7d2d31f97d869a"}, + {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, + {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] discord = ["requests"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] @@ -3493,4 +3557,4 @@ windows = ["python-magic-bin"] [metadata] lock-version = "2.0" python-versions = ">=3.11,<3.14" -content-hash = "32bc871d4f2576f594cc5976222b8347a694f39dda75dd830dde96247feb181c" +content-hash = "15eaf2498283b9fea0350c0f3c89806f4a51eeccbed9b10cdd71dd17613573fe" diff --git a/pyproject.toml b/pyproject.toml index 708a572..4d3efe6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,7 +45,9 @@ optional = true #html-telegraph-poster-v2 = { path = "../html-telegraph-poster-v2/" } #fastfetchbot-telegram-bot = { path = "../FastFetchBot-Telegram-Bot/" } black = "^23.3.0" +pytest = "^8.3.3" +pytest-asyncio = "^0.24.0" [tool.poetry.extras] windows = ["python-magic-bin"] diff --git a/tests/cases/bluesky.py b/tests/cases/bluesky.py new file mode 100644 index 0000000..1eae268 --- /dev/null +++ b/tests/cases/bluesky.py @@ -0,0 +1,4 @@ +bluesky_cases = { + "pure_text": {"url": "https://blueskyinfo.net/threads/1", "expected": "bluesky_pure_text.json"}, + "text_with_image": {"url": "https://bsky.app/profile/cinnabarocean.bsky.social/post/3lbqxabem4c2t", "expected": "bluesky_text_with_image.json"}, +} \ No newline at end of file diff --git a/tests/test_bluesky.py b/tests/test_bluesky.py new file mode 100644 index 0000000..412738a --- /dev/null +++ b/tests/test_bluesky.py @@ -0,0 +1,36 @@ +from typing import Tuple + +import pytest + +from app.services.scrapers.bluesky.scraper import BlueskyScraper +from app.services.scrapers.scraper_manager import ScraperManager +from tests.cases.bluesky import bluesky_cases + + +@pytest.fixture(scope="module", autouse=True) +async def bluesky_scraper(): + bluesky_scraper = await ScraperManager.init_bluesky_scraper() + yield bluesky_scraper + + +async def get_item_from_url(bluesky_scraper: BlueskyScraper, url: str) -> dict: + data_processor = await bluesky_scraper.get_processor_by_url(url) + item = await data_processor.get_item() + return item + + +async def get_test_data(bluesky_scraper: BlueskyScraper, case: str) -> Tuple[dict, dict]: + data = await get_item_from_url(bluesky_scraper=bluesky_scraper, url=bluesky_cases[case]["url"]) + return data, bluesky_cases[case]["expected"] + + +@pytest.mark.asyncio +async def test_bluesky_init(bluesky_scraper: BlueskyScraper): + assert bluesky_scraper is not None + assert isinstance(bluesky_scraper, BlueskyScraper) + + +@pytest.mark.asyncio +async def test_bluesky_pure_text_post(bluesky_scraper: BlueskyScraper): + data, expected = await get_test_data(bluesky_scraper, "pure_text") + assert data == expected