gabriel / muse public
test_harmony_envelope.py python
85 lines 2.9 KB
Raw
1 """Envelope tests for muse harmony subcommands."""
2 from __future__ import annotations
3 from collections.abc import Mapping
4 import json
5 import pytest
6 from tests.cli_test_helper import CliRunner
7
8 runner = CliRunner()
9
10 _FIELDS = ("muse_version", "schema", "timestamp", "warnings")
11
12
13 def _check(d: Mapping[str, object]) -> None:
14 for f in _FIELDS:
15 assert f in d, f"missing {f}"
16 assert "schema_version" not in d
17
18
19 class TestHarmonyEnvelope:
20 def test_harmony_list_has_envelope(self) -> None:
21 r = runner.invoke(None, ["harmony", "list", "--json"])
22 assert r.exit_code == 0, r.output
23 _check(json.loads(r.output))
24
25 def test_harmony_policy_list_has_envelope(self) -> None:
26 r = runner.invoke(None, ["harmony", "policy-list", "--json"])
27 assert r.exit_code == 0, r.output
28 _check(json.loads(r.output))
29
30 def test_harmony_audit_has_envelope(self) -> None:
31 r = runner.invoke(None, ["harmony", "audit", "--json"])
32 assert r.exit_code == 0, r.output
33 _check(json.loads(r.output))
34
35 def test_harmony_escalations_has_envelope(self) -> None:
36 r = runner.invoke(None, ["harmony", "escalations", "--json"])
37 assert r.exit_code == 0, r.output
38 _check(json.loads(r.output))
39
40 def test_harmony_gc_has_envelope(self) -> None:
41 r = runner.invoke(None, ["harmony", "gc", "--json"])
42 assert r.exit_code == 0, r.output
43 _check(json.loads(r.output))
44
45
46 # ---------------------------------------------------------------------------
47 # TestRegisterFlags — argparse-level verification
48 # ---------------------------------------------------------------------------
49
50
51 class TestRegisterFlags:
52 """Verify that harmony subcommands wire --json / -j correctly."""
53
54 def _make_parser(self) -> "argparse.ArgumentParser":
55 import argparse
56 from muse.cli.commands.harmony import register
57 ap = argparse.ArgumentParser()
58 subs = ap.add_subparsers()
59 register(subs)
60 return ap
61
62 def test_list_json_flag_long(self) -> None:
63 ns = self._make_parser().parse_args(["harmony", "list", "--json"])
64 assert ns.json_out is True
65
66 def test_list_j_alias(self) -> None:
67 ns = self._make_parser().parse_args(["harmony", "list", "-j"])
68 assert ns.json_out is True
69
70 def test_list_default_is_text(self) -> None:
71 ns = self._make_parser().parse_args(["harmony", "list"])
72 assert ns.json_out is False
73
74 def test_gc_j_alias(self) -> None:
75 ns = self._make_parser().parse_args(["harmony", "gc", "-j"])
76 assert ns.json_out is True
77
78 def test_audit_j_alias(self) -> None:
79 ns = self._make_parser().parse_args(["harmony", "audit", "-j"])
80 assert ns.json_out is True
81
82 def test_dest_is_json_out(self) -> None:
83 ns = self._make_parser().parse_args(["harmony", "list", "-j"])
84 assert hasattr(ns, "json_out")
85 assert not hasattr(ns, "fmt")
File History 1 commit