add integration responses.
This commit is contained in:
		
							parent
							
								
									e3ff8dc510
								
							
						
					
					
						commit
						95f9b3fb35
					
				| @ -13,11 +13,34 @@ class Deployment(dict): | |||||||
|         self['stageName'] = name |         self['stageName'] = name | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | class IntegrationResponse(dict): | ||||||
|  |     def __init__(self, status_code, selection_pattern=None): | ||||||
|  |         self['responseTemplates'] = {"application/json": None} | ||||||
|  |         self['statusCode'] = status_code | ||||||
|  |         if selection_pattern: | ||||||
|  |             self['selectionPattern'] = selection_pattern | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| class Integration(dict): | class Integration(dict): | ||||||
|     def __init__(self, integration_type, uri): |     def __init__(self, integration_type, uri, http_method): | ||||||
|         super(Integration, self).__init__() |         super(Integration, self).__init__() | ||||||
|         self['type'] = integration_type |         self['type'] = integration_type | ||||||
|         self['uri'] = uri |         self['uri'] = uri | ||||||
|  |         self['httpMethod'] = http_method | ||||||
|  |         self["integrationResponses"] = { | ||||||
|  |             "200": IntegrationResponse(200) | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     def create_integration_response(self, status_code, selection_pattern): | ||||||
|  |         integration_response = IntegrationResponse(status_code, selection_pattern) | ||||||
|  |         self["integrationResponses"][status_code] = integration_response | ||||||
|  |         return integration_response | ||||||
|  | 
 | ||||||
|  |     def get_integration_response(self, status_code): | ||||||
|  |         return self["integrationResponses"][status_code] | ||||||
|  | 
 | ||||||
|  |     def delete_integration_response(self, status_code): | ||||||
|  |         return self["integrationResponses"].pop(status_code) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class MethodResponse(dict): | class MethodResponse(dict): | ||||||
| @ -80,7 +103,7 @@ class Resource(object): | |||||||
|         return self.resource_methods[method_type] |         return self.resource_methods[method_type] | ||||||
| 
 | 
 | ||||||
|     def add_integration(self, method_type, integration_type, uri): |     def add_integration(self, method_type, integration_type, uri): | ||||||
|         integration = Integration(integration_type, uri) |         integration = Integration(integration_type, uri, method_type) | ||||||
|         self.resource_methods[method_type]['methodIntegration'] = integration |         self.resource_methods[method_type]['methodIntegration'] = integration | ||||||
|         return integration |         return integration | ||||||
| 
 | 
 | ||||||
| @ -220,6 +243,21 @@ class APIGatewayBackend(BaseBackend): | |||||||
|         resource = self.get_resource(function_id, resource_id) |         resource = self.get_resource(function_id, resource_id) | ||||||
|         return resource.delete_integration(method_type) |         return resource.delete_integration(method_type) | ||||||
| 
 | 
 | ||||||
|  |     def create_integration_response(self, function_id, resource_id, method_type, status_code, selection_pattern): | ||||||
|  |         integration = self.get_integration(function_id, resource_id, method_type) | ||||||
|  |         integration_response = integration.create_integration_response(status_code, selection_pattern) | ||||||
|  |         return integration_response | ||||||
|  | 
 | ||||||
|  |     def get_integration_response(self, function_id, resource_id, method_type, status_code): | ||||||
|  |         integration = self.get_integration(function_id, resource_id, method_type) | ||||||
|  |         integration_response = integration.get_integration_response(status_code) | ||||||
|  |         return integration_response | ||||||
|  | 
 | ||||||
|  |     def delete_integration_response(self, function_id, resource_id, method_type, status_code): | ||||||
|  |         integration = self.get_integration(function_id, resource_id, method_type) | ||||||
|  |         integration_response = integration.delete_integration_response(status_code) | ||||||
|  |         return integration_response | ||||||
|  | 
 | ||||||
|     def create_deployment(self, function_id, name): |     def create_deployment(self, function_id, name): | ||||||
|         api = self.get_rest_api(function_id) |         api = self.get_rest_api(function_id) | ||||||
|         deployment = api.create_deployment(name) |         deployment = api.create_deployment(name) | ||||||
|  | |||||||
| @ -57,11 +57,9 @@ class APIGatewayResponse(BaseResponse): | |||||||
| 
 | 
 | ||||||
|         if self.method == 'GET': |         if self.method == 'GET': | ||||||
|             resource = self.backend.get_resource(function_id, resource_id) |             resource = self.backend.get_resource(function_id, resource_id) | ||||||
|             return 200, headers, json.dumps(resource.to_dict()) |  | ||||||
|         elif self.method == 'POST': |         elif self.method == 'POST': | ||||||
|             path_part = self._get_param("pathPart") |             path_part = self._get_param("pathPart") | ||||||
|             resource = self.backend.create_resource(function_id, resource_id, path_part) |             resource = self.backend.create_resource(function_id, resource_id, path_part) | ||||||
|             return 200, headers, json.dumps(resource.to_dict()) |  | ||||||
|         elif self.method == 'DELETE': |         elif self.method == 'DELETE': | ||||||
|             resource = self.backend.delete_resource(function_id, resource_id) |             resource = self.backend.delete_resource(function_id, resource_id) | ||||||
|         return 200, headers, json.dumps(resource.to_dict()) |         return 200, headers, json.dumps(resource.to_dict()) | ||||||
| @ -91,10 +89,8 @@ class APIGatewayResponse(BaseResponse): | |||||||
| 
 | 
 | ||||||
|         if self.method == 'GET': |         if self.method == 'GET': | ||||||
|             method_response = self.backend.get_method_response(function_id, resource_id, method_type, response_code) |             method_response = self.backend.get_method_response(function_id, resource_id, method_type, response_code) | ||||||
|             return 200, headers, json.dumps(method_response) |  | ||||||
|         elif self.method == 'PUT': |         elif self.method == 'PUT': | ||||||
|             method_response = self.backend.create_method_response(function_id, resource_id, method_type, response_code) |             method_response = self.backend.create_method_response(function_id, resource_id, method_type, response_code) | ||||||
|             return 200, headers, json.dumps(method_response) |  | ||||||
|         elif self.method == 'DELETE': |         elif self.method == 'DELETE': | ||||||
|             method_response = self.backend.delete_method_response(function_id, resource_id, method_type, response_code) |             method_response = self.backend.delete_method_response(function_id, resource_id, method_type, response_code) | ||||||
|         return 200, headers, json.dumps(method_response) |         return 200, headers, json.dumps(method_response) | ||||||
| @ -108,16 +104,37 @@ class APIGatewayResponse(BaseResponse): | |||||||
| 
 | 
 | ||||||
|         if self.method == 'GET': |         if self.method == 'GET': | ||||||
|             integration_response = self.backend.get_integration(function_id, resource_id, method_type) |             integration_response = self.backend.get_integration(function_id, resource_id, method_type) | ||||||
|             return 200, headers, json.dumps(integration_response) |  | ||||||
|         elif self.method == 'PUT': |         elif self.method == 'PUT': | ||||||
|             integration_type = self._get_param('type') |             integration_type = self._get_param('type') | ||||||
|             uri = self._get_param('uri') |             uri = self._get_param('uri') | ||||||
|             integration_response = self.backend.create_integration(function_id, resource_id, method_type, integration_type, uri) |             integration_response = self.backend.create_integration(function_id, resource_id, method_type, integration_type, uri) | ||||||
|             return 200, headers, json.dumps(integration_response) |  | ||||||
|         elif self.method == 'DELETE': |         elif self.method == 'DELETE': | ||||||
|             integration_response = self.backend.delete_integration(function_id, resource_id, method_type) |             integration_response = self.backend.delete_integration(function_id, resource_id, method_type) | ||||||
|         return 200, headers, json.dumps(integration_response) |         return 200, headers, json.dumps(integration_response) | ||||||
| 
 | 
 | ||||||
|  |     def integration_responses(self, request, full_url, headers): | ||||||
|  |         self.setup_class(request, full_url, headers) | ||||||
|  |         url_path_parts = self.path.split("/") | ||||||
|  |         function_id = url_path_parts[2] | ||||||
|  |         resource_id = url_path_parts[4] | ||||||
|  |         method_type = url_path_parts[6] | ||||||
|  |         status_code = url_path_parts[9] | ||||||
|  | 
 | ||||||
|  |         if self.method == 'GET': | ||||||
|  |             integration_response = self.backend.get_integration_response( | ||||||
|  |                 function_id, resource_id, method_type, status_code | ||||||
|  |             ) | ||||||
|  |         elif self.method == 'PUT': | ||||||
|  |             selection_pattern = self._get_param("selectionPattern") | ||||||
|  |             integration_response = self.backend.create_integration_response( | ||||||
|  |                 function_id, resource_id, method_type, status_code, selection_pattern | ||||||
|  |             ) | ||||||
|  |         elif self.method == 'DELETE': | ||||||
|  |             integration_response = self.backend.delete_integration_response( | ||||||
|  |                 function_id, resource_id, method_type, status_code | ||||||
|  |             ) | ||||||
|  |         return 200, headers, json.dumps(integration_response) | ||||||
|  | 
 | ||||||
|     def deployments(self, request, full_url, headers): |     def deployments(self, request, full_url, headers): | ||||||
|         self.setup_class(request, full_url, headers) |         self.setup_class(request, full_url, headers) | ||||||
|         function_id = self.path.replace("/restapis/", "", 1).split("/")[0] |         function_id = self.path.replace("/restapis/", "", 1).split("/")[0] | ||||||
| @ -138,7 +155,6 @@ class APIGatewayResponse(BaseResponse): | |||||||
| 
 | 
 | ||||||
|         if self.method == 'GET': |         if self.method == 'GET': | ||||||
|             deployment = self.backend.get_deployment(function_id, deployment_id) |             deployment = self.backend.get_deployment(function_id, deployment_id) | ||||||
|             return 200, headers, json.dumps(deployment) |  | ||||||
|         elif self.method == 'DELETE': |         elif self.method == 'DELETE': | ||||||
|             deployment = self.backend.delete_deployment(function_id, deployment_id) |             deployment = self.backend.delete_deployment(function_id, deployment_id) | ||||||
|         return 200, headers, json.dumps(deployment) |         return 200, headers, json.dumps(deployment) | ||||||
|  | |||||||
| @ -15,4 +15,5 @@ url_paths = { | |||||||
|     '{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/?$': APIGatewayResponse().resource_methods, |     '{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/?$': APIGatewayResponse().resource_methods, | ||||||
|     '{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/responses/200$': APIGatewayResponse().resource_method_responses, |     '{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/responses/200$': APIGatewayResponse().resource_method_responses, | ||||||
|     '{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/integration/?$': APIGatewayResponse().integrations, |     '{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/integration/?$': APIGatewayResponse().integrations, | ||||||
|  |     '{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/integration/responses/(?P<status_code>\d+)/?$': APIGatewayResponse().integration_responses, | ||||||
| } | } | ||||||
|  | |||||||
| @ -223,9 +223,18 @@ def test_integrations(): | |||||||
|         uri='http://httpbin.org/robots.txt', |         uri='http://httpbin.org/robots.txt', | ||||||
|     ) |     ) | ||||||
|     response.should.equal({ |     response.should.equal({ | ||||||
|  |         'ResponseMetadata': {'HTTPStatusCode': 200}, | ||||||
|  |         'httpMethod': 'GET', | ||||||
|  |         'integrationResponses': { | ||||||
|  |             '200': { | ||||||
|  |                 'responseTemplates': { | ||||||
|  |                     'application/json': None | ||||||
|  |                 }, | ||||||
|  |                 'statusCode': 200 | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|         'type': 'HTTP', |         'type': 'HTTP', | ||||||
|         'uri': 'http://httpbin.org/robots.txt', |         'uri': 'http://httpbin.org/robots.txt' | ||||||
|         'ResponseMetadata': {'HTTPStatusCode': 200} |  | ||||||
|     }) |     }) | ||||||
| 
 | 
 | ||||||
|     response = client.get_integration( |     response = client.get_integration( | ||||||
| @ -234,9 +243,18 @@ def test_integrations(): | |||||||
|         httpMethod='GET' |         httpMethod='GET' | ||||||
|     ) |     ) | ||||||
|     response.should.equal({ |     response.should.equal({ | ||||||
|  |         'ResponseMetadata': {'HTTPStatusCode': 200}, | ||||||
|  |         'httpMethod': 'GET', | ||||||
|  |         'integrationResponses': { | ||||||
|  |             '200': { | ||||||
|  |                 'responseTemplates': { | ||||||
|  |                     'application/json': None | ||||||
|  |                 }, | ||||||
|  |                 'statusCode': 200 | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|         'type': 'HTTP', |         'type': 'HTTP', | ||||||
|         'uri': 'http://httpbin.org/robots.txt', |         'uri': 'http://httpbin.org/robots.txt' | ||||||
|         'ResponseMetadata': {'HTTPStatusCode': 200} |  | ||||||
|     }) |     }) | ||||||
| 
 | 
 | ||||||
|     response = client.get_resource( |     response = client.get_resource( | ||||||
| @ -244,6 +262,15 @@ def test_integrations(): | |||||||
|         resourceId=root_id, |         resourceId=root_id, | ||||||
|     ) |     ) | ||||||
|     response['resourceMethods']['GET']['methodIntegration'].should.equal({ |     response['resourceMethods']['GET']['methodIntegration'].should.equal({ | ||||||
|  |         'httpMethod': 'GET', | ||||||
|  |         'integrationResponses': { | ||||||
|  |             '200': { | ||||||
|  |                 'responseTemplates': { | ||||||
|  |                     'application/json': None | ||||||
|  |                 }, | ||||||
|  |                 'statusCode': 200 | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|         'type': 'HTTP', |         'type': 'HTTP', | ||||||
|         'uri': 'http://httpbin.org/robots.txt' |         'uri': 'http://httpbin.org/robots.txt' | ||||||
|     }) |     }) | ||||||
| @ -261,6 +288,101 @@ def test_integrations(): | |||||||
|     response['resourceMethods']['GET'].shouldnt.contain("methodIntegration") |     response['resourceMethods']['GET'].shouldnt.contain("methodIntegration") | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @mock_apigateway | ||||||
|  | def test_integration_response(): | ||||||
|  |     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', | ||||||
|  |     ) | ||||||
|  | 
 | ||||||
|  |     response = client.put_integration( | ||||||
|  |         restApiId=api_id, | ||||||
|  |         resourceId=root_id, | ||||||
|  |         httpMethod='GET', | ||||||
|  |         type='HTTP', | ||||||
|  |         uri='http://httpbin.org/robots.txt', | ||||||
|  |     ) | ||||||
|  | 
 | ||||||
|  |     response = client.put_integration_response( | ||||||
|  |         restApiId=api_id, | ||||||
|  |         resourceId=root_id, | ||||||
|  |         httpMethod='GET', | ||||||
|  |         statusCode='200', | ||||||
|  |         selectionPattern='foobar', | ||||||
|  |     ) | ||||||
|  |     response.should.equal({ | ||||||
|  |         'statusCode': '200', | ||||||
|  |         'selectionPattern': 'foobar', | ||||||
|  |         'ResponseMetadata': {'HTTPStatusCode': 200}, | ||||||
|  |         'responseTemplates': { | ||||||
|  |             'application/json': None | ||||||
|  |         } | ||||||
|  |     }) | ||||||
|  | 
 | ||||||
|  |     response = client.get_integration_response( | ||||||
|  |         restApiId=api_id, | ||||||
|  |         resourceId=root_id, | ||||||
|  |         httpMethod='GET', | ||||||
|  |         statusCode='200', | ||||||
|  |     ) | ||||||
|  |     response.should.equal({ | ||||||
|  |         'statusCode': '200', | ||||||
|  |         'selectionPattern': 'foobar', | ||||||
|  |         'ResponseMetadata': {'HTTPStatusCode': 200}, | ||||||
|  |         'responseTemplates': { | ||||||
|  |             'application/json': None | ||||||
|  |         } | ||||||
|  |     }) | ||||||
|  | 
 | ||||||
|  |     response = client.get_method( | ||||||
|  |         restApiId=api_id, | ||||||
|  |         resourceId=root_id, | ||||||
|  |         httpMethod='GET', | ||||||
|  |     ) | ||||||
|  |     response['methodIntegration']['integrationResponses'].should.equal({ | ||||||
|  |         '200': { | ||||||
|  |             'responseTemplates': { | ||||||
|  |                 'application/json': None | ||||||
|  |             }, | ||||||
|  |             'selectionPattern': 'foobar', | ||||||
|  |             'statusCode': '200' | ||||||
|  |         } | ||||||
|  |     }) | ||||||
|  | 
 | ||||||
|  |     response = client.delete_integration_response( | ||||||
|  |         restApiId=api_id, | ||||||
|  |         resourceId=root_id, | ||||||
|  |         httpMethod='GET', | ||||||
|  |         statusCode='200', | ||||||
|  |     ) | ||||||
|  | 
 | ||||||
|  |     response = client.get_method( | ||||||
|  |         restApiId=api_id, | ||||||
|  |         resourceId=root_id, | ||||||
|  |         httpMethod='GET', | ||||||
|  |     ) | ||||||
|  |     response['methodIntegration']['integrationResponses'].should.equal({}) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| @mock_apigateway | @mock_apigateway | ||||||
| def test_deployment(): | def test_deployment(): | ||||||
|     client = boto3.client('apigateway', region_name='us-west-2') |     client = boto3.client('apigateway', region_name='us-west-2') | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user