diff --git a/mistralclient/tests/unit/base.py b/mistralclient/tests/unit/base.py index eccef03a..85c8ec4c 100644 --- a/mistralclient/tests/unit/base.py +++ b/mistralclient/tests/unit/base.py @@ -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): diff --git a/mistralclient/tests/unit/v1/__init__.py b/mistralclient/tests/unit/v1/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/mistralclient/tests/unit/v1/base.py b/mistralclient/tests/unit/v1/base.py new file mode 100644 index 00000000..de6d89ea --- /dev/null +++ b/mistralclient/tests/unit/v1/base.py @@ -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 diff --git a/mistralclient/tests/unit/test_cli_executions.py b/mistralclient/tests/unit/v1/test_cli_executions.py similarity index 100% rename from mistralclient/tests/unit/test_cli_executions.py rename to mistralclient/tests/unit/v1/test_cli_executions.py diff --git a/mistralclient/tests/unit/test_cli_tasks.py b/mistralclient/tests/unit/v1/test_cli_tasks.py similarity index 100% rename from mistralclient/tests/unit/test_cli_tasks.py rename to mistralclient/tests/unit/v1/test_cli_tasks.py diff --git a/mistralclient/tests/unit/test_cli_workbooks.py b/mistralclient/tests/unit/v1/test_cli_workbooks.py similarity index 100% rename from mistralclient/tests/unit/test_cli_workbooks.py rename to mistralclient/tests/unit/v1/test_cli_workbooks.py diff --git a/mistralclient/tests/unit/test_executions.py b/mistralclient/tests/unit/v1/test_executions.py similarity index 94% rename from mistralclient/tests/unit/test_executions.py rename to mistralclient/tests/unit/v1/test_executions.py index 9ade0db9..68dafcd5 100644 --- a/mistralclient/tests/unit/test_executions.py +++ b/mistralclient/tests/unit/v1/test_executions.py @@ -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'], diff --git a/mistralclient/tests/unit/test_listeners.py b/mistralclient/tests/unit/v1/test_listeners.py similarity index 97% rename from mistralclient/tests/unit/test_listeners.py rename to mistralclient/tests/unit/v1/test_listeners.py index 307ee07c..d740fe41 100644 --- a/mistralclient/tests/unit/test_listeners.py +++ b/mistralclient/tests/unit/v1/test_listeners.py @@ -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 = { diff --git a/mistralclient/tests/unit/test_tasks.py b/mistralclient/tests/unit/v1/test_tasks.py similarity index 97% rename from mistralclient/tests/unit/test_tasks.py rename to mistralclient/tests/unit/v1/test_tasks.py index 0a1c0bea..b728a17b 100644 --- a/mistralclient/tests/unit/test_tasks.py +++ b/mistralclient/tests/unit/v1/test_tasks.py @@ -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 = { diff --git a/mistralclient/tests/unit/test_workbooks.py b/mistralclient/tests/unit/v1/test_workbooks.py similarity index 97% rename from mistralclient/tests/unit/test_workbooks.py rename to mistralclient/tests/unit/v1/test_workbooks.py index ec45faf4..c96243af 100644 --- a/mistralclient/tests/unit/test_workbooks.py +++ b/mistralclient/tests/unit/v1/test_workbooks.py @@ -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]) diff --git a/mistralclient/tests/unit/v2/__init__.py b/mistralclient/tests/unit/v2/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/mistralclient/tests/unit/v2/base.py b/mistralclient/tests/unit/v2/base.py new file mode 100644 index 00000000..1e1d9ccc --- /dev/null +++ b/mistralclient/tests/unit/v2/base.py @@ -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 diff --git a/mistralclient/tests/unit/v2/test_executions.py b/mistralclient/tests/unit/v2/test_executions.py new file mode 100644 index 00000000..33aba2c3 --- /dev/null +++ b/mistralclient/tests/unit/v2/test_executions.py @@ -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']) diff --git a/mistralclient/tests/unit/v2/test_tasks.py b/mistralclient/tests/unit/v2/test_tasks.py new file mode 100644 index 00000000..9c714900 --- /dev/null +++ b/mistralclient/tests/unit/v2/test_tasks.py @@ -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']) diff --git a/mistralclient/tests/unit/v2/test_workbooks.py b/mistralclient/tests/unit/v2/test_workbooks.py new file mode 100644 index 00000000..80db3529 --- /dev/null +++ b/mistralclient/tests/unit/v2/test_workbooks.py @@ -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'])