Add unit tests on v2 client
Partially implements blueprint mistral-client-2.0 Change-Id: I678f2c005645a83b22ffbf2bfd933bcf22a650bd
This commit is contained in:
		| @@ -16,8 +16,6 @@ import unittest2 | ||||
| import mock | ||||
| import json | ||||
|  | ||||
| from mistralclient.api.v1 import client | ||||
|  | ||||
|  | ||||
| class FakeResponse(object): | ||||
|     """Fake response for testing Mistral Client.""" | ||||
| @@ -31,13 +29,7 @@ class FakeResponse(object): | ||||
|  | ||||
|  | ||||
| class BaseClientTest(unittest2.TestCase): | ||||
|     def setUp(self): | ||||
|         self._client = client.Client(project_name="test", | ||||
|                                      mistral_url="test") | ||||
|         self.workbooks = self._client.workbooks | ||||
|         self.executions = self._client.executions | ||||
|         self.tasks = self._client.tasks | ||||
|         self.listeners = self._client.listeners | ||||
|     _client = None | ||||
|  | ||||
|     def mock_http_get(self, content, status_code=200): | ||||
|         if isinstance(content, dict): | ||||
|   | ||||
							
								
								
									
										0
									
								
								mistralclient/tests/unit/v1/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								mistralclient/tests/unit/v1/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										42
									
								
								mistralclient/tests/unit/v1/base.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								mistralclient/tests/unit/v1/base.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| # Copyright 2014 - Mirantis, Inc. | ||||
| # | ||||
| #    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. | ||||
|  | ||||
| # Copyright 2013 - Mirantis, Inc. | ||||
| # | ||||
| #    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. | ||||
|  | ||||
| from mistralclient.api.v1 import client | ||||
| from mistralclient.tests.unit import base | ||||
|  | ||||
|  | ||||
| class BaseClientV1Test(base.BaseClientTest): | ||||
|     def setUp(self): | ||||
|         super(BaseClientV1Test, self).setUp() | ||||
|  | ||||
|         self._client = client.Client(project_name="test", | ||||
|                                      mistral_url="test") | ||||
|         self.workbooks = self._client.workbooks | ||||
|         self.executions = self._client.executions | ||||
|         self.tasks = self._client.tasks | ||||
|         self.listeners = self._client.listeners | ||||
| @@ -15,7 +15,7 @@ | ||||
| import unittest2 | ||||
| import json | ||||
| 
 | ||||
| from mistralclient.tests.unit import base | ||||
| from mistralclient.tests.unit.v1 import base | ||||
| from mistralclient.api.v1.executions import Execution | ||||
| 
 | ||||
| # TODO: Later we need additional tests verifying all the errors etc. | ||||
| @@ -41,13 +41,13 @@ URL_TEMPLATE = '/workbooks/%s/executions' | ||||
| URL_TEMPLATE_ID = '/workbooks/%s/executions/%s' | ||||
| 
 | ||||
| 
 | ||||
| class TestExecutions(base.BaseClientTest): | ||||
| class TestExecutions(base.BaseClientV1Test): | ||||
|     def test_create(self): | ||||
|         mock = self.mock_http_post(content=EXECS[0]) | ||||
|         body = { | ||||
|             'workbook_name': EXECS[0]['workbook_name'], | ||||
|             'task': EXECS[0]['task'], | ||||
|             'context': EXECS[0]['context'], | ||||
|             'workbook_name': EXECS[0]['workbook_name'] | ||||
|             'context': EXECS[0]['context'] | ||||
|         } | ||||
| 
 | ||||
