"""commands/program_run.py 单元测试 — cmd_run_program。 运行: python tests/unit/test_program_run.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 = {"name": "zprogram"} defaults.update(kwargs) return argparse.Namespace(**defaults) class TestCmdRunProgram(unittest.TestCase): """cmd_run_program 远程执行 ABAP 程序。""" def test_output_present_is_printed(self): """程序返回非空输出时打印输出内容。""" from sapcli.commands.program_run import cmd_run_program client = MagicMock() client.run_program.return_value = " Hello ABAP \n" with patch("builtins.print") as mock_print: cmd_run_program(_args(name="zsetup"), client) # 程序名应大写后传给 client client.run_program.assert_called_once_with("ZSETUP") printed = " ".join(str(c) for c, _ in mock_print.call_args_list) self.assertIn("Hello ABAP", printed) def test_output_trailing_newlines_rstripped(self): """输出尾随空白被 rstrip 去掉。""" from sapcli.commands.program_run import cmd_run_program client = MagicMock() client.run_program.return_value = "line1\nline2\n\n\n" with patch("builtins.print") as mock_print: cmd_run_program(_args(), client) printed = " ".join(str(c) for c, _ in mock_print.call_args_list) self.assertIn("line2", printed) def test_empty_output_prints_no_output(self): """程序返回纯空白输出时打印「无输出」。""" from sapcli.commands.program_run import cmd_run_program client = MagicMock() client.run_program.return_value = " \n " with patch("builtins.print") as mock_print: cmd_run_program(_args(), client) printed = " ".join(str(c) for c, _ in mock_print.call_args_list) self.assertIn("无输出", printed) def test_truly_empty_string_prints_no_output(self): """程序返回空字符串时打印「无输出」。""" from sapcli.commands.program_run import cmd_run_program client = MagicMock() client.run_program.return_value = "" with patch("builtins.print") as mock_print: cmd_run_program(_args(), client) printed = " ".join(str(c) for c, _ in mock_print.call_args_list) self.assertIn("无输出", printed) def test_name_uppercased_before_call(self): """小写程序名被 .upper() 后传给 client。""" from sapcli.commands.program_run import cmd_run_program client = MagicMock() client.run_program.return_value = "" cmd_run_program(_args(name="ztest_prog"), client) client.run_program.assert_called_once_with("ZTEST_PROG") def test_info_message_printed(self): """执行前打印「远程执行程序」提示。""" from sapcli.commands.program_run import cmd_run_program client = MagicMock() client.run_program.return_value = "ok" with patch("builtins.print") as mock_print: cmd_run_program(_args(name="zprog"), client) printed = " ".join(str(c) for c, _ in mock_print.call_args_list) self.assertIn("ZPROG", printed) if __name__ == "__main__": unittest.main(verbosity=2)