from __future__ import annotations import io import json import unittest from contextlib import redirect_stdout from owner_voice_pet.cli import main class CliAcceptanceTests(unittest.TestCase): def call(self, *args: str) -> tuple[int, dict[str, object]]: buffer = io.StringIO() with redirect_stdout(buffer): code = main(list(args)) return code, json.loads(buffer.getvalue()) def test_acceptance_command_runs_end_to_end(self) -> None: code, data = self.call("acceptance") self.assertEqual(code, 0) self.assertTrue(data["success"]) self.assertEqual(data["transcript"], "你是谁") self.assertGreaterEqual(data["played_segments"], 1) def test_validate_assets_command(self) -> None: code, data = self.call("validate-assets") self.assertEqual(code, 0) self.assertTrue(data["valid"]) def test_security_check_command_has_no_leaks(self) -> None: code, data = self.call("security-check") self.assertEqual(code, 0) self.assertEqual(data["secret_leaks"], []) if __name__ == "__main__": unittest.main()