|         ex = self.executions.create(EXECS[0]['workbook_name'], | ||||
| @@ -67,8 +67,8 @@ class TestExecutions(base.BaseClientTest): | ||||
|     def test_create_with_empty_context(self): | ||||
|         mock = self.mock_http_post(content=EXECS[0]) | ||||
|         body = { | ||||
|             'task': EXECS[0]['task'], | ||||
|             'workbook_name': EXECS[0]['workbook_name'] | ||||
|             'workbook_name': EXECS[0]['workbook_name'], | ||||
|             'task': EXECS[0]['task'] | ||||
|         } | ||||
| 
 | ||||
|         self.executions.create(EXECS[0]['workbook_name'], | ||||
| @@ -14,7 +14,7 @@ | ||||
| 
 | ||||
| import json | ||||
| 
 | ||||
| from mistralclient.tests.unit import base | ||||
| from mistralclient.tests.unit.v1 import base | ||||
| from mistralclient.api.v1.listeners import Listener | ||||
| 
 | ||||
| # TODO: later we need additional tests verifying all the errors etc. | ||||
| @@ -32,7 +32,7 @@ URL_TEMPLATE = '/workbooks/%s/listeners' | ||||
| URL_TEMPLATE_ID = '/workbooks/%s/listeners/%s' | ||||
| 
 | ||||
| 
 | ||||
| class TestListeners(base.BaseClientTest): | ||||
| class TestListeners(base.BaseClientV1Test): | ||||
|     def test_create(self): | ||||
|         mock = self.mock_http_post(content=LISTENERS[0]) | ||||
|         body = { | ||||
| @@ -14,7 +14,7 @@ | ||||
| 
 | ||||
| import json | ||||
| 
 | ||||
| from mistralclient.tests.unit import base | ||||
| from mistralclient.tests.unit.v1 import base | ||||
| from mistralclient.api.v1.tasks import Task | ||||
| 
 | ||||
| # TODO: later we need additional tests verifying all the errors etc. | ||||
| @@ -36,7 +36,7 @@ URL_TEMPLATE = '/workbooks/%s/executions/%s/tasks' | ||||
| URL_TEMPLATE_ID = '/workbooks/%s/executions/%s/tasks/%s' | ||||
| 
 | ||||
| 
 | ||||
| class TestTasks(base.BaseClientTest): | ||||
| class TestTasks(base.BaseClientV1Test): | ||||
|     def test_update(self): | ||||
|         mock = self.mock_http_put(content=TASKS[0]) | ||||
|         body = { | ||||
| @@ -14,7 +14,7 @@ | ||||
| 
 | ||||
| import json | ||||
| 
 | ||||
| from mistralclient.tests.unit import base | ||||
| from mistralclient.tests.unit.v1 import base | ||||
| from mistralclient.api.v1.workbooks import Workbook | ||||
| 
 | ||||
| # TODO: later we need additional tests verifying all the errors etc. | ||||
| @@ -57,7 +57,7 @@ URL_TEMPLATE_NAME = '/workbooks/%s' | ||||
| URL_TEMPLATE_DEFINITION = '/workbooks/%s/definition' | ||||
| 
 | ||||
| 
 | ||||
| class TestWorkbooks(base.BaseClientTest): | ||||
| class TestWorkbooks(base.BaseClientV1Test): | ||||
|     def test_create(self): | ||||
|         mock = self.mock_http_post(content=WORKBOOKS[0]) | ||||
| 
 | ||||
							
								
								
									
										0
									
								
								mistralclient/tests/unit/v2/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								mistralclient/tests/unit/v2/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										28
									
								
								mistralclient/tests/unit/v2/base.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								mistralclient/tests/unit/v2/base.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| # Copyright 2014 - Mirantis, Inc. | ||||
| # | ||||
| #    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. | ||||
|  | ||||
| from mistralclient.api.v2 import client | ||||
| from mistralclient.tests.unit import base | ||||
|  | ||||
|  | ||||
| class BaseClientV2Test(base.BaseClientTest): | ||||
|     def setUp(self): | ||||
|         super(BaseClientV2Test, self).setUp() | ||||
|  | ||||
|         self._client = client.Client(project_name="test", | ||||
|                                      mistral_url="test") | ||||
|         self.workbooks = self._client.workbooks | ||||
|         self.executions = self._client.executions | ||||
|         self.tasks = self._client.tasks | ||||
|         self.workflows = self._client.workflows | ||||
							
								
								
									
										109
									
								
								mistralclient/tests/unit/v2/test_executions.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								mistralclient/tests/unit/v2/test_executions.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,109 @@ | ||||
| # Copyright 2014 - Mirantis, Inc. | ||||
| # | ||||
| #    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 unittest2 | ||||
| import json | ||||
|  | ||||
| from mistralclient.tests.unit.v2 import base | ||||
| from mistralclient.api.v2 import executions | ||||
|  | ||||
| # TODO: Later we need additional tests verifying all the errors etc. | ||||
|  | ||||
| EXEC = { | ||||
|     'id': "123", | ||||
|     'workflow_name': 'my_wf', | ||||
|     'state': 'RUNNING', | ||||
|     'workflow_input': """ | ||||
|         { | ||||
|             "person": { | ||||
|                 "first_name": "John", | ||||
|                 "last_name": "Doe" | ||||
|             } | ||||
|         } | ||||
|     """ | ||||
| } | ||||
|  | ||||
|  | ||||
| URL_TEMPLATE = '/executions' | ||||
| URL_TEMPLATE_ID = '/executions/%s' | ||||
|  | ||||
|  | ||||
| class TestExecutionsV2(base.BaseClientV2Test): | ||||
|     def test_create(self): | ||||
|         mock = self.mock_http_post(content=EXEC) | ||||
|         body = { | ||||
|             'workflow_name': EXEC['workflow_name'], | ||||
|             'workflow_input': EXEC['workflow_input'], | ||||
|         } | ||||
|  | ||||
|         ex = self.executions.create(EXEC['workflow_name'], | ||||
|                                     EXEC['workflow_input']) | ||||
|  | ||||
|         self.assertIsNotNone(ex) | ||||
|         self.assertEqual(executions.Execution(self.executions, EXEC).__dict__, | ||||
|                          ex.__dict__) | ||||
|         mock.assert_called_once_with(URL_TEMPLATE, json.dumps(body)) | ||||
|  | ||||
|     @unittest2.expectedFailure | ||||
|     def test_create_failure1(self): | ||||
|         self.mock_http_post(content=EXEC) | ||||
|         self.executions.create("") | ||||
|  | ||||
|     @unittest2.expectedFailure | ||||
|     def test_create_failure2(self): | ||||
|         self.mock_http_post(content=EXEC) | ||||
|         self.executions.create(EXEC['workflow_name'], | ||||
|                                list('343', 'sdfsd')) | ||||
|  | ||||
|     def test_update(self): | ||||
|         mock = self.mock_http_put(content=EXEC) | ||||
|         body = { | ||||
|             'state': EXEC['state'] | ||||
|         } | ||||
|  | ||||
|         ex = self.executions.update(EXEC['id'], EXEC['state']) | ||||
|  | ||||
|         self.assertIsNotNone(ex) | ||||
|         self.assertEqual(executions.Execution(self.executions, EXEC).__dict__, | ||||
|                          ex.__dict__) | ||||
|         mock.assert_called_once_with( | ||||
|             URL_TEMPLATE_ID % EXEC['id'], json.dumps(body)) | ||||
|  | ||||
|     def test_list(self): | ||||
|         mock = self.mock_http_get(content={'executions': [EXEC]}) | ||||
|  | ||||
|         execution_list = self.executions.list() | ||||
|  | ||||
|         self.assertEqual(1, len(execution_list)) | ||||
|         ex = execution_list[0] | ||||
|  | ||||
|         self.assertEqual(executions.Execution(self.executions, EXEC).__dict__, | ||||
|                          ex.__dict__) | ||||
|         mock.assert_called_once_with(URL_TEMPLATE) | ||||
|  | ||||
|     def test_get(self): | ||||
|         mock = self.mock_http_get(content=EXEC) | ||||
|  | ||||
|         ex = self.executions.get(EXEC['id']) | ||||
|  | ||||
|         self.assertEqual(executions.Execution(self.executions, EXEC).__dict__, | ||||
|                          ex.__dict__) | ||||
|         mock.assert_called_once_with(URL_TEMPLATE_ID % EXEC['id']) | ||||
|  | ||||
|     def test_delete(self): | ||||
|         mock = self.mock_http_delete(status_code=204) | ||||
|  | ||||
|         self.executions.delete(EXEC['id']) | ||||
|  | ||||
|         mock.assert_called_once_with(URL_TEMPLATE_ID % EXEC['id']) | ||||
							
								
								
									
										69
									
								
								mistralclient/tests/unit/v2/test_tasks.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								mistralclient/tests/unit/v2/test_tasks.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | ||||
| # Copyright 2014 - Mirantis, Inc. | ||||
| # | ||||
| #    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 json | ||||
|  | ||||
| from mistralclient.tests.unit.v2 import base | ||||
| from mistralclient.api.v2 import tasks | ||||
|  | ||||
| # TODO: later we need additional tests verifying all the errors etc. | ||||
|  | ||||
| TASK = { | ||||
|     'id': "1", | ||||
|     'execution_id': '123', | ||||
|     'name': 'my_task', | ||||
|     'wf_name': 'my_wf', | ||||
|     'state': 'RUNNING', | ||||
|     'tags': ['deployment', 'demo'] | ||||
| } | ||||
|  | ||||
|  | ||||
| URL_TEMPLATE = '/tasks' | ||||
| URL_TEMPLATE_ID = '/tasks/%s' | ||||
|  | ||||
|  | ||||
| class TestTasksV2(base.BaseClientV2Test): | ||||
|     def test_update(self): | ||||
|         mock = self.mock_http_put(content=TASK) | ||||
|         body = { | ||||
|             'state': TASK['state'] | ||||
|         } | ||||
|  | ||||
|         task = self.tasks.update(TASK['id'], | ||||
|                                  TASK['state']) | ||||
|  | ||||
|         self.assertIsNotNone(task) | ||||
|         self.assertEqual(tasks.Task(self.tasks, TASK).__dict__, task.__dict__) | ||||
|         mock.assert_called_once_with( | ||||
|             URL_TEMPLATE_ID % TASK['id'], json.dumps(body)) | ||||
|  | ||||
|     def test_list(self): | ||||
|         mock = self.mock_http_get(content={'tasks': [TASK]}) | ||||
|  | ||||
|         task_list = self.tasks.list() | ||||
|  | ||||
|         self.assertEqual(1, len(task_list)) | ||||
|         task = task_list[0] | ||||
|  | ||||
|         self.assertEqual(tasks.Task(self.tasks, TASK).__dict__, task.__dict__) | ||||
|         mock.assert_called_once_with(URL_TEMPLATE) | ||||
|  | ||||
|     def test_get(self): | ||||
|         mock = self.mock_http_get(content=TASK) | ||||
|  | ||||
|         task = self.tasks.get(TASK['id']) | ||||
|  | ||||
|         self.assertEqual(tasks.Task(self.tasks, TASK).__dict__, task.__dict__) | ||||
|         mock.assert_called_once_with( | ||||
|             URL_TEMPLATE_ID % TASK['id']) | ||||
							
								
								
									
										115
									
								
								mistralclient/tests/unit/v2/test_workbooks.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								mistralclient/tests/unit/v2/test_workbooks.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,115 @@ | ||||
| # Copyright 2014 - Mirantis, Inc. | ||||
| # | ||||
| #    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 json | ||||
|  | ||||
| from mistralclient.tests.unit.v2 import base | ||||
| from mistralclient.api.v2 import workbooks | ||||
|  | ||||
| # TODO: later we need additional tests verifying all the errors etc. | ||||
|  | ||||
|  | ||||
| WB_DEF = """ | ||||
| --- | ||||
| Version: 2.0 | ||||
|  | ||||
| Workflows: | ||||
|   wf1: | ||||
|     type: direct | ||||
|     start_task: task1 | ||||
|     parameters: | ||||
|       - param1 | ||||
|       - param2 | ||||
|  | ||||
|     tasks: | ||||
|       task1: | ||||
|         action: std.http url="localhost:8989" | ||||
|         on-success: test_subsequent | ||||
|  | ||||
|       test_subsequent: | ||||
|         action: std.http url="http://some_url" | ||||
|         parameters: | ||||
|           server_id: 1 | ||||
| """ | ||||
|  | ||||
| WORKBOOK = { | ||||
|     'name': "my_workbook", | ||||
|     'description': "My cool Mistral workbook", | ||||
|     'tags': ['deployment', 'demo'], | ||||
|     'definition': WB_DEF | ||||
| } | ||||
|  | ||||
|  | ||||
| URL_TEMPLATE = '/workbooks' | ||||
| URL_TEMPLATE_NAME = '/workbooks/%s' | ||||
| URL_TEMPLATE_DEFINITION = '/workbooks/%s/definition' | ||||
|  | ||||
|  | ||||
| class TestWorkbooksV2(base.BaseClientV2Test): | ||||
|     def test_create(self): | ||||
|         mock = self.mock_http_post(content=WORKBOOK) | ||||
|  | ||||
|         wb = self.workbooks.create(WORKBOOK['name'], | ||||
|                                    WORKBOOK['definition'], | ||||
|                                    WORKBOOK['description'], | ||||
|                                    WORKBOOK['tags']) | ||||
|  | ||||
|         self.assertIsNotNone(wb) | ||||
|         self.assertEqual(workbooks.Workbook(self.workbooks, | ||||
|                                             WORKBOOK).__dict__, wb.__dict__) | ||||
|         mock.assert_called_once_with(URL_TEMPLATE, json.dumps(WORKBOOK)) | ||||
|  | ||||
|     def test_update(self): | ||||
|         mock = self.mock_http_put(content=WORKBOOK) | ||||
|  | ||||
|         wb = self.workbooks.update(WORKBOOK['name'], | ||||
|                                    WORKBOOK['definition'], | ||||
|                                    description=WORKBOOK['description'], | ||||
|                                    tags=WORKBOOK['tags']) | ||||
|  | ||||
|         self.assertIsNotNone(wb) | ||||
|         self.assertEqual(workbooks.Workbook(self.workbooks, | ||||
|                                             WORKBOOK).__dict__, wb.__dict__) | ||||
|         mock.assert_called_once_with( | ||||
|             URL_TEMPLATE_NAME % WORKBOOK['name'], | ||||
|             json.dumps(WORKBOOK)) | ||||
|  | ||||
|     def test_list(self): | ||||
|         mock = self.mock_http_get(content={'workbooks': [WORKBOOK]}) | ||||
|  | ||||
|         workbook_list = self.workbooks.list() | ||||
|  | ||||
|         self.assertEqual(1, len(workbook_list)) | ||||
|         wb = workbook_list[0] | ||||
|  | ||||
|         self.assertEqual(workbooks.Workbook(self.workbooks, | ||||
|                                             WORKBOOK).__dict__, wb.__dict__) | ||||
|         mock.assert_called_once_with(URL_TEMPLATE) | ||||
|  | ||||
|     def test_get(self): | ||||
|         mock = self.mock_http_get(content=WORKBOOK) | ||||
|  | ||||
|         wb = self.workbooks.get(WORKBOOK['name']) | ||||
|  | ||||
|         self.assertIsNotNone(wb) | ||||
|         self.assertEqual(workbooks.Workbook(self.workbooks, | ||||
|                                             WORKBOOK).__dict__, wb.__dict__) | ||||
|         mock.assert_called_once_with(URL_TEMPLATE_NAME % WORKBOOK['name']) | ||||
|  | ||||
|     def test_delete(self): | ||||
|         mock = self.mock_http_delete(status_code=204) | ||||
|  | ||||
|         self.workbooks.delete(WORKBOOK['name']) | ||||
|  | ||||
|         mock.assert_called_once_with(URL_TEMPLATE_NAME % WORKBOOK['name']) | ||||
		Reference in New Issue
	
	Block a user
	 Nikolay Mahotkin
					Nikolay Mahotkin