Add scenarios CRUD in testapiclient 89/53489/3
authorthuva4 <tharma.thuva@gmail.com>
Mon, 19 Mar 2018 18:20:47 +0000 (23:50 +0530)
committerthuva4 <tharma.thuva@gmail.com>
Mon, 19 Mar 2018 18:20:47 +0000 (23:50 +0530)
implement interface to do CRUD operations
for scenarios in testapiclient + tests

Change-Id: Ia952bd29e88d867a2873af79c3424953142676d3
Signed-off-by: thuva4 <tharma.thuva@gmail.com>
testapi/testapi-client/setup.cfg
testapi/testapi-client/testapiclient/cli/scenarios.py [new file with mode: 0644]
testapi/testapi-client/testapiclient/tests/unit/test_scenario.py [new file with mode: 0644]

index 72a5a57..a0d5e0d 100644 (file)
@@ -26,6 +26,12 @@ testapi =
     project delete = testapiclient.cli.projects:ProjectDelete
     project put = testapiclient.cli.projects:ProjectPut
 
+    scenario create = testapiclient.cli.scenarios:ScenarioCreate
+    scenario get = testapiclient.cli.scenarios:ScenarioGet
+    scenario getone = testapiclient.cli.scenarios:ScenarioGetOne
+    scenario delete = testapiclient.cli.scenarios:ScenarioDelete
+    scenario put = testapiclient.cli.scenarios:ScenarioPut
+
 [egg_info]
 tag_build =
 tag_date = 0
diff --git a/testapi/testapi-client/testapiclient/cli/scenarios.py b/testapi/testapi-client/testapiclient/cli/scenarios.py
new file mode 100644 (file)
index 0000000..fc6a2db
--- /dev/null
@@ -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/tests/unit/test_scenario.py b/testapi/testapi-client/testapiclient/tests/unit/test_scenario.py
new file mode 100644 (file)
index 0000000..2458d2b
--- /dev/null
@@ -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)