mirror of
https://github.com/HKUDS/nanobot.git
synced 2026-04-30 14:56:01 +00:00
cmd_restart only persisted channel + chat_id across the os.execv boundary, so when the new process announced "Restart completed" the OutboundMessage had no Slack thread_ts and the reply fell back to the channel root. Serialize msg.metadata into NANOBOT_RESTART_NOTIFY_METADATA, restore it on the RestartNotice, and forward it to OutboundMessage so the completion message follows the same routing as the original /restart invocation. Made-with: Cursor
79 lines
3.0 KiB
Python
79 lines
3.0 KiB
Python
"""Tests for restart notice helpers."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
|
|
from nanobot.utils.restart import (
|
|
RestartNotice,
|
|
consume_restart_notice_from_env,
|
|
format_restart_completed_message,
|
|
set_restart_notice_to_env,
|
|
should_show_cli_restart_notice,
|
|
)
|
|
|
|
|
|
def test_set_and_consume_restart_notice_env_roundtrip(monkeypatch):
|
|
monkeypatch.delenv("NANOBOT_RESTART_NOTIFY_CHANNEL", raising=False)
|
|
monkeypatch.delenv("NANOBOT_RESTART_NOTIFY_CHAT_ID", raising=False)
|
|
monkeypatch.delenv("NANOBOT_RESTART_NOTIFY_METADATA", raising=False)
|
|
monkeypatch.delenv("NANOBOT_RESTART_STARTED_AT", raising=False)
|
|
|
|
set_restart_notice_to_env(channel="feishu", chat_id="oc_123")
|
|
|
|
notice = consume_restart_notice_from_env()
|
|
assert notice is not None
|
|
assert notice.channel == "feishu"
|
|
assert notice.chat_id == "oc_123"
|
|
assert notice.started_at_raw
|
|
assert notice.metadata == {}
|
|
|
|
# Consumed values should be cleared from env.
|
|
assert consume_restart_notice_from_env() is None
|
|
assert "NANOBOT_RESTART_NOTIFY_CHANNEL" not in os.environ
|
|
assert "NANOBOT_RESTART_NOTIFY_CHAT_ID" not in os.environ
|
|
assert "NANOBOT_RESTART_NOTIFY_METADATA" not in os.environ
|
|
assert "NANOBOT_RESTART_STARTED_AT" not in os.environ
|
|
|
|
|
|
def test_restart_notice_preserves_metadata_across_env(monkeypatch):
|
|
monkeypatch.delenv("NANOBOT_RESTART_NOTIFY_CHANNEL", raising=False)
|
|
monkeypatch.delenv("NANOBOT_RESTART_NOTIFY_CHAT_ID", raising=False)
|
|
monkeypatch.delenv("NANOBOT_RESTART_NOTIFY_METADATA", raising=False)
|
|
monkeypatch.delenv("NANOBOT_RESTART_STARTED_AT", raising=False)
|
|
|
|
set_restart_notice_to_env(
|
|
channel="slack",
|
|
chat_id="C123",
|
|
metadata={"slack": {"thread_ts": "1700.42", "channel_type": "channel"}},
|
|
)
|
|
|
|
notice = consume_restart_notice_from_env()
|
|
assert notice is not None
|
|
assert notice.metadata == {
|
|
"slack": {"thread_ts": "1700.42", "channel_type": "channel"}
|
|
}
|
|
assert "NANOBOT_RESTART_NOTIFY_METADATA" not in os.environ
|
|
|
|
|
|
def test_restart_notice_clears_stale_metadata(monkeypatch):
|
|
monkeypatch.setenv("NANOBOT_RESTART_NOTIFY_METADATA", '{"stale": true}')
|
|
set_restart_notice_to_env(channel="cli", chat_id="direct")
|
|
assert "NANOBOT_RESTART_NOTIFY_METADATA" not in os.environ
|
|
|
|
|
|
def test_format_restart_completed_message_with_elapsed(monkeypatch):
|
|
monkeypatch.setattr("nanobot.utils.restart.time.time", lambda: 102.0)
|
|
assert format_restart_completed_message("100.0") == "Restart completed in 2.0s."
|
|
|
|
|
|
def test_should_show_cli_restart_notice():
|
|
notice = RestartNotice(channel="cli", chat_id="direct", started_at_raw="100")
|
|
assert should_show_cli_restart_notice(notice, "cli:direct") is True
|
|
assert should_show_cli_restart_notice(notice, "cli:other") is False
|
|
assert should_show_cli_restart_notice(notice, "direct") is True
|
|
|
|
non_cli = RestartNotice(channel="feishu", chat_id="oc_1", started_at_raw="100")
|
|
assert should_show_cli_restart_notice(non_cli, "cli:direct") is False
|
|
|