
Now update/remove commands return messages on success or error. Resource definitions operations refactored to use TuningBox errors on object not found error. Change-Id: I8bc4590a1ca28207562e03cb347d99801f421ff8 Closes-Bug: #1616866 Closes-Bug: #1619264
100 lines
3.6 KiB
Python
100 lines
3.6 KiB
Python
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
from requests_mock.contrib import fixture as req_fixture
|
|
import six
|
|
import testscenarios
|
|
|
|
from tuning_box import cli
|
|
from tuning_box.cli import base as cli_base
|
|
from tuning_box import client as tb_client
|
|
from tuning_box.tests import base
|
|
|
|
|
|
class FormatOutputTest(testscenarios.WithScenarios, base.TestCase):
|
|
scenarios = [
|
|
(s[0], dict(zip(('output', 'format_', 'expected_result'), s[1])))
|
|
for s in [
|
|
('none,plain', (None, 'plain', '')),
|
|
('none,json', (None, 'json', 'null')),
|
|
# TODO(yorik-sar): look into why YAML return those elipsis
|
|
('none,yaml', (None, 'yaml', 'null\n...\n')),
|
|
('str,plain', (u"a string", 'plain', 'a string')),
|
|
('str,json', (u"a string", 'json', '"a string"')),
|
|
('str,yaml', (u"a string", 'yaml', 'a string\n...\n')),
|
|
('int,plain', (42, 'plain', '42')),
|
|
('int,json', (42, 'json', '42')),
|
|
('int,yaml', (42, 'yaml', '42\n...\n')),
|
|
('float,plain', (1.2, 'plain', '1.2')),
|
|
('float,json', (1.2, 'json', '1.2')),
|
|
('float,yaml', (1.2, 'yaml', '1.2\n...\n')),
|
|
('list,plain', ([1, 2], 'plain', '[1, 2]')),
|
|
('list,json', ([1, 2], 'json', '[1, 2]')),
|
|
('list,yaml', ([1, 2], 'yaml', '- 1\n- 2\n')),
|
|
('dict,plain', ({'a': 1}, 'plain', '{"a": 1}')),
|
|
('dict,json', ({'a': 1}, 'json', '{"a": 1}')),
|
|
('dict,yaml', ({'a': 1}, 'yaml', 'a: 1\n')),
|
|
]
|
|
]
|
|
|
|
output = None
|
|
format_ = None
|
|
expected_result = None
|
|
|
|
def test_format_output(self):
|
|
res = cli_base.format_output(self.output, self.format_)
|
|
self.assertEqual(self.expected_result, res)
|
|
|
|
|
|
class SafeTuningBoxApp(cli.TuningBoxApp):
|
|
def __init__(self, client):
|
|
super(SafeTuningBoxApp, self).__init__(
|
|
client=client,
|
|
**self.get_std_streams()
|
|
)
|
|
|
|
@staticmethod
|
|
def get_std_streams():
|
|
if bytes is str:
|
|
io_cls = six.BytesIO
|
|
else:
|
|
io_cls = six.StringIO
|
|
return {k: io_cls() for k in ('stdin', 'stdout', 'stderr')}
|
|
|
|
def build_option_parser(self, description, version, argparse_kwargs=None):
|
|
parser = super(SafeTuningBoxApp, self).build_option_parser(
|
|
description, version, argparse_kwargs)
|
|
parser.set_defaults(debug=True)
|
|
return parser
|
|
|
|
def get_fuzzy_matches(self, cmd):
|
|
# Turn off guessing, we need exact failures in tests
|
|
return []
|
|
|
|
def run(self, argv):
|
|
try:
|
|
super(SafeTuningBoxApp, self).run(argv)
|
|
except SystemExit as e:
|
|
# We should check exit code only if system exit was called.
|
|
exit_code = e.code
|
|
assert exit_code == 0
|
|
|
|
|
|
class _BaseCLITest(base.TestCase):
|
|
BASE_URL = 'http://somehost/prefix'
|
|
|
|
def setUp(self):
|
|
super(_BaseCLITest, self).setUp()
|
|
client = tb_client.HTTPClient(self.BASE_URL)
|
|
self.req_mock = self.useFixture(req_fixture.Fixture())
|
|
self.cli = SafeTuningBoxApp(client=client)
|