"""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