test_cli.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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'}, form_data=None)
  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, form_data=None)
  43. @patch('dw_base.ds.cli.DSClient')
  44. def test_post_with_form_data(MockClient, capsys):
  45. inst = MagicMock()
  46. inst.post.return_value = {'ok': True}
  47. MockClient.return_value = inst
  48. cli.main(['post', '/foo', '-d', 'name=x', '-d', 'desc=hi'])
  49. inst.post.assert_called_once_with(
  50. '/foo', json_body=None, form_data={'name': 'x', 'desc': 'hi'})
  51. def test_post_j_and_d_mutex_exits():
  52. with pytest.raises(SystemExit):
  53. cli.main(['post', '/foo', '-j', '{}', '-d', 'k=v'])
  54. def test_no_subcommand_exits():
  55. with pytest.raises(SystemExit):
  56. cli.main([])
  57. def test_unknown_subcommand_exits():
  58. with pytest.raises(SystemExit):
  59. cli.main(['bogus'])
  60. def test_kv_invalid_format_skipped(capsys):
  61. """-p 参数无 = 时跳过并 stderr 警告,不 raise。"""
  62. with patch('dw_base.ds.cli.DSClient') as MockClient:
  63. inst = MagicMock()
  64. inst.get.return_value = {}
  65. MockClient.return_value = inst
  66. cli.main(['get', '/p', '-p', 'no_equals', '-p', 'k=v'])
  67. inst.get.assert_called_once_with('/p', params={'k': 'v'})
  68. assert '需要 k=v 格式' in capsys.readouterr().err