2016-03-01 17:03:59 +00:00
from __future__ import unicode_literals
2020-05-03 03:01:46 +00:00
import json
2016-09-13 11:44:17 +00:00
2016-03-01 17:03:59 +00:00
import boto3
from freezegun import freeze_time
2016-03-05 15:54:19 +00:00
import requests
2016-03-01 17:03:59 +00:00
import sure # noqa
2016-09-13 11:44:17 +00:00
from botocore . exceptions import ClientError
2016-03-01 17:03:59 +00:00
2020-02-18 16:49:35 +00:00
from moto import mock_apigateway , mock_cognitoidp , settings
2019-12-17 02:05:29 +00:00
from moto . core import ACCOUNT_ID
2021-01-15 09:12:41 +00:00
from moto . core . models import responses_mock
2020-10-06 05:54:49 +00:00
import pytest
2016-03-01 17:03:59 +00:00
@freeze_time ( " 2015-01-01 " )
@mock_apigateway
def test_create_and_get_rest_api ( ) :
2019-10-31 15:44:26 +00:00
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
2016-03-01 17:03:59 +00:00
2019-10-31 15:44:26 +00:00
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
2016-03-01 17:03:59 +00:00
2019-10-31 15:44:26 +00:00
response = client . get_rest_api ( restApiId = api_id )
2016-03-01 17:03:59 +00:00
2019-10-31 15:44:26 +00:00
response . pop ( " ResponseMetadata " )
response . pop ( " createdDate " )
response . should . equal (
2020-02-03 16:21:22 +00:00
{
" id " : api_id ,
" name " : " my_api " ,
" description " : " this is my api " ,
2021-05-23 16:09:02 +00:00
" version " : " V1 " ,
" binaryMediaTypes " : [ ] ,
2020-02-03 16:21:22 +00:00
" apiKeySource " : " HEADER " ,
" endpointConfiguration " : { " types " : [ " EDGE " ] } ,
" tags " : { } ,
2021-05-23 16:09:02 +00:00
" disableExecuteApiEndpoint " : False ,
2020-02-03 16:21:22 +00:00
}
2019-10-31 15:44:26 +00:00
)
2016-03-01 17:03:59 +00:00
2021-05-23 16:09:02 +00:00
@mock_apigateway
def test_upate_rest_api ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
patchOperations = [
{ " op " : " replace " , " path " : " /name " , " value " : " new-name " } ,
{ " op " : " replace " , " path " : " /description " , " value " : " new-description " } ,
{ " op " : " replace " , " path " : " /apiKeySource " , " value " : " AUTHORIZER " } ,
{ " op " : " replace " , " path " : " /binaryMediaTypes " , " value " : " image/jpeg " } ,
{ " op " : " replace " , " path " : " /disableExecuteApiEndpoint " , " value " : " True " } ,
]
response = client . update_rest_api ( restApiId = api_id , patchOperations = patchOperations )
response . pop ( " ResponseMetadata " )
response . pop ( " createdDate " )
response . pop ( " binaryMediaTypes " )
response . should . equal (
{
" id " : api_id ,
" name " : " new-name " ,
" version " : " V1 " ,
" description " : " new-description " ,
" apiKeySource " : " AUTHORIZER " ,
" endpointConfiguration " : { " types " : [ " EDGE " ] } ,
" tags " : { } ,
" disableExecuteApiEndpoint " : True ,
}
)
# should fail with wrong apikeysoruce
patchOperations = [
{ " op " : " replace " , " path " : " /apiKeySource " , " value " : " Wrong-value-AUTHORIZER " }
]
with pytest . raises ( ClientError ) as ex :
response = client . update_rest_api (
restApiId = api_id , patchOperations = patchOperations
)
ex . value . response [ " Error " ] [ " Message " ] . should . equal (
" 1 validation error detected: Value ' Wrong-value-AUTHORIZER ' at ' createRestApiInput.apiKeySource ' failed to satisfy constraint: Member must satisfy enum value set: [AUTHORIZER, HEADER] "
)
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " ValidationException " )
@mock_apigateway
def test_upate_rest_api_invalid_api_id ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
patchOperations = [
{ " op " : " replace " , " path " : " /apiKeySource " , " value " : " AUTHORIZER " }
]
with pytest . raises ( ClientError ) as ex :
client . update_rest_api ( restApiId = " api_id " , patchOperations = patchOperations )
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " NotFoundException " )
2016-03-01 17:03:59 +00:00
@mock_apigateway
def test_list_and_delete_apis ( ) :
2019-10-31 15:44:26 +00:00
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
2016-03-01 17:03:59 +00:00
2019-10-31 15:44:26 +00:00
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
client . create_rest_api ( name = " my_api2 " , description = " this is my api2 " )
2016-03-01 17:03:59 +00:00
response = client . get_rest_apis ( )
2019-10-31 15:44:26 +00:00
len ( response [ " items " ] ) . should . equal ( 2 )
2016-03-01 17:03:59 +00:00
2019-10-31 15:44:26 +00:00
client . delete_rest_api ( restApiId = api_id )
2016-03-01 17:03:59 +00:00
response = client . get_rest_apis ( )
2019-10-31 15:44:26 +00:00
len ( response [ " items " ] ) . should . equal ( 1 )
2016-03-01 23:50:06 +00:00
2020-02-03 16:21:22 +00:00
@mock_apigateway
def test_create_rest_api_with_tags ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
response = client . create_rest_api (
name = " my_api " , description = " this is my api " , tags = { " MY_TAG1 " : " MY_VALUE1 " }
)
api_id = response [ " id " ]
response = client . get_rest_api ( restApiId = api_id )
assert " tags " in response
response [ " tags " ] . should . equal ( { " MY_TAG1 " : " MY_VALUE1 " } )
2020-04-25 08:27:59 +00:00
@mock_apigateway
def test_create_rest_api_with_policy ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
2020-04-25 16:24:54 +00:00
policy = ' { " Version " : " 2012-10-17 " , " Statement " : []} '
2020-04-25 08:27:59 +00:00
response = client . create_rest_api (
2020-04-25 16:24:54 +00:00
name = " my_api " , description = " this is my api " , policy = policy
2020-04-25 08:27:59 +00:00
)
api_id = response [ " id " ]
response = client . get_rest_api ( restApiId = api_id )
assert " policy " in response
response [ " policy " ] . should . equal ( policy )
2020-02-03 16:21:22 +00:00
@mock_apigateway
def test_create_rest_api_invalid_apikeysource ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
2020-10-06 05:54:49 +00:00
with pytest . raises ( ClientError ) as ex :
2020-02-03 16:21:22 +00:00
client . create_rest_api (
name = " my_api " ,
description = " this is my api " ,
apiKeySource = " not a valid api key source " ,
)
2020-10-06 06:04:09 +00:00
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " ValidationException " )
2020-02-03 16:21:22 +00:00
@mock_apigateway
def test_create_rest_api_valid_apikeysources ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
# 1. test creating rest api with HEADER apiKeySource
response = client . create_rest_api (
2020-11-11 15:55:37 +00:00
name = " my_api " , description = " this is my api " , apiKeySource = " HEADER " ,
2020-02-03 16:21:22 +00:00
)
api_id = response [ " id " ]
response = client . get_rest_api ( restApiId = api_id )
response [ " apiKeySource " ] . should . equal ( " HEADER " )
# 2. test creating rest api with AUTHORIZER apiKeySource
response = client . create_rest_api (
2020-11-11 15:55:37 +00:00
name = " my_api2 " , description = " this is my api " , apiKeySource = " AUTHORIZER " ,
2020-02-03 16:21:22 +00:00
)
api_id = response [ " id " ]
response = client . get_rest_api ( restApiId = api_id )
response [ " apiKeySource " ] . should . equal ( " AUTHORIZER " )
@mock_apigateway
def test_create_rest_api_invalid_endpointconfiguration ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
2020-10-06 05:54:49 +00:00
with pytest . raises ( ClientError ) as ex :
2020-02-03 16:21:22 +00:00
client . create_rest_api (
name = " my_api " ,
description = " this is my api " ,
endpointConfiguration = { " types " : [ " INVALID " ] } ,
)
2020-10-06 06:04:09 +00:00
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " ValidationException " )
2020-02-03 16:21:22 +00:00
@mock_apigateway
def test_create_rest_api_valid_endpointconfigurations ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
# 1. test creating rest api with PRIVATE endpointConfiguration
response = client . create_rest_api (
name = " my_api " ,
description = " this is my api " ,
endpointConfiguration = { " types " : [ " PRIVATE " ] } ,
)
api_id = response [ " id " ]
response = client . get_rest_api ( restApiId = api_id )
response [ " endpointConfiguration " ] . should . equal (
2020-11-11 15:55:37 +00:00
{ " types " : [ " PRIVATE " ] , }
2020-02-03 16:21:22 +00:00
)
# 2. test creating rest api with REGIONAL endpointConfiguration
response = client . create_rest_api (
name = " my_api2 " ,
description = " this is my api " ,
endpointConfiguration = { " types " : [ " REGIONAL " ] } ,
)
api_id = response [ " id " ]
response = client . get_rest_api ( restApiId = api_id )
response [ " endpointConfiguration " ] . should . equal (
2020-11-11 15:55:37 +00:00
{ " types " : [ " REGIONAL " ] , }
2020-02-03 16:21:22 +00:00
)
# 3. test creating rest api with EDGE endpointConfiguration
response = client . create_rest_api (
name = " my_api3 " ,
description = " this is my api " ,
endpointConfiguration = { " types " : [ " EDGE " ] } ,
)
api_id = response [ " id " ]
response = client . get_rest_api ( restApiId = api_id )
response [ " endpointConfiguration " ] . should . equal (
2020-11-11 15:55:37 +00:00
{ " types " : [ " EDGE " ] , }
2020-02-03 16:21:22 +00:00
)
2019-11-04 09:12:24 +00:00
@mock_apigateway
def test_create_resource__validate_name ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
resources = client . get_resources ( restApiId = api_id )
root_id = [ resource for resource in resources [ " items " ] if resource [ " path " ] == " / " ] [
0
] [ " id " ]
2020-01-29 19:28:37 +00:00
invalid_names = [ " /users " , " users/ " , " users/ {user_id} " , " us { er " , " us+er " ]
valid_names = [ " users " , " {user_id} " , " { proxy+} " , " user_09 " , " good-dog " ]
2019-11-04 09:12:24 +00:00
# All invalid names should throw an exception
for name in invalid_names :
2020-10-06 05:54:49 +00:00
with pytest . raises ( ClientError ) as ex :
2019-11-04 09:12:24 +00:00
client . create_resource ( restApiId = api_id , parentId = root_id , pathPart = name )
2020-10-06 06:04:09 +00:00
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " BadRequestException " )
ex . value . response [ " Error " ] [ " Message " ] . should . equal (
2020-01-29 19:28:37 +00:00
" Resource ' s path part only allow a-zA-Z0-9._- and curly braces at the beginning and the end and an optional plus sign before the closing brace. "
2019-11-04 09:12:24 +00:00
)
# All valid names should go through
for name in valid_names :
client . create_resource ( restApiId = api_id , parentId = root_id , pathPart = name )
2016-03-01 23:50:06 +00:00
@mock_apigateway
def test_create_resource ( ) :
2019-10-31 15:44:26 +00:00
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
2016-03-01 23:50:06 +00:00
resources = client . get_resources ( restApiId = api_id )
2019-10-31 15:44:26 +00:00
root_id = [ resource for resource in resources [ " items " ] if resource [ " path " ] == " / " ] [
0
] [ " id " ]
2016-03-01 23:50:06 +00:00
2019-10-31 15:44:26 +00:00
root_resource = client . get_resource ( restApiId = api_id , resourceId = root_id )
2017-02-24 02:37:43 +00:00
# this is hard to match against, so remove it
2019-10-31 15:44:26 +00:00
root_resource [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
root_resource [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
root_resource . should . equal (
2020-11-11 15:55:37 +00:00
{ " path " : " / " , " id " : root_id , " ResponseMetadata " : { " HTTPStatusCode " : 200 } , }
2019-10-31 15:44:26 +00:00
)
2016-03-01 23:50:06 +00:00
2019-11-04 09:12:24 +00:00
client . create_resource ( restApiId = api_id , parentId = root_id , pathPart = " users " )
2016-03-01 23:50:06 +00:00
2019-10-31 15:44:26 +00:00
resources = client . get_resources ( restApiId = api_id ) [ " items " ]
2016-03-01 23:50:06 +00:00
len ( resources ) . should . equal ( 2 )
2019-10-31 15:44:26 +00:00
non_root_resource = [ resource for resource in resources if resource [ " path " ] != " / " ] [
0
]
2016-03-01 23:50:06 +00:00
2019-11-04 09:12:24 +00:00
client . delete_resource ( restApiId = api_id , resourceId = non_root_resource [ " id " ] )
2016-03-01 23:50:06 +00:00
2019-10-31 15:44:26 +00:00
len ( client . get_resources ( restApiId = api_id ) [ " items " ] ) . should . equal ( 1 )
2016-03-01 23:50:06 +00:00
2016-03-05 15:54:19 +00:00
@mock_apigateway
def test_child_resource ( ) :
2019-10-31 15:44:26 +00:00
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
2016-03-05 15:54:19 +00:00
resources = client . get_resources ( restApiId = api_id )
2019-10-31 15:44:26 +00:00
root_id = [ resource for resource in resources [ " items " ] if resource [ " path " ] == " / " ] [
0
] [ " id " ]
2016-03-05 15:54:19 +00:00
response = client . create_resource (
2019-10-31 15:44:26 +00:00
restApiId = api_id , parentId = root_id , pathPart = " users "
2016-03-05 15:54:19 +00:00
)
2019-10-31 15:44:26 +00:00
users_id = response [ " id " ]
2016-03-05 15:54:19 +00:00
response = client . create_resource (
2019-10-31 15:44:26 +00:00
restApiId = api_id , parentId = users_id , pathPart = " tags "
2016-03-05 15:54:19 +00:00
)
2019-10-31 15:44:26 +00:00
tags_id = response [ " id " ]
2016-03-05 15:54:19 +00:00
2019-10-31 15:44:26 +00:00
child_resource = client . get_resource ( restApiId = api_id , resourceId = tags_id )
2017-02-24 02:37:43 +00:00
# this is hard to match against, so remove it
2019-10-31 15:44:26 +00:00
child_resource [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
child_resource [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
child_resource . should . equal (
{
" path " : " /users/tags " ,
" pathPart " : " tags " ,
" parentId " : users_id ,
" id " : tags_id ,
" ResponseMetadata " : { " HTTPStatusCode " : 200 } ,
}
)
2016-03-05 15:54:19 +00:00
2016-03-01 23:50:06 +00:00
@mock_apigateway
def test_create_method ( ) :
2019-10-31 15:44:26 +00:00
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
2016-03-01 23:50:06 +00:00
resources = client . get_resources ( restApiId = api_id )
2019-10-31 15:44:26 +00:00
root_id = [ resource for resource in resources [ " items " ] if resource [ " path " ] == " / " ] [
0
] [ " id " ]
2016-03-01 23:50:06 +00:00
client . put_method (
2019-10-31 15:44:26 +00:00
restApiId = api_id , resourceId = root_id , httpMethod = " GET " , authorizationType = " none "
2016-03-01 23:50:06 +00:00
)
2019-10-31 15:44:26 +00:00
response = client . get_method ( restApiId = api_id , resourceId = root_id , httpMethod = " GET " )
2016-03-01 23:50:06 +00:00
2017-02-24 02:37:43 +00:00
# this is hard to match against, so remove it
2019-10-31 15:44:26 +00:00
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response . should . equal (
{
" httpMethod " : " GET " ,
" authorizationType " : " none " ,
2020-02-14 18:26:27 +00:00
" apiKeyRequired " : False ,
" ResponseMetadata " : { " HTTPStatusCode " : 200 } ,
}
)
@mock_apigateway
def test_create_method_apikeyrequired ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
resources = client . get_resources ( restApiId = api_id )
root_id = [ resource for resource in resources [ " items " ] if resource [ " path " ] == " / " ] [
0
] [ " id " ]
client . put_method (
restApiId = api_id ,
resourceId = root_id ,
httpMethod = " GET " ,
authorizationType = " none " ,
apiKeyRequired = True ,
)
response = client . get_method ( restApiId = api_id , resourceId = root_id , httpMethod = " GET " )
# this is hard to match against, so remove it
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response . should . equal (
{
" httpMethod " : " GET " ,
" authorizationType " : " none " ,
" apiKeyRequired " : True ,
2019-10-31 15:44:26 +00:00
" ResponseMetadata " : { " HTTPStatusCode " : 200 } ,
}
)
2016-03-01 23:50:06 +00:00
@mock_apigateway
def test_create_method_response ( ) :
2019-10-31 15:44:26 +00:00
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
2016-03-01 23:50:06 +00:00
resources = client . get_resources ( restApiId = api_id )
2019-10-31 15:44:26 +00:00
root_id = [ resource for resource in resources [ " items " ] if resource [ " path " ] == " / " ] [
0
] [ " id " ]
2016-03-01 23:50:06 +00:00
client . put_method (
2019-10-31 15:44:26 +00:00
restApiId = api_id , resourceId = root_id , httpMethod = " GET " , authorizationType = " none "
2016-03-01 23:50:06 +00:00
)
2019-10-31 15:44:26 +00:00
response = client . get_method ( restApiId = api_id , resourceId = root_id , httpMethod = " GET " )
2016-03-01 23:50:06 +00:00
response = client . put_method_response (
2019-10-31 15:44:26 +00:00
restApiId = api_id , resourceId = root_id , httpMethod = " GET " , statusCode = " 200 "
2016-03-01 23:50:06 +00:00
)
2017-02-24 02:37:43 +00:00
# this is hard to match against, so remove it
2019-10-31 15:44:26 +00:00
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response . should . equal (
{ " ResponseMetadata " : { " HTTPStatusCode " : 200 } , " statusCode " : " 200 " }
)
2016-03-01 23:50:06 +00:00
response = client . get_method_response (
2019-10-31 15:44:26 +00:00
restApiId = api_id , resourceId = root_id , httpMethod = " GET " , statusCode = " 200 "
2016-03-01 23:50:06 +00:00
)
2017-02-24 02:37:43 +00:00
# this is hard to match against, so remove it
2019-10-31 15:44:26 +00:00
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response . should . equal (
{ " ResponseMetadata " : { " HTTPStatusCode " : 200 } , " statusCode " : " 200 " }
)
2016-03-01 23:50:06 +00:00
response = client . delete_method_response (
2019-10-31 15:44:26 +00:00
restApiId = api_id , resourceId = root_id , httpMethod = " GET " , statusCode = " 200 "
2016-03-01 23:50:06 +00:00
)
2017-02-24 02:37:43 +00:00
# this is hard to match against, so remove it
2019-10-31 15:44:26 +00:00
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response . should . equal ( { " ResponseMetadata " : { " HTTPStatusCode " : 200 } } )
2016-03-02 20:18:11 +00:00
@mock_apigateway
def test_integrations ( ) :
2019-10-31 15:44:26 +00:00
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
2016-03-02 20:18:11 +00:00
resources = client . get_resources ( restApiId = api_id )
2019-10-31 15:44:26 +00:00
root_id = [ resource for resource in resources [ " items " ] if resource [ " path " ] == " / " ] [
0
] [ " id " ]
2016-03-02 20:18:11 +00:00
client . put_method (
2019-10-31 15:44:26 +00:00
restApiId = api_id , resourceId = root_id , httpMethod = " GET " , authorizationType = " none "
2016-03-02 20:18:11 +00:00
)
client . put_method_response (
2019-10-31 15:44:26 +00:00
restApiId = api_id , resourceId = root_id , httpMethod = " GET " , statusCode = " 200 "
2016-03-02 20:18:11 +00:00
)
response = client . put_integration (
restApiId = api_id ,
resourceId = root_id ,
2019-10-31 15:44:26 +00:00
httpMethod = " GET " ,
type = " HTTP " ,
uri = " http://httpbin.org/robots.txt " ,
2019-11-04 09:12:24 +00:00
integrationHttpMethod = " POST " ,
2016-03-02 20:18:11 +00:00
)
2017-02-24 02:37:43 +00:00
# this is hard to match against, so remove it
2019-10-31 15:44:26 +00:00
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response . should . equal (
{
" ResponseMetadata " : { " HTTPStatusCode " : 200 } ,
" httpMethod " : " GET " ,
" integrationResponses " : {
" 200 " : {
" responseTemplates " : { " application/json " : None } ,
" statusCode " : 200 ,
}
} ,
" type " : " HTTP " ,
" uri " : " http://httpbin.org/robots.txt " ,
}
)
2016-03-04 23:02:07 +00:00
response = client . get_integration (
2019-10-31 15:44:26 +00:00
restApiId = api_id , resourceId = root_id , httpMethod = " GET "
2016-03-04 23:02:07 +00:00
)
2017-02-24 02:37:43 +00:00
# this is hard to match against, so remove it
2019-10-31 15:44:26 +00:00
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response . should . equal (
{
" ResponseMetadata " : { " HTTPStatusCode " : 200 } ,
" httpMethod " : " GET " ,
" integrationResponses " : {
" 200 " : {
" responseTemplates " : { " application/json " : None } ,
" statusCode " : 200 ,
}
} ,
" type " : " HTTP " ,
" uri " : " http://httpbin.org/robots.txt " ,
}
2016-03-04 23:02:07 +00:00
)
2019-10-31 15:44:26 +00:00
response = client . get_resource ( restApiId = api_id , resourceId = root_id )
# this is hard to match against, so remove it
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response [ " resourceMethods " ] [ " GET " ] [ " methodIntegration " ] . should . equal (
{
" httpMethod " : " GET " ,
" integrationResponses " : {
" 200 " : {
" responseTemplates " : { " application/json " : None } ,
" statusCode " : 200 ,
}
} ,
" type " : " HTTP " ,
" uri " : " http://httpbin.org/robots.txt " ,
}
2016-03-04 23:02:07 +00:00
)
2019-10-31 15:44:26 +00:00
client . delete_integration ( restApiId = api_id , resourceId = root_id , httpMethod = " GET " )
response = client . get_resource ( restApiId = api_id , resourceId = root_id )
response [ " resourceMethods " ] [ " GET " ] . shouldnt . contain ( " methodIntegration " )
2016-03-04 23:35:03 +00:00
2016-08-10 03:55:59 +00:00
# Create a new integration with a requestTemplates config
client . put_method (
restApiId = api_id ,
resourceId = root_id ,
2019-10-31 15:44:26 +00:00
httpMethod = " POST " ,
authorizationType = " none " ,
2016-08-10 03:55:59 +00:00
)
templates = {
2017-02-24 02:37:43 +00:00
# example based on
# http://docs.aws.amazon.com/apigateway/latest/developerguide/api-as-kinesis-proxy-export-swagger-with-extensions.html
2019-10-31 15:44:26 +00:00
" application/json " : ' { \n " StreamName " : " $input.params( \' stream-name \' ) " , \n " Records " : [] \n } '
2016-08-10 03:55:59 +00:00
}
2019-10-31 15:44:26 +00:00
test_uri = " http://example.com/foobar.txt "
2016-08-10 03:55:59 +00:00
response = client . put_integration (
restApiId = api_id ,
resourceId = root_id ,
2019-10-31 15:44:26 +00:00
httpMethod = " POST " ,
type = " HTTP " ,
2016-08-10 03:55:59 +00:00
uri = test_uri ,
2019-10-31 15:44:26 +00:00
requestTemplates = templates ,
2019-11-04 09:12:24 +00:00
integrationHttpMethod = " POST " ,
2016-08-10 03:55:59 +00:00
)
2017-02-24 02:37:43 +00:00
# this is hard to match against, so remove it
2019-10-31 15:44:26 +00:00
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response [ " ResponseMetadata " ] . should . equal ( { " HTTPStatusCode " : 200 } )
2016-08-10 03:55:59 +00:00
response = client . get_integration (
2019-10-31 15:44:26 +00:00
restApiId = api_id , resourceId = root_id , httpMethod = " POST "
2016-08-10 03:55:59 +00:00
)
2019-10-31 15:44:26 +00:00
response [ " uri " ] . should . equal ( test_uri )
response [ " requestTemplates " ] . should . equal ( templates )
2016-08-10 03:55:59 +00:00
2016-03-04 23:35:03 +00:00
2016-03-05 14:48:37 +00:00
@mock_apigateway
def test_integration_response ( ) :
2019-10-31 15:44:26 +00:00
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
2016-03-05 14:48:37 +00:00
resources = client . get_resources ( restApiId = api_id )
2019-10-31 15:44:26 +00:00
root_id = [ resource for resource in resources [ " items " ] if resource [ " path " ] == " / " ] [
0
] [ " id " ]
2016-03-05 14:48:37 +00:00
client . put_method (
2019-10-31 15:44:26 +00:00
restApiId = api_id , resourceId = root_id , httpMethod = " GET " , authorizationType = " none "
2016-03-05 14:48:37 +00:00
)
client . put_method_response (
2019-10-31 15:44:26 +00:00
restApiId = api_id , resourceId = root_id , httpMethod = " GET " , statusCode = " 200 "
2016-03-05 14:48:37 +00:00
)
2019-11-04 09:12:24 +00:00
client . put_integration (
2016-03-05 14:48:37 +00:00
restApiId = api_id ,
resourceId = root_id ,
2019-10-31 15:44:26 +00:00
httpMethod = " GET " ,
type = " HTTP " ,
uri = " http://httpbin.org/robots.txt " ,
2019-11-04 09:12:24 +00:00
integrationHttpMethod = " POST " ,
2016-03-05 14:48:37 +00:00
)
response = client . put_integration_response (
restApiId = api_id ,
resourceId = root_id ,
2019-10-31 15:44:26 +00:00
httpMethod = " GET " ,
statusCode = " 200 " ,
selectionPattern = " foobar " ,
2019-11-04 09:12:24 +00:00
responseTemplates = { } ,
2016-03-05 14:48:37 +00:00
)
2020-06-10 06:58:40 +00:00
2017-02-24 02:37:43 +00:00
# this is hard to match against, so remove it
2019-10-31 15:44:26 +00:00
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response . should . equal (
{
" statusCode " : " 200 " ,
" selectionPattern " : " foobar " ,
" ResponseMetadata " : { " HTTPStatusCode " : 200 } ,
" responseTemplates " : { " application/json " : None } ,
2016-03-05 14:48:37 +00:00
}
2019-10-31 15:44:26 +00:00
)
2016-03-05 14:48:37 +00:00
response = client . get_integration_response (
2019-10-31 15:44:26 +00:00
restApiId = api_id , resourceId = root_id , httpMethod = " GET " , statusCode = " 200 "
2016-03-05 14:48:37 +00:00
)
2017-02-24 02:37:43 +00:00
# this is hard to match against, so remove it
2019-10-31 15:44:26 +00:00
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response . should . equal (
{
" statusCode " : " 200 " ,
" selectionPattern " : " foobar " ,
" ResponseMetadata " : { " HTTPStatusCode " : 200 } ,
" responseTemplates " : { " application/json " : None } ,
2016-03-05 14:48:37 +00:00
}
)
2019-10-31 15:44:26 +00:00
response = client . get_method ( restApiId = api_id , resourceId = root_id , httpMethod = " GET " )
2017-02-24 02:37:43 +00:00
# this is hard to match against, so remove it
2019-10-31 15:44:26 +00:00
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response [ " methodIntegration " ] [ " integrationResponses " ] . should . equal (
{
" 200 " : {
" responseTemplates " : { " application/json " : None } ,
" selectionPattern " : " foobar " ,
" statusCode " : " 200 " ,
}
2016-03-05 14:48:37 +00:00
}
2019-10-31 15:44:26 +00:00
)
2016-03-05 14:48:37 +00:00
response = client . delete_integration_response (
2019-10-31 15:44:26 +00:00
restApiId = api_id , resourceId = root_id , httpMethod = " GET " , statusCode = " 200 "
2016-03-05 14:48:37 +00:00
)
2019-10-31 15:44:26 +00:00
response = client . get_method ( restApiId = api_id , resourceId = root_id , httpMethod = " GET " )
response [ " methodIntegration " ] [ " integrationResponses " ] . should . equal ( { } )
2016-03-05 14:48:37 +00:00
2020-06-10 06:58:40 +00:00
# adding a new method and perfomring put intergration with contentHandling as CONVERT_TO_BINARY
client . put_method (
restApiId = api_id , resourceId = root_id , httpMethod = " PUT " , authorizationType = " none "
)
client . put_method_response (
restApiId = api_id , resourceId = root_id , httpMethod = " PUT " , statusCode = " 200 "
)
client . put_integration (
restApiId = api_id ,
resourceId = root_id ,
httpMethod = " PUT " ,
type = " HTTP " ,
uri = " http://httpbin.org/robots.txt " ,
integrationHttpMethod = " POST " ,
)
response = client . put_integration_response (
restApiId = api_id ,
resourceId = root_id ,
httpMethod = " PUT " ,
statusCode = " 200 " ,
selectionPattern = " foobar " ,
responseTemplates = { } ,
contentHandling = " CONVERT_TO_BINARY " ,
)
# this is hard to match against, so remove it
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response . should . equal (
{
" statusCode " : " 200 " ,
" selectionPattern " : " foobar " ,
" ResponseMetadata " : { " HTTPStatusCode " : 200 } ,
" responseTemplates " : { " application/json " : None } ,
" contentHandling " : " CONVERT_TO_BINARY " ,
}
)
response = client . get_integration_response (
restApiId = api_id , resourceId = root_id , httpMethod = " PUT " , statusCode = " 200 "
)
# this is hard to match against, so remove it
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response . should . equal (
{
" statusCode " : " 200 " ,
" selectionPattern " : " foobar " ,
" ResponseMetadata " : { " HTTPStatusCode " : 200 } ,
" responseTemplates " : { " application/json " : None } ,
" contentHandling " : " CONVERT_TO_BINARY " ,
}
)
2016-03-05 14:48:37 +00:00
2020-02-18 16:49:35 +00:00
@mock_apigateway
@mock_cognitoidp
def test_update_authorizer_configuration ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
authorizer_name = " my_authorizer "
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
cognito_client = boto3 . client ( " cognito-idp " , region_name = " us-west-2 " )
user_pool_arn = cognito_client . create_user_pool ( PoolName = " my_cognito_pool " ) [
" UserPool "
] [ " Arn " ]
response = client . create_authorizer (
restApiId = api_id ,
name = authorizer_name ,
type = " COGNITO_USER_POOLS " ,
providerARNs = [ user_pool_arn ] ,
identitySource = " method.request.header.Authorization " ,
)
authorizer_id = response [ " id " ]
response = client . get_authorizer ( restApiId = api_id , authorizerId = authorizer_id )
# createdDate is hard to match against, remove it
response . pop ( " createdDate " , None )
# this is hard to match against, so remove it
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response . should . equal (
{
" id " : authorizer_id ,
" name " : authorizer_name ,
" type " : " COGNITO_USER_POOLS " ,
" providerARNs " : [ user_pool_arn ] ,
" identitySource " : " method.request.header.Authorization " ,
" authorizerResultTtlInSeconds " : 300 ,
" ResponseMetadata " : { " HTTPStatusCode " : 200 } ,
}
)
client . update_authorizer (
restApiId = api_id ,
authorizerId = authorizer_id ,
patchOperations = [ { " op " : " replace " , " path " : " /type " , " value " : " TOKEN " } ] ,
)
authorizer = client . get_authorizer ( restApiId = api_id , authorizerId = authorizer_id )
authorizer . should . have . key ( " type " ) . which . should . equal ( " TOKEN " )
client . update_authorizer (
restApiId = api_id ,
authorizerId = authorizer_id ,
patchOperations = [ { " op " : " replace " , " path " : " /type " , " value " : " REQUEST " } ] ,
)
authorizer = client . get_authorizer ( restApiId = api_id , authorizerId = authorizer_id )
authorizer . should . have . key ( " type " ) . which . should . equal ( " REQUEST " )
# TODO: implement mult-update tests
try :
client . update_authorizer (
restApiId = api_id ,
authorizerId = authorizer_id ,
patchOperations = [
{ " op " : " add " , " path " : " /notasetting " , " value " : " eu-west-1 " }
] ,
)
assert False . should . be . ok # Fail, should not be here
except Exception :
assert True . should . be . ok
@mock_apigateway
def test_non_existent_authorizer ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
client . get_authorizer . when . called_with (
restApiId = api_id , authorizerId = " xxx "
) . should . throw ( ClientError )
@mock_apigateway
@mock_cognitoidp
def test_create_authorizer ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
authorizer_name = " my_authorizer "
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
cognito_client = boto3 . client ( " cognito-idp " , region_name = " us-west-2 " )
user_pool_arn = cognito_client . create_user_pool ( PoolName = " my_cognito_pool " ) [
" UserPool "
] [ " Arn " ]
response = client . create_authorizer (
restApiId = api_id ,
name = authorizer_name ,
type = " COGNITO_USER_POOLS " ,
providerARNs = [ user_pool_arn ] ,
identitySource = " method.request.header.Authorization " ,
)
authorizer_id = response [ " id " ]
response = client . get_authorizer ( restApiId = api_id , authorizerId = authorizer_id )
# createdDate is hard to match against, remove it
response . pop ( " createdDate " , None )
# this is hard to match against, so remove it
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response . should . equal (
{
" id " : authorizer_id ,
" name " : authorizer_name ,
" type " : " COGNITO_USER_POOLS " ,
" providerARNs " : [ user_pool_arn ] ,
" identitySource " : " method.request.header.Authorization " ,
" authorizerResultTtlInSeconds " : 300 ,
" ResponseMetadata " : { " HTTPStatusCode " : 200 } ,
}
)
authorizer_name2 = " my_authorizer2 "
response = client . create_authorizer (
restApiId = api_id ,
name = authorizer_name2 ,
type = " COGNITO_USER_POOLS " ,
providerARNs = [ user_pool_arn ] ,
identitySource = " method.request.header.Authorization " ,
)
authorizer_id2 = response [ " id " ]
response = client . get_authorizers ( restApiId = api_id )
# this is hard to match against, so remove it
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response [ " items " ] [ 0 ] [ " id " ] . should . match (
r " {0} | {1} " . format ( authorizer_id2 , authorizer_id )
)
response [ " items " ] [ 1 ] [ " id " ] . should . match (
r " {0} | {1} " . format ( authorizer_id2 , authorizer_id )
)
new_authorizer_name_with_vars = " authorizer_with_vars "
response = client . create_authorizer (
restApiId = api_id ,
name = new_authorizer_name_with_vars ,
type = " COGNITO_USER_POOLS " ,
providerARNs = [ user_pool_arn ] ,
identitySource = " method.request.header.Authorization " ,
)
authorizer_id3 = response [ " id " ]
# this is hard to match against, so remove it
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response . should . equal (
{
" name " : new_authorizer_name_with_vars ,
" id " : authorizer_id3 ,
" type " : " COGNITO_USER_POOLS " ,
" providerARNs " : [ user_pool_arn ] ,
" identitySource " : " method.request.header.Authorization " ,
" authorizerResultTtlInSeconds " : 300 ,
" ResponseMetadata " : { " HTTPStatusCode " : 200 } ,
}
)
stage = client . get_authorizer ( restApiId = api_id , authorizerId = authorizer_id3 )
stage [ " name " ] . should . equal ( new_authorizer_name_with_vars )
stage [ " id " ] . should . equal ( authorizer_id3 )
stage [ " type " ] . should . equal ( " COGNITO_USER_POOLS " )
stage [ " providerARNs " ] . should . equal ( [ user_pool_arn ] )
stage [ " identitySource " ] . should . equal ( " method.request.header.Authorization " )
stage [ " authorizerResultTtlInSeconds " ] . should . equal ( 300 )
@mock_apigateway
@mock_cognitoidp
def test_delete_authorizer ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
authorizer_name = " my_authorizer "
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
cognito_client = boto3 . client ( " cognito-idp " , region_name = " us-west-2 " )
user_pool_arn = cognito_client . create_user_pool ( PoolName = " my_cognito_pool " ) [
" UserPool "
] [ " Arn " ]
response = client . create_authorizer (
restApiId = api_id ,
name = authorizer_name ,
type = " COGNITO_USER_POOLS " ,
providerARNs = [ user_pool_arn ] ,
identitySource = " method.request.header.Authorization " ,
)
authorizer_id = response [ " id " ]
response = client . get_authorizer ( restApiId = api_id , authorizerId = authorizer_id )
# createdDate is hard to match against, remove it
response . pop ( " createdDate " , None )
# this is hard to match against, so remove it
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response . should . equal (
{
" id " : authorizer_id ,
" name " : authorizer_name ,
" type " : " COGNITO_USER_POOLS " ,
" providerARNs " : [ user_pool_arn ] ,
" identitySource " : " method.request.header.Authorization " ,
" authorizerResultTtlInSeconds " : 300 ,
" ResponseMetadata " : { " HTTPStatusCode " : 200 } ,
}
)
authorizer_name2 = " my_authorizer2 "
response = client . create_authorizer (
restApiId = api_id ,
name = authorizer_name2 ,
type = " COGNITO_USER_POOLS " ,
providerARNs = [ user_pool_arn ] ,
identitySource = " method.request.header.Authorization " ,
)
authorizer_id2 = response [ " id " ]
authorizers = client . get_authorizers ( restApiId = api_id ) [ " items " ]
sorted ( [ authorizer [ " name " ] for authorizer in authorizers ] ) . should . equal (
sorted ( [ authorizer_name2 , authorizer_name ] )
)
# delete stage
response = client . delete_authorizer ( restApiId = api_id , authorizerId = authorizer_id2 )
response [ " ResponseMetadata " ] [ " HTTPStatusCode " ] . should . equal ( 202 )
# verify other stage still exists
authorizers = client . get_authorizers ( restApiId = api_id ) [ " items " ]
sorted ( [ authorizer [ " name " ] for authorizer in authorizers ] ) . should . equal (
sorted ( [ authorizer_name ] )
)
2016-09-13 11:44:17 +00:00
@mock_apigateway
def test_update_stage_configuration ( ) :
2019-10-31 15:44:26 +00:00
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
stage_name = " staging "
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
2019-11-04 09:12:24 +00:00
create_method_integration ( client , api_id )
2016-09-13 11:44:17 +00:00
response = client . create_deployment (
2019-10-31 15:44:26 +00:00
restApiId = api_id , stageName = stage_name , description = " 1.0.1 "
2016-09-13 11:44:17 +00:00
)
2019-10-31 15:44:26 +00:00
deployment_id = response [ " id " ]
2016-09-13 11:44:17 +00:00
2019-10-31 15:44:26 +00:00
response = client . get_deployment ( restApiId = api_id , deploymentId = deployment_id )
2017-02-24 02:37:43 +00:00
# createdDate is hard to match against, remove it
2019-10-31 15:44:26 +00:00
response . pop ( " createdDate " , None )
2017-02-24 02:37:43 +00:00
# this is hard to match against, so remove it
2019-10-31 15:44:26 +00:00
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response . should . equal (
{
" id " : deployment_id ,
" ResponseMetadata " : { " HTTPStatusCode " : 200 } ,
" description " : " 1.0.1 " ,
}
)
2016-09-13 11:44:17 +00:00
response = client . create_deployment (
2019-10-31 15:44:26 +00:00
restApiId = api_id , stageName = stage_name , description = " 1.0.2 "
2017-02-24 02:37:43 +00:00
)
2019-10-31 15:44:26 +00:00
deployment_id2 = response [ " id " ]
stage = client . get_stage ( restApiId = api_id , stageName = stage_name )
stage [ " stageName " ] . should . equal ( stage_name )
stage [ " deploymentId " ] . should . equal ( deployment_id2 )
stage . shouldnt . have . key ( " cacheClusterSize " )
2016-09-13 11:44:17 +00:00
2019-10-31 15:44:26 +00:00
client . update_stage (
2016-09-13 11:44:17 +00:00
restApiId = api_id ,
2019-10-31 15:44:26 +00:00
stageName = stage_name ,
patchOperations = [
{ " op " : " replace " , " path " : " /cacheClusterEnabled " , " value " : " True " }
] ,
2016-09-13 11:44:17 +00:00
)
2019-10-31 15:44:26 +00:00
stage = client . get_stage ( restApiId = api_id , stageName = stage_name )
stage . should . have . key ( " cacheClusterSize " ) . which . should . equal ( " 0.5 " )
client . update_stage (
2016-09-14 09:04:51 +00:00
restApiId = api_id ,
2019-10-31 15:44:26 +00:00
stageName = stage_name ,
patchOperations = [
{ " op " : " replace " , " path " : " /cacheClusterSize " , " value " : " 1.6 " }
] ,
2016-09-14 09:04:51 +00:00
)
2019-10-31 15:44:26 +00:00
stage = client . get_stage ( restApiId = api_id , stageName = stage_name )
2016-09-14 09:04:51 +00:00
2019-10-31 15:44:26 +00:00
stage . should . have . key ( " cacheClusterSize " ) . which . should . equal ( " 1.6 " )
2016-09-14 09:04:51 +00:00
2019-10-31 15:44:26 +00:00
client . update_stage (
2016-09-14 09:04:51 +00:00
restApiId = api_id ,
2019-10-31 15:44:26 +00:00
stageName = stage_name ,
patchOperations = [
{ " op " : " replace " , " path " : " /deploymentId " , " value " : deployment_id } ,
{ " op " : " replace " , " path " : " /variables/environment " , " value " : " dev " } ,
{ " op " : " replace " , " path " : " /variables/region " , " value " : " eu-west-1 " } ,
{ " op " : " replace " , " path " : " /*/*/caching/dataEncrypted " , " value " : " True " } ,
{ " op " : " replace " , " path " : " /cacheClusterEnabled " , " value " : " True " } ,
{
" op " : " replace " ,
" path " : " /description " ,
" value " : " stage description update " ,
} ,
{ " op " : " replace " , " path " : " /cacheClusterSize " , " value " : " 1.6 " } ,
] ,
2016-09-14 09:04:51 +00:00
)
2019-10-31 15:44:26 +00:00
client . update_stage (
restApiId = api_id ,
stageName = stage_name ,
patchOperations = [
{ " op " : " remove " , " path " : " /variables/region " , " value " : " eu-west-1 " }
] ,
)
2016-09-13 11:44:17 +00:00
2017-02-24 02:37:43 +00:00
stage = client . get_stage ( restApiId = api_id , stageName = stage_name )
2016-09-13 11:44:17 +00:00
2019-10-31 15:44:26 +00:00
stage [ " description " ] . should . match ( " stage description update " )
stage [ " cacheClusterSize " ] . should . equal ( " 1.6 " )
stage [ " variables " ] [ " environment " ] . should . match ( " dev " )
stage [ " variables " ] . should_not . have . key ( " region " )
stage [ " cacheClusterEnabled " ] . should . be . true
stage [ " deploymentId " ] . should . match ( deployment_id )
stage [ " methodSettings " ] . should . have . key ( " */* " )
stage [ " methodSettings " ] [ " */* " ] . should . have . key (
" cacheDataEncrypted "
) . which . should . be . true
2016-09-13 11:44:17 +00:00
try :
2019-10-31 15:44:26 +00:00
client . update_stage (
restApiId = api_id ,
stageName = stage_name ,
patchOperations = [
{ " op " : " add " , " path " : " /notasetting " , " value " : " eu-west-1 " }
] ,
)
2017-02-24 02:37:43 +00:00
assert False . should . be . ok # Fail, should not be here
2016-09-13 11:44:17 +00:00
except Exception :
assert True . should . be . ok
2017-02-24 02:37:43 +00:00
2016-09-13 11:44:17 +00:00
@mock_apigateway
def test_non_existent_stage ( ) :
2019-10-31 15:44:26 +00:00
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
2016-09-13 11:44:17 +00:00
2019-10-31 15:44:26 +00:00
client . get_stage . when . called_with ( restApiId = api_id , stageName = " xxx " ) . should . throw (
ClientError
)
2016-09-13 11:44:17 +00:00
@mock_apigateway
def test_create_stage ( ) :
2019-10-31 15:44:26 +00:00
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
stage_name = " staging "
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
2016-09-13 11:44:17 +00:00
2019-11-04 09:12:24 +00:00
create_method_integration ( client , api_id )
2019-11-21 22:53:58 +00:00
response = client . create_deployment ( restApiId = api_id , stageName = stage_name )
2019-10-31 15:44:26 +00:00
deployment_id = response [ " id " ]
2016-09-13 11:44:17 +00:00
2019-10-31 15:44:26 +00:00
response = client . get_deployment ( restApiId = api_id , deploymentId = deployment_id )
2017-02-24 02:37:43 +00:00
# createdDate is hard to match against, remove it
2019-10-31 15:44:26 +00:00
response . pop ( " createdDate " , None )
2017-02-24 02:37:43 +00:00
# this is hard to match against, so remove it
2019-10-31 15:44:26 +00:00
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response . should . equal (
{
" id " : deployment_id ,
" ResponseMetadata " : { " HTTPStatusCode " : 200 } ,
" description " : " " ,
}
2016-09-13 11:44:17 +00:00
)
2019-10-31 15:44:26 +00:00
response = client . create_deployment ( restApiId = api_id , stageName = stage_name )
2016-09-13 11:44:17 +00:00
2019-10-31 15:44:26 +00:00
deployment_id2 = response [ " id " ]
response = client . get_deployments ( restApiId = api_id )
2016-09-13 11:44:17 +00:00
2017-02-24 02:37:43 +00:00
# this is hard to match against, so remove it
2019-10-31 15:44:26 +00:00
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
2016-09-13 11:44:17 +00:00
2019-10-31 15:44:26 +00:00
response [ " items " ] [ 0 ] . pop ( " createdDate " )
response [ " items " ] [ 1 ] . pop ( " createdDate " )
response [ " items " ] [ 0 ] [ " id " ] . should . match (
r " {0} | {1} " . format ( deployment_id2 , deployment_id )
)
response [ " items " ] [ 1 ] [ " id " ] . should . match (
r " {0} | {1} " . format ( deployment_id2 , deployment_id )
)
2016-09-13 11:44:17 +00:00
2019-10-31 15:44:26 +00:00
new_stage_name = " current "
2017-02-24 02:37:43 +00:00
response = client . create_stage (
2019-10-31 15:44:26 +00:00
restApiId = api_id , stageName = new_stage_name , deploymentId = deployment_id2
)
2016-09-13 11:44:17 +00:00
2017-02-24 02:37:43 +00:00
# this is hard to match against, so remove it
2019-10-31 15:44:26 +00:00
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response . should . equal (
{
" stageName " : new_stage_name ,
" deploymentId " : deployment_id2 ,
" methodSettings " : { } ,
" variables " : { } ,
" ResponseMetadata " : { " HTTPStatusCode " : 200 } ,
" description " : " " ,
" cacheClusterEnabled " : False ,
}
2016-09-14 09:04:51 +00:00
)
2019-10-31 15:44:26 +00:00
stage = client . get_stage ( restApiId = api_id , stageName = new_stage_name )
stage [ " stageName " ] . should . equal ( new_stage_name )
stage [ " deploymentId " ] . should . equal ( deployment_id2 )
2016-09-13 11:44:17 +00:00
2019-10-31 15:44:26 +00:00
new_stage_name_with_vars = " stage_with_vars "
response = client . create_stage (
2016-09-13 11:44:17 +00:00
restApiId = api_id ,
2019-10-31 15:44:26 +00:00
stageName = new_stage_name_with_vars ,
deploymentId = deployment_id2 ,
variables = { " env " : " dev " } ,
2016-09-13 11:44:17 +00:00
)
2016-09-14 09:04:51 +00:00
2017-02-24 02:37:43 +00:00
# this is hard to match against, so remove it
2019-10-31 15:44:26 +00:00
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response . should . equal (
{
" stageName " : new_stage_name_with_vars ,
" deploymentId " : deployment_id2 ,
" methodSettings " : { } ,
" variables " : { " env " : " dev " } ,
" ResponseMetadata " : { " HTTPStatusCode " : 200 } ,
" description " : " " ,
" cacheClusterEnabled " : False ,
}
2016-09-13 11:44:17 +00:00
)
2016-09-14 09:04:51 +00:00
2019-10-31 15:44:26 +00:00
stage = client . get_stage ( restApiId = api_id , stageName = new_stage_name_with_vars )
stage [ " stageName " ] . should . equal ( new_stage_name_with_vars )
stage [ " deploymentId " ] . should . equal ( deployment_id2 )
stage [ " variables " ] . should . have . key ( " env " ) . which . should . match ( " dev " )
2016-09-14 09:04:51 +00:00
2019-10-31 15:44:26 +00:00
new_stage_name = " stage_with_vars_and_cache_settings "
response = client . create_stage (
restApiId = api_id ,
stageName = new_stage_name ,
deploymentId = deployment_id2 ,
variables = { " env " : " dev " } ,
cacheClusterEnabled = True ,
description = " hello moto " ,
)
2016-09-14 09:04:51 +00:00
2017-02-24 02:37:43 +00:00
# this is hard to match against, so remove it
2019-10-31 15:44:26 +00:00
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response . should . equal (
{
" stageName " : new_stage_name ,
" deploymentId " : deployment_id2 ,
" methodSettings " : { } ,
" variables " : { " env " : " dev " } ,
" ResponseMetadata " : { " HTTPStatusCode " : 200 } ,
" description " : " hello moto " ,
" cacheClusterEnabled " : True ,
" cacheClusterSize " : " 0.5 " ,
}
2016-09-14 09:04:51 +00:00
)
2016-09-13 11:44:17 +00:00
2019-10-31 15:44:26 +00:00
stage = client . get_stage ( restApiId = api_id , stageName = new_stage_name )
2016-09-13 11:44:17 +00:00
2019-10-31 15:44:26 +00:00
stage [ " cacheClusterSize " ] . should . equal ( " 0.5 " )
2016-03-04 23:35:03 +00:00
2019-10-31 15:44:26 +00:00
new_stage_name = " stage_with_vars_and_cache_settings_and_size "
response = client . create_stage (
2016-03-04 23:35:03 +00:00
restApiId = api_id ,
2019-10-31 15:44:26 +00:00
stageName = new_stage_name ,
deploymentId = deployment_id2 ,
variables = { " env " : " dev " } ,
cacheClusterEnabled = True ,
cacheClusterSize = " 1.6 " ,
description = " hello moto " ,
2016-03-04 23:35:03 +00:00
)
2019-10-31 15:44:26 +00:00
# this is hard to match against, so remove it
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response . should . equal (
{
" stageName " : new_stage_name ,
" deploymentId " : deployment_id2 ,
" methodSettings " : { } ,
" variables " : { " env " : " dev " } ,
" ResponseMetadata " : { " HTTPStatusCode " : 200 } ,
" description " : " hello moto " ,
" cacheClusterEnabled " : True ,
" cacheClusterSize " : " 1.6 " ,
}
2016-03-04 23:35:03 +00:00
)
2019-10-31 15:44:26 +00:00
stage = client . get_stage ( restApiId = api_id , stageName = new_stage_name )
stage [ " stageName " ] . should . equal ( new_stage_name )
stage [ " deploymentId " ] . should . equal ( deployment_id2 )
stage [ " variables " ] . should . have . key ( " env " ) . which . should . match ( " dev " )
stage [ " cacheClusterSize " ] . should . equal ( " 1.6 " )
2019-11-04 09:12:24 +00:00
@mock_apigateway
def test_create_deployment_requires_REST_methods ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
stage_name = " staging "
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
2020-10-06 05:54:49 +00:00
with pytest . raises ( ClientError ) as ex :
2019-11-04 09:12:24 +00:00
client . create_deployment ( restApiId = api_id , stageName = stage_name ) [ " id " ]
2020-10-06 06:04:09 +00:00
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " BadRequestException " )
ex . value . response [ " Error " ] [ " Message " ] . should . equal (
2019-11-04 09:12:24 +00:00
" The REST API doesn ' t contain any methods "
)
@mock_apigateway
def test_create_deployment_requires_REST_method_integrations ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
stage_name = " staging "
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
resources = client . get_resources ( restApiId = api_id )
root_id = [ resource for resource in resources [ " items " ] if resource [ " path " ] == " / " ] [
0
] [ " id " ]
client . put_method (
restApiId = api_id , resourceId = root_id , httpMethod = " GET " , authorizationType = " NONE "
)
2020-10-06 05:54:49 +00:00
with pytest . raises ( ClientError ) as ex :
2019-11-04 09:12:24 +00:00
client . create_deployment ( restApiId = api_id , stageName = stage_name ) [ " id " ]
2020-10-06 06:04:09 +00:00
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " BadRequestException " )
ex . value . response [ " Error " ] [ " Message " ] . should . equal (
2019-11-04 09:12:24 +00:00
" No integration defined for method "
)
@mock_apigateway
def test_create_simple_deployment_with_get_method ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
stage_name = " staging "
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
create_method_integration ( client , api_id )
deployment = client . create_deployment ( restApiId = api_id , stageName = stage_name )
assert " id " in deployment
@mock_apigateway
def test_create_simple_deployment_with_post_method ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
stage_name = " staging "
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
create_method_integration ( client , api_id , httpMethod = " POST " )
deployment = client . create_deployment ( restApiId = api_id , stageName = stage_name )
assert " id " in deployment
@mock_apigateway
# https://github.com/aws/aws-sdk-js/issues/2588
def test_put_integration_response_requires_responseTemplate ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
resources = client . get_resources ( restApiId = api_id )
root_id = [ resource for resource in resources [ " items " ] if resource [ " path " ] == " / " ] [
0
] [ " id " ]
client . put_method (
restApiId = api_id , resourceId = root_id , httpMethod = " GET " , authorizationType = " NONE "
)
client . put_method_response (
restApiId = api_id , resourceId = root_id , httpMethod = " GET " , statusCode = " 200 "
)
client . put_integration (
restApiId = api_id ,
resourceId = root_id ,
httpMethod = " GET " ,
type = " HTTP " ,
uri = " http://httpbin.org/robots.txt " ,
integrationHttpMethod = " POST " ,
)
2020-10-06 05:54:49 +00:00
with pytest . raises ( ClientError ) as ex :
2019-11-04 09:12:24 +00:00
client . put_integration_response (
restApiId = api_id , resourceId = root_id , httpMethod = " GET " , statusCode = " 200 "
)
2020-10-06 06:04:09 +00:00
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " BadRequestException " )
ex . value . response [ " Error " ] [ " Message " ] . should . equal ( " Invalid request input " )
2021-05-01 14:45:06 +00:00
2019-11-04 09:12:24 +00:00
# Works fine if responseTemplate is defined
client . put_integration_response (
restApiId = api_id ,
2019-11-04 09:41:47 +00:00
resourceId = root_id ,
2019-11-04 09:12:24 +00:00
httpMethod = " GET " ,
statusCode = " 200 " ,
responseTemplates = { } ,
)
2020-05-04 08:27:57 +00:00
2020-05-03 03:01:46 +00:00
@mock_apigateway
def test_put_integration_response_with_response_template ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
resources = client . get_resources ( restApiId = api_id )
root_id = [ resource for resource in resources [ " items " ] if resource [ " path " ] == " / " ] [
0
] [ " id " ]
client . put_method (
restApiId = api_id , resourceId = root_id , httpMethod = " GET " , authorizationType = " NONE "
)
client . put_method_response (
restApiId = api_id , resourceId = root_id , httpMethod = " GET " , statusCode = " 200 "
)
client . put_integration (
restApiId = api_id ,
resourceId = root_id ,
httpMethod = " GET " ,
type = " HTTP " ,
uri = " http://httpbin.org/robots.txt " ,
integrationHttpMethod = " POST " ,
)
2020-10-06 05:54:49 +00:00
with pytest . raises ( ClientError ) as ex :
2020-05-03 03:01:46 +00:00
client . put_integration_response (
restApiId = api_id , resourceId = root_id , httpMethod = " GET " , statusCode = " 200 "
)
2020-10-06 06:04:09 +00:00
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " BadRequestException " )
ex . value . response [ " Error " ] [ " Message " ] . should . equal ( " Invalid request input " )
2020-05-03 03:01:46 +00:00
client . put_integration_response (
restApiId = api_id ,
resourceId = root_id ,
httpMethod = " GET " ,
statusCode = " 200 " ,
2020-05-04 08:27:57 +00:00
selectionPattern = " foobar " ,
responseTemplates = { " application/json " : json . dumps ( { " data " : " test " } ) } ,
)
2020-05-03 03:01:46 +00:00
response = client . get_integration_response (
restApiId = api_id , resourceId = root_id , httpMethod = " GET " , statusCode = " 200 "
)
# this is hard to match against, so remove it
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response . should . equal (
{
" statusCode " : " 200 " ,
" selectionPattern " : " foobar " ,
" ResponseMetadata " : { " HTTPStatusCode " : 200 } ,
2020-05-04 08:27:57 +00:00
" responseTemplates " : { " application/json " : json . dumps ( { " data " : " test " } ) } ,
2020-05-03 03:01:46 +00:00
}
)
2019-11-04 09:12:24 +00:00
2020-05-04 08:27:57 +00:00
2019-11-04 09:12:24 +00:00
@mock_apigateway
def test_put_integration_validation ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
resources = client . get_resources ( restApiId = api_id )
root_id = [ resource for resource in resources [ " items " ] if resource [ " path " ] == " / " ] [
0
] [ " id " ]
client . put_method (
restApiId = api_id , resourceId = root_id , httpMethod = " GET " , authorizationType = " NONE "
)
client . put_method_response (
restApiId = api_id , resourceId = root_id , httpMethod = " GET " , statusCode = " 200 "
)
http_types = [ " HTTP " , " HTTP_PROXY " ]
aws_types = [ " AWS " , " AWS_PROXY " ]
types_requiring_integration_method = http_types + aws_types
types_not_requiring_integration_method = [ " MOCK " ]
for type in types_requiring_integration_method :
# Ensure that integrations of these types fail if no integrationHttpMethod is provided
2020-10-06 05:54:49 +00:00
with pytest . raises ( ClientError ) as ex :
2019-11-04 09:12:24 +00:00
client . put_integration (
restApiId = api_id ,
resourceId = root_id ,
httpMethod = " GET " ,
type = type ,
uri = " http://httpbin.org/robots.txt " ,
)
2020-10-06 06:04:09 +00:00
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " BadRequestException " )
ex . value . response [ " Error " ] [ " Message " ] . should . equal (
2019-11-04 09:12:24 +00:00
" Enumeration value for HttpMethod must be non-empty "
)
for type in types_not_requiring_integration_method :
# Ensure that integrations of these types do not need the integrationHttpMethod
client . put_integration (
restApiId = api_id ,
resourceId = root_id ,
httpMethod = " GET " ,
type = type ,
uri = " http://httpbin.org/robots.txt " ,
)
for type in http_types :
# Ensure that it works fine when providing the integrationHttpMethod-argument
client . put_integration (
restApiId = api_id ,
resourceId = root_id ,
httpMethod = " GET " ,
type = type ,
uri = " http://httpbin.org/robots.txt " ,
integrationHttpMethod = " POST " ,
)
for type in [ " AWS " ] :
# Ensure that it works fine when providing the integrationHttpMethod + credentials
client . put_integration (
restApiId = api_id ,
resourceId = root_id ,
2019-12-17 02:25:20 +00:00
credentials = " arn:aws:iam:: {} :role/service-role/testfunction-role-oe783psq " . format (
ACCOUNT_ID
) ,
2019-11-04 09:12:24 +00:00
httpMethod = " GET " ,
type = type ,
uri = " arn:aws:apigateway:us-west-2:s3:path/b/k " ,
integrationHttpMethod = " POST " ,
)
for type in aws_types :
# Ensure that credentials are not required when URI points to a Lambda stream
client . put_integration (
restApiId = api_id ,
resourceId = root_id ,
httpMethod = " GET " ,
type = type ,
uri = " arn:aws:apigateway:eu-west-1:lambda:path/2015-03-31/functions/arn:aws:lambda:eu-west-1:012345678901:function:MyLambda/invocations " ,
integrationHttpMethod = " POST " ,
)
for type in [ " AWS_PROXY " ] :
# Ensure that aws_proxy does not support S3
2020-10-06 05:54:49 +00:00
with pytest . raises ( ClientError ) as ex :
2019-11-04 09:12:24 +00:00
client . put_integration (
restApiId = api_id ,
resourceId = root_id ,
2019-12-17 02:25:20 +00:00
credentials = " arn:aws:iam:: {} :role/service-role/testfunction-role-oe783psq " . format (
ACCOUNT_ID
) ,
2019-11-04 09:12:24 +00:00
httpMethod = " GET " ,
type = type ,
uri = " arn:aws:apigateway:us-west-2:s3:path/b/k " ,
integrationHttpMethod = " POST " ,
)
2020-10-06 06:04:09 +00:00
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " BadRequestException " )
ex . value . response [ " Error " ] [ " Message " ] . should . equal (
2019-11-04 09:12:24 +00:00
" Integrations of type ' AWS_PROXY ' currently only supports Lambda function and Firehose stream invocations. "
)
for type in aws_types :
# Ensure that the Role ARN is for the current account
2020-10-06 05:54:49 +00:00
with pytest . raises ( ClientError ) as ex :
2019-11-04 09:12:24 +00:00
client . put_integration (
restApiId = api_id ,
resourceId = root_id ,
credentials = " arn:aws:iam::000000000000:role/service-role/testrole " ,
httpMethod = " GET " ,
type = type ,
uri = " arn:aws:apigateway:us-west-2:s3:path/b/k " ,
integrationHttpMethod = " POST " ,
)
2020-10-06 06:04:09 +00:00
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " AccessDeniedException " )
ex . value . response [ " Error " ] [ " Message " ] . should . equal (
2019-11-04 09:12:24 +00:00
" Cross-account pass role is not allowed. "
)
for type in [ " AWS " ] :
# Ensure that the Role ARN is specified for aws integrations
2020-10-06 05:54:49 +00:00
with pytest . raises ( ClientError ) as ex :
2019-11-04 09:12:24 +00:00
client . put_integration (
restApiId = api_id ,
resourceId = root_id ,
httpMethod = " GET " ,
type = type ,
uri = " arn:aws:apigateway:us-west-2:s3:path/b/k " ,
integrationHttpMethod = " POST " ,
)
2020-10-06 06:04:09 +00:00
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " BadRequestException " )
ex . value . response [ " Error " ] [ " Message " ] . should . equal (
2019-11-04 09:12:24 +00:00
" Role ARN must be specified for AWS integrations "
)
for type in http_types :
# Ensure that the URI is valid HTTP
2020-10-06 05:54:49 +00:00
with pytest . raises ( ClientError ) as ex :
2019-11-04 09:12:24 +00:00
client . put_integration (
restApiId = api_id ,
resourceId = root_id ,
httpMethod = " GET " ,
type = type ,
uri = " non-valid-http " ,
integrationHttpMethod = " POST " ,
)
2020-10-06 06:04:09 +00:00
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " BadRequestException " )
ex . value . response [ " Error " ] [ " Message " ] . should . equal (
2019-11-04 09:12:24 +00:00
" Invalid HTTP endpoint specified for URI "
)
for type in aws_types :
# Ensure that the URI is an ARN
2020-10-06 05:54:49 +00:00
with pytest . raises ( ClientError ) as ex :
2019-11-04 09:12:24 +00:00
client . put_integration (
restApiId = api_id ,
resourceId = root_id ,
httpMethod = " GET " ,
type = type ,
uri = " non-valid-arn " ,
integrationHttpMethod = " POST " ,
)
2020-10-06 06:04:09 +00:00
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " BadRequestException " )
ex . value . response [ " Error " ] [ " Message " ] . should . equal (
2019-11-04 09:12:24 +00:00
" Invalid ARN specified in the request "
)
for type in aws_types :
# Ensure that the URI is a valid ARN
2020-10-06 05:54:49 +00:00
with pytest . raises ( ClientError ) as ex :
2019-11-04 09:12:24 +00:00
client . put_integration (
restApiId = api_id ,
resourceId = root_id ,
httpMethod = " GET " ,
type = type ,
uri = " arn:aws:iam::0000000000:role/service-role/asdf " ,
integrationHttpMethod = " POST " ,
)
2020-10-06 06:04:09 +00:00
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " BadRequestException " )
ex . value . response [ " Error " ] [ " Message " ] . should . equal (
2019-11-04 09:12:24 +00:00
" AWS ARN for integration must contain path or action "
)
@mock_apigateway
def test_delete_stage ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
stage_name = " staging "
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
create_method_integration ( client , api_id )
deployment_id1 = client . create_deployment ( restApiId = api_id , stageName = stage_name ) [
" id "
]
deployment_id2 = client . create_deployment ( restApiId = api_id , stageName = stage_name ) [
" id "
]
new_stage_name = " current "
client . create_stage (
restApiId = api_id , stageName = new_stage_name , deploymentId = deployment_id1
)
new_stage_name_with_vars = " stage_with_vars "
client . create_stage (
restApiId = api_id ,
stageName = new_stage_name_with_vars ,
deploymentId = deployment_id2 ,
variables = { " env " : " dev " } ,
)
stages = client . get_stages ( restApiId = api_id ) [ " item " ]
2019-11-04 09:41:47 +00:00
sorted ( [ stage [ " stageName " ] for stage in stages ] ) . should . equal (
sorted ( [ new_stage_name , new_stage_name_with_vars , stage_name ] )
2019-11-04 09:12:24 +00:00
)
# delete stage
response = client . delete_stage ( restApiId = api_id , stageName = new_stage_name_with_vars )
response [ " ResponseMetadata " ] [ " HTTPStatusCode " ] . should . equal ( 202 )
# verify other stage still exists
stages = client . get_stages ( restApiId = api_id ) [ " item " ]
2019-11-04 10:02:07 +00:00
sorted ( [ stage [ " stageName " ] for stage in stages ] ) . should . equal (
sorted ( [ new_stage_name , stage_name ] )
)
2019-11-04 09:12:24 +00:00
2019-10-31 15:44:26 +00:00
@mock_apigateway
def test_deployment ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
stage_name = " staging "
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
2019-11-04 09:12:24 +00:00
create_method_integration ( client , api_id )
2019-10-31 15:44:26 +00:00
response = client . create_deployment ( restApiId = api_id , stageName = stage_name )
deployment_id = response [ " id " ]
response = client . get_deployment ( restApiId = api_id , deploymentId = deployment_id )
2017-02-24 02:37:43 +00:00
# createdDate is hard to match against, remove it
2019-10-31 15:44:26 +00:00
response . pop ( " createdDate " , None )
2017-02-24 02:37:43 +00:00
# this is hard to match against, so remove it
2019-10-31 15:44:26 +00:00
response [ " ResponseMetadata " ] . pop ( " HTTPHeaders " , None )
response [ " ResponseMetadata " ] . pop ( " RetryAttempts " , None )
response . should . equal (
{
" id " : deployment_id ,
" ResponseMetadata " : { " HTTPStatusCode " : 200 } ,
" description " : " " ,
}
2016-03-04 23:35:03 +00:00
)
2016-09-13 11:44:17 +00:00
2019-10-31 15:44:26 +00:00
response = client . get_deployments ( restApiId = api_id )
2016-03-04 23:35:03 +00:00
2019-10-31 15:44:26 +00:00
response [ " items " ] [ 0 ] . pop ( " createdDate " )
response [ " items " ] . should . equal ( [ { " id " : deployment_id , " description " : " " } ] )
2016-03-04 23:35:03 +00:00
2019-11-04 09:12:24 +00:00
client . delete_deployment ( restApiId = api_id , deploymentId = deployment_id )
2019-10-31 15:44:26 +00:00
response = client . get_deployments ( restApiId = api_id )
len ( response [ " items " ] ) . should . equal ( 0 )
2016-03-05 15:54:19 +00:00
2016-08-11 06:14:13 +00:00
# test deployment stages
2019-10-31 15:44:26 +00:00
stage = client . get_stage ( restApiId = api_id , stageName = stage_name )
stage [ " stageName " ] . should . equal ( stage_name )
stage [ " deploymentId " ] . should . equal ( deployment_id )
2016-08-11 06:14:13 +00:00
2019-11-04 09:12:24 +00:00
client . update_stage (
2016-08-11 06:14:13 +00:00
restApiId = api_id ,
stageName = stage_name ,
patchOperations = [
2019-10-31 15:44:26 +00:00
{ " op " : " replace " , " path " : " /description " , " value " : " _new_description_ " }
] ,
2016-08-11 06:14:13 +00:00
)
2019-10-31 15:44:26 +00:00
stage = client . get_stage ( restApiId = api_id , stageName = stage_name )
stage [ " stageName " ] . should . equal ( stage_name )
stage [ " deploymentId " ] . should . equal ( deployment_id )
stage [ " description " ] . should . equal ( " _new_description_ " )
2016-08-11 06:14:13 +00:00
2016-03-05 15:54:19 +00:00
2020-04-07 21:48:42 +00:00
@mock_apigateway
def test_create_domain_names ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
domain_name = " testDomain "
test_certificate_name = " test.certificate "
test_certificate_private_key = " testPrivateKey "
2020-04-08 16:24:26 +00:00
# success case with valid params
2020-04-08 10:06:30 +00:00
response = client . create_domain_name (
domainName = domain_name ,
certificateName = test_certificate_name ,
certificatePrivateKey = test_certificate_private_key ,
)
2020-04-07 21:48:42 +00:00
response [ " domainName " ] . should . equal ( domain_name )
response [ " certificateName " ] . should . equal ( test_certificate_name )
2020-04-08 16:24:26 +00:00
# without domain name it should throw BadRequestException
2020-10-06 05:54:49 +00:00
with pytest . raises ( ClientError ) as ex :
2020-04-08 16:24:26 +00:00
client . create_domain_name ( domainName = " " )
2020-10-06 06:04:09 +00:00
ex . value . response [ " Error " ] [ " Message " ] . should . equal ( " No Domain Name specified " )
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " BadRequestException " )
2020-04-08 16:24:26 +00:00
@mock_apigateway
def test_get_domain_names ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
# without any domain names already present
result = client . get_domain_names ( )
result [ " items " ] . should . equal ( [ ] )
domain_name = " testDomain "
test_certificate_name = " test.certificate "
2020-04-09 07:12:44 +00:00
response = client . create_domain_name (
domainName = domain_name , certificateName = test_certificate_name
)
2020-04-08 16:24:26 +00:00
response [ " domainName " ] . should . equal ( domain_name )
response [ " certificateName " ] . should . equal ( test_certificate_name )
response [ " domainNameStatus " ] . should . equal ( " AVAILABLE " )
# after adding a new domain name
2020-04-07 21:48:42 +00:00
result = client . get_domain_names ( )
result [ " items " ] [ 0 ] [ " domainName " ] . should . equal ( domain_name )
2020-04-08 16:24:26 +00:00
result [ " items " ] [ 0 ] [ " certificateName " ] . should . equal ( test_certificate_name )
result [ " items " ] [ 0 ] [ " domainNameStatus " ] . should . equal ( " AVAILABLE " )
@mock_apigateway
def test_get_domain_name ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
domain_name = " testDomain "
# quering an invalid domain name which is not present
2020-10-06 05:54:49 +00:00
with pytest . raises ( ClientError ) as ex :
2020-04-08 16:24:26 +00:00
client . get_domain_name ( domainName = domain_name )
2020-10-06 06:46:05 +00:00
ex . value . response [ " Error " ] [ " Message " ] . should . equal ( " Invalid Domain Name specified " )
2020-10-06 06:04:09 +00:00
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " NotFoundException " )
2020-04-08 16:24:26 +00:00
# adding a domain name
client . create_domain_name ( domainName = domain_name )
# retrieving the data of added domain name.
2020-04-07 21:48:42 +00:00
result = client . get_domain_name ( domainName = domain_name )
result [ " domainName " ] . should . equal ( domain_name )
2020-04-08 16:24:26 +00:00
result [ " domainNameStatus " ] . should . equal ( " AVAILABLE " )
2020-04-07 21:48:42 +00:00
2020-04-12 12:19:22 +00:00
@mock_apigateway
def test_create_model ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
2020-04-14 07:06:00 +00:00
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
2020-04-12 12:19:22 +00:00
rest_api_id = response [ " id " ]
2020-04-14 07:06:00 +00:00
dummy_rest_api_id = " a12b3c4d "
2020-04-12 12:19:22 +00:00
model_name = " testModel "
description = " test model "
2020-04-14 07:06:00 +00:00
content_type = " application/json "
2020-04-12 12:19:22 +00:00
# success case with valid params
response = client . create_model (
restApiId = rest_api_id ,
name = model_name ,
description = description ,
2020-04-14 07:06:00 +00:00
contentType = content_type ,
2020-04-12 12:19:22 +00:00
)
response [ " name " ] . should . equal ( model_name )
response [ " description " ] . should . equal ( description )
# with an invalid rest_api_id it should throw NotFoundException
2020-10-06 05:54:49 +00:00
with pytest . raises ( ClientError ) as ex :
2020-04-14 07:06:00 +00:00
client . create_model (
2020-04-12 12:19:22 +00:00
restApiId = dummy_rest_api_id ,
name = model_name ,
description = description ,
2020-04-14 07:06:00 +00:00
contentType = content_type ,
2020-04-12 12:19:22 +00:00
)
2020-10-06 06:46:05 +00:00
ex . value . response [ " Error " ] [ " Message " ] . should . equal ( " Invalid Rest API Id specified " )
2020-10-06 06:04:09 +00:00
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " NotFoundException " )
2020-04-12 12:19:22 +00:00
2020-10-06 05:54:49 +00:00
with pytest . raises ( ClientError ) as ex :
2020-04-14 07:06:00 +00:00
client . create_model (
2020-04-12 12:19:22 +00:00
restApiId = rest_api_id ,
name = " " ,
description = description ,
2020-04-14 07:06:00 +00:00
contentType = content_type ,
2020-04-12 12:19:22 +00:00
)
2020-10-06 06:04:09 +00:00
ex . value . response [ " Error " ] [ " Message " ] . should . equal ( " No Model Name specified " )
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " BadRequestException " )
2020-04-12 12:19:22 +00:00
@mock_apigateway
def test_get_api_models ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
2020-04-14 07:06:00 +00:00
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
2020-04-12 12:19:22 +00:00
rest_api_id = response [ " id " ]
model_name = " testModel "
description = " test model "
2020-04-14 07:06:00 +00:00
content_type = " application/json "
2020-04-12 12:19:22 +00:00
# when no models are present
2020-04-14 07:06:00 +00:00
result = client . get_models ( restApiId = rest_api_id )
2020-04-12 12:19:22 +00:00
result [ " items " ] . should . equal ( [ ] )
# add a model
client . create_model (
restApiId = rest_api_id ,
name = model_name ,
description = description ,
2020-04-14 07:06:00 +00:00
contentType = content_type ,
2020-04-12 12:19:22 +00:00
)
# get models after adding
2020-04-14 07:06:00 +00:00
result = client . get_models ( restApiId = rest_api_id )
2020-04-12 12:19:22 +00:00
result [ " items " ] [ 0 ] [ " name " ] = model_name
result [ " items " ] [ 0 ] [ " description " ] = description
@mock_apigateway
def test_get_model_by_name ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
2020-04-14 07:06:00 +00:00
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
2020-04-12 12:19:22 +00:00
rest_api_id = response [ " id " ]
2020-04-14 07:06:00 +00:00
dummy_rest_api_id = " a12b3c4d "
2020-04-12 12:19:22 +00:00
model_name = " testModel "
description = " test model "
2020-04-14 07:06:00 +00:00
content_type = " application/json "
2020-04-12 12:19:22 +00:00
# add a model
client . create_model (
restApiId = rest_api_id ,
name = model_name ,
description = description ,
2020-04-14 07:06:00 +00:00
contentType = content_type ,
2020-04-12 12:19:22 +00:00
)
# get models after adding
2020-04-14 07:06:00 +00:00
result = client . get_model ( restApiId = rest_api_id , modelName = model_name )
2020-04-12 12:19:22 +00:00
result [ " name " ] = model_name
result [ " description " ] = description
2020-10-06 05:54:49 +00:00
with pytest . raises ( ClientError ) as ex :
2020-04-14 07:06:00 +00:00
client . get_model ( restApiId = dummy_rest_api_id , modelName = model_name )
2020-10-06 06:46:05 +00:00
ex . value . response [ " Error " ] [ " Message " ] . should . equal ( " Invalid Rest API Id specified " )
2020-10-06 06:04:09 +00:00
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " NotFoundException " )
2020-04-12 12:19:22 +00:00
@mock_apigateway
def test_get_model_with_invalid_name ( ) :
client = boto3 . client ( " apigateway " , region_name = " us-west-2 " )
2020-04-14 07:06:00 +00:00
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
2020-04-12 12:19:22 +00:00
rest_api_id = response [ " id " ]
# test with an invalid model name
2020-10-06 05:54:49 +00:00
with pytest . raises ( ClientError ) as ex :
2020-04-14 07:06:00 +00:00
client . get_model ( restApiId = rest_api_id , modelName = " fake " )
2020-10-06 06:46:05 +00:00
ex . value . response [ " Error " ] [ " Message " ] . should . equal ( " Invalid Model Name specified " )
2020-10-06 06:04:09 +00:00
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " NotFoundException " )
2020-04-12 12:19:22 +00:00
2016-03-05 15:54:19 +00:00
@mock_apigateway
def test_http_proxying_integration ( ) :
2021-01-15 09:12:41 +00:00
responses_mock . add (
responses_mock . GET , " http://httpbin.org/robots.txt " , body = " a fake response "
2016-03-05 15:54:19 +00:00
)
2019-10-31 15:44:26 +00:00
region_name = " us-west-2 "
client = boto3 . client ( " apigateway " , region_name = region_name )
response = client . create_rest_api ( name = " my_api " , description = " this is my api " )
api_id = response [ " id " ]
2016-03-05 15:54:19 +00:00
resources = client . get_resources ( restApiId = api_id )
2019-10-31 15:44:26 +00:00
root_id = [ resource for resource in resources [ " items " ] if resource [ " path " ] == " / " ] [
0
] [ " id " ]
2016-03-05 15:54:19 +00:00
client . put_method (
2019-10-31 15:44:26 +00:00
restApiId = api_id , resourceId = root_id , httpMethod = " GET " , authorizationType = " none "
2016-03-05 15:54:19 +00:00
)
client . put_method_response (
2019-10-31 15:44:26 +00:00
restApiId = api_id , resourceId = root_id , httpMethod = " GET " , statusCode = " 200 "
2016-03-05 15:54:19 +00:00
)
response = client . put_integration (
restApiId = api_id ,
resourceId = root_id ,
2019-10-31 15:44:26 +00:00
httpMethod = " GET " ,
type = " HTTP " ,
uri = " http://httpbin.org/robots.txt " ,
2019-11-04 09:12:24 +00:00
integrationHttpMethod = " POST " ,
2016-03-05 15:54:19 +00:00
)
2019-10-31 15:44:26 +00:00
stage_name = " staging "
client . create_deployment ( restApiId = api_id , stageName = stage_name )
2016-03-05 15:54:19 +00:00
2020-11-11 15:55:37 +00:00
deploy_url = " https:// {api_id} .execute-api. {region_name} .amazonaws.com/ {stage_name} " . format (
api_id = api_id , region_name = region_name , stage_name = stage_name
2019-10-31 15:44:26 +00:00
)
2016-03-05 15:54:19 +00:00
2017-02-24 00:43:48 +00:00
if not settings . TEST_SERVER_MODE :
requests . get ( deploy_url ) . content . should . equal ( b " a fake response " )
2018-03-21 16:11:49 +00:00
2021-02-15 09:39:35 +00:00
@mock_apigateway
def test_api_key_value_min_length ( ) :
region_name = " us-east-1 "
client = boto3 . client ( " apigateway " , region_name = region_name )
apikey_value = " 12345 "
apikey_name = " TESTKEY1 "
payload = { " value " : apikey_value , " name " : apikey_name }
with pytest . raises ( ClientError ) as e :
client . create_api_key ( * * payload )
ex = e . value
ex . operation_name . should . equal ( " CreateApiKey " )
ex . response [ " ResponseMetadata " ] [ " HTTPStatusCode " ] . should . equal ( 400 )
ex . response [ " Error " ] [ " Code " ] . should . contain ( " BadRequestException " )
ex . response [ " Error " ] [ " Message " ] . should . equal (
" API Key value should be at least 20 characters "
)
@mock_apigateway
def test_get_api_key_include_value ( ) :
region_name = " us-west-2 "
client = boto3 . client ( " apigateway " , region_name = region_name )
apikey_value = " 01234567890123456789 "
apikey_name = " TESTKEY1 "
payload = { " value " : apikey_value , " name " : apikey_name }
response = client . create_api_key ( * * payload )
api_key_id_one = response [ " id " ]
response = client . get_api_key ( apiKey = api_key_id_one , includeValue = True )
response . should . have . key ( " value " )
response = client . get_api_key ( apiKey = api_key_id_one )
response . should_not . have . key ( " value " )
response = client . get_api_key ( apiKey = api_key_id_one , includeValue = True )
response . should . have . key ( " value " )
response = client . get_api_key ( apiKey = api_key_id_one , includeValue = False )
response . should_not . have . key ( " value " )
response = client . get_api_key ( apiKey = api_key_id_one , includeValue = True )
response . should . have . key ( " value " )
@mock_apigateway
def test_get_api_keys_include_values ( ) :
region_name = " us-west-2 "
client = boto3 . client ( " apigateway " , region_name = region_name )
apikey_value = " 01234567890123456789 "
apikey_name = " TESTKEY1 "
payload = { " value " : apikey_value , " name " : apikey_name }
apikey_value2 = " 01234567890123456789123 "
apikey_name2 = " TESTKEY1 "
payload2 = { " value " : apikey_value2 , " name " : apikey_name2 }
client . create_api_key ( * * payload )
client . create_api_key ( * * payload2 )
response = client . get_api_keys ( )
len ( response [ " items " ] ) . should . equal ( 2 )
for api_key in response [ " items " ] :
api_key . should_not . have . key ( " value " )
response = client . get_api_keys ( includeValues = True )
len ( response [ " items " ] ) . should . equal ( 2 )
for api_key in response [ " items " ] :
api_key . should . have . key ( " value " )
response = client . get_api_keys ( includeValues = False )
len ( response [ " items " ] ) . should . equal ( 2 )
for api_key in response [ " items " ] :
api_key . should_not . have . key ( " value " )
2019-11-27 14:49:37 +00:00
@mock_apigateway
def test_create_api_key ( ) :
region_name = " us-west-2 "
client = boto3 . client ( " apigateway " , region_name = region_name )
2021-02-15 09:39:35 +00:00
apikey_value = " 01234567890123456789 "
2019-11-27 14:49:37 +00:00
apikey_name = " TESTKEY1 "
payload = { " value " : apikey_value , " name " : apikey_name }
2020-07-15 06:00:44 +00:00
response = client . create_api_key ( * * payload )
2020-07-15 11:21:11 +00:00
response [ " ResponseMetadata " ] [ " HTTPStatusCode " ] . should . equal ( 201 )
2020-07-15 06:00:44 +00:00
response [ " name " ] . should . equal ( apikey_name )
response [ " value " ] . should . equal ( apikey_value )
response [ " enabled " ] . should . equal ( False )
response [ " stageKeys " ] . should . equal ( [ ] )
2019-11-27 14:49:37 +00:00
response = client . get_api_keys ( )
len ( response [ " items " ] ) . should . equal ( 1 )
client . create_api_key . when . called_with ( * * payload ) . should . throw ( ClientError )
2020-09-01 07:25:59 +00:00
@mock_apigateway
def test_create_api_headers ( ) :
region_name = " us-west-2 "
client = boto3 . client ( " apigateway " , region_name = region_name )
2021-02-15 09:39:35 +00:00
apikey_value = " 01234567890123456789 "
2020-09-01 07:25:59 +00:00
apikey_name = " TESTKEY1 "
payload = { " value " : apikey_value , " name " : apikey_name }
client . create_api_key ( * * payload )
2020-10-06 05:54:49 +00:00
with pytest . raises ( ClientError ) as ex :
2020-09-01 07:25:59 +00:00
client . create_api_key ( * * payload )
2020-10-06 06:04:09 +00:00
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " ConflictException " )
2020-09-01 07:25:59 +00:00
if not settings . TEST_SERVER_MODE :
2020-10-06 06:04:09 +00:00
ex . value . response [ " ResponseMetadata " ] [ " HTTPHeaders " ] . should . equal ( { } )
2020-09-01 07:25:59 +00:00
2018-03-21 16:11:49 +00:00
@mock_apigateway
def test_api_keys ( ) :
2019-10-31 15:44:26 +00:00
region_name = " us-west-2 "
client = boto3 . client ( " apigateway " , region_name = region_name )
2018-03-21 16:11:49 +00:00
response = client . get_api_keys ( )
2019-10-31 15:44:26 +00:00
len ( response [ " items " ] ) . should . equal ( 0 )
2018-03-21 16:11:49 +00:00
2021-02-15 09:39:35 +00:00
apikey_value = " 01234567890123456789 "
2019-10-31 15:44:26 +00:00
apikey_name = " TESTKEY1 "
2019-11-27 15:12:30 +00:00
payload = {
" value " : apikey_value ,
" name " : apikey_name ,
" tags " : { " tag1 " : " test_tag1 " , " tag2 " : " 1 " } ,
}
2018-03-21 16:11:49 +00:00
response = client . create_api_key ( * * payload )
2019-11-27 14:49:37 +00:00
apikey_id = response [ " id " ]
2021-02-15 09:39:35 +00:00
apikey = client . get_api_key ( apiKey = response [ " id " ] , includeValue = True )
2019-10-31 15:44:26 +00:00
apikey [ " name " ] . should . equal ( apikey_name )
apikey [ " value " ] . should . equal ( apikey_value )
apikey [ " tags " ] [ " tag1 " ] . should . equal ( " test_tag1 " )
apikey [ " tags " ] [ " tag2 " ] . should . equal ( " 1 " )
2019-08-02 16:28:47 +00:00
patch_operations = [
2019-10-31 15:44:26 +00:00
{ " op " : " replace " , " path " : " /name " , " value " : " TESTKEY3_CHANGE " } ,
{ " op " : " replace " , " path " : " /customerId " , " value " : " 12345 " } ,
{ " op " : " replace " , " path " : " /description " , " value " : " APIKEY UPDATE TEST " } ,
{ " op " : " replace " , " path " : " /enabled " , " value " : " false " } ,
2019-08-02 16:28:47 +00:00
]
response = client . update_api_key ( apiKey = apikey_id , patchOperations = patch_operations )
2019-10-31 15:44:26 +00:00
response [ " name " ] . should . equal ( " TESTKEY3_CHANGE " )
response [ " customerId " ] . should . equal ( " 12345 " )
response [ " description " ] . should . equal ( " APIKEY UPDATE TEST " )
response [ " enabled " ] . should . equal ( False )
2019-08-02 16:28:47 +00:00
2019-11-27 14:49:37 +00:00
updated_api_key = client . get_api_key ( apiKey = apikey_id )
updated_api_key [ " name " ] . should . equal ( " TESTKEY3_CHANGE " )
updated_api_key [ " customerId " ] . should . equal ( " 12345 " )
updated_api_key [ " description " ] . should . equal ( " APIKEY UPDATE TEST " )
updated_api_key [ " enabled " ] . should . equal ( False )
2018-03-21 16:11:49 +00:00
response = client . get_api_keys ( )
2019-11-27 14:49:37 +00:00
len ( response [ " items " ] ) . should . equal ( 1 )
2018-03-21 16:11:49 +00:00
2019-11-27 14:49:37 +00:00
payload = { " name " : apikey_name }
client . create_api_key ( * * payload )
2018-03-21 16:11:49 +00:00
response = client . get_api_keys ( )
2019-10-31 15:44:26 +00:00
len ( response [ " items " ] ) . should . equal ( 2 )
2020-07-15 08:41:41 +00:00
response = client . delete_api_key ( apiKey = apikey_id )
response [ " ResponseMetadata " ] [ " HTTPStatusCode " ] . should . equal ( 202 )
2019-11-27 14:49:37 +00:00
response = client . get_api_keys ( )
len ( response [ " items " ] ) . should . equal ( 1 )
2018-07-10 13:58:02 +00:00
@mock_apigateway
def test_usage_plans ( ) :
2019-10-31 15:44:26 +00:00
region_name = " us-west-2 "
client = boto3 . client ( " apigateway " , region_name = region_name )
2018-07-10 13:58:02 +00:00
response = client . get_usage_plans ( )
2019-10-31 15:44:26 +00:00
len ( response [ " items " ] ) . should . equal ( 0 )
2018-07-10 13:58:02 +00:00
2020-04-27 17:39:33 +00:00
# # Try to get info about a non existing usage
2020-10-06 05:54:49 +00:00
with pytest . raises ( ClientError ) as ex :
2020-04-27 17:39:33 +00:00
client . get_usage_plan ( usagePlanId = " not_existing " )
2020-10-06 06:04:09 +00:00
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " NotFoundException " )
ex . value . response [ " Error " ] [ " Message " ] . should . equal (
2020-04-27 17:39:33 +00:00
" Invalid Usage Plan ID specified "
)
2019-10-31 15:44:26 +00:00
usage_plan_name = " TEST-PLAN "
payload = { " name " : usage_plan_name }
2018-07-10 13:58:02 +00:00
response = client . create_usage_plan ( * * payload )
2019-10-31 15:44:26 +00:00
usage_plan = client . get_usage_plan ( usagePlanId = response [ " id " ] )
usage_plan [ " name " ] . should . equal ( usage_plan_name )
usage_plan [ " apiStages " ] . should . equal ( [ ] )
2018-07-10 13:58:02 +00:00
2019-10-08 11:45:47 +00:00
payload = {
2019-10-31 15:44:26 +00:00
" name " : " TEST-PLAN-2 " ,
" description " : " Description " ,
" quota " : { " limit " : 10 , " period " : " DAY " , " offset " : 0 } ,
" throttle " : { " rateLimit " : 2 , " burstLimit " : 1 } ,
" apiStages " : [ { " apiId " : " foo " , " stage " : " bar " } ] ,
" tags " : { " tag_key " : " tag_value " } ,
2019-10-08 11:45:47 +00:00
}
2018-07-10 13:58:02 +00:00
response = client . create_usage_plan ( * * payload )
2019-10-31 15:44:26 +00:00
usage_plan_id = response [ " id " ]
2018-07-10 13:58:02 +00:00
usage_plan = client . get_usage_plan ( usagePlanId = usage_plan_id )
2019-10-08 11:45:47 +00:00
# The payload should remain unchanged
for key , value in payload . items ( ) :
usage_plan . should . have . key ( key ) . which . should . equal ( value )
# Status code should be 200
2019-10-31 15:44:26 +00:00
usage_plan [ " ResponseMetadata " ] . should . have . key ( " HTTPStatusCode " ) . which . should . equal (
200
)
2019-10-08 11:45:47 +00:00
# An Id should've been generated
2019-10-31 15:44:26 +00:00
usage_plan . should . have . key ( " id " ) . which . should_not . be . none
2018-07-10 13:58:02 +00:00
response = client . get_usage_plans ( )
2019-10-31 15:44:26 +00:00
len ( response [ " items " ] ) . should . equal ( 2 )
2018-07-10 13:58:02 +00:00
client . delete_usage_plan ( usagePlanId = usage_plan_id )
response = client . get_usage_plans ( )
2019-10-31 15:44:26 +00:00
len ( response [ " items " ] ) . should . equal ( 1 )
2018-07-11 16:17:58 +00:00
2021-02-25 07:46:11 +00:00
@mock_apigateway
def test_update_usage_plan ( ) :
region_name = " us-west-2 "
client = boto3 . client ( " apigateway " , region_name = region_name )
payload = {
" name " : " TEST-PLAN-2 " ,
" description " : " Description " ,
" quota " : { " limit " : 10 , " period " : " DAY " , " offset " : 0 } ,
" throttle " : { " rateLimit " : 2 , " burstLimit " : 1 } ,
" apiStages " : [ { " apiId " : " foo " , " stage " : " bar " } ] ,
" tags " : { " tag_key " : " tag_value " } ,
}
response = client . create_usage_plan ( * * payload )
usage_plan_id = response [ " id " ]
response = client . update_usage_plan (
usagePlanId = usage_plan_id ,
patchOperations = [
{ " op " : " replace " , " path " : " /quota/limit " , " value " : " 1000 " } ,
{ " op " : " replace " , " path " : " /quota/period " , " value " : " MONTH " } ,
{ " op " : " replace " , " path " : " /throttle/rateLimit " , " value " : " 500 " } ,
{ " op " : " replace " , " path " : " /throttle/burstLimit " , " value " : " 1500 " } ,
2021-05-20 06:10:08 +00:00
{ " op " : " replace " , " path " : " /name " , " value " : " new-name " } ,
{ " op " : " replace " , " path " : " /description " , " value " : " new-description " } ,
{ " op " : " replace " , " path " : " /productCode " , " value " : " new-productionCode " } ,
2021-02-25 07:46:11 +00:00
] ,
)
response [ " quota " ] [ " limit " ] . should . equal ( " 1000 " )
response [ " quota " ] [ " period " ] . should . equal ( " MONTH " )
response [ " quota " ] [ " limit " ] . should . equal ( " 1000 " )
2021-05-20 06:10:08 +00:00
response [ " name " ] . should . equal ( " new-name " )
response [ " description " ] . should . equal ( " new-description " )
response [ " productCode " ] . should . equal ( " new-productionCode " )
2021-02-25 07:46:11 +00:00
2018-07-11 16:17:58 +00:00
@mock_apigateway
def test_usage_plan_keys ( ) :
2019-10-31 15:44:26 +00:00
region_name = " us-west-2 "
client = boto3 . client ( " apigateway " , region_name = region_name )
2018-07-11 16:17:58 +00:00
usage_plan_id = " test "
# Create an API key so we can use it
2019-10-31 15:44:26 +00:00
key_name = " test-api-key "
2018-07-11 16:17:58 +00:00
response = client . create_api_key ( name = key_name )
key_id = response [ " id " ]
key_value = response [ " value " ]
# Get current plan keys (expect none)
response = client . get_usage_plan_keys ( usagePlanId = usage_plan_id )
2019-10-31 15:44:26 +00:00
len ( response [ " items " ] ) . should . equal ( 0 )
2018-07-11 16:17:58 +00:00
# Create usage plan key
2019-10-31 15:44:26 +00:00
key_type = " API_KEY "
payload = { " usagePlanId " : usage_plan_id , " keyId " : key_id , " keyType " : key_type }
2018-07-11 16:17:58 +00:00
response = client . create_usage_plan_key ( * * payload )
2020-07-15 13:01:03 +00:00
response [ " ResponseMetadata " ] [ " HTTPStatusCode " ] . should . equals ( 201 )
2018-07-11 16:17:58 +00:00
usage_plan_key_id = response [ " id " ]
# Get current plan keys (expect 1)
response = client . get_usage_plan_keys ( usagePlanId = usage_plan_id )
2019-10-31 15:44:26 +00:00
len ( response [ " items " ] ) . should . equal ( 1 )
2018-07-11 16:17:58 +00:00
# Get a single usage plan key and check it matches the created one
2019-10-31 15:44:26 +00:00
usage_plan_key = client . get_usage_plan_key (
usagePlanId = usage_plan_id , keyId = usage_plan_key_id
)
usage_plan_key [ " name " ] . should . equal ( key_name )
usage_plan_key [ " id " ] . should . equal ( key_id )
usage_plan_key [ " type " ] . should . equal ( key_type )
usage_plan_key [ " value " ] . should . equal ( key_value )
2018-07-11 16:17:58 +00:00
# Delete usage plan key
client . delete_usage_plan_key ( usagePlanId = usage_plan_id , keyId = key_id )
# Get current plan keys (expect none)
response = client . get_usage_plan_keys ( usagePlanId = usage_plan_id )
2019-10-31 15:44:26 +00:00
len ( response [ " items " ] ) . should . equal ( 0 )
2020-04-27 17:39:33 +00:00
# Try to get info about a non existing api key
2020-10-06 05:54:49 +00:00
with pytest . raises ( ClientError ) as ex :
2020-04-27 17:39:33 +00:00
client . get_usage_plan_key ( usagePlanId = usage_plan_id , keyId = " not_existing_key " )
2020-10-06 06:04:09 +00:00
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " NotFoundException " )
ex . value . response [ " Error " ] [ " Message " ] . should . equal (
2020-04-27 17:39:33 +00:00
" Invalid API Key identifier specified "
)
# Try to get info about an existing api key that has not jet added to a valid usage plan
2020-10-06 05:54:49 +00:00
with pytest . raises ( ClientError ) as ex :
2020-04-27 17:39:33 +00:00
client . get_usage_plan_key ( usagePlanId = usage_plan_id , keyId = key_id )
2020-10-06 06:04:09 +00:00
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " NotFoundException " )
ex . value . response [ " Error " ] [ " Message " ] . should . equal (
2020-04-27 17:39:33 +00:00
" Invalid Usage Plan ID specified "
)
# Try to get info about an existing api key that has not jet added to a valid usage plan
2020-10-06 05:54:49 +00:00
with pytest . raises ( ClientError ) as ex :
2020-04-27 17:39:33 +00:00
client . get_usage_plan_key ( usagePlanId = " not_existing_plan_id " , keyId = key_id )
2020-10-06 06:04:09 +00:00
ex . value . response [ " Error " ] [ " Code " ] . should . equal ( " NotFoundException " )
ex . value . response [ " Error " ] [ " Message " ] . should . equal (
2020-04-27 17:39:33 +00:00
" Invalid Usage Plan ID specified "
)
2018-07-11 16:17:58 +00:00
@mock_apigateway
def test_create_usage_plan_key_non_existent_api_key ( ) :
2019-10-31 15:44:26 +00:00
region_name = " us-west-2 "
client = boto3 . client ( " apigateway " , region_name = region_name )
2018-07-11 16:17:58 +00:00
usage_plan_id = " test "
# Attempt to create a usage plan key for a API key that doesn't exists
2019-10-31 15:44:26 +00:00
payload = {
" usagePlanId " : usage_plan_id ,
" keyId " : " non-existent " ,
" keyType " : " API_KEY " ,
}
2018-07-11 16:17:58 +00:00
client . create_usage_plan_key . when . called_with ( * * payload ) . should . throw ( ClientError )
2018-10-17 12:44:00 +00:00
@mock_apigateway
def test_get_usage_plans_using_key_id ( ) :
2019-10-31 15:44:26 +00:00
region_name = " us-west-2 "
client = boto3 . client ( " apigateway " , region_name = region_name )
2018-10-17 12:44:00 +00:00
# Create 2 Usage Plans
# one will be attached to an API Key, the other will remain unattached
2019-10-31 15:44:26 +00:00
attached_plan = client . create_usage_plan ( name = " Attached " )
unattached_plan = client . create_usage_plan ( name = " Unattached " )
2018-10-17 12:44:00 +00:00
# Create an API key
# to attach to the usage plan
2019-10-31 15:44:26 +00:00
key_name = " test-api-key "
2018-10-17 12:44:00 +00:00
response = client . create_api_key ( name = key_name )
key_id = response [ " id " ]
# Create a Usage Plan Key
# Attached the Usage Plan and API Key
2019-10-31 15:44:26 +00:00
key_type = " API_KEY "
payload = { " usagePlanId " : attached_plan [ " id " ] , " keyId " : key_id , " keyType " : key_type }
2018-10-17 12:44:00 +00:00
response = client . create_usage_plan_key ( * * payload )
# All usage plans should be returned when keyId is not included
all_plans = client . get_usage_plans ( )
2019-10-31 15:44:26 +00:00
len ( all_plans [ " items " ] ) . should . equal ( 2 )
2018-10-17 12:44:00 +00:00
# Only the usage plan attached to the given api key are included
only_plans_with_key = client . get_usage_plans ( keyId = key_id )
2019-10-31 15:44:26 +00:00
len ( only_plans_with_key [ " items " ] ) . should . equal ( 1 )
only_plans_with_key [ " items " ] [ 0 ] [ " name " ] . should . equal ( attached_plan [ " name " ] )
only_plans_with_key [ " items " ] [ 0 ] [ " id " ] . should . equal ( attached_plan [ " id " ] )
2019-11-04 09:12:24 +00:00
def create_method_integration ( client , api_id , httpMethod = " GET " ) :
resources = client . get_resources ( restApiId = api_id )
root_id = [ resource for resource in resources [ " items " ] if resource [ " path " ] == " / " ] [
0
] [ " id " ]
client . put_method (
restApiId = api_id ,
resourceId = root_id ,
httpMethod = httpMethod ,
authorizationType = " NONE " ,
)
client . put_method_response (
restApiId = api_id , resourceId = root_id , httpMethod = httpMethod , statusCode = " 200 "
)
client . put_integration (
restApiId = api_id ,
resourceId = root_id ,
httpMethod = httpMethod ,
type = " HTTP " ,
uri = " http://httpbin.org/robots.txt " ,
integrationHttpMethod = " POST " ,
)
client . put_integration_response (
restApiId = api_id ,
resourceId = root_id ,
httpMethod = httpMethod ,
statusCode = " 200 " ,
responseTemplates = { } ,
)