| @@ -39,6 +39,7 @@ import argparse | |||||
| import asyncio | import asyncio | ||||
| import contextlib | import contextlib | ||||
| import io | import io | ||||
| import json | |||||
| import os | import os | ||||
| import sys | import sys | ||||
| import unittest | import unittest | ||||
| @@ -49,7 +50,11 @@ def check_res_code(res): | |||||
| print('Invalid authentication credentials.') | print('Invalid authentication credentials.') | ||||
| sys.exit(1) | sys.exit(1) | ||||
| elif res.status_code != HTTP_200_OK: | elif res.status_code != HTTP_200_OK: | ||||
| print('Got status: %d, json: %s' % (res.status_code, res.json())) | |||||
| try: | |||||
| print('Got status: %d, json: %s' % (res.status_code, res.json())) | |||||
| except json.decoder.JSONDecodeError: | |||||
| # body is JSON | |||||
| print('Got status: %d, body: %s' % (res.status_code, repr(res.text))) | |||||
| sys.exit(1) | sys.exit(1) | ||||
| def makebool(s): | def makebool(s): | ||||
| @@ -94,11 +99,6 @@ def get_sshpubkey(fname): | |||||
| raise IOError | raise IOError | ||||
| async def real_main(): | async def real_main(): | ||||
| baseurl = os.environ['BITELAB_URL'] | |||||
| authkey = os.environ['BITELAB_AUTH'] | |||||
| client = AsyncClient(base_url=baseurl) | |||||
| parser = argparse.ArgumentParser() | parser = argparse.ArgumentParser() | ||||
| subparsers = parser.add_subparsers(title='subcommands', | subparsers = parser.add_subparsers(title='subcommands', | ||||
| dest='subparser_name', | dest='subparser_name', | ||||
| @@ -117,6 +117,11 @@ async def real_main(): | |||||
| args = parser.parse_args() | args = parser.parse_args() | ||||
| #print(repr(args), file=sys.stderr) | #print(repr(args), file=sys.stderr) | ||||
| baseurl = os.environ['BITELAB_URL'] | |||||
| authkey = os.environ['BITELAB_AUTH'] | |||||
| client = AsyncClient(base_url=baseurl) | |||||
| try: | try: | ||||
| if args.subparser_name == 'list': | if args.subparser_name == 'list': | ||||
| res = await client.get('board/classes', | res = await client.get('board/classes', | ||||
| @@ -179,11 +184,11 @@ class TestClient(unittest.TestCase): | |||||
| self.acp = self.ac.return_value.post = AsyncMock() | self.acp = self.ac.return_value.post = AsyncMock() | ||||
| self.acpr = self.acp.return_value = Mock() | self.acpr = self.acp.return_value = Mock() | ||||
| def runMain(self): | |||||
| def runMain(self, fun=main): | |||||
| try: | try: | ||||
| stdout = StringIO() | stdout = StringIO() | ||||
| with patch.dict(sys.__dict__, dict(stdout=stdout)): | with patch.dict(sys.__dict__, dict(stdout=stdout)): | ||||
| main() | |||||
| fun() | |||||
| ret = 0 | ret = 0 | ||||
| except SystemExit as e: | except SystemExit as e: | ||||
| @@ -393,5 +398,12 @@ Attributes: | |||||
| self.assertRaises(ValueError, make_attrs, 'power=bar') | self.assertRaises(ValueError, make_attrs, 'power=bar') | ||||
| def test_check_res_code(self): | def test_check_res_code(self): | ||||
| # XXX - on weird errors, res.json() will fail w/ json.decoder.JSONDecodeError | |||||
| pass | |||||
| res = Mock() | |||||
| res.status_code = HTTP_404_NOT_FOUND | |||||
| res.json.side_effect = json.decoder.JSONDecodeError('foo', 'bar', 1) | |||||
| res.text = 'body' | |||||
| ret, output = self.runMain(lambda: check_res_code(res)) | |||||
| self.assertEqual(ret, 1) | |||||
| self.assertEqual(output, 'Got status: 404, body: \'body\'\n') | |||||