stackchain-dashboard/tests/test_work_route_resolver.py
timmy 8411e907af
All checks were successful
CI / lint (pull_request) Successful in 1m47s
CI / build-release (pull_request) Successful in 6s
CI / browser-journey (pull_request) Successful in 53s
CI / release-candidate (pull_request) Has been skipped
feat: review completed mobile Filed outcomes (Closes #878)
2026-08-15 07:40:23 +00:00

223 lines
7.5 KiB
Python

import httpx
import pytest
from src import gitea_proxy, main
@pytest.mark.anyio
async def test_work_route_endpoint_resolves_one_authorized_item(monkeypatch):
requested = []
async def resolve(kind, repository, number, notification_id):
requested.append((kind, repository, number, notification_id))
return {
"kind": "review",
"repository": "stackchain/dashboard",
"number": 87,
"title": "Review the mobile resolver",
"is_review": True,
"url": "https://forge.example/stackchain/dashboard/pulls/87",
}
monkeypatch.setattr(main.gitea_proxy, "resolve_work_route", resolve, raising=False)
transport = httpx.ASGITransport(app=main.app)
async with httpx.AsyncClient(transport=transport, base_url="http://test") as client:
response = await client.get(
"/api/v1/work-route?kind=review&repository=stackchain/dashboard&number=87"
)
assert response.status_code == 200
assert response.headers["cache-control"] == "no-store"
assert requested == [("review", "stackchain/dashboard", 87, None)]
assert response.json() == {
"kind": "review",
"repository": "stackchain/dashboard",
"number": 87,
"title": "Review the mobile resolver",
"is_review": True,
"url": "https://forge.example/stackchain/dashboard/pulls/87",
}
@pytest.mark.anyio
async def test_work_route_endpoint_accepts_filed_issue_identity(monkeypatch):
requested = []
async def resolve(kind, repository, number, notification_id):
requested.append((kind, repository, number, notification_id))
return {
"kind": "filed",
"repository": repository,
"number": number,
"title": "Delegated filing",
"is_filed": True,
"is_assigned": False,
}
monkeypatch.setattr(main.gitea_proxy, "resolve_work_route", resolve)
transport = httpx.ASGITransport(app=main.app)
async with httpx.AsyncClient(transport=transport, base_url="http://test") as client:
response = await client.get(
"/api/v1/work-route?kind=filed&repository=stackchain/dashboard&number=88"
)
assert response.status_code == 200
assert requested == [("filed", "stackchain/dashboard", 88, None)]
assert response.json()["kind"] == "filed"
@pytest.mark.anyio
async def test_resolve_work_route_returns_only_a_requested_review():
requests = []
async def upstream(request):
requests.append(request.url.path)
if request.url.path.endswith("/user"):
return httpx.Response(200, json={"login": "timmy"})
return httpx.Response(200, json={
"id": 700,
"number": 87,
"title": "Review the resolver",
"state": "open",
"html_url": gitea_proxy.GITEA_URL + "/stackchain/dashboard/pulls/87",
"repository": {"full_name": "stackchain/dashboard"},
"requested_reviewers": [{"login": "timmy"}],
"assignees": [],
"user": {"login": "alex"},
})
gitea_proxy.start_client(transport=httpx.MockTransport(upstream))
try:
result = await gitea_proxy.resolve_work_route(
"review", "stackchain/dashboard", 87, None
)
finally:
await gitea_proxy.stop_client()
assert len(requests) == 2
assert result == {
"kind": "review",
"repository": "stackchain/dashboard",
"number": 87,
"title": "Review the resolver",
"state": "open",
"url": gitea_proxy.GITEA_URL + "/stackchain/dashboard/pulls/87",
"is_review": True,
"work_reasons": ["review_requested"],
}
@pytest.mark.anyio
async def test_resolve_work_route_returns_an_open_issue_filed_by_the_current_user():
requests = []
async def upstream(request):
requests.append(request.url.path)
if request.url.path.endswith("/user"):
return httpx.Response(200, json={"login": "timmy"})
return httpx.Response(200, json={
"id": 701,
"number": 88,
"title": "Delegated filing",
"state": "open",
"html_url": gitea_proxy.GITEA_URL + "/stackchain/dashboard/issues/88",
"assignees": [{"login": "alex"}],
"user": {"login": "timmy"},
})
gitea_proxy.start_client(transport=httpx.MockTransport(upstream))
try:
result = await gitea_proxy.resolve_work_route(
"filed", "stackchain/dashboard", 88, None
)
finally:
await gitea_proxy.stop_client()
assert len(requests) == 2
assert result == {
"kind": "filed",
"repository": "stackchain/dashboard",
"number": 88,
"title": "Delegated filing",
"state": "open",
"url": gitea_proxy.GITEA_URL + "/stackchain/dashboard/issues/88",
"is_filed": True,
"is_assigned": False,
"work_reasons": ["created_by_me"],
}
@pytest.mark.anyio
async def test_resolve_work_route_returns_a_completed_issue_filed_by_the_current_user():
async def upstream(request):
if request.url.path.endswith("/user"):
return httpx.Response(200, json={"login": "timmy"})
return httpx.Response(200, json={
"id": 702,
"number": 89,
"title": "Completed delegation",
"state": "closed",
"html_url": gitea_proxy.GITEA_URL + "/stackchain/dashboard/issues/89",
"assignees": [{"login": "alex"}],
"user": {"login": "timmy"},
})
gitea_proxy.start_client(transport=httpx.MockTransport(upstream))
try:
result = await gitea_proxy.resolve_work_route(
"filed", "stackchain/dashboard", 89, None
)
finally:
await gitea_proxy.stop_client()
assert result == {
"kind": "filed",
"repository": "stackchain/dashboard",
"number": 89,
"title": "Completed delegation",
"state": "closed",
"url": gitea_proxy.GITEA_URL + "/stackchain/dashboard/issues/89",
"is_filed": True,
"is_assigned": False,
"work_reasons": ["created_by_me"],
}
@pytest.mark.anyio
async def test_completed_filed_issue_remains_authorized_for_detail_and_reply():
async def upstream(request):
if request.url.path.endswith("/user"):
return httpx.Response(200, json={"login": "timmy"})
return httpx.Response(200, json={
"state": "closed",
"user": {"login": "timmy"},
})
gitea_proxy.start_client(transport=httpx.MockTransport(upstream))
try:
authorized = await gitea_proxy.is_authored_issue("stackchain/dashboard", 89)
finally:
await gitea_proxy.stop_client()
assert authorized is True
@pytest.mark.anyio
async def test_resolve_work_route_rejects_a_notification_that_is_already_read():
async def upstream(request):
if request.url.path.endswith("/notifications/threads/913"):
return httpx.Response(200, json={
"id": 913,
"unread": False,
"repository": {"full_name": "stackchain/dashboard"},
"subject": {"title": "Already handled", "type": "Issue"},
})
return httpx.Response(404)
gitea_proxy.start_client(transport=httpx.MockTransport(upstream))
try:
with pytest.raises(gitea_proxy.WorkRouteUnavailableError):
await gitea_proxy.resolve_work_route("update", None, None, 913)
finally:
await gitea_proxy.stop_client()