"""Envelope tests for muse harmony subcommands.""" from __future__ import annotations from collections.abc import Mapping import json import pytest from tests.cli_test_helper import CliRunner runner = CliRunner() _FIELDS = ("muse_version", "schema", "timestamp", "warnings") def _check(d: Mapping[str, object]) -> None: for f in _FIELDS: assert f in d, f"missing {f}" assert "schema_version" not in d class TestHarmonyEnvelope: def test_harmony_list_has_envelope(self) -> None: r = runner.invoke(None, ["harmony", "list", "--json"]) assert r.exit_code == 0, r.output _check(json.loads(r.output)) def test_harmony_policy_list_has_envelope(self) -> None: r = runner.invoke(None, ["harmony", "policy-list", "--json"]) assert r.exit_code == 0, r.output _check(json.loads(r.output)) def test_harmony_audit_has_envelope(self) -> None: r = runner.invoke(None, ["harmony", "audit", "--json"]) assert r.exit_code == 0, r.output _check(json.loads(r.output)) def test_harmony_escalations_has_envelope(self) -> None: r = runner.invoke(None, ["harmony", "escalations", "--json"]) assert r.exit_code == 0, r.output _check(json.loads(r.output)) def test_harmony_gc_has_envelope(self) -> None: r = runner.invoke(None, ["harmony", "gc", "--json"]) assert r.exit_code == 0, r.output _check(json.loads(r.output)) # --------------------------------------------------------------------------- # TestRegisterFlags — argparse-level verification # --------------------------------------------------------------------------- class TestRegisterFlags: """Verify that harmony subcommands wire --json / -j correctly.""" def _make_parser(self) -> "argparse.ArgumentParser": import argparse from muse.cli.commands.harmony import register ap = argparse.ArgumentParser() subs = ap.add_subparsers() register(subs) return ap def test_list_json_flag_long(self) -> None: ns = self._make_parser().parse_args(["harmony", "list", "--json"]) assert ns.json_out is True def test_list_j_alias(self) -> None: ns = self._make_parser().parse_args(["harmony", "list", "-j"]) assert ns.json_out is True def test_list_default_is_text(self) -> None: ns = self._make_parser().parse_args(["harmony", "list"]) assert ns.json_out is False def test_gc_j_alias(self) -> None: ns = self._make_parser().parse_args(["harmony", "gc", "-j"]) assert ns.json_out is True def test_audit_j_alias(self) -> None: ns = self._make_parser().parse_args(["harmony", "audit", "-j"]) assert ns.json_out is True def test_dest_is_json_out(self) -> None: ns = self._make_parser().parse_args(["harmony", "list", "-j"]) assert hasattr(ns, "json_out") assert not hasattr(ns, "fmt")