doc-inspector / tests /test_github_contributors.py
steven0226's picture
deploy: 建立乾淨的已驗收版本
9d60e8e verified
Raw
History Blame Contribute Delete
3.14 kB
from __future__ import annotations
from io import BytesIO
import json
import pytest
from scripts_support import load_script_module
check_github_contributors = load_script_module("check_github_contributors")
class FakeResponse:
def __init__(self, payload: object, *, status: int = 200) -> None:
self._body = BytesIO(json.dumps(payload).encode("utf-8"))
self._status = status
def __enter__(self) -> "FakeResponse":
return self
def __exit__(self, *_: object) -> None:
return None
def getcode(self) -> int:
return self._status
def read(self) -> bytes:
return self._body.read()
def test_expected_account_is_the_only_public_contributor() -> None:
requests: list[object] = []
def opener(request: object, **_: object) -> FakeResponse:
requests.append(request)
return FakeResponse([{"login": "kuotunyu", "contributions": 12}])
report = check_github_contributors.fetch_contributor_report(opener=opener)
assert report["verified"] is True
assert report["sole_contributor"] is True
assert report["logins"] == ["kuotunyu"]
assert report["anonymous_contributor_count"] == 0
assert report["pages_checked"] == 1
assert "anon=1" in requests[0].full_url
assert "per_page=100" in requests[0].full_url
assert requests[0].get_header("X-github-api-version") == "2026-03-10"
assert report["uses_authentication"] is False
assert report["reads_env_truth"] is False
assert report["performs_writes"] is False
def test_second_github_account_fails_the_sole_contributor_gate() -> None:
def opener(*_: object, **__: object) -> FakeResponse:
return FakeResponse(
[
{"login": "kuotunyu", "contributions": 12},
{"login": "automation-bot", "contributions": 1},
]
)
report = check_github_contributors.fetch_contributor_report(opener=opener)
assert report["sole_contributor"] is False
assert report["logins"] == ["automation-bot", "kuotunyu"]
def test_anonymous_identity_fails_without_exposing_personal_fields() -> None:
private_email = "someone@example.test"
def opener(*_: object, **__: object) -> FakeResponse:
return FakeResponse(
[
{"login": "kuotunyu", "contributions": 12},
{"name": "Anonymous Author", "email": private_email, "contributions": 1},
]
)
report = check_github_contributors.fetch_contributor_report(opener=opener)
assert report["sole_contributor"] is False
assert report["anonymous_contributor_count"] == 1
assert private_email not in json.dumps(report)
assert "Anonymous Author" not in json.dumps(report)
@pytest.mark.parametrize("payload", [{"message": "not a list"}, ["invalid item"]])
def test_malformed_api_payload_is_rejected(payload: object) -> None:
def opener(*_: object, **__: object) -> FakeResponse:
return FakeResponse(payload)
with pytest.raises(ValueError, match="回應不是清單|無效項目"):
check_github_contributors.fetch_contributor_report(opener=opener)