Add projects CRUD in testapiclient 77/54377/2
authorthuva4 <tharma.thuva@gmail.com>
Fri, 23 Mar 2018 07:02:13 +0000 (12:32 +0530)
committerthuva4 <tharma.thuva@gmail.com>
Fri, 23 Mar 2018 07:03:18 +0000 (12:33 +0530)
implement interface to do CRUD operations
for projects  in testapiclient
Tests are added

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

index b975c15..f860a2c 100644 (file)
@@ -48,6 +48,10 @@ testapi =
 
     scenario version owner put = testapiclient.cli.scenarios:VersionOwnerPut
 
+    scenario project create = testapiclient.cli.scenarios:ProjectCreate
+    scenario project delete = testapiclient.cli.scenarios:ProjectDelete
+    scenario project put = testapiclient.cli.scenarios:ProjectPut
+
 [egg_info]
 tag_build =
 tag_date = 0
index cb8f1f3..1e384d0 100644 (file)
@@ -301,3 +301,92 @@ class VersionOwnerPut(command.Command):
                 resources_url(parsed_args.scenario_name, 'owner'),
                 ['installer', 'version'],
                 parsed_args), parsed_args.owner)
+
+
+class ProjectCreate(command.Command):
+
+    def get_parser(self, prog_name):
+        parser = super(ProjectCreate, self).get_parser(prog_name)
+        parser.add_argument('--scenario-name',
+                            type=str,
+                            required=True,
+                            help='Create project by scenario name')
+        parser.add_argument('--installer',
+                            required=True,
+                            help='Create project under installer name')
+        parser.add_argument('--version',
+                            required=True,
+                            help='Create project under version name')
+        parser.add_argument('project',
+                            type=json.loads,
+                            help='Project create request format :\n'
+                                 '\'[{ "project" (string),'
+                                 '"scores": (array[ScenarioScore]),'
+                                 '"trust_indicators": (array[ScenarioTI]),'
+                                 '"customs": (array[string]) }]\',\n')
+        return parser
+
+    def take_action(self, parsed_args):
+        return self.app.client_manager.post(
+            urlparse.query_by(
+                resources_url(parsed_args.scenario_name, 'projects'),
+                ['installer', 'version'],
+                parsed_args), parsed_args.project)
+
+
+class ProjectDelete(command.Command):
+
+    def get_parser(self, prog_name):
+        parser = super(ProjectDelete, self).get_parser(prog_name)
+        parser.add_argument('--scenario-name',
+                            required=True,
+                            type=str,
+                            help='Delete projects by scenario name')
+        parser.add_argument('--installer',
+                            required=True,
+                            help='Delete projects under installer name')
+        parser.add_argument('--version',
+                            required=True,
+                            help='Delete projects under version name')
+        parser.add_argument('name',
+                            nargs='+',
+                            help='Delete projects by name')
+        return parser
+
+    def take_action(self, parsed_args):
+        return self.app.client_manager.delete(
+            urlparse.query_by(
+                resources_url(parsed_args.scenario_name, 'projects'),
+                ['installer', 'version'],
+                parsed_args), parsed_args.name)
+
+
+class ProjectPut(command.Command):
+
+    def get_parser(self, prog_name):
+        parser = super(ProjectPut, self).get_parser(prog_name)
+        parser.add_argument('--scenario-name',
+                            type=str,
+                            required=True,
+                            help='Update project by scenario name')
+        parser.add_argument('--installer',
+                            required=True,
+                            help='Update project under installer name')
+        parser.add_argument('--version',
+                            required=True,
+                            help='Update project under version name')
+        parser.add_argument('project',
+                            type=json.loads,
+                            help='Project update request format :\n'
+                                 '\'[{ "project" (string),'
+                                 '"scores": (array[ScenarioScore]),'
+                                 '"trust_indicators": (array[ScenarioTI]),'
+                                 '"customs": (array[string]) }]\',\n')
+        return parser
+
+    def take_action(self, parsed_args):
+        return self.app.client_manager.put(
+            urlparse.query_by(
+                resources_url(parsed_args.scenario_name, 'projects'),
+                ['installer', 'version'],
+                parsed_args), parsed_args.project)
diff --git a/testapi/testapi-client/testapiclient/tests/unit/test_scenario_project.py b/testapi/testapi-client/testapiclient/tests/unit/test_scenario_project.py
new file mode 100644 (file)
index 0000000..7bd6645
--- /dev/null
@@ -0,0 +1,90 @@
+import json
+
+from mock import mock
+from six.moves.urllib import parse
+
+from testapiclient.cli import scenarios
+from testapiclient.tests.unit import fakes
+from testapiclient.tests.unit import utils
+
+
+class ProjectTest(utils.TestCommand):
+    def setUp(self):
+        super(ProjectTest, self).setUp()
+        self.base_url = parse.urljoin(self.api_url, 'scenarios/{}/projects')
+        self.scenario_name = 's1'
+        self.project_json = {
+            'trust_indicators': [],
+            'project': 'test-project',
+            'scores': [],
+            'customs': []
+        }
+        self.project_string = json.dumps(self.project_json)
+
+
+class ProjectCreateTest(ProjectTest):
+
+    def setUp(self):
+        super(ProjectCreateTest, self).setUp()
+
+    def test_create_success(self):
+        self.post_mock.return_value = fakes.FakeResponse(data=None)
+        project_create = scenarios.ProjectCreate(self.app, mock.Mock())
+        args = [
+            '--scenario-name', 's1', '--installer', 'i1', '--version', 'v1',
+            self.project_string]
+        verifies = [
+            ('scenario_name', 's1'),
+            ('installer', 'i1'),
+            ('version', 'v1'),
+            ('project', self.project_json)]
+        parsed_args = self.check_parser(project_create, args, verifies)
+        project_create.take_action(parsed_args)
+        self.post_mock.assert_called_once()
+
+
+class ProjectDeleteTest(ProjectTest):
+
+    def setUp(self):
+        super(ProjectDeleteTest, self).setUp()
+
+    def test_delete_success(self):
+        self.delete_mock.return_value = fakes.FakeResponse(data=None)
+        project_delete = scenarios.ProjectDelete(self.app, mock.Mock())
+        args = [
+            '--scenario-name', 's1', '--installer', 'i1', '--version', 'v1',
+            'def']
+        verifies = [
+            ('scenario_name', 's1'),
+            ('installer', 'i1'),
+            ('version', 'v1'),
+            ('name', ['def'])]
+        parsed_args = self.check_parser(project_delete, args, verifies)
+        project_delete.take_action(parsed_args)
+        kall = self.delete_mock.call_args
+        args, kwargs = kall
+        self.assert_url(
+            args[0],
+            self.base_url + '?version=v1&installer=i1')
+
+
+class ProjectPutTest(ProjectTest):
+
+    def setUp(self):
+        super(ProjectPutTest, self).setUp()
+
+    def test_put_success(self):
+        self.put_mock.return_value = fakes.FakeResponse(
+            data=None)
+        project_put = scenarios.ProjectPut(self.app, mock.Mock())
+        args = [
+            '--scenario-name', 's1', '--installer', 'i1', '--version', 'v1',
+            self.project_string]
+        verifies = [
+            ('scenario_name', 's1'),
+            ('installer', 'i1'),
+            ('version', 'v1'),
+            ('project', self.project_json)]
+        parsed_args = self.check_parser(project_put, args, verifies)
+        project_put.take_action(parsed_args)
+        self.put_mock.assert_called_once()