summaryrefslogtreecommitdiffstats
path: root/testapi/testapi-client/testapiclient
diff options
context:
space:
mode:
Diffstat (limited to 'testapi/testapi-client/testapiclient')
-rw-r--r--testapi/testapi-client/testapiclient/cli/scenarios.py131
-rw-r--r--testapi/testapi-client/testapiclient/cli/testcases.py119
-rw-r--r--testapi/testapi-client/testapiclient/tests/unit/test_scenario.py152
-rw-r--r--testapi/testapi-client/testapiclient/tests/unit/test_testcases.py155
-rw-r--r--testapi/testapi-client/testapiclient/utils/urlparse.py4
5 files changed, 559 insertions, 2 deletions
diff --git a/testapi/testapi-client/testapiclient/cli/scenarios.py b/testapi/testapi-client/testapiclient/cli/scenarios.py
new file mode 100644
index 0000000..fc6a2db
--- /dev/null
+++ b/testapi/testapi-client/testapiclient/cli/scenarios.py
@@ -0,0 +1,131 @@
+import json
+
+from testapiclient.utils import command
+from testapiclient.utils import urlparse
+
+
+def scenarios_url():
+ return urlparse.resource_join('scenarios')
+
+
+def scenario_url(parsed_args):
+ return urlparse.path_join(scenarios_url(), parsed_args.name)
+
+
+class ScenarioGet(command.Lister):
+
+ def get_parser(self, prog_name):
+ parser = super(ScenarioGet, self).get_parser(prog_name)
+ parser.add_argument('-name',
+ help='Search scenarios using name')
+ parser.add_argument('-installer',
+ help='Search scenarios using installer')
+ parser.add_argument('---version',
+ help='Search scenarios using version')
+ parser.add_argument('-project',
+ help='Search scenarios using project')
+ return parser
+
+ def take_action(self, parsed_args):
+ columns = (
+ 'name',
+ '_id',
+ 'creator',
+ 'creation_date'
+ )
+ data = self.app.client_manager.get(
+ urlparse.query_by(scenarios_url(),
+ ['name', 'installer', 'version', 'project'],
+ parsed_args))
+ return self.format_output(columns, data.get('scenarios', []))
+
+
+class ScenarioGetOne(command.ShowOne):
+
+ def get_parser(self, prog_name):
+ parser = super(ScenarioGetOne, self).get_parser(prog_name)
+ parser.add_argument('name',
+ help='Search scenario by name')
+ return parser
+
+ def take_action(self, parsed_args):
+ return self.format_output(
+ self.app.client_manager.get(scenario_url(parsed_args)))
+
+
+class ScenarioCreate(command.ShowOne):
+
+ def get_parser(self, prog_name):
+ parser = super(ScenarioCreate, self).get_parser(prog_name)
+ parser.add_argument('scenario',
+ type=json.loads,
+ help='Scenario create request format :\n'
+ '\'{ "installers": [], "name": ""}\',\n'
+ 'Intaller create request format :\n'
+ '\'{"installer": "","versions": []}\',\n'
+ 'Version create request format :\n'
+ '\'{"owner": "","version": "",'
+ '"projects": []}\',\n'
+ 'Project create request format :\n'
+ '\'{"project": "","customs": [],'
+ '"scores": [],'
+ '"trust_indicators": []}\',\n'
+ 'Custom create request format :\n'
+ '\'["asf","saf"]\',\n'
+ 'Score create request format :\n'
+ '\'{"date": "", "score": ""}\',\n'
+ 'Trust Indicators create request format :\n'
+ '\'{"date": "", "status": ""}\'')
+ return parser
+
+ def take_action(self, parsed_args):
+ return self.format_output(
+ self.app.client_manager.post(
+ scenarios_url(), parsed_args.scenario))
+
+
+class ScenarioDelete(command.Command):
+
+ def get_parser(self, prog_name):
+ parser = super(ScenarioDelete, self).get_parser(prog_name)
+ parser.add_argument('name',
+ type=str,
+ help='Delete scenario by name')
+ return parser
+
+ def take_action(self, parsed_args):
+ return self.app.client_manager.delete(scenario_url(parsed_args))
+
+
+class ScenarioPut(command.ShowOne):
+
+ def get_parser(self, prog_name):
+ parser = super(ScenarioPut, self).get_parser(prog_name)
+ parser.add_argument('name',
+ type=str,
+ help='Update scenario by name')
+ parser.add_argument('scenario',
+ type=json.loads,
+ help='Scenario create request format :\n'
+ '\'{ "installers": [], "name": ""}\',\n'
+ 'Intaller create request format :\n'
+ '\'{"installer": "","versions": []}\',\n'
+ 'Version create request format :\n'
+ '\'{"owner": "","version": "",'
+ '"projects": []}\',\n'
+ 'Project create request format :\n'
+ '\'{"project": "","customs": [],'
+ '"scores": [],'
+ '"trust_indicators": []}\',\n'
+ 'Custom create request format :\n'
+ '\'["asf","saf"]\',\n'
+ 'Score create request format :\n'
+ '\'{"date": "", "score": ""}\',\n'
+ 'Trust Indicators create request format :\n'
+ '\'{"date": "", "status": ""}\'')
+ return parser
+
+ def take_action(self, parsed_args):
+ return self.format_output(
+ self.app.client_manager.put(
+ scenario_url(parsed_args), parsed_args.scenario))
diff --git a/testapi/testapi-client/testapiclient/cli/testcases.py b/testapi/testapi-client/testapiclient/cli/testcases.py
new file mode 100644
index 0000000..6c97edb
--- /dev/null
+++ b/testapi/testapi-client/testapiclient/cli/testcases.py
@@ -0,0 +1,119 @@
+import json
+
+from testapiclient.utils import command
+from testapiclient.utils import urlparse
+
+
+def testcases_url(name):
+ return urlparse.resource_join('projects', name, 'cases')
+
+
+def testcase_url(parsed_args):
+ return urlparse.path_join(
+ testcases_url(parsed_args.project_name), parsed_args.name)
+
+
+class TestcaseGet(command.Lister):
+
+ def get_parser(self, prog_name):
+ parser = super(TestcaseGet, self).get_parser(prog_name)
+ parser.add_argument('--project-name',
+ required=True,
+ help='Search testcases by project name')
+ return parser
+
+ def take_action(self, parsed_args):
+ columns = (
+ 'name',
+ '_id',
+ 'creator',
+ 'creation_date'
+ )
+ data = self.app.client_manager.get(
+ testcases_url(parsed_args.project_name))
+ return self.format_output(columns, data.get('testcases', []))
+
+
+class TestcaseGetOne(command.ShowOne):
+
+ def get_parser(self, prog_name):
+ parser = super(TestcaseGetOne, self).get_parser(prog_name)
+ parser.add_argument('--project-name',
+ required=True,
+ help='Search testcase by project name')
+ parser.add_argument('name',
+ help='Search testcase by name')
+ return parser
+
+ def take_action(self, parsed_args):
+ return self.format_output(
+ self.app.client_manager.get(testcase_url(parsed_args)))
+
+
+class TestcaseCreate(command.ShowOne):
+
+ def get_parser(self, prog_name):
+ parser = super(TestcaseCreate, self).get_parser(prog_name)
+ parser.add_argument('--project-name',
+ required=True,
+ help='Create testcase under project name')
+ parser.add_argument('testcase',
+ type=json.loads,
+ help='Testcase create request format:\n'
+ '\'{"run": "", "name": "", "ci_loop": "",'
+ '"tags": "",\n "url": "", "blocking": "",'
+ '"domains": "", "dependencies": "",\n '
+ '"version": "", "criteria": "", "tier": "",'
+ '"trust": "",\n "catalog_description": "",'
+ '"description": ""}\'')
+ return parser
+
+ def take_action(self, parsed_args):
+ return self.format_output(
+ self.app.client_manager.post(
+ testcases_url(parsed_args.project_name), parsed_args.testcase))
+
+
+class TestcaseDelete(command.Command):
+
+ def get_parser(self, prog_name):
+ parser = super(TestcaseDelete, self).get_parser(prog_name)
+ parser.add_argument('--project-name',
+ required=True,
+ type=str,
+ help='Delete testcase by project name')
+ parser.add_argument('name',
+ type=str,
+ help='Delete testcase by name')
+ return parser
+
+ def take_action(self, parsed_args):
+ return self.app.client_manager.delete(testcase_url(parsed_args))
+
+
+class TestcasePut(command.ShowOne):
+
+ def get_parser(self, prog_name):
+ parser = super(TestcasePut, self).get_parser(prog_name)
+ parser.add_argument('--project-name',
+ type=str,
+ required=True,
+ help='Update testcase by project name')
+ parser.add_argument('name',
+ type=str,
+ help='Update testcase by name')
+ parser.add_argument('testcase',
+ type=json.loads,
+ help='Testcase Update request format:\n'
+ '\'{"run": "", "name": "", "ci_loop": "",'
+ '"tags": "",\n "url": "", "blocking": "",'
+ '"domains": "", "dependencies": "",\n '
+ '"version": "", "criteria": "", "tier": "",'
+ '"trust": "",\n "catalog_description": "",'
+ '"description": ""}\'')
+ return parser
+
+ def take_action(self, parsed_args):
+ return self.format_output(
+ self.app.client_manager.put(
+ testcase_url(parsed_args), parsed_args.testcase))
diff --git a/testapi/testapi-client/testapiclient/tests/unit/test_scenario.py b/testapi/testapi-client/testapiclient/tests/unit/test_scenario.py
new file mode 100644
index 0000000..2458d2b
--- /dev/null
+++ b/testapi/testapi-client/testapiclient/tests/unit/test_scenario.py
@@ -0,0 +1,152 @@
+import json
+
+from mock import mock
+from six.moves.urllib import parse
+import testtools
+
+from testapiclient.cli import scenarios
+from testapiclient.tests.unit import fakes as fk
+from testapiclient.tests.unit import utils
+from testapiclient.utils import clientmanager
+
+
+class ScenarioTest(utils.TestCommand):
+ def setUp(self):
+ super(ScenarioTest, self).setUp()
+ self.base_url = parse.urljoin(self.api_url, 'scenarios')
+ self.scenario_json = {
+ "installers": [],
+ "name": "test_scenario"
+ }
+ self.scenario_string = json.dumps(self.scenario_json)
+
+
+class ScenarioGetTest(ScenarioTest):
+
+ def setUp(self):
+ super(ScenarioGetTest, self).setUp()
+ self.scenarios_rsp = {'scenarios': [self.scenario_json]}
+
+ def test_get(self):
+ self.get_mock.return_value = fk.FakeResponse(data=self.scenarios_rsp)
+ scenario_get = scenarios.ScenarioGet(self.app, mock.Mock())
+ args = ['-name', 's1', '-installer',
+ 'i1', '---version', 'v1', '-project', 'p1']
+ verifies = [
+ ('name', 's1'),
+ ('installer', 'i1'),
+ ('version', 'v1'),
+ ('project', 'p1')]
+ parsed_args = self.check_parser(scenario_get, args, verifies)
+ scenario_get.take_action(parsed_args)
+ kall = self.get_mock.call_args
+ args, kwargs = kall
+ self.assert_url(
+ args[0],
+ self.base_url + '?version=v1&name=s1&installer=i1&project=p1')
+
+ def assert_url(self, actual_url, expected_url):
+ actual_parsed = parse.parse_qs(parse.urlparse(actual_url).query)
+ expected_parsed = parse.parse_qs(parse.urlparse(expected_url).query)
+ assert actual_parsed == expected_parsed
+
+ def test_get_all(self):
+ self.get_mock.return_value = fk.FakeResponse(data=self.scenarios_rsp)
+ scenario_get = scenarios.ScenarioGet(self.app, mock.Mock())
+ args = []
+ verifies = []
+ parsed_args = self.check_parser(scenario_get, args, verifies)
+ scenario_get.take_action(parsed_args)
+ self.get_mock.assert_called_once_with(
+ self.base_url,
+ headers=clientmanager.ClientManager.headers)
+
+ def test_get_one(self):
+ self.get_mock.return_value = fk.FakeResponse(data=self.scenario_json)
+ scenario_get_one = scenarios.ScenarioGetOne(self.app, mock.Mock())
+ args = ['def']
+ verifies = [('name', 'def')]
+ parsed_args = self.check_parser(scenario_get_one, args, verifies)
+ scenario_get_one.take_action(parsed_args)
+ self.get_mock.assert_called_once_with(
+ self.base_url + '/def',
+ headers=clientmanager.ClientManager.headers)
+
+
+class ScenarioCreateTest(ScenarioTest):
+
+ def setUp(self):
+ super(ScenarioCreateTest, self).setUp()
+
+ def test_create_success(self):
+ succ_rsp = {
+ 'href': '{}/{}'.format(self.base_url,
+ self.scenario_json.get('name'))
+ }
+ self.post_mock.return_value = fk.FakeResponse(data=succ_rsp)
+ scenario_create = scenarios.ScenarioCreate(self.app, mock.Mock())
+ args = [self.scenario_string]
+ verifies = [('scenario', self.scenario_json)]
+ parsed_args = self.check_parser(scenario_create, args, verifies)
+ scenario_create.take_action(parsed_args)
+ self.post_mock.assert_called_once()
+
+ def test_create_failure(self):
+ with testtools.ExpectedException(Exception, 'Create failed: Error'):
+ self.post_mock.return_value = utils.FAKE_FAILURE
+ scenario_create = scenarios.ScenarioCreate(self.app, mock.Mock())
+ args = [self.scenario_string]
+ verifies = [('scenario', self.scenario_json)]
+ parsed_args = self.check_parser(scenario_create, args, verifies)
+ scenario_create.take_action(parsed_args)
+
+
+class ScenarioDeleteTest(ScenarioTest):
+
+ def setUp(self):
+ super(ScenarioDeleteTest, self).setUp()
+
+ def test_delete_success(self):
+ self.delete_mock.return_value = fk.FakeResponse()
+ scenario_delete = scenarios.ScenarioDelete(self.app, mock.Mock())
+ args = ['def']
+ verifies = [('name', 'def')]
+ parsed_args = self.check_parser(scenario_delete, args, verifies)
+ scenario_delete.take_action(parsed_args)
+ self.delete_mock.assert_called_once_with(
+ self.base_url + '/def',
+ data=None,
+ headers=clientmanager.ClientManager.headers)
+
+ def test_delete_failure(self):
+ with testtools.ExpectedException(Exception, 'Delete failed: Error'):
+ self.delete_mock.return_value = utils.FAKE_FAILURE
+ scenario_delete = scenarios.ScenarioDelete(self.app, mock.Mock())
+ args = ['def']
+ verifies = [('name', 'def')]
+ parsed_args = self.check_parser(scenario_delete, args, verifies)
+ scenario_delete.take_action(parsed_args)
+
+
+class ScenarioPutTest(ScenarioTest):
+
+ def setUp(self):
+ super(ScenarioPutTest, self).setUp()
+
+ def test_put_success(self):
+ self.put_mock.return_value = fk.FakeResponse(data=self.scenario_json)
+ scenario_put = scenarios.ScenarioPut(self.app, mock.Mock())
+ args = ['def', self.scenario_string]
+ verifies = [('name', 'def'), ('scenario', self.scenario_json)]
+ parsed_args = self.check_parser(scenario_put, args, verifies)
+ scenario_put.take_action(parsed_args)
+ self.put_mock.assert_called_once()
+
+ def test_put_failure(self):
+ with testtools.ExpectedException(Exception, 'Update failed: Error'):
+ self.put_mock.return_value = utils.FAKE_FAILURE
+ scenario_put = scenarios.ScenarioPut(self.app, mock.Mock())
+ args = ['def', self.scenario_string]
+ verifies = [('name', 'def'), ('scenario', self.scenario_json)]
+ parsed_args = self.check_parser(scenario_put, args, verifies)
+ scenario_put.take_action(parsed_args)
diff --git a/testapi/testapi-client/testapiclient/tests/unit/test_testcases.py b/testapi/testapi-client/testapiclient/tests/unit/test_testcases.py
new file mode 100644
index 0000000..6fd2120
--- /dev/null
+++ b/testapi/testapi-client/testapiclient/tests/unit/test_testcases.py
@@ -0,0 +1,155 @@
+import json
+
+from mock import mock
+from six.moves.urllib import parse
+import testtools
+
+from testapiclient.cli import testcases
+from testapiclient.tests.unit import fakes
+from testapiclient.tests.unit import utils
+from testapiclient.utils import clientmanager
+
+
+class TestcaseTest(utils.TestCommand):
+ def setUp(self):
+ super(TestcaseTest, self).setUp()
+ self.base_url = parse.urljoin(self.api_url, 'projects/{}/cases')
+ self.project_name = 'functest'
+ self.testcase_json = {
+ 'run': '',
+ 'name': 'test-case',
+ 'ci_loop': '',
+ 'tags': '',
+ 'url': '',
+ 'blocking': '',
+ 'domains': '',
+ 'dependencies': '',
+ 'version': '',
+ 'criteria': '',
+ 'tier': '',
+ 'trust': '',
+ 'catalog_description': '',
+ 'description': ''
+ }
+ self.testcase_string = json.dumps(self.testcase_json)
+
+
+class TestcaseGetTest(TestcaseTest):
+
+ def setUp(self):
+ super(TestcaseGetTest, self).setUp()
+ self.testcases_rsp = {'testcases': [self.testcase_json]}
+
+ def test_get(self):
+ self.get_mock.return_value = fakes.FakeResponse(
+ data=self.testcases_rsp)
+ testcase_get = testcases.TestcaseGet(self.app, mock.Mock())
+ args = ['--project-name', 'dfs']
+ verifies = [('project_name', 'dfs')]
+ parsed_args = self.check_parser(testcase_get, args, verifies)
+ testcase_get.take_action(parsed_args)
+ self.get_mock.assert_called_once_with(
+ self.base_url.format(parsed_args.project_name),
+ headers=clientmanager.ClientManager.headers)
+
+ def test_get_one(self):
+ self.get_mock.return_value = fakes.FakeResponse(
+ data=self.testcase_json)
+ testcase_get_one = testcases.TestcaseGetOne(self.app, mock.Mock())
+ args = ['--project-name', 'functest', 'def']
+ verifies = [('project_name', 'functest'), ('name', 'def')]
+ parsed_args = self.check_parser(testcase_get_one, args, verifies)
+ testcase_get_one.take_action(parsed_args)
+ self.get_mock.assert_called_once_with(
+ self.base_url.format(parsed_args.project_name) + '/def',
+ headers=clientmanager.ClientManager.headers)
+
+
+class TestcaseCreateTest(TestcaseTest):
+
+ def setUp(self):
+ super(TestcaseCreateTest, self).setUp()
+
+ def test_create_success(self):
+ succ_rsp = {
+ 'href': '{}/{}'.format(self.base_url.format(self.project_name),
+ self.testcase_json.get('name'))
+ }
+ self.post_mock.return_value = fakes.FakeResponse(data=succ_rsp)
+ testcase_create = testcases.TestcaseCreate(self.app, mock.Mock())
+ args = ['--project-name', 'functest', self.testcase_string]
+ verifies = [
+ ('project_name', 'functest'),
+ ('testcase', self.testcase_json)]
+ parsed_args = self.check_parser(testcase_create, args, verifies)
+ testcase_create.take_action(parsed_args)
+ self.post_mock.assert_called_once()
+
+ def test_create_failure(self):
+ with testtools.ExpectedException(Exception, 'Create failed: Error'):
+ self.post_mock.return_value = utils.FAKE_FAILURE
+ testcase_create = testcases.TestcaseCreate(self.app, mock.Mock())
+ args = ['--project-name', 'functest', self.testcase_string]
+ verifies = [
+ ('project_name', 'functest'),
+ ('testcase', self.testcase_json)]
+ parsed_args = self.check_parser(testcase_create, args, verifies)
+ testcase_create.take_action(parsed_args)
+
+
+class TestcaseDeleteTest(TestcaseTest):
+
+ def setUp(self):
+ super(TestcaseDeleteTest, self).setUp()
+
+ def test_delete_success(self):
+ self.delete_mock.return_value = fakes.FakeResponse()
+ testcase_delete = testcases.TestcaseDelete(self.app, mock.Mock())
+ args = ['--project-name', 'functest', 'def']
+ verifies = [('project_name', 'functest'), ('name', 'def')]
+ parsed_args = self.check_parser(testcase_delete, args, verifies)
+ testcase_delete.take_action(parsed_args)
+ self.delete_mock.assert_called_once_with(
+ self.base_url.format(parsed_args.project_name) + '/def',
+ data=None,
+ headers=clientmanager.ClientManager.headers)
+
+ def test_delete_failure(self):
+ with testtools.ExpectedException(Exception, 'Delete failed: Error'):
+ self.delete_mock.return_value = utils.FAKE_FAILURE
+ testcase_delete = testcases.TestcaseDelete(self.app, mock.Mock())
+ args = ['--project-name', 'functest', 'def']
+ verifies = [('project_name', 'functest'), ('name', 'def')]
+ parsed_args = self.check_parser(testcase_delete, args, verifies)
+ testcase_delete.take_action(parsed_args)
+
+
+class TestcasePutTest(TestcaseTest):
+
+ def setUp(self):
+ super(TestcasePutTest, self).setUp()
+
+ def test_put_success(self):
+ self.put_mock.return_value = fakes.FakeResponse(
+ data=self.testcase_json)
+ testcase_put = testcases.TestcasePut(self.app, mock.Mock())
+ args = ['--project-name', 'functest', 'def', self.testcase_string]
+ verifies = [
+ ('project_name', 'functest'),
+ ('name', 'def'),
+ ('testcase', self.testcase_json)]
+ parsed_args = self.check_parser(testcase_put, args, verifies)
+ testcase_put.take_action(parsed_args)
+ self.put_mock.assert_called_once()
+
+ def test_put_failure(self):
+ with testtools.ExpectedException(Exception, 'Update failed: Error'):
+ self.put_mock.return_value = utils.FAKE_FAILURE
+ testcase_put = testcases.TestcasePut(self.app, mock.Mock())
+ args = ['--project-name', 'functest', 'def', self.testcase_string]
+ verifies = [
+ ('project_name', 'functest'),
+ ('name', 'def'),
+ ('testcase', self.testcase_json)]
+ parsed_args = self.check_parser(testcase_put, args, verifies)
+ testcase_put.take_action(parsed_args)
diff --git a/testapi/testapi-client/testapiclient/utils/urlparse.py b/testapi/testapi-client/testapiclient/utils/urlparse.py
index 9f99a46..47d40d5 100644
--- a/testapi/testapi-client/testapiclient/utils/urlparse.py
+++ b/testapi/testapi-client/testapiclient/utils/urlparse.py
@@ -17,9 +17,9 @@ def query_join(base, **queries):
return base + '?' + parse.urlencode(queries)
-def resource_join(url):
+def resource_join(*url):
testapi_url = os.environ.get('testapi_url')
- return path_join(testapi_url, url)
+ return path_join(testapi_url, *url)
def get_queries(queries, parsed_args):