2015-11-24 12:34:53 +01:00
|
|
|
import json
|
|
|
|
|
|
|
|
from botocore import xform_name
|
|
|
|
from botocore.exceptions import ClientError
|
|
|
|
|
|
|
|
from behave import when, then
|
|
|
|
|
|
|
|
|
|
|
|
def _params_from_table(table):
|
|
|
|
# Unfortunately the way we're using table is not quite how
|
|
|
|
# behave expects tables to be used:
|
|
|
|
# They expect:
|
|
|
|
#
|
|
|
|
# | name | department |
|
|
|
|
# | Barry | foo |
|
|
|
|
# | Pudey | bar |
|
|
|
|
# | Two-Lumps | bar |
|
|
|
|
#
|
|
|
|
# Where the first row are headings that indicate the
|
|
|
|
# key name you can use to retrieve row values,
|
|
|
|
# e.g row['name'] -> Barry.
|
|
|
|
#
|
|
|
|
#
|
|
|
|
# We just use:
|
|
|
|
# | LaunchConfigurationName | hello, world |
|
|
|
|
# | ImageId | ami-12345678 |
|
|
|
|
# | InstanceType | m1.small |
|
|
|
|
#
|
|
|
|
# So we have to grab the headings before iterating over
|
|
|
|
# the table rows.
|
|
|
|
params = {table.headings[0]: table.headings[1]}
|
|
|
|
for row in table:
|
|
|
|
params[row[0]] = row[1]
|
|
|
|
return params
|
|
|
|
|
|
|
|
|
|
|
|
@when(u'I call the "{}" API')
|
|
|
|
def api_call_no_args(context, operation):
|
|
|
|
context.response = getattr(context.client, xform_name(operation))()
|
|
|
|
|
|
|
|
|
|
|
|
@when(u'I call the "{}" API with')
|
|
|
|
def api_call_with_args(context, operation):
|
|
|
|
params = _params_from_table(context.table)
|
|
|
|
context.response = getattr(context.client, xform_name(operation))(**params)
|
|
|
|
|
|
|
|
|
|
|
|
@when(u'I call the "{}" API with JSON')
|
|
|
|
def api_call_with_json(context, operation):
|
|
|
|
params = json.loads(context.text)
|
|
|
|
context.response = getattr(context.client, xform_name(operation))(**params)
|
|
|
|
|
|
|
|
|
|
|
|
@when(u'I attempt to call the "{}" API with')
|
|
|
|
def api_call_with_error(context, operation):
|
|
|
|
params = _params_from_table(context.table)
|
|
|
|
try:
|
|
|
|
getattr(context.client, xform_name(operation))(**params)
|
|
|
|
except ClientError as e:
|
|
|
|
context.error_response = e
|
|
|
|
|
|
|
|
|
|
|
|
@when(u'I attempt to call the "{}" API with JSON')
|
|
|
|
def api_call_with_json_and_error(context, operation):
|
|
|
|
params = json.loads(context.text)
|
|
|
|
try:
|
|
|
|
getattr(context.client, xform_name(operation))(**params)
|
|
|
|
except ClientError as e:
|
|
|
|
context.error_response = e
|
|
|
|
|
|
|
|
|
|
|
|
@then(u'I expect the response error code to be "{}"')
|
|
|
|
def then_expected_error(context, code):
|
2021-10-04 18:33:37 +02:00
|
|
|
assert context.error_response.response['Error']['Code'] == code
|
2015-11-24 12:34:53 +01:00
|
|
|
|
|
|
|
|
|
|
|
@then(u'the value at "{}" should be a list')
|
|
|
|
def then_expected_type_is_list(context, expression):
|
|
|
|
# In botocore, if there are no values with an element,
|
|
|
|
# it will not appear in the response dict, so it's actually
|
|
|
|
# ok if the element does not exist (and is not a list).
|
|
|
|
# If an exception happened the test will have already failed,
|
|
|
|
# which makes this step a noop. We'll just verify
|
|
|
|
# the response is a dict to ensure it made it through
|
|
|
|
# our response parser properly.
|
|
|
|
if not isinstance(context.response, dict):
|
|
|
|
raise AssertionError("Response is not a dict: %s" % context.response)
|
|
|
|
|
|
|
|
|
|
|
|
@then(u'the response should contain a "{}"')
|
|
|
|
def then_should_contain_key(context, key):
|
|
|
|
# See then_expected_type_is_a_list for more background info.
|
|
|
|
# We really just care that the request succeeded for these
|
|
|
|
# smoke tests.
|
|
|
|
if not isinstance(context.response, dict):
|
|
|
|
raise AssertionError("Response is not a dict: %s" % context.response)
|
|
|
|
|
|
|
|
|
2016-02-02 09:54:52 +01:00
|
|
|
@then(u'I expect the response error to contain a message')
|
|
|
|
def then_error_has_message(context):
|
|
|
|
if 'Message' not in context.error_response.response['Error']:
|
|
|
|
raise AssertionError("Message key missing from error response: %s" %
|
|
|
|
context.error_response.response)
|