moto/tests/test_apigatewayv2/test_apigatewayv2_integrations.py
2022-02-08 20:12:51 -01:00

318 lines
12 KiB
Python

import boto3
import pytest
from botocore.exceptions import ClientError
from moto import mock_apigatewayv2
@mock_apigatewayv2
def test_get_integrations_empty():
client = boto3.client("apigatewayv2", region_name="eu-west-1")
api_id = client.create_api(Name="test-api", ProtocolType="HTTP")["ApiId"]
resp = client.get_integrations(ApiId=api_id)
resp.should.have.key("Items").equals([])
@mock_apigatewayv2
def test_create_integration_minimum():
client = boto3.client("apigatewayv2", region_name="eu-west-1")
api_id = client.create_api(Name="test-api", ProtocolType="HTTP")["ApiId"]
resp = client.create_integration(ApiId=api_id, IntegrationType="HTTP")
resp.should.have.key("IntegrationId")
resp.should.have.key("IntegrationType").equals("HTTP")
@mock_apigatewayv2
def test_create_integration_for_internet_mock():
client = boto3.client("apigatewayv2", region_name="eu-west-1")
api_id = client.create_api(Name="test-api", ProtocolType="HTTP")["ApiId"]
resp = client.create_integration(
ApiId=api_id, ConnectionType="INTERNET", IntegrationType="MOCK"
)
resp.should.have.key("IntegrationId")
resp.should.have.key("IntegrationType").equals("MOCK")
resp.should.have.key("IntegrationResponseSelectionExpression").equals(
"${integration.response.statuscode}"
)
@mock_apigatewayv2
def test_create_integration_full():
client = boto3.client("apigatewayv2", region_name="eu-west-1")
api_id = client.create_api(Name="test-api", ProtocolType="HTTP")["ApiId"]
resp = client.create_integration(
ApiId=api_id,
ConnectionId="conn_id",
ConnectionType="INTERNET",
ContentHandlingStrategy="CONVERT_TO_BINARY",
CredentialsArn="cred:arn",
Description="my full integration",
IntegrationMethod="PUT",
IntegrationType="HTTP",
IntegrationSubtype="n/a",
PassthroughBehavior="WHEN_NO_MATCH",
PayloadFormatVersion="1.0",
RequestParameters={"r": "p"},
RequestTemplates={"r": "t"},
ResponseParameters={"res": {"par": "am"}},
TemplateSelectionExpression="tse",
TimeoutInMillis=123,
TlsConfig={"ServerNameToVerify": "server"},
)
resp.should.have.key("IntegrationId")
resp.should.have.key("ConnectionId").equals("conn_id")
resp.should.have.key("ConnectionType").equals("INTERNET")
resp.should.have.key("ContentHandlingStrategy").equals("CONVERT_TO_BINARY")
resp.should.have.key("CredentialsArn").equals("cred:arn")
resp.should.have.key("Description").equals("my full integration")
resp.should.have.key("IntegrationMethod").equals("PUT")
resp.should.have.key("IntegrationType").equals("HTTP")
resp.should.have.key("IntegrationSubtype").equals("n/a")
resp.should.have.key("PassthroughBehavior").equals("WHEN_NO_MATCH")
resp.should.have.key("PayloadFormatVersion").equals("1.0")
resp.should.have.key("RequestParameters").equals({"r": "p"})
resp.should.have.key("RequestTemplates").equals({"r": "t"})
resp.should.have.key("ResponseParameters").equals({"res": {"par": "am"}})
resp.should.have.key("TemplateSelectionExpression").equals("tse")
resp.should.have.key("TimeoutInMillis").equals(123)
resp.should.have.key("TlsConfig").equals({"ServerNameToVerify": "server"})
@mock_apigatewayv2
def test_get_integration():
client = boto3.client("apigatewayv2", region_name="ap-southeast-1")
api_id = client.create_api(Name="test-api", ProtocolType="HTTP")["ApiId"]
integration_id = client.create_integration(ApiId=api_id, IntegrationType="HTTP")[
"IntegrationId"
]
resp = client.get_integration(ApiId=api_id, IntegrationId=integration_id)
resp.should.have.key("IntegrationId")
resp.should.have.key("IntegrationType").equals("HTTP")
@mock_apigatewayv2
def test_get_integration_unknown():
client = boto3.client("apigatewayv2", region_name="ap-southeast-1")
api_id = client.create_api(Name="test-api", ProtocolType="HTTP")["ApiId"]
with pytest.raises(ClientError) as exc:
client.get_integration(ApiId=api_id, IntegrationId="unknown")
err = exc.value.response["Error"]
err["Code"].should.equal("NotFoundException")
err["Message"].should.equal("Invalid Integration identifier specified unknown")
@mock_apigatewayv2
def test_get_integrations():
client = boto3.client("apigatewayv2", region_name="us-east-2")
api_id = client.create_api(Name="test-api", ProtocolType="HTTP")["ApiId"]
integration_id = client.create_integration(ApiId=api_id, IntegrationType="HTTP")[
"IntegrationId"
]
resp = client.get_integrations(ApiId=api_id)
resp.should.have.key("Items").length_of(1)
resp["Items"][0].should.have.key("IntegrationId").equals(integration_id)
@mock_apigatewayv2
def test_delete_integration():
client = boto3.client("apigatewayv2", region_name="ap-southeast-1")
api_id = client.create_api(Name="test-api", ProtocolType="HTTP")["ApiId"]
integration_id = client.create_integration(ApiId=api_id, IntegrationType="HTTP")[
"IntegrationId"
]
client.delete_integration(ApiId=api_id, IntegrationId=integration_id)
with pytest.raises(ClientError) as exc:
client.get_integration(ApiId=api_id, IntegrationId=integration_id)
err = exc.value.response["Error"]
err["Code"].should.equal("NotFoundException")
@mock_apigatewayv2
def test_update_integration_single_attr():
client = boto3.client("apigatewayv2", region_name="eu-west-1")
api_id = client.create_api(Name="test-api", ProtocolType="HTTP")["ApiId"]
int_id = client.create_integration(
ApiId=api_id,
ConnectionId="conn_id",
ConnectionType="INTERNET",
ContentHandlingStrategy="CONVERT_TO_BINARY",
CredentialsArn="cred:arn",
Description="my full integration",
IntegrationMethod="PUT",
IntegrationType="HTTP",
IntegrationSubtype="n/a",
PassthroughBehavior="WHEN_NO_MATCH",
PayloadFormatVersion="1.0",
RequestParameters={"r": "p"},
RequestTemplates={"r": "t"},
ResponseParameters={"res": {"par": "am"}},
TemplateSelectionExpression="tse",
TimeoutInMillis=123,
TlsConfig={"ServerNameToVerify": "server"},
)["IntegrationId"]
resp = client.update_integration(
ApiId=api_id, IntegrationId=int_id, Description="updated int"
)
resp.should.have.key("IntegrationId")
resp.should.have.key("ConnectionId").equals("conn_id")
resp.should.have.key("ConnectionType").equals("INTERNET")
resp.should.have.key("ContentHandlingStrategy").equals("CONVERT_TO_BINARY")
resp.should.have.key("CredentialsArn").equals("cred:arn")
resp.should.have.key("Description").equals("updated int")
resp.should.have.key("IntegrationMethod").equals("PUT")
resp.should.have.key("IntegrationType").equals("HTTP")
resp.should.have.key("IntegrationSubtype").equals("n/a")
resp.should.have.key("PassthroughBehavior").equals("WHEN_NO_MATCH")
resp.should.have.key("PayloadFormatVersion").equals("1.0")
resp.should.have.key("RequestParameters").equals({"r": "p"})
resp.should.have.key("RequestTemplates").equals({"r": "t"})
resp.should.have.key("ResponseParameters").equals({"res": {"par": "am"}})
resp.should.have.key("TemplateSelectionExpression").equals("tse")
resp.should.have.key("TimeoutInMillis").equals(123)
resp.should.have.key("TlsConfig").equals({"ServerNameToVerify": "server"})
@mock_apigatewayv2
def test_update_integration_all_attrs():
client = boto3.client("apigatewayv2", region_name="eu-west-1")
api_id = client.create_api(Name="test-api", ProtocolType="HTTP")["ApiId"]
int_id = client.create_integration(
ApiId=api_id,
ConnectionId="conn_id",
ConnectionType="INTERNET",
ContentHandlingStrategy="CONVERT_TO_BINARY",
CredentialsArn="cred:arn",
Description="my full integration",
IntegrationMethod="PUT",
IntegrationType="HTTP",
IntegrationSubtype="n/a",
PassthroughBehavior="WHEN_NO_MATCH",
PayloadFormatVersion="1.0",
RequestParameters={"r": "p"},
RequestTemplates={"r": "t"},
ResponseParameters={"res": {"par": "am"}},
TemplateSelectionExpression="tse",
TimeoutInMillis=123,
TlsConfig={"ServerNameToVerify": "server"},
)["IntegrationId"]
resp = client.update_integration(
ApiId=api_id,
IntegrationId=int_id,
ConnectionType="VPC_LINK",
ContentHandlingStrategy="CONVERT_TO_TEXT",
CredentialsArn="",
IntegrationMethod="PATCH",
IntegrationType="AWS",
PassthroughBehavior="NEVER",
)
resp.should.have.key("IntegrationId")
resp.should.have.key("ConnectionId").equals("conn_id")
resp.should.have.key("ConnectionType").equals("VPC_LINK")
resp.should.have.key("ContentHandlingStrategy").equals("CONVERT_TO_TEXT")
resp.should.have.key("CredentialsArn").equals("")
resp.should.have.key("Description").equals("my full integration")
resp.should.have.key("IntegrationMethod").equals("PATCH")
resp.should.have.key("IntegrationType").equals("AWS")
resp.should.have.key("IntegrationSubtype").equals("n/a")
resp.should.have.key("PassthroughBehavior").equals("NEVER")
resp.should.have.key("PayloadFormatVersion").equals("1.0")
resp.should.have.key("RequestParameters").equals({"r": "p"})
resp.should.have.key("RequestTemplates").equals({"r": "t"})
resp.should.have.key("ResponseParameters").equals({"res": {"par": "am"}})
resp.should.have.key("TemplateSelectionExpression").equals("tse")
resp.should.have.key("TimeoutInMillis").equals(123)
resp.should.have.key("TlsConfig").equals({"ServerNameToVerify": "server"})
@mock_apigatewayv2
def test_update_integration_request_parameters():
client = boto3.client("apigatewayv2", region_name="eu-west-1")
api_id = client.create_api(Name="test-api", ProtocolType="HTTP")["ApiId"]
resp = client.create_integration(
ApiId=api_id,
ConnectionType="INTERNET",
IntegrationMethod="ANY",
IntegrationType="HTTP_PROXY",
IntegrationUri="http://www.example.com",
PayloadFormatVersion="1.0",
RequestParameters={
"append:header.header1": "$context.requestId",
"remove:querystring.qs1": "''",
},
ResponseParameters={
"404": {"append:header.error": "$stageVariables.environmentId"},
"500": {
"append:header.header1": "$context.requestId",
"overwrite:statuscode": "403",
},
},
)
int_id = resp["IntegrationId"]
# Having an empty value between quotes ("''") is valid
resp["RequestParameters"].should.equal(
{"append:header.header1": "$context.requestId", "remove:querystring.qs1": "''"}
)
resp = client.update_integration(
ApiId=api_id,
IntegrationId=int_id,
IntegrationType="HTTP_PROXY",
RequestParameters={
"append:header.header1": "$context.accountId",
"overwrite:header.header2": "$stageVariables.environmentId",
"remove:querystring.qs1": "",
},
ResponseParameters={
"404": {},
"500": {
"append:header.header1": "$context.requestId",
"overwrite:statuscode": "403",
},
},
)
resp.should.have.key("IntegrationId")
resp.should.have.key("IntegrationMethod").equals("ANY")
resp.should.have.key("IntegrationType").equals("HTTP_PROXY")
resp.should.have.key("PayloadFormatVersion").equals("1.0")
# Having no value ("") is not valid, so that param should not be persisted
resp.should.have.key("RequestParameters").equals(
{
"append:header.header1": "$context.accountId",
"overwrite:header.header2": "$stageVariables.environmentId",
}
)
resp.should.have.key("ResponseParameters").equals(
{
"404": {},
"500": {
"append:header.header1": "$context.requestId",
"overwrite:statuscode": "403",
},
}
)