Add functional API tests for cron-triggers

- Added API tests which check main api calls to cron-trigger endpoint
- Fixed tearDown method (there was a problem when item array
had a few elements, not all of them were deleted)

Partly implements: blueprint mistral-triggers-functional-tests

Change-Id: Ibba7cd03e6ccdf06c76ea4ea161542b954faee0f
This commit is contained in:
Anastasia Kuznetsova 2014-10-20 15:27:03 +04:00
parent b8390eb84d
commit e00ad25ca6
3 changed files with 162 additions and 7 deletions

View File

@ -132,7 +132,7 @@ class ExecutionTestsV1(base.TestCase):
for ex in self.client.executions:
self.client.delete_obj('executions', ex)
self.client.executions.remove(ex)
self.client.executions = []
@test.attr(type='positive')
def test_create_execution(self):

View File

@ -12,6 +12,7 @@
# License for the specific language governing permissions and limitations
# under the License.
from tempest import exceptions
from tempest import test
from mistral.tests.functional.api.v1 import test_mistral_basic
@ -25,7 +26,7 @@ class WorkbookTestsV2(test_mistral_basic.WorkbookTestsV1):
def tearDown(self):
for wf in self.client.workflows:
self.client.delete_obj('workflows', wf)
self.client.workflows.remove(wf)
self.client.workflows = []
super(WorkbookTestsV2, self).tearDown()
@ -37,7 +38,7 @@ class WorkflowTestsV2(base.TestCase):
def tearDown(self):
for wf in self.client.workflows:
self.client.delete_obj('workflows', wf)
self.client.workflows.remove(wf)
self.client.workflows = []
super(WorkflowTestsV2, self).tearDown()
@ -109,6 +110,144 @@ class ExecutionTestsV2(test_mistral_basic.ExecutionTestsV1):
def tearDown(self):
for wf in self.client.workflows:
self.client.delete_obj('workflows', wf)
self.client.workflows.remove(wf)
self.client.workflows = []
super(ExecutionTestsV2, self).tearDown()
class CronTriggerTestsV2(base.TestCase):
_version = 2
def setUp(self):
super(CronTriggerTestsV2, self).setUp()
_, body = self.client.create_workflow()
self.wf_name = body['workflows'][0]['name']
def tearDown(self):
for tr in self.client.triggers:
self.client.delete_obj('cron_triggers', tr)
self.client.triggers = []
for wf in self.client.workflows:
self.client.delete_obj('workflows', wf)
self.client.workflows = []
super(CronTriggerTestsV2, self).tearDown()
@test.attr(type='smoke')
def test_get_list_triggers(self):
resp, body = self.client.get_list_obj('cron_triggers')
self.assertEqual(200, resp.status)
self.assertEqual([], body['cron_triggers'])
@test.attr(type='sanity')
def test_create_and_delete_triggers(self):
tr_name = 'trigger'
resp, body = self.client.create_trigger(
tr_name, '5 * * * *', self.wf_name)
self.assertEqual(201, resp.status)
self.assertEqual(tr_name, body['name'])
resp, body = self.client.get_list_obj('cron_triggers')
self.assertEqual(200, resp.status)
trs_names = [body['cron_triggers'][i]['name']
for i in range(len(body['cron_triggers']))]
self.assertIn(tr_name, trs_names)
self.client.delete_obj('cron_triggers', tr_name)
self.client.triggers.remove(tr_name)
_, body = self.client.get_list_obj('cron_triggers')
trs_names = [body['cron_triggers'][i]['name']
for i in range(len(body['cron_triggers']))]
self.assertNotIn(tr_name, trs_names)
@test.attr(type='sanity')
def test_create_two_triggers_for_one_wf(self):
tr_name_1 = 'trigger1'
tr_name_2 = 'trigger2'
resp, body = self.client.create_trigger(
tr_name_1, '5 * * * *', self.wf_name)
self.assertEqual(201, resp.status)
self.assertEqual(tr_name_1, body['name'])
resp, body = self.client.create_trigger(
tr_name_2, '15 * * * *', self.wf_name)
self.assertEqual(201, resp.status)
self.assertEqual(tr_name_2, body['name'])
resp, body = self.client.get_list_obj('cron_triggers')
self.assertEqual(200, resp.status)
trs_names = [body['cron_triggers'][i]['name']
for i in range(len(body['cron_triggers']))]
self.assertIn(tr_name_1, trs_names)
self.assertIn(tr_name_2, trs_names)
@test.attr(type='sanity')
def test_get_trigger(self):
tr_name = 'trigger'
self.client.create_trigger(
tr_name, '5 * * * *', self.wf_name)
resp, body = self.client.get_object('cron_triggers', tr_name)
self.assertEqual(200, resp.status)
self.assertEqual(tr_name, body['name'])
@test.attr(type='negative')
def test_create_trigger_nonexistent_wf(self):
self.assertRaises(exceptions.NotFound,
self.client.create_trigger,
'trigger', '5 * * * *', 'nonexist')
@test.attr(type='negative')
def test_get_nonexistent_trigger(self):
self.assertRaises(exceptions.NotFound,
self.client.get_object,
'cron_triggers', 'trigger')
@test.attr(type='negative')
def test_delete_nonexistent_trigger(self):
self.assertRaises(exceptions.NotFound,
self.client.delete_obj,
'cron_triggers', 'trigger')
@test.attr(type='negative')
def test_create_two_triggers_with_same_name(self):
tr_name = 'trigger'
self.client.create_trigger(
tr_name, '5 * * * *', self.wf_name)
self.assertRaises(exceptions.Conflict,
self.client.create_trigger,
tr_name, '5 * * * *', self.wf_name)
@test.skip_because(bug="1383146")
@test.attr(type='negative')
def test_create_two_triggers_with_same_pattern(self):
self.client.create_trigger(
'trigger1', '5 * * * *', self.wf_name)
self.assertRaises(exceptions.Conflict,
self.client.create_trigger,
'trigger2', '5 * * * *', self.wf_name)
@test.attr(type='nagative')
def test_invalid_pattern_not_enough_params(self):
self.assertRaises(exceptions.ServerFault,
self.client.create_trigger,
'trigger', '5 *', self.wf_name)
@test.attr(type='nagative')
def test_invalid_pattern_out_of_range(self):
self.assertRaises(exceptions.ServerFault,
self.client.create_trigger,
'trigger', '88 * * * *', self.wf_name)

