| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- # -*- 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
|