moto/tests/test_apigateway/test_apigateway_deployments.py
2024-01-27 19:38:09 +00:00

208 lines
7.3 KiB
Python

import boto3
import pytest
from botocore.exceptions import ClientError
from moto import mock_aws
from .test_apigateway import create_method_integration
@mock_aws
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"]
with pytest.raises(ClientError) as ex:
client.create_deployment(restApiId=api_id, stageName=stage_name)["id"]
assert ex.value.response["Error"]["Code"] == "BadRequestException"
assert (
ex.value.response["Error"]["Message"]
== "The REST API doesn't contain any methods"
)
@mock_aws
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 = [r for r in resources["items"] if r["path"] == "/"][0]["id"]
client.put_method(
restApiId=api_id, resourceId=root_id, httpMethod="GET", authorizationType="NONE"
)
with pytest.raises(ClientError) as ex:
client.create_deployment(restApiId=api_id, stageName=stage_name)["id"]
assert ex.value.response["Error"]["Code"] == "NotFoundException"
assert ex.value.response["Error"]["Message"] == "No integration defined for method"
@mock_aws
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_aws
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_aws
def test_create_deployment_minimal():
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)
response = client.create_deployment(restApiId=api_id, stageName=stage_name)
deployment_id = response["id"]
response = client.get_deployment(restApiId=api_id, deploymentId=deployment_id)
assert response["id"] == deployment_id
assert response["ResponseMetadata"]["HTTPStatusCode"] == 200
@mock_aws
def test_create_deployment_with_empty_stage():
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"]
create_method_integration(client, api_id)
response = client.create_deployment(restApiId=api_id, stageName="")
deployment_id = response["id"]
response = client.get_deployment(restApiId=api_id, deploymentId=deployment_id)
assert "id" in response
assert "createdDate" in response
assert "stageName" not in response
# This should not create an empty stage
stages = client.get_stages(restApiId=api_id)["item"]
assert stages == []
@mock_aws
def test_get_deployments():
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)
response = client.create_deployment(restApiId=api_id, stageName=stage_name)
deployment_id = response["id"]
response = client.get_deployments(restApiId=api_id)
assert len(response["items"]) == 1
response["items"][0].pop("createdDate")
assert response["items"] == [{"id": deployment_id}]
@mock_aws
def test_create_multiple_deployments():
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)
response = client.create_deployment(restApiId=api_id, stageName=stage_name)
deployment_id = response["id"]
response = client.get_deployment(restApiId=api_id, deploymentId=deployment_id)
response = client.create_deployment(restApiId=api_id, stageName=stage_name)
deployment_id2 = response["id"]
response = client.get_deployments(restApiId=api_id)
assert response["items"][0]["id"] in [deployment_id, deployment_id2]
assert response["items"][1]["id"] in [deployment_id, deployment_id2]
@mock_aws
def test_delete_deployment__requires_stage_to_be_deleted():
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)
response = client.create_deployment(restApiId=api_id, stageName=stage_name)
deployment_id = response["id"]
# Can't delete deployment immediately
with pytest.raises(ClientError) as exc:
client.delete_deployment(restApiId=api_id, deploymentId=deployment_id)
err = exc.value.response["Error"]
assert err["Code"] == "BadRequestException"
assert (
err["Message"]
== "Active stages pointing to this deployment must be moved or deleted"
)
# Deployment still exists
deployments = client.get_deployments(restApiId=api_id)["items"]
assert len(deployments) == 1
# Stage still exists
stages = client.get_stages(restApiId=api_id)["item"]
assert len(stages) == 1
# Delete stage first
resp = client.delete_stage(restApiId=api_id, stageName=stage_name)
assert resp["ResponseMetadata"]["HTTPStatusCode"] == 202
# Deployment still exists
deployments = client.get_deployments(restApiId=api_id)["items"]
assert len(deployments) == 1
# Now delete deployment
resp = client.delete_deployment(restApiId=api_id, deploymentId=deployment_id)
assert resp["ResponseMetadata"]["HTTPStatusCode"] == 202
# Deployment is gone
deployments = client.get_deployments(restApiId=api_id)["items"]
assert len(deployments) == 0
# Stage is gone
stages = client.get_stages(restApiId=api_id)["item"]
assert len(stages) == 0
@mock_aws
def test_delete_unknown_deployment():
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"]
create_method_integration(client, api_id)
with pytest.raises(ClientError) as exc:
client.delete_deployment(restApiId=api_id, deploymentId="unknown")
err = exc.value.response["Error"]
assert err["Code"] == "NotFoundException"
assert err["Message"] == "Invalid Deployment identifier specified"