Files
orchestrator/tests/test_notify_done_regression.py

80 lines
2.9 KiB
Python

"""ORCH-016 / TC-18 + AC-7: notify_done / set_issue_done not regressed.
The final deploy -> done transition still posts the «✅ Task completed!»
comment under the deployer bot, alongside the new ORCH-016 status comment
the deployer publishes when it finishes the stage. The two comments are
independent — the status comment doesn't replace `notify_done`.
"""
import os
os.environ.setdefault("ORCH_PLANE_API_TOKEN", "test-token")
os.environ.setdefault("ORCH_GITEA_TOKEN", "test-token")
from src import plane_sync as PS # noqa: E402
def test_notify_done_constants_unchanged():
# Emoji + message body — pinned to lock the contract.
assert PS.EMOJI_DONE == ""
def test_notify_done_posts_completed_comment(monkeypatch):
"""plane_sync.notify_done still posts the ✅ Task completed! comment
authored by the deployer."""
captured = {}
def _spy_update(work_item_id, state, project_id=None):
captured["update"] = (work_item_id, state, project_id)
def _spy_add(work_item_id, body, project_id=None, author=None, **kw):
captured.setdefault("comments", []).append(
{"wid": work_item_id, "body": body, "author": author}
)
monkeypatch.setattr(PS, "update_issue_state", _spy_update)
monkeypatch.setattr(PS, "add_comment", _spy_add)
monkeypatch.setattr(PS, "_resolve_project_id", lambda wid, pid=None: "p-1")
PS.notify_done("ET-016")
assert captured["update"] == ("ET-016", "done", "p-1")
assert len(captured["comments"]) == 1
c = captured["comments"][0]
assert c["wid"] == "ET-016"
assert c["author"] == "deployer"
# Body untouched: emoji + canonical Russian/English copy.
assert "" in c["body"]
assert "Task completed" in c["body"]
def test_set_issue_done_still_exported():
"""set_issue_done must remain importable from plane_sync — stage_engine
line ~269 invokes it on deploy->done. ORCH-016 must not remove or rename it.
"""
assert callable(getattr(PS, "set_issue_done", None))
# And stage_engine still imports it at the module level (regression: ORCH-016
# touches stage_engine to wire the new analyst comment helper).
from src import stage_engine as SE
assert getattr(SE, "set_issue_done", None) is PS.set_issue_done
def test_orch016_does_not_steal_done_signal(monkeypatch):
"""build_status_comment is just a comment — it must NOT call set_issue_done
or notify_done as a side effect (that's stage_engine's job)."""
from src import usage as U
called = {"done": 0, "in_review": 0}
def _fail(*a, **k):
called["done"] += 1
monkeypatch.setattr(PS, "set_issue_done", _fail)
monkeypatch.setattr(PS, "notify_done", _fail)
html = U.build_status_comment(
"deployer", repo="enduro-trails", branch="b", work_item_id="ET-016",
stage="deploy", duration_s=12,
)
assert "\U0001f680 Deployer" in html
assert called["done"] == 0