"""commands/enhancement.py 单元测试 — cmd_enhancement。 运行: python tests/unit/test_enhancement.py """ from __future__ import annotations import argparse import os import sys import unittest from unittest.mock import MagicMock, patch sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "..", "assets")) def _args(**kwargs): defaults = {"type": "class", "name": "ZCL_TEST"} defaults.update(kwargs) return argparse.Namespace(**defaults) class TestCmdEnhancement(unittest.TestCase): """cmd_enhancement 查询对象的增强实现。""" def test_object_not_found_raises(self): from sapcli.commands.enhancement import cmd_enhancement from sapcli.exceptions import ObjectNotFoundError client = MagicMock() client.object_exists.return_value = False with self.assertRaises(ObjectNotFoundError) as ctx: cmd_enhancement(_args(), client) self.assertIn("ZCL_TEST", str(ctx.exception)) def test_api_error_prints_failure_and_returns(self): """get_enhancements 抛异常时打印失败并返回。""" from sapcli.commands.enhancement import cmd_enhancement client = MagicMock() client.object_exists.return_value = True client.get_enhancements.side_effect = Exception("network error") with patch("builtins.print") as mock_print: cmd_enhancement(_args(), client) printed = " ".join(str(c) for c, _ in mock_print.call_args_list) self.assertIn("失败", printed) def test_no_enhancements(self): """无增强实现时打印提示。""" from sapcli.commands.enhancement import cmd_enhancement client = MagicMock() client.object_exists.return_value = True client.get_enhancements.return_value = [] with patch("builtins.print") as mock_print: cmd_enhancement(_args(), client) printed = " ".join(str(c) for c, _ in mock_print.call_args_list) self.assertIn("未找到增强实现", printed) def test_with_enhancements_and_full_elements(self): """增强实现含完整字段(enhanced_name、elements、mode、replacing)。""" from sapcli.commands.enhancement import cmd_enhancement client = MagicMock() client.object_exists.return_value = True client.get_enhancements.return_value = [ { "name": "ZENH_TEST", "type": "ENHO", "enhanced_name": "ZCL_TEST", "enhanced_type": "CLAS/OC", "elements": [ { "type": "METHOD", "name": "HELLO", "mode": "overwrite", "replacing": "ZCL_TEST=>HELLO", }, ], }, ] with patch("builtins.print") as mock_print: cmd_enhancement(_args(), client) printed = " ".join(str(c) for c, _ in mock_print.call_args_list) self.assertIn("ZENH_TEST", printed) self.assertIn("ENHO", printed) self.assertIn("Enhanced Object", printed) self.assertIn("ZCL_TEST", printed) self.assertIn("METHOD: HELLO", printed) self.assertIn("Mode: overwrite", printed) self.assertIn("Replacing: ZCL_TEST=>HELLO", printed) self.assertIn("Element 1", printed) def test_element_label_name_only(self): """element 只有 name 时 label 为 name。""" from sapcli.commands.enhancement import cmd_enhancement client = MagicMock() client.object_exists.return_value = True client.get_enhancements.return_value = [ { "name": "ZENH1", "elements": [{"name": "ONLY_NAME"}], }, ] with patch("builtins.print") as mock_print: cmd_enhancement(_args(), client) printed = " ".join(str(c) for c, _ in mock_print.call_args_list) self.assertIn("ONLY_NAME", printed) def test_element_label_type_only(self): """element 只有 type 时 label 为 type。""" from sapcli.commands.enhancement import cmd_enhancement client = MagicMock() client.object_exists.return_value = True client.get_enhancements.return_value = [ { "name": "ZENH1", "elements": [{"type": "ONLY_TYPE"}], }, ] with patch("builtins.print") as mock_print: cmd_enhancement(_args(), client) printed = " ".join(str(c) for c, _ in mock_print.call_args_list) self.assertIn("ONLY_TYPE", printed) def test_enhancement_minimal_fields(self): """增强实现仅含 name(无 type/enhanced_name/elements)。""" from sapcli.commands.enhancement import cmd_enhancement client = MagicMock() client.object_exists.return_value = True client.get_enhancements.return_value = [{"name": "ZENH_MIN"}] with patch("builtins.print") as mock_print: cmd_enhancement(_args(), client) printed = " ".join(str(c) for c, _ in mock_print.call_args_list) self.assertIn("ZENH_MIN", printed) # 默认 type 为 ENHO self.assertIn("ENHO", printed) # 无 enhanced_name 时不打印 Enhanced Object 行 self.assertNotIn("Enhanced Object", printed) def test_multiple_enhancements_count(self): """多个增强实现时打印数量。""" from sapcli.commands.enhancement import cmd_enhancement client = MagicMock() client.object_exists.return_value = True client.get_enhancements.return_value = [ {"name": "ZENH1", "elements": []}, {"name": "ZENH2", "elements": []}, ] with patch("builtins.print") as mock_print: cmd_enhancement(_args(), client) printed = " ".join(str(c) for c, _ in mock_print.call_args_list) self.assertIn("2", printed) if __name__ == "__main__": unittest.main(verbosity=2)