View File

@ -72,6 +72,7 @@ class MistralClientBase(rest_client.RestClient):
self.workbooks = []
self.executions = []
self.workflows = []
self.triggers = []
def get_list_obj(self, name):
resp, body = self.get(name)
@ -286,6 +287,21 @@ class MistralClientV2(MistralClientBase):
return resp, json.loads(body)
def create_trigger(self, name, pattern, wf_name, wf_input=None):
post_body = {
'name': name,
'pattern': pattern,
'workflow_name': wf_name,
}
if wf_input:
post_body.update({'workflow_input': json.dumps(wf_input)})
rest, body = self.post('cron_triggers', json.dumps(post_body))
self.triggers.append(name)
return rest, json.loads(body)
class AuthProv(auth.KeystoneV2AuthProvider):
@ -333,7 +349,7 @@ class TestCase(tempest.test.BaseTestCase):
for wb in self.client.workbooks:
self.client.delete_obj('workbooks', wb)
self.client.workbooks.remove(wb)
self.client.workbooks = []
class TestCaseAdvanced(TestCase):
@ -355,10 +371,10 @@ class TestCaseAdvanced(TestCase):
def tearDown(self):
for wb in self.client.workbooks:
self.client.delete_obj('workbooks', wb)
self.client.workbooks.remove(wb)
self.client.workbooks = []
for ex in self.client.executions:
self.client.delete_obj('executions', ex)
self.client.executions.remove(ex)
self.client.executions = []
super(TestCaseAdvanced, self).tearDown()