317 lines
10 KiB
Python
317 lines
10 KiB
Python
"""Unit tests for apigatewayv2-supported APIs."""
|
|
import boto3
|
|
import pytest
|
|
from botocore.exceptions import ClientError
|
|
|
|
from moto import mock_aws
|
|
|
|
# See our Development Tips on writing tests for hints on how to write good tests:
|
|
# http://docs.getmoto.org/en/latest/docs/contributing/development_tips/tests.html
|
|
|
|
|
|
@mock_aws
|
|
def test_create_api_with_unknown_protocol_type():
|
|
client = boto3.client("apigatewayv2", region_name="eu-west-1")
|
|
|
|
with pytest.raises(ClientError) as exc:
|
|
client.create_api(Name="test-api", ProtocolType="?")
|
|
err = exc.value.response["Error"]
|
|
assert err["Code"] == "BadRequestException"
|
|
assert (
|
|
err["Message"] == "Invalid protocol specified. Must be one of [HTTP, WEBSOCKET]"
|
|
)
|
|
|
|
|
|
@mock_aws
|
|
def test_create_api_minimal():
|
|
client = boto3.client("apigatewayv2", region_name="eu-west-1")
|
|
resp = client.create_api(Name="test-api", ProtocolType="HTTP")
|
|
|
|
assert "ApiId" in resp
|
|
assert (
|
|
resp["ApiEndpoint"]
|
|
== f"https://{resp['ApiId']}.execute-api.eu-west-1.amazonaws.com"
|
|
)
|
|
assert resp["ApiKeySelectionExpression"] == "$request.header.x-api-key"
|
|
assert "CreatedDate" in resp
|
|
assert resp["DisableExecuteApiEndpoint"] is False
|
|
assert resp["Name"] == "test-api"
|
|
assert resp["ProtocolType"] == "HTTP"
|
|
assert resp["RouteSelectionExpression"] == "$request.method $request.path"
|
|
|
|
|
|
@mock_aws
|
|
def test_create_api():
|
|
client = boto3.client("apigatewayv2", region_name="eu-west-1")
|
|
resp = client.create_api(
|
|
ApiKeySelectionExpression="s3l3ction",
|
|
CorsConfiguration={
|
|
"AllowCredentials": True,
|
|
"AllowHeaders": ["x-header1"],
|
|
"AllowMethods": ["GET", "PUT"],
|
|
"AllowOrigins": ["google.com"],
|
|
"ExposeHeaders": ["x-header1"],
|
|
"MaxAge": 2,
|
|
},
|
|
Description="my first api",
|
|
DisableSchemaValidation=True,
|
|
DisableExecuteApiEndpoint=True,
|
|
Name="test-api",
|
|
ProtocolType="HTTP",
|
|
RouteSelectionExpression="route_s3l3ction",
|
|
Version="1.0",
|
|
)
|
|
|
|
assert "ApiId" in resp
|
|
assert (
|
|
resp["ApiEndpoint"]
|
|
== f"https://{resp['ApiId']}.execute-api.eu-west-1.amazonaws.com"
|
|
)
|
|
assert resp["ApiKeySelectionExpression"] == "s3l3ction"
|
|
assert "CreatedDate" in resp
|
|
assert resp["CorsConfiguration"] == {
|
|
"AllowCredentials": True,
|
|
"AllowHeaders": ["x-header1"],
|
|
"AllowMethods": ["GET", "PUT"],
|
|
"AllowOrigins": ["google.com"],
|
|
"ExposeHeaders": ["x-header1"],
|
|
"MaxAge": 2,
|
|
}
|
|
assert resp["Description"] == "my first api"
|
|
assert resp["DisableExecuteApiEndpoint"] is True
|
|
assert resp["DisableSchemaValidation"] is True
|
|
assert resp["Name"] == "test-api"
|
|
assert resp["ProtocolType"] == "HTTP"
|
|
assert resp["RouteSelectionExpression"] == "route_s3l3ction"
|
|
assert resp["Version"] == "1.0"
|
|
|
|
|
|
@mock_aws
|
|
def test_delete_api():
|
|
client = boto3.client("apigatewayv2", region_name="us-east-2")
|
|
api_id = client.create_api(Name="t", ProtocolType="HTTP")["ApiId"]
|
|
|
|
client.delete_api(ApiId=api_id)
|
|
|
|
with pytest.raises(ClientError) as exc:
|
|
client.get_api(ApiId=api_id)
|
|
assert exc.value.response["Error"]["Code"] == "NotFoundException"
|
|
|
|
|
|
@mock_aws
|
|
def test_delete_cors_configuration():
|
|
client = boto3.client("apigatewayv2", region_name="eu-west-1")
|
|
api_id = client.create_api(
|
|
ApiKeySelectionExpression="s3l3ction",
|
|
CorsConfiguration={
|
|
"AllowCredentials": True,
|
|
"AllowHeaders": ["x-header1"],
|
|
"AllowMethods": ["GET", "PUT"],
|
|
"AllowOrigins": ["google.com"],
|
|
"ExposeHeaders": ["x-header1"],
|
|
"MaxAge": 2,
|
|
},
|
|
Description="my first api",
|
|
DisableSchemaValidation=True,
|
|
DisableExecuteApiEndpoint=True,
|
|
Name="test-api",
|
|
ProtocolType="HTTP",
|
|
RouteSelectionExpression="route_s3l3ction",
|
|
Version="1.0",
|
|
)["ApiId"]
|
|
|
|
client.delete_cors_configuration(ApiId=api_id)
|
|
|
|
resp = client.get_api(ApiId=api_id)
|
|
|
|
assert "CorsConfiguration" not in resp
|
|
assert resp["Description"] == "my first api"
|
|
assert resp["Name"] == "test-api"
|
|
|
|
|
|
@mock_aws
|
|
def test_get_api_unknown():
|
|
client = boto3.client("apigatewayv2", region_name="ap-southeast-1")
|
|
with pytest.raises(ClientError) as exc:
|
|
client.get_api(ApiId="unknown")
|
|
|
|
err = exc.value.response["Error"]
|
|
assert err["Code"] == "NotFoundException"
|
|
assert err["Message"] == "Invalid API identifier specified unknown"
|
|
|
|
|
|
@mock_aws
|
|
def test_get_api():
|
|
client = boto3.client("apigatewayv2", region_name="ap-southeast-1")
|
|
api_id = client.create_api(Name="test-get-api", ProtocolType="WEBSOCKET")["ApiId"]
|
|
|
|
resp = client.get_api(ApiId=api_id)
|
|
|
|
assert resp["ApiId"] == api_id
|
|
assert (
|
|
resp["ApiEndpoint"]
|
|
== f"https://{resp['ApiId']}.execute-api.ap-southeast-1.amazonaws.com"
|
|
)
|
|
assert resp["ApiKeySelectionExpression"] == "$request.header.x-api-key"
|
|
assert "CreatedDate" in resp
|
|
assert resp["DisableExecuteApiEndpoint"] is False
|
|
assert resp["Name"] == "test-get-api"
|
|
assert resp["ProtocolType"] == "WEBSOCKET"
|
|
assert resp["RouteSelectionExpression"] == "$request.method $request.path"
|
|
|
|
|
|
@mock_aws
|
|
def test_get_apis():
|
|
client = boto3.client("apigatewayv2", region_name="ap-southeast-1")
|
|
assert len(client.get_apis()["Items"]) == 0
|
|
|
|
api_id_1 = client.create_api(Name="api1", ProtocolType="HTTP")["ApiId"]
|
|
api_id_2 = client.create_api(Name="api2", ProtocolType="WEBSOCKET")["ApiId"]
|
|
assert len(client.get_apis()["Items"]) == 2
|
|
|
|
api_ids = [i["ApiId"] for i in client.get_apis()["Items"]]
|
|
assert api_id_1 in api_ids
|
|
assert api_id_2 in api_ids
|
|
|
|
|
|
@mock_aws
|
|
def test_update_api_minimal():
|
|
client = boto3.client("apigatewayv2", region_name="eu-west-1")
|
|
api_id = client.create_api(
|
|
ApiKeySelectionExpression="s3l3ction",
|
|
CorsConfiguration={
|
|
"AllowCredentials": True,
|
|
"AllowHeaders": ["x-header1"],
|
|
"AllowMethods": ["GET", "PUT"],
|
|
"AllowOrigins": ["google.com"],
|
|
"ExposeHeaders": ["x-header1"],
|
|
"MaxAge": 2,
|
|
},
|
|
Description="my first api",
|
|
DisableSchemaValidation=True,
|
|
DisableExecuteApiEndpoint=True,
|
|
Name="test-api",
|
|
ProtocolType="HTTP",
|
|
RouteSelectionExpression="route_s3l3ction",
|
|
Version="1.0",
|
|
)["ApiId"]
|
|
|
|
resp = client.update_api(
|
|
ApiId=api_id,
|
|
CorsConfiguration={
|
|
"AllowCredentials": False,
|
|
"AllowHeaders": ["x-header2"],
|
|
"AllowMethods": ["GET", "PUT"],
|
|
"AllowOrigins": ["google.com"],
|
|
"ExposeHeaders": ["x-header2"],
|
|
"MaxAge": 2,
|
|
},
|
|
)
|
|
|
|
assert "ApiId" in resp
|
|
assert (
|
|
resp["ApiEndpoint"]
|
|
== f"https://{resp['ApiId']}.execute-api.eu-west-1.amazonaws.com"
|
|
)
|
|
assert resp["ApiKeySelectionExpression"] == "s3l3ction"
|
|
assert "CreatedDate" in resp
|
|
assert resp["CorsConfiguration"] == {
|
|
"AllowCredentials": False,
|
|
"AllowHeaders": ["x-header2"],
|
|
"AllowMethods": ["GET", "PUT"],
|
|
"AllowOrigins": ["google.com"],
|
|
"ExposeHeaders": ["x-header2"],
|
|
"MaxAge": 2,
|
|
}
|
|
assert resp["Description"] == "my first api"
|
|
assert resp["DisableExecuteApiEndpoint"] is True
|
|
assert resp["DisableSchemaValidation"] is True
|
|
assert resp["Name"] == "test-api"
|
|
assert resp["ProtocolType"] == "HTTP"
|
|
assert resp["RouteSelectionExpression"] == "route_s3l3ction"
|
|
assert resp["Version"] == "1.0"
|
|
|
|
|
|
@mock_aws
|
|
def test_update_api_empty_fields():
|
|
client = boto3.client("apigatewayv2", region_name="eu-west-1")
|
|
api_id = client.create_api(
|
|
ApiKeySelectionExpression="s3l3ction",
|
|
CorsConfiguration={
|
|
"AllowCredentials": True,
|
|
"AllowHeaders": ["x-header1"],
|
|
"AllowMethods": ["GET", "PUT"],
|
|
"AllowOrigins": ["google.com"],
|
|
"ExposeHeaders": ["x-header1"],
|
|
"MaxAge": 2,
|
|
},
|
|
Description="my first api",
|
|
DisableSchemaValidation=True,
|
|
DisableExecuteApiEndpoint=True,
|
|
Name="test-api",
|
|
ProtocolType="HTTP",
|
|
RouteSelectionExpression="route_s3l3ction",
|
|
Version="1.0",
|
|
)["ApiId"]
|
|
|
|
resp = client.update_api(ApiId=api_id, Description="", Name="updated", Version="")
|
|
|
|
assert "ApiId" in resp
|
|
assert (
|
|
resp["ApiEndpoint"]
|
|
== f"https://{resp['ApiId']}.execute-api.eu-west-1.amazonaws.com"
|
|
)
|
|
assert resp["ApiKeySelectionExpression"] == "s3l3ction"
|
|
assert resp["Description"] == ""
|
|
assert resp["DisableExecuteApiEndpoint"] is True
|
|
assert resp["DisableSchemaValidation"] is True
|
|
assert resp["Name"] == "updated"
|
|
assert resp["ProtocolType"] == "HTTP"
|
|
assert resp["RouteSelectionExpression"] == "route_s3l3ction"
|
|
assert resp["Version"] == ""
|
|
|
|
|
|
@mock_aws
|
|
def test_update_api():
|
|
client = boto3.client("apigatewayv2", region_name="us-east-2")
|
|
api_id = client.create_api(Name="test-api", ProtocolType="HTTP")["ApiId"]
|
|
|
|
resp = client.update_api(
|
|
ApiId=api_id,
|
|
ApiKeySelectionExpression="api_key_s3l3ction",
|
|
CorsConfiguration={
|
|
"AllowCredentials": True,
|
|
"AllowHeaders": ["X-Amz-Target"],
|
|
"AllowMethods": ["GET"],
|
|
},
|
|
CredentialsArn="credentials:arn",
|
|
Description="updated API",
|
|
DisableSchemaValidation=True,
|
|
DisableExecuteApiEndpoint=True,
|
|
Name="new name",
|
|
RouteKey="route key",
|
|
RouteSelectionExpression="route_s3l3ction",
|
|
Target="updated target",
|
|
Version="1.1",
|
|
)
|
|
|
|
assert "ApiId" in resp
|
|
assert (
|
|
resp["ApiEndpoint"]
|
|
== f"https://{resp['ApiId']}.execute-api.us-east-2.amazonaws.com"
|
|
)
|
|
assert resp["ApiKeySelectionExpression"] == "api_key_s3l3ction"
|
|
assert resp["CorsConfiguration"] == {
|
|
"AllowCredentials": True,
|
|
"AllowHeaders": ["X-Amz-Target"],
|
|
"AllowMethods": ["GET"],
|
|
}
|
|
assert "CreatedDate" in resp
|
|
assert resp["Description"] == "updated API"
|
|
assert resp["DisableSchemaValidation"] is True
|
|
assert resp["DisableExecuteApiEndpoint"] is True
|
|
assert resp["Name"] == "new name"
|
|
assert resp["ProtocolType"] == "HTTP"
|
|
assert resp["RouteSelectionExpression"] == "route_s3l3ction"
|
|
assert resp["Version"] == "1.1"
|