From bc3691a17b2e34807fc54edd52fb52f0e93e8f37 Mon Sep 17 00:00:00 2001 From: Nikolay Mahotkin Date: Tue, 2 Sep 2014 18:23:19 +0400 Subject: [PATCH] Add unit tests on client CLI v2 Change-Id: Ia964346471072b9f5be9572027f6764ce6615648 --- .../tests/unit/v2/test_cli_executions.py | 88 +++++++++++++++ mistralclient/tests/unit/v2/test_cli_tasks.py | 61 ++++++++++ .../tests/unit/v2/test_cli_workbooks.py | 104 +++++++++++++++++ .../tests/unit/v2/test_cli_workflows.py | 105 ++++++++++++++++++ 4 files changed, 358 insertions(+) create mode 100644 mistralclient/tests/unit/v2/test_cli_executions.py create mode 100644 mistralclient/tests/unit/v2/test_cli_tasks.py create mode 100644 mistralclient/tests/unit/v2/test_cli_workbooks.py create mode 100644 mistralclient/tests/unit/v2/test_cli_workflows.py diff --git a/mistralclient/tests/unit/v2/test_cli_executions.py b/mistralclient/tests/unit/v2/test_cli_executions.py new file mode 100644 index 00000000..5ae6e1ac --- /dev/null +++ b/mistralclient/tests/unit/v2/test_cli_executions.py @@ -0,0 +1,88 @@ +# Copyright 2014 Mirantis, Inc. +# All Rights Reserved +# +# 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. +# + +import pkg_resources as pkg + +import mock + +from mistralclient.tests.unit import base +from mistralclient.commands.v2 import executions as execution_cmd +from mistralclient.api.v2 import executions + +EXECUTION = executions.Execution(mock, { + 'id': '123', + 'workflow_name': 'some', + 'state': 'RUNNING', + 'created_at': '1', + 'updated_at': '1' +}) + + +class TestCLIExecutionsV2(base.BaseCommandTest): + @mock.patch('mistralclient.api.v2.executions.ExecutionManager.create') + def test_create_wf_input_string(self, mock): + mock.return_value = EXECUTION + + result = self.call(execution_cmd.Create, + app_args=['id', '{ "context": true }']) + + self.assertEqual(('123', 'some', 'RUNNING', + '1', '1'), result[1]) + + @mock.patch('mistralclient.api.v2.executions.ExecutionManager.create') + def test_create_wf_input_file(self, mock): + mock.return_value = EXECUTION + path = pkg.resource_filename('mistralclient', + 'tests/unit/resources/ctx.json') + result = self.call(execution_cmd.Create, + app_args=['id', path]) + + self.assertEqual(('123', 'some', 'RUNNING', + '1', '1'), result[1]) + + @mock.patch('mistralclient.api.v2.executions.ExecutionManager.update') + def test_update(self, mock): + mock.return_value = EXECUTION + + result = self.call(execution_cmd.Update, + app_args=['id', 'SUCCESS']) + + self.assertEqual(('123', 'some', 'RUNNING', + '1', '1'), result[1]) + + @mock.patch('mistralclient.api.v2.executions.ExecutionManager.list') + def test_list(self, mock): + mock.return_value = (EXECUTION,) + + result = self.call(execution_cmd.List) + + self.assertEqual([('123', 'some', 'RUNNING', + '1', '1')], result[1]) + + @mock.patch('mistralclient.api.v2.executions.ExecutionManager.get') + def test_get(self, mock): + mock.return_value = EXECUTION + + result = self.call(execution_cmd.Get, app_args=['id']) + + self.assertEqual(('123', 'some', 'RUNNING', + '1', '1'), result[1]) + + @mock.patch('mistralclient.api.v2.executions.ExecutionManager.delete') + def test_delete(self, mock): + result = self.call(execution_cmd.Delete, app_args=['id']) + + self.assertIsNone(result) diff --git a/mistralclient/tests/unit/v2/test_cli_tasks.py b/mistralclient/tests/unit/v2/test_cli_tasks.py new file mode 100644 index 00000000..4958dca8 --- /dev/null +++ b/mistralclient/tests/unit/v2/test_cli_tasks.py @@ -0,0 +1,61 @@ +# Copyright 2014 Mirantis, Inc. +# All Rights Reserved +# +# 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. +# + +import mock + +from mistralclient.tests.unit import base + +from mistralclient.commands.v2 import tasks as task_cmd +from mistralclient.api.v2 import tasks + +TASK = tasks.Task(mock, { + 'id': '123', + 'name': 'some', + 'wf_name': 'thing', + 'execution_id': '321', + 'state': 'RUNNING', + 'parameters': {}, +}) + + +class TestCLIT1asksV2(base.BaseCommandTest): + @mock.patch('mistralclient.api.v2.tasks.TaskManager.update') + def test_update(self, mock): + mock.return_value = TASK + + result = self.call(task_cmd.Update, + app_args=['id', 'ERROR']) + + self.assertEqual(('123', 'some', 'thing', '321', 'RUNNING', {}), + result[1]) + + @mock.patch('mistralclient.api.v2.tasks.TaskManager.list') + def test_list(self, mock): + mock.return_value = (TASK,) + + result = self.call(task_cmd.List) + + self.assertEqual([('123', 'some', 'thing', '321', 'RUNNING', {})], + result[1]) + + @mock.patch('mistralclient.api.v2.tasks.TaskManager.get') + def test_get(self, mock): + mock.return_value = TASK + + result = self.call(task_cmd.Get, app_args=['id']) + + self.assertEqual(('123', 'some', 'thing', '321', 'RUNNING', {}), + result[1]) diff --git a/mistralclient/tests/unit/v2/test_cli_workbooks.py b/mistralclient/tests/unit/v2/test_cli_workbooks.py new file mode 100644 index 00000000..e9bf5b81 --- /dev/null +++ b/mistralclient/tests/unit/v2/test_cli_workbooks.py @@ -0,0 +1,104 @@ +# Copyright 2014 Mirantis, Inc. +# All Rights Reserved +# +# 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. +# + +import mock + +from mistralclient.tests.unit import base + +from mistralclient.commands.v2 import workbooks as workbook_cmd +from mistralclient.api.v2 import workbooks + + +WORKBOOK_DICT = { + 'name': 'a', + 'tags': ['a', 'b'], + 'created_at': '1', + 'updated_at': '1' +} + + +WB_DEF = """ +Workflows: + wf1: + tasks: + task1: + action: nova.servers_get server="1" +""" + +WB_WITH_DEF_DICT = WORKBOOK_DICT.copy() +WB_WITH_DEF_DICT.update({'definition': WB_DEF}) +WORKBOOK = workbooks.Workbook(mock, WORKBOOK_DICT) +WORKBOOK_WITH_DEF = workbooks.Workbook(mock, WB_WITH_DEF_DICT) + + +class TestCLIWorkbooksV2(base.BaseCommandTest): + @mock.patch('mistralclient.api.v2.workbooks.WorkbookManager.create') + def test_create(self, mock): + mock.return_value = WORKBOOK + + result = self.call(workbook_cmd.Create, app_args=['name']) + + self.assertEqual(('a', 'a, b', '1', '1'), result[1]) + + @mock.patch('mistralclient.api.v2.workbooks.WorkbookManager.update') + def test_update(self, mock): + mock.return_value = WORKBOOK + + result = self.call(workbook_cmd.Update, app_args=['name']) + + self.assertEqual(('a', 'a, b', '1', '1'), result[1]) + + @mock.patch('mistralclient.api.v2.workbooks.WorkbookManager.list') + def test_list(self, mock): + mock.return_value = (WORKBOOK,) + + result = self.call(workbook_cmd.List) + + self.assertEqual([('a', 'a, b', '1', '1')], result[1]) + + @mock.patch('mistralclient.api.v2.workbooks.WorkbookManager.get') + def test_get(self, mock): + mock.return_value = WORKBOOK + + result = self.call(workbook_cmd.Get, app_args=['name']) + + self.assertEqual(('a', 'a, b', '1', '1'), result[1]) + + @mock.patch('mistralclient.api.v2.workbooks.WorkbookManager.delete') + def test_delete(self, mock): + self.assertIsNone(self.call(workbook_cmd.Delete, app_args=['name'])) + + @mock.patch('argparse.open', create=True) + @mock.patch( + 'mistralclient.api.v2.workbooks.WorkbookManager.update' + ) + def test_upload_definition(self, mock, mock_open): + mock.return_value = WORKBOOK_WITH_DEF + mock_open.return_value = mock.MagicMock(spec=file) + + result = self.call(workbook_cmd.UploadDefinition, + app_args=['name', '1.txt']) + + self.assertIsNone(result) + + @mock.patch('mistralclient.api.v2.workbooks.' + 'WorkbookManager.get') + def test_get_definition(self, mock): + mock.return_value = WORKBOOK_WITH_DEF + + self.call(workbook_cmd.GetDefinition, app_args=['name']) + + self.app.stdout.write.assert_called_with(WB_DEF) diff --git a/mistralclient/tests/unit/v2/test_cli_workflows.py b/mistralclient/tests/unit/v2/test_cli_workflows.py new file mode 100644 index 00000000..f89faf2e --- /dev/null +++ b/mistralclient/tests/unit/v2/test_cli_workflows.py @@ -0,0 +1,105 @@ +# Copyright 2014 Mirantis, Inc. +# All Rights Reserved +# +# 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. +# + +import mock + +from mistralclient.tests.unit import base + +from mistralclient.commands.v2 import workflows as workflow_cmd +from mistralclient.api.v2 import workflows + + +WORKFLOW_DICT = { + 'name': 'a', + 'tags': ['a', 'b'], + 'created_at': '1', + 'updated_at': '1' +} + +WF_DEF = """ +tasks: + task1: + action: nova.servers_get server="1" +""" + +WF_WITH_DEF_DICT = WORKFLOW_DICT.copy() +WF_WITH_DEF_DICT.update({'definition': WF_DEF}) +WORKFLOW = workflows.Workflow(mock, WORKFLOW_DICT) +WORKFLOW_WITH_DEF = workflows.Workflow(mock, WF_WITH_DEF_DICT) + + +class TestCLIWorkflowsV2(base.BaseCommandTest): + @mock.patch('argparse.open', create=True) + @mock.patch('mistralclient.api.v2.workflows.WorkflowManager.create') + def test_create(self, mock, mock_open): + mock.return_value = WORKFLOW + mock_open.return_value = mock.MagicMock(spec=file) + + result = self.call(workflow_cmd.Create, + app_args=['name', 'tag', '1.txt']) + + self.assertEqual(('a', 'a, b', '1', '1'), result[1]) + + @mock.patch('mistralclient.api.v2.workflows.WorkflowManager.update') + def test_update(self, mock): + mock.return_value = WORKFLOW + + result = self.call(workflow_cmd.Update, app_args=['name']) + + self.assertEqual(('a', 'a, b', '1', '1'), result[1]) + + @mock.patch('mistralclient.api.v2.workflows.WorkflowManager.list') + def test_list(self, mock): + mock.return_value = (WORKFLOW,) + + result = self.call(workflow_cmd.List) + + self.assertEqual([('a', 'a, b', '1', '1')], result[1]) + + @mock.patch('mistralclient.api.v2.workflows.WorkflowManager.get') + def test_get(self, mock): + mock.return_value = WORKFLOW + + result = self.call(workflow_cmd.Get, app_args=['name']) + + self.assertEqual(('a', 'a, b', '1', '1'), result[1]) + + @mock.patch('mistralclient.api.v2.workflows.WorkflowManager.delete') + def test_delete(self, mock): + self.assertIsNone(self.call(workflow_cmd.Delete, app_args=['name'])) + + @mock.patch('argparse.open', create=True) + @mock.patch( + 'mistralclient.api.v2.workflows.WorkflowManager.update' + ) + def test_upload_definition(self, mock, mock_open): + mock.return_value = WORKFLOW_WITH_DEF + mock_open.return_value = mock.MagicMock(spec=file) + + result = self.call(workflow_cmd.UploadDefinition, + app_args=['name', '1.txt']) + + self.assertIsNone(result) + self.app.stdout.write.assert_called_with(WF_DEF) + + @mock.patch('mistralclient.api.v2.workflows.' + 'WorkflowManager.get') + def test_get_definition(self, mock): + mock.return_value = WORKFLOW_WITH_DEF + + self.call(workflow_cmd.GetDefinition, app_args=['name']) + + self.app.stdout.write.assert_called_with(WF_DEF)