test_cli.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. # -*- coding:utf-8 -*-
  2. import json
  3. from unittest.mock import MagicMock, patch
  4. import pytest
  5. from dw_base.ds import cli
  6. @patch('dw_base.ds.cli.DSClient')
  7. def test_get_invokes_client_get(MockClient, capsys):
  8. inst = MagicMock()
  9. inst.get.return_value = {'code': 0}
  10. MockClient.return_value = inst
  11. cli.main(['get', '/projects', '-p', 'pageNo=1', '-p', 'pageSize=10'])
  12. inst.get.assert_called_once_with(
  13. '/projects', params={'pageNo': '1', 'pageSize': '10'})
  14. out = capsys.readouterr().out
  15. assert json.loads(out) == {'code': 0}
  16. @patch('dw_base.ds.cli.DSClient')
  17. def test_get_o_writes_file(MockClient, tmp_path, capsys):
  18. """新特性:-o 把 JSON 写文件,stdout 不打,stderr 提示落点。"""
  19. inst = MagicMock()
  20. inst.get.return_value = {'code': 0, 'data': 'x'}
  21. MockClient.return_value = inst
  22. out_file = tmp_path / 'out.json'
  23. cli.main(['get', '/projects', '-o', str(out_file)])
  24. assert json.loads(out_file.read_text(encoding='utf-8')) == {'code': 0, 'data': 'x'}
  25. captured = capsys.readouterr()
  26. assert captured.out == ''
  27. assert '已写到' in captured.err
  28. assert str(out_file) in captured.err
  29. @patch('dw_base.ds.cli.DSClient')
  30. def test_post_with_json_body(MockClient, capsys):
  31. inst = MagicMock()
  32. inst.post.return_value = {'ok': True}
  33. MockClient.return_value = inst
  34. cli.main(['post', '/foo', '-j', '{"a":1,"b":"x"}'])
  35. inst.post.assert_called_once_with('/foo', json_body={'a': 1, 'b': 'x'})
  36. @patch('dw_base.ds.cli.DSClient')
  37. def test_post_no_body(MockClient, capsys):
  38. inst = MagicMock()
  39. inst.post.return_value = {}
  40. MockClient.return_value = inst
  41. cli.main(['post', '/foo'])
  42. inst.post.assert_called_once_with('/foo', json_body=None)
  43. def test_no_subcommand_exits():
  44. with pytest.raises(SystemExit):
  45. cli.main([])
  46. def test_unknown_subcommand_exits():
  47. with pytest.raises(SystemExit):
  48. cli.main(['bogus'])
  49. def test_kv_invalid_format_skipped(capsys):
  50. """-p 参数无 = 时跳过并 stderr 警告,不 raise。"""
  51. with patch('dw_base.ds.cli.DSClient') as MockClient:
  52. inst = MagicMock()
  53. inst.get.return_value = {}
  54. MockClient.return_value = inst
  55. cli.main(['get', '/p', '-p', 'no_equals', '-p', 'k=v'])
  56. inst.get.assert_called_once_with('/p', params={'k': 'v'})
  57. assert '需要 k=v 格式' in capsys.readouterr().err