"""Tests for sapcli.commands.activate — activate command.""" import argparse import unittest from unittest.mock import MagicMock from sapcli.commands.activate import cmd_activate def _make_client(): """创建完整 mock 的 ADTClient。""" client = MagicMock() client.host = "https://sap.example.com" client.sap_client = "100" client.csrf_token = "test-csrf-token" client.user = "TESTUSER" client.session = MagicMock() client._headers.return_value = { "content-type": "application/xml", "x-csrf-token": "test-csrf-token", } return client class TestCmdActivateSingle(unittest.TestCase): """单对象激活测试。""" def test_activate_success(self): """激活成功,无消息。""" client = _make_client() client.activate.return_value = (True, []) args = argparse.Namespace( name="ZTEST", type="report", names=None, types=None, corr_nr=None, config=None, ) cmd_activate(args, client) client.activate.assert_called_once_with( "ZTEST", "/sap/bc/adt/programs/programs/ztest", None, ) def test_activate_success_with_corr_nr(self): """带传输请求号激活。""" client = _make_client() client.activate.return_value = (True, []) args = argparse.Namespace( name="ZTEST", type="class", names=None, types=None, corr_nr="DEVK901362", config=None, ) cmd_activate(args, client) client.activate.assert_called_once_with( "ZTEST", "/sap/bc/adt/oo/classes/ztest", "DEVK901362", ) def test_activate_with_errors(self): """激活失败,返回错误消息。""" client = _make_client() client.activate.return_value = ( False, [{"type": "E", "line": "10", "text": "Syntax error", "href": ""}], ) args = argparse.Namespace( name="ZMY_CLASS", type="class", names=None, types=None, corr_nr=None, config=None, ) cmd_activate(args, client) client.activate.assert_called_once() def test_activate_with_warnings(self): """激活成功但有警告。""" client = _make_client() client.activate.return_value = ( True, [{"type": "W", "line": "5", "text": "Unused variable", "href": ""}], ) args = argparse.Namespace( name="ZTEST", type="report", names=None, types=None, corr_nr=None, config=None, ) cmd_activate(args, client) # 不抛异常 def test_activate_exception(self): """activate 抛出异常时优雅处理。""" client = _make_client() client.activate.side_effect = Exception("HTTP 500") args = argparse.Namespace( name="ZTEST", type="report", names=None, types=None, corr_nr=None, config=None, ) cmd_activate(args, client) # 不抛异常,打印错误 class TestCmdActivateBatch(unittest.TestCase): """批量激活测试。""" def test_batch_activate_all_success(self): """批量激活全部成功。""" client = _make_client() client.activate.return_value = (True, []) args = argparse.Namespace( name=None, type=None, names="ZCLS1,ZCLS2,ZCLS3", types="class,class,class", corr_nr=None, config=None, ) cmd_activate(args, client) self.assertEqual(client.activate.call_count, 3) def test_batch_activate_with_corr_nr(self): """批量激活带传输请求号。""" client = _make_client() client.activate.return_value = (True, []) args = argparse.Namespace( name=None, type=None, names="ZCLS1,ZREP1", types="class,report", corr_nr="DEVK901368", config=None, ) cmd_activate(args, client) calls = client.activate.call_args_list self.assertEqual(len(calls), 2) # 验证都传了 corr_nr for call in calls: self.assertEqual(call[0][2], "DEVK901368") def test_batch_activate_mismatch_count(self): """names 和 types 数量不匹配时报错。""" client = _make_client() args = argparse.Namespace( name=None, type=None, names="ZCLS1,ZCLS2", types="class", corr_nr=None, config=None, ) cmd_activate(args, client) client.activate.assert_not_called() def test_batch_activate_partial_failure(self): """批量激活部分失败。""" client = _make_client() client.activate.side_effect = [ (True, []), (False, [{"type": "E", "line": "1", "text": "Error", "href": ""}]), ] args = argparse.Namespace( name=None, type=None, names="ZCLS1,ZCLS2", types="class,class", corr_nr=None, config=None, ) cmd_activate(args, client) self.assertEqual(client.activate.call_count, 2) class TestCmdActivateNoneMode(unittest.TestCase): """既没有 --name 也没有 --names 的情况。""" def test_no_name_no_names(self): """没有提供 name 或 names 时,访问 args.name 应为 None,触发 AttributeError。""" client = _make_client() args = argparse.Namespace( name=None, type=None, names=None, types=None, corr_nr=None, config=None, ) # name=None 传给 parse_object_name 会失败 with self.assertRaises((TypeError, AttributeError, ValueError)): cmd_activate(args, client) if __name__ == "__main__": unittest.main()