Newer
Older
gnexus-tasks / backend / tests / test_project_readme.py
"""README репозитория проекта (0.67): прокси привязан к проекту, не нашли — 404."""

import pytest
from fastapi.testclient import TestClient

from app.services import readme


@pytest.fixture(autouse=True)
def clean_cache() -> None:
    """Кэш README между тестами чистим: ключ — ссылка, живет на процесс."""
    readme._CACHE.clear()


def _fake_readme(content: str | None, seen: list[str] | None = None):
    async def fetch(url: str) -> str | None:
        if seen is not None:
            seen.append(url)
        return content

    return fetch


def test_readme_of_project(client: TestClient, monkeypatch: pytest.MonkeyPatch) -> None:
    seen: list[str] = []
    monkeypatch.setattr(readme, "fetch_readme", _fake_readme("# Заголовок\n\nтекст", seen))
    project = client.post(
        "/api/projects",
        json={"name": "С README", "repository_url": "https://git.example.com/owner/repo"},
    ).json()

    resp = client.get(f"/api/projects/{project['id']}/readme")
    assert resp.status_code == 200
    assert resp.json() == {"content": "# Заголовок\n\nтекст"}
    # читаем README именно по repository_url проекта (URL фронт не передаёт)
    assert seen == ["https://git.example.com/owner/repo"]


def test_readme_without_repository(client: TestClient, monkeypatch: pytest.MonkeyPatch) -> None:
    monkeypatch.setattr(readme, "fetch_readme", _fake_readme("не должно вызваться"))
    project = client.post("/api/projects", json={"name": "Без репозитория"}).json()
    resp = client.get(f"/api/projects/{project['id']}/readme")
    assert resp.status_code == 404


def test_readme_not_found(client: TestClient, monkeypatch: pytest.MonkeyPatch) -> None:
    monkeypatch.setattr(readme, "fetch_readme", _fake_readme(None))
    project = client.post(
        "/api/projects",
        json={"name": "Битый репозиторий", "repository_url": "https://git.example.com/owner/nope"},
    ).json()
    resp = client.get(f"/api/projects/{project['id']}/readme")
    assert resp.status_code == 404


def test_readme_of_unknown_project(client: TestClient) -> None:
    assert client.get("/api/projects/9999/readme").status_code == 404