CLI-level smoke tests using --yaml output against real Twitter API. Default skipped via @pytest.mark.smoke marker + pyproject.toml addopts. Run locally with: uv run pytest -m smoke -v
86 lines
2.7 KiB
Python
86 lines
2.7 KiB
Python
"""Integration smoke tests for twitter-cli.
|
|
|
|
These tests invoke the real CLI commands with ``--yaml`` against the live
|
|
Twitter/X API using your local browser cookies. They are **skipped by
|
|
default** and only run when explicitly requested::
|
|
|
|
uv run pytest -m smoke -v
|
|
|
|
Only read-only operations are tested — no writes.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import yaml
|
|
import pytest
|
|
from click.testing import CliRunner
|
|
|
|
from twitter_cli.cli import cli
|
|
|
|
smoke = pytest.mark.smoke
|
|
|
|
runner = CliRunner()
|
|
|
|
|
|
def _invoke(*args: str):
|
|
"""Run a CLI command with --yaml and return parsed payload."""
|
|
result = runner.invoke(cli, [*args, "--yaml"])
|
|
if result.output:
|
|
payload = yaml.safe_load(result.output)
|
|
else:
|
|
payload = None
|
|
return result, payload
|
|
|
|
|
|
# ── Auth ────────────────────────────────────────────────────────────────
|
|
|
|
|
|
@smoke
|
|
class TestAuth:
|
|
"""Verify authentication is working end-to-end."""
|
|
|
|
def test_status(self):
|
|
result, payload = _invoke("status")
|
|
assert result.exit_code == 0, f"status failed: {result.output}"
|
|
assert payload["ok"] is True
|
|
assert payload["data"]["authenticated"] is True
|
|
assert payload["data"]["user"]["username"]
|
|
|
|
def test_whoami(self):
|
|
result, payload = _invoke("whoami")
|
|
assert result.exit_code == 0, f"whoami failed: {result.output}"
|
|
assert payload["ok"] is True
|
|
assert payload["data"]["user"]["username"]
|
|
assert payload["data"]["user"]["id"]
|
|
|
|
|
|
# ── Read-only queries ───────────────────────────────────────────────────
|
|
|
|
|
|
@smoke
|
|
class TestReadOnly:
|
|
"""Read-only CLI smoke tests."""
|
|
|
|
def test_user(self):
|
|
result, payload = _invoke("user", "elonmusk")
|
|
assert result.exit_code == 0, f"user failed: {result.output}"
|
|
assert payload["ok"] is True
|
|
|
|
def test_search(self):
|
|
result, payload = _invoke("search", "python", "--max", "3")
|
|
assert result.exit_code == 0, f"search failed: {result.output}"
|
|
assert payload["ok"] is True
|
|
items = payload["data"]
|
|
assert isinstance(items, list)
|
|
assert len(items) >= 1
|
|
|
|
def test_user_posts(self):
|
|
result, payload = _invoke("user-posts", "elonmusk", "--max", "3")
|
|
assert result.exit_code == 0, f"user-posts failed: {result.output}"
|
|
assert payload["ok"] is True
|
|
|
|
def test_feed(self):
|
|
result, payload = _invoke("feed", "--max", "3")
|
|
assert result.exit_code == 0, f"feed failed: {result.output}"
|
|
assert payload["ok"] is True
|