mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-09-28 06:45:17 +08:00
79 lines
2.8 KiB
Python
79 lines
2.8 KiB
Python
"""Every verified R2 upload lands in the GitHub step summary, with its public URL."""
|
|
import json
|
|
|
|
import pytest
|
|
|
|
from scripts.releases import r2, upload_summary
|
|
from scripts.releases.r2_scope import R2Scope
|
|
|
|
|
|
BASE = "https://hermes-assets.nousresearch.com"
|
|
KEY = "releases/commit/" + "a" * 40 + "/HermesBundled-1.2.3-win-x64.msix"
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def clear_notes():
|
|
upload_summary._KEYS.clear()
|
|
upload_summary._REGISTERED = False
|
|
yield
|
|
upload_summary._KEYS.clear()
|
|
|
|
|
|
def test_render_uses_the_public_asset_host(monkeypatch):
|
|
monkeypatch.delenv("CLOUDFLARE_R2_PUBLIC_URL", raising=False)
|
|
monkeypatch.delenv("R2_DISPOSABLE_RUN", raising=False)
|
|
text = upload_summary.render([KEY])
|
|
assert f"[download]({BASE}/{KEY})" in text
|
|
assert text.startswith("\n### R2 uploads\n")
|
|
assert upload_summary.render([]) == ""
|
|
|
|
|
|
def test_render_names_a_key_whose_url_cannot_be_built(monkeypatch):
|
|
monkeypatch.setattr(r2, "public_url_for",
|
|
lambda base, key: (_ for _ in ()).throw(ValueError("bad key")))
|
|
text = upload_summary.render(["../escape"])
|
|
assert "`../escape`" in text
|
|
assert "| — |" in text
|
|
|
|
|
|
def test_note_dedupes_and_flush_appends_once(tmp_path, monkeypatch):
|
|
summary = tmp_path / "summary.md"
|
|
summary.write_text("existing\n", encoding="utf-8")
|
|
monkeypatch.setenv("GITHUB_STEP_SUMMARY", str(summary))
|
|
monkeypatch.delenv("CLOUDFLARE_R2_PUBLIC_URL", raising=False)
|
|
monkeypatch.delenv("R2_DISPOSABLE_RUN", raising=False)
|
|
upload_summary.note(KEY)
|
|
upload_summary.note(KEY)
|
|
upload_summary.flush()
|
|
upload_summary.flush()
|
|
text = summary.read_text(encoding="utf-8")
|
|
assert text.count("### R2 uploads") == 1
|
|
assert text.startswith("existing\n")
|
|
assert f"{BASE}/{KEY}" in text
|
|
|
|
|
|
def test_flush_without_a_summary_keeps_the_notes(monkeypatch):
|
|
monkeypatch.delenv("GITHUB_STEP_SUMMARY", raising=False)
|
|
upload_summary.note(KEY)
|
|
upload_summary.flush()
|
|
assert upload_summary._KEYS == [KEY]
|
|
|
|
|
|
def test_put_object_records_only_after_the_size_check(monkeypatch):
|
|
recorded = []
|
|
monkeypatch.setattr(upload_summary, "note", recorded.append)
|
|
|
|
class Response:
|
|
status = 200
|
|
def header(self, name):
|
|
return "11" if name == "content-length" else None
|
|
def text(self):
|
|
return ""
|
|
|
|
monkeypatch.setattr(r2, "signed_request", lambda *args, **kwargs: Response())
|
|
monkeypatch.setattr(r2, "R2Scope", type("Scope", (), {"configured": staticmethod(lambda: R2Scope())}))
|
|
with pytest.raises(r2.R2RequestError):
|
|
r2.put_object({"access_key_id": "k", "secret_key": "s"}, "https://example.r2.cloudflarestorage.com",
|
|
"bucket", KEY, b"payload-bytes", "20000101T000000Z", "application/octet-stream", fetcher=None)
|
|
assert recorded == []
|