# -*- coding:utf-8 -*- import json from unittest.mock import MagicMock, patch import pytest from dw_base.ds import cli @patch('dw_base.ds.cli.DSClient') def test_get_invokes_client_get(MockClient, capsys): inst = MagicMock() inst.get.return_value = {'code': 0} MockClient.return_value = inst cli.main(['get', '/projects', '-p', 'pageNo=1', '-p', 'pageSize=10']) inst.get.assert_called_once_with( '/projects', params={'pageNo': '1', 'pageSize': '10'}) out = capsys.readouterr().out assert json.loads(out) == {'code': 0} @patch('dw_base.ds.cli.DSClient') def test_get_o_writes_file(MockClient, tmp_path, capsys): """新特性:-o 把 JSON 写文件,stdout 不打,stderr 提示落点。""" inst = MagicMock() inst.get.return_value = {'code': 0, 'data': 'x'} MockClient.return_value = inst out_file = tmp_path / 'out.json' cli.main(['get', '/projects', '-o', str(out_file)]) assert json.loads(out_file.read_text(encoding='utf-8')) == {'code': 0, 'data': 'x'} captured = capsys.readouterr() assert captured.out == '' assert '已写到' in captured.err assert str(out_file) in captured.err @patch('dw_base.ds.cli.DSClient') def test_post_with_json_body(MockClient, capsys): inst = MagicMock() inst.post.return_value = {'ok': True} MockClient.return_value = inst cli.main(['post', '/foo', '-j', '{"a":1,"b":"x"}']) inst.post.assert_called_once_with('/foo', json_body={'a': 1, 'b': 'x'}, form_data=None) @patch('dw_base.ds.cli.DSClient') def test_post_no_body(MockClient, capsys): inst = MagicMock() inst.post.return_value = {} MockClient.return_value = inst cli.main(['post', '/foo']) inst.post.assert_called_once_with('/foo', json_body=None, form_data=None) @patch('dw_base.ds.cli.DSClient') def test_post_with_form_data(MockClient, capsys): inst = MagicMock() inst.post.return_value = {'ok': True} MockClient.return_value = inst cli.main(['post', '/foo', '-d', 'name=x', '-d', 'desc=hi']) inst.post.assert_called_once_with( '/foo', json_body=None, form_data={'name': 'x', 'desc': 'hi'}) def test_post_j_and_d_mutex_exits(): with pytest.raises(SystemExit): cli.main(['post', '/foo', '-j', '{}', '-d', 'k=v']) def test_no_subcommand_exits(): with pytest.raises(SystemExit): cli.main([]) def test_unknown_subcommand_exits(): with pytest.raises(SystemExit): cli.main(['bogus']) def test_kv_invalid_format_skipped(capsys): """-p 参数无 = 时跳过并 stderr 警告,不 raise。""" with patch('dw_base.ds.cli.DSClient') as MockClient: inst = MagicMock() inst.get.return_value = {} MockClient.return_value = inst cli.main(['get', '/p', '-p', 'no_equals', '-p', 'k=v']) inst.get.assert_called_once_with('/p', params={'k': 'v'}) assert '需要 k=v 格式' in capsys.readouterr().err