python-botocore/tests/acceptance/features/steps/base.py
2021-10-04 09:33:37 -07:00

104 lines
3.5 KiB
Python

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):
assert context.error_response.response['Error']['Code'] == code
@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)
@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)