Fixed a few stupid mistakes
This commit is contained in:
@@ -2,7 +2,6 @@ from __future__ import annotations
|
||||
|
||||
from types import SimpleNamespace
|
||||
|
||||
import httpx
|
||||
from sqlalchemy import select
|
||||
|
||||
from gitea_codex_bot.config import get_settings
|
||||
@@ -15,7 +14,8 @@ from gitea_codex_bot.types import ParsedCommand
|
||||
from gitea_codex_bot.workers.dispatcher import process_one_job
|
||||
|
||||
|
||||
def test_process_one_job_recreates_persistent_comment_when_edit_returns_404(monkeypatch) -> None:
|
||||
def test_process_one_job_always_posts_new_review_comment(monkeypatch) -> None:
|
||||
posted_ids: list[int] = []
|
||||
session_factory = get_session_factory()
|
||||
with session_factory() as session:
|
||||
job = enqueue_job(
|
||||
@@ -39,37 +39,27 @@ def test_process_one_job_recreates_persistent_comment_when_edit_returns_404(monk
|
||||
monkeypatch.setattr(
|
||||
"gitea_codex_bot.workers.dispatcher.run_review_ephemeral",
|
||||
lambda *_args, **_kwargs: (
|
||||
{
|
||||
"verdict": "has_issues",
|
||||
"confidence": 0.7,
|
||||
"summary": "runner error",
|
||||
"findings": [],
|
||||
},
|
||||
{"verdict": "has_issues", "confidence": 0.7, "summary": "runner error", "findings": []},
|
||||
RepoReviewConfig(configured=True, enabled=True),
|
||||
),
|
||||
)
|
||||
|
||||
class _FakeGiteaClient:
|
||||
def __init__(self, _settings) -> None:
|
||||
self.posted_comment_id = 0
|
||||
pass
|
||||
|
||||
def get_pull_request(self, _repo: str, _pr_number: int):
|
||||
return SimpleNamespace(is_fork=False)
|
||||
|
||||
def edit_issue_comment(self, _repo: str, _comment_id: int, _body: str) -> int:
|
||||
request = httpx.Request("PATCH", "https://gitea.test/api/v1/repos/acme/repo/issues/comments/289")
|
||||
response = httpx.Response(404, request=request, text='{"message":"not found"}')
|
||||
raise httpx.HTTPStatusError("not found", request=request, response=response)
|
||||
|
||||
def post_issue_comment(self, _repo: str, _pr_number: int, _body: str) -> int:
|
||||
self.posted_comment_id = 990
|
||||
return self.posted_comment_id
|
||||
new_id = 990
|
||||
posted_ids.append(new_id)
|
||||
return new_id
|
||||
|
||||
monkeypatch.setattr("gitea_codex_bot.workers.dispatcher.GiteaClient", _FakeGiteaClient)
|
||||
|
||||
settings = get_settings()
|
||||
processed = process_one_job(settings)
|
||||
assert processed is True
|
||||
assert process_one_job(get_settings()) is True
|
||||
assert posted_ids == [990]
|
||||
|
||||
with session_factory() as session:
|
||||
persisted_comment_id = get_persistent_review_comment_id(session, "acme/repo", 9)
|
||||
@@ -107,15 +97,10 @@ def test_process_one_job_passes_full_trigger_message_to_runner(monkeypatch) -> N
|
||||
def post_issue_comment(self, _repo: str, _pr_number: int, _body: str) -> int:
|
||||
return 901
|
||||
|
||||
def edit_issue_comment(self, _repo: str, _comment_id: int, _body: str) -> int:
|
||||
return _comment_id
|
||||
|
||||
monkeypatch.setattr("gitea_codex_bot.workers.dispatcher.run_review_ephemeral", _fake_run_review_ephemeral)
|
||||
monkeypatch.setattr("gitea_codex_bot.workers.dispatcher.GiteaClient", _FakeGiteaClient)
|
||||
|
||||
settings = get_settings()
|
||||
processed = process_one_job(settings)
|
||||
assert processed is True
|
||||
assert process_one_job(get_settings()) is True
|
||||
assert captured["raw"] == "@codex review security --full\nFocus auth/session handling."
|
||||
|
||||
|
||||
@@ -155,9 +140,7 @@ def test_process_one_job_skips_review_when_repo_config_disabled(monkeypatch) ->
|
||||
|
||||
monkeypatch.setattr("gitea_codex_bot.workers.dispatcher.GiteaClient", _FakeGiteaClient)
|
||||
|
||||
settings = get_settings()
|
||||
processed = process_one_job(settings)
|
||||
assert processed is True
|
||||
assert process_one_job(get_settings()) is True
|
||||
assert any("Review is disabled" in body for body in posted_comments)
|
||||
|
||||
with session_factory() as session:
|
||||
|
||||
@@ -2,7 +2,9 @@ from __future__ import annotations
|
||||
|
||||
from fastapi.testclient import TestClient
|
||||
|
||||
from gitea_codex_bot.db import get_session_factory
|
||||
from gitea_codex_bot.main import app
|
||||
from gitea_codex_bot.models import JobStatus, ReviewJob
|
||||
|
||||
|
||||
def test_root_returns_tailwind_landing_page() -> None:
|
||||
@@ -15,8 +17,10 @@ def test_root_returns_tailwind_landing_page() -> None:
|
||||
assert "Gitea Codex Review Bot" in response.text
|
||||
assert "cdn.tailwindcss.com" in response.text
|
||||
assert 'id="health-button"' in response.text
|
||||
assert 'id="failure-button"' in response.text
|
||||
assert 'id="health-modal"' in response.text
|
||||
assert 'fetch("/healthz"' in response.text
|
||||
assert 'fetch("/healthz/latest-failure"' in response.text
|
||||
|
||||
|
||||
def test_404_returns_tailwind_page_for_browser_requests() -> None:
|
||||
@@ -38,3 +42,104 @@ def test_404_returns_json_for_non_browser_requests() -> None:
|
||||
assert response.status_code == 404
|
||||
assert response.headers["content-type"].startswith("application/json")
|
||||
assert response.json() == {"detail": "Not Found"}
|
||||
|
||||
|
||||
def test_healthz_latest_failure_returns_empty_when_no_failed_jobs() -> None:
|
||||
client = TestClient(app)
|
||||
response = client.get("/healthz/latest-failure")
|
||||
assert response.status_code == 200
|
||||
assert response.json() == {"status": "ok", "has_failed_job": False}
|
||||
|
||||
|
||||
def test_healthz_latest_failure_returns_latest_failed_job() -> None:
|
||||
session_factory = get_session_factory()
|
||||
with session_factory() as session:
|
||||
first = ReviewJob(
|
||||
repo="acme/repo",
|
||||
pr_number=1,
|
||||
head_sha="1111111",
|
||||
trigger_comment_id=3001,
|
||||
trigger_comment_body="@codex review",
|
||||
command="review",
|
||||
requested_by="alice",
|
||||
status=JobStatus.failed,
|
||||
last_error="first error",
|
||||
)
|
||||
second = ReviewJob(
|
||||
repo="acme/repo",
|
||||
pr_number=2,
|
||||
head_sha="2222222",
|
||||
trigger_comment_id=3002,
|
||||
trigger_comment_body="@codex rerun",
|
||||
command="rerun",
|
||||
requested_by="bob",
|
||||
status=JobStatus.failed,
|
||||
last_error="second error",
|
||||
)
|
||||
session.add(first)
|
||||
session.add(second)
|
||||
session.commit()
|
||||
|
||||
client = TestClient(app)
|
||||
response = client.get("/healthz/latest-failure")
|
||||
assert response.status_code == 200
|
||||
payload = response.json()
|
||||
assert payload["status"] == "ok"
|
||||
assert payload["has_failed_job"] is True
|
||||
assert payload["repo"] == "acme/repo"
|
||||
assert payload["pr_number"] == 2
|
||||
assert payload["command"] == "rerun"
|
||||
assert payload["head_sha"] == "2222222"
|
||||
assert payload["error"] == "second error"
|
||||
|
||||
|
||||
def test_healthz_latest_job_returns_empty_when_no_jobs() -> None:
|
||||
client = TestClient(app)
|
||||
response = client.get("/healthz/latest-job")
|
||||
assert response.status_code == 200
|
||||
assert response.json() == {"status": "ok", "has_job": False}
|
||||
|
||||
|
||||
def test_healthz_latest_job_returns_latest_job_details() -> None:
|
||||
session_factory = get_session_factory()
|
||||
with session_factory() as session:
|
||||
first = ReviewJob(
|
||||
repo="acme/repo",
|
||||
pr_number=3,
|
||||
head_sha="3333333",
|
||||
trigger_comment_id=3003,
|
||||
trigger_comment_body="@codex review",
|
||||
command="review",
|
||||
requested_by="alice",
|
||||
status=JobStatus.succeeded,
|
||||
result_json={"summary": "first summary"},
|
||||
)
|
||||
second = ReviewJob(
|
||||
repo="acme/repo",
|
||||
pr_number=4,
|
||||
head_sha="4444444",
|
||||
trigger_comment_id=3004,
|
||||
trigger_comment_body="@codex rerun",
|
||||
command="rerun",
|
||||
requested_by="bob",
|
||||
status=JobStatus.failed,
|
||||
last_error="failed later",
|
||||
result_json={"summary": "second summary"},
|
||||
)
|
||||
session.add(first)
|
||||
session.add(second)
|
||||
session.commit()
|
||||
|
||||
client = TestClient(app)
|
||||
response = client.get("/healthz/latest-job")
|
||||
assert response.status_code == 200
|
||||
payload = response.json()
|
||||
assert payload["status"] == "ok"
|
||||
assert payload["has_job"] is True
|
||||
assert payload["repo"] == "acme/repo"
|
||||
assert payload["pr_number"] == 4
|
||||
assert payload["command"] == "rerun"
|
||||
assert payload["head_sha"] == "4444444"
|
||||
assert payload["job_status"] == "failed"
|
||||
assert payload["error"] == "failed later"
|
||||
assert payload["result_summary"] == "second summary"
|
||||
|
||||
@@ -93,6 +93,47 @@ def test_webhook_accepts_review_and_queues(monkeypatch) -> None:
|
||||
assert queued.trigger_comment_body == "@codex review security"
|
||||
|
||||
|
||||
def test_webhook_uses_latest_pr_head_sha_when_config_lookup_fails(monkeypatch) -> None:
|
||||
posted_comments: list[str] = []
|
||||
|
||||
def _post_issue_comment(self, repo: str, pr_number: int, body: str) -> int:
|
||||
posted_comments.append(body)
|
||||
return 100
|
||||
|
||||
monkeypatch.setattr("gitea_codex_bot.services.gitea.GiteaClient.post_issue_comment", _post_issue_comment)
|
||||
monkeypatch.setattr(
|
||||
"gitea_codex_bot.services.gitea.GiteaClient.get_pull_request",
|
||||
lambda *_args, **_kwargs: type("PR", (), {"head_sha": "newsha123"})(),
|
||||
)
|
||||
monkeypatch.setattr(
|
||||
"gitea_codex_bot.services.gitea.GiteaClient.get_file_content",
|
||||
lambda *_args, **_kwargs: (_ for _ in ()).throw(RuntimeError("config unavailable")),
|
||||
)
|
||||
|
||||
client = TestClient(app)
|
||||
payload_obj = _payload("@codex review", username="alice", comment_id=112)
|
||||
payload_obj["pull_request"]["head"]["sha"] = "oldsha999"
|
||||
raw = json.dumps(payload_obj).encode()
|
||||
|
||||
response = client.post(
|
||||
"/webhook/gitea",
|
||||
content=raw,
|
||||
headers={
|
||||
"X-Gitea-Event": "issue_comment",
|
||||
"X-Gitea-Delivery": "d-2b",
|
||||
"X-Gitea-Signature": _sign(raw),
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
)
|
||||
assert response.status_code == 200
|
||||
assert response.json()["status"] == "queued"
|
||||
assert any("`newsha1`" in body for body in posted_comments)
|
||||
session_factory = get_session_factory()
|
||||
with session_factory() as session:
|
||||
queued = session.execute(select(ReviewJob).where(ReviewJob.trigger_comment_id == 112)).scalar_one()
|
||||
assert queued.head_sha == "newsha123"
|
||||
|
||||
|
||||
def test_webhook_logs_when_no_codex_review_command(monkeypatch) -> None:
|
||||
messages: list[str] = []
|
||||
|
||||
|
||||
Reference in New Issue
Block a user