80 lines
2.9 KiB
Python
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
|