196 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			196 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								import boto3
							 | 
						||
| 
								 | 
							
								import sure  # noqa # pylint: disable=unused-import
							 | 
						||
| 
								 | 
							
								import pytest
							 | 
						||
| 
								 | 
							
								import botocore.exceptions
							 | 
						||
| 
								 | 
							
								from moto import mock_apigatewayv2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@mock_apigatewayv2
							 | 
						||
| 
								 | 
							
								def test_create_api_mapping():
							 | 
						||
| 
								 | 
							
								    client = boto3.client("apigatewayv2", region_name="us-east-1")
							 | 
						||
| 
								 | 
							
								    api = client.create_api(Name="test-api", ProtocolType="HTTP")
							 | 
						||
| 
								 | 
							
								    dev_domain = client.create_domain_name(DomainName="dev.service.io")
							 | 
						||
| 
								 | 
							
								    expected_keys = ["ApiId", "ApiMappingId", "ApiMappingKey", "Stage"]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    post_resp = client.create_api_mapping(
							 | 
						||
| 
								 | 
							
								        DomainName=dev_domain["DomainName"],
							 | 
						||
| 
								 | 
							
								        ApiMappingKey="v1/api",
							 | 
						||
| 
								 | 
							
								        Stage="$default",
							 | 
						||
| 
								 | 
							
								        ApiId=api["ApiId"],
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    get_resp = client.get_api_mapping(
							 | 
						||
| 
								 | 
							
								        DomainName="dev.service.io", ApiMappingId=post_resp["ApiMappingId"]
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # check post response has all expected keys
							 | 
						||
| 
								 | 
							
								    for key in expected_keys:
							 | 
						||
| 
								 | 
							
								        post_resp.should.have.key(key)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # check get response has all expected keys
							 | 
						||
| 
								 | 
							
								    for key in expected_keys:
							 | 
						||
| 
								 | 
							
								        get_resp.should.have.key(key)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # check that values are equal for post and get of same resource
							 | 
						||
| 
								 | 
							
								    for key in expected_keys:
							 | 
						||
| 
								 | 
							
								        post_resp.get(key).should.equal(get_resp.get(key))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # ensure known values are set correct in post response
							 | 
						||
| 
								 | 
							
								    post_resp.get("ApiId").should_not.equal(None)
							 | 
						||
| 
								 | 
							
								    post_resp.get("ApiMappingId").should_not.equal(None)
							 | 
						||
| 
								 | 
							
								    post_resp.get("ApiMappingKey").should.equal("v1/api")
							 | 
						||
| 
								 | 
							
								    post_resp.get("Stage").should.equal("$default")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@mock_apigatewayv2
							 | 
						||
| 
								 | 
							
								def test_create_api_mapping_missing_api():
							 | 
						||
| 
								 | 
							
								    client = boto3.client("apigatewayv2", region_name="us-east-1")
							 | 
						||
| 
								 | 
							
								    dev_domain = client.create_domain_name(DomainName="dev.service.io")
							 | 
						||
| 
								 | 
							
								    with pytest.raises(botocore.exceptions.ClientError) as exc:
							 | 
						||
| 
								 | 
							
								        client.create_api_mapping(
							 | 
						||
| 
								 | 
							
								            DomainName=dev_domain["DomainName"],
							 | 
						||
| 
								 | 
							
								            Stage="$default",
							 | 
						||
| 
								 | 
							
								            ApiId="123dne",
							 | 
						||
| 
								 | 
							
								        )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    err = exc.value.response["Error"]
							 | 
						||
| 
								 | 
							
								    err["Code"].should.equal("NotFoundException")
							 | 
						||
| 
								 | 
							
								    err["Message"].should.equal(
							 | 
						||
| 
								 | 
							
								        "Invalid API identifier specified The resource specified in the request was not found."
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@mock_apigatewayv2
							 | 
						||
| 
								 | 
							
								def test_create_api_mapping_missing_domain():
							 | 
						||
| 
								 | 
							
								    client = boto3.client("apigatewayv2", region_name="us-east-1")
							 | 
						||
| 
								 | 
							
								    api = client.create_api(Name="test-api", ProtocolType="HTTP")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    with pytest.raises(botocore.exceptions.ClientError) as exc:
							 | 
						||
| 
								 | 
							
								        client.create_api_mapping(
							 | 
						||
| 
								 | 
							
								            DomainName="domain.dne",
							 | 
						||
| 
								 | 
							
								            Stage="$default",
							 | 
						||
| 
								 | 
							
								            ApiId=api["ApiId"],
							 | 
						||
| 
								 | 
							
								        )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    err = exc.value.response["Error"]
							 | 
						||
| 
								 | 
							
								    err["Code"].should.equal("NotFoundException")
							 | 
						||
| 
								 | 
							
								    err["Message"].should.equal(
							 | 
						||
| 
								 | 
							
								        "The domain name resource specified in the request was not found."
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@mock_apigatewayv2
							 | 
						||
| 
								 | 
							
								def test_create_api_mapping_bad_mapping_keys():
							 | 
						||
| 
								 | 
							
								    client = boto3.client("apigatewayv2", region_name="us-east-1")
							 | 
						||
| 
								 | 
							
								    api = client.create_api(Name="test-api", ProtocolType="HTTP")
							 | 
						||
| 
								 | 
							
								    dev_domain = client.create_domain_name(DomainName="dev.service.io")
							 | 
						||
| 
								 | 
							
								    bad_keys = {
							 | 
						||
| 
								 | 
							
								        "/api": "API mapping key should not start with a '/' or have consecutive '/'s.",
							 | 
						||
| 
								 | 
							
								        "v1//api": "API mapping key should not start with a '/' or have consecutive '/'s.",
							 | 
						||
| 
								 | 
							
								        "api/": "API mapping key should not end with a '/'.",
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for bad_key, message in bad_keys.items():
							 | 
						||
| 
								 | 
							
								        with pytest.raises(botocore.exceptions.ClientError) as exc:
							 | 
						||
| 
								 | 
							
								            client.create_api_mapping(
							 | 
						||
| 
								 | 
							
								                DomainName=dev_domain["DomainName"],
							 | 
						||
| 
								 | 
							
								                ApiMappingKey=bad_key,
							 | 
						||
| 
								 | 
							
								                Stage="$default",
							 | 
						||
| 
								 | 
							
								                ApiId=api["ApiId"],
							 | 
						||
| 
								 | 
							
								            )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        err = exc.value.response["Error"]
							 | 
						||
| 
								 | 
							
								        err["Code"].should.equal("BadRequestException")
							 | 
						||
| 
								 | 
							
								        err["Message"].should.equal(message)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@mock_apigatewayv2
							 | 
						||
| 
								 | 
							
								def test_get_api_mappings():
							 | 
						||
| 
								 | 
							
								    client = boto3.client("apigatewayv2", region_name="eu-west-1")
							 | 
						||
| 
								 | 
							
								    api = client.create_api(Name="test-api", ProtocolType="HTTP")
							 | 
						||
| 
								 | 
							
								    included_domain = client.create_domain_name(DomainName="dev.service.io")
							 | 
						||
| 
								 | 
							
								    excluded_domain = client.create_domain_name(DomainName="hr.service.io")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    v1_mapping = client.create_api_mapping(
							 | 
						||
| 
								 | 
							
								        DomainName=included_domain["DomainName"],
							 | 
						||
| 
								 | 
							
								        ApiMappingKey="v1/api",
							 | 
						||
| 
								 | 
							
								        Stage="$default",
							 | 
						||
| 
								 | 
							
								        ApiId=api["ApiId"],
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    v2_mapping = client.create_api_mapping(
							 | 
						||
| 
								 | 
							
								        DomainName=included_domain["DomainName"],
							 | 
						||
| 
								 | 
							
								        ApiMappingKey="v2/api",
							 | 
						||
| 
								 | 
							
								        Stage="$default",
							 | 
						||
| 
								 | 
							
								        ApiId=api["ApiId"],
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    hr_mapping = client.create_api_mapping(
							 | 
						||
| 
								 | 
							
								        DomainName=excluded_domain["DomainName"],
							 | 
						||
| 
								 | 
							
								        ApiMappingKey="hr/api",
							 | 
						||
| 
								 | 
							
								        Stage="$default",
							 | 
						||
| 
								 | 
							
								        ApiId=api["ApiId"],
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # sanity check responses
							 | 
						||
| 
								 | 
							
								    v1_mapping.should.have.key("ApiMappingKey").equals("v1/api")
							 | 
						||
| 
								 | 
							
								    v2_mapping.should.have.key("ApiMappingKey").equals("v2/api")
							 | 
						||
| 
								 | 
							
								    hr_mapping.should.have.key("ApiMappingKey").equals("hr/api")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # make comparable
							 | 
						||
| 
								 | 
							
								    del v1_mapping["ResponseMetadata"]
							 | 
						||
| 
								 | 
							
								    del v2_mapping["ResponseMetadata"]
							 | 
						||
| 
								 | 
							
								    del hr_mapping["ResponseMetadata"]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    get_resp = client.get_api_mappings(DomainName=included_domain["DomainName"])
							 | 
						||
| 
								 | 
							
								    get_resp.should.have.key("Items")
							 | 
						||
| 
								 | 
							
								    get_resp.get("Items").should.contain(v1_mapping)
							 | 
						||
| 
								 | 
							
								    get_resp.get("Items").should.contain(v2_mapping)
							 | 
						||
| 
								 | 
							
								    get_resp.get("Items").should_not.contain(hr_mapping)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@mock_apigatewayv2
							 | 
						||
| 
								 | 
							
								def test_delete_api_mapping():
							 | 
						||
| 
								 | 
							
								    client = boto3.client("apigatewayv2", region_name="eu-west-1")
							 | 
						||
| 
								 | 
							
								    api = client.create_api(Name="test-api", ProtocolType="HTTP")
							 | 
						||
| 
								 | 
							
								    api_domain = client.create_domain_name(DomainName="dev.service.io")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    v1_mapping = client.create_api_mapping(
							 | 
						||
| 
								 | 
							
								        DomainName=api_domain["DomainName"],
							 | 
						||
| 
								 | 
							
								        ApiMappingKey="v1/api",
							 | 
						||
| 
								 | 
							
								        Stage="$default",
							 | 
						||
| 
								 | 
							
								        ApiId=api["ApiId"],
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    del v1_mapping["ResponseMetadata"]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    get_resp = client.get_api_mappings(DomainName=api_domain["DomainName"])
							 | 
						||
| 
								 | 
							
								    get_resp.should.have.key("Items")
							 | 
						||
| 
								 | 
							
								    get_resp.get("Items").should.contain(v1_mapping)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    client.delete_api_mapping(
							 | 
						||
| 
								 | 
							
								        DomainName=api_domain["DomainName"], ApiMappingId=v1_mapping["ApiMappingId"]
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    get_resp = client.get_api_mappings(DomainName=api_domain["DomainName"])
							 | 
						||
| 
								 | 
							
								    get_resp.should.have.key("Items")
							 | 
						||
| 
								 | 
							
								    get_resp.get("Items").should_not.contain(v1_mapping)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@mock_apigatewayv2
							 | 
						||
| 
								 | 
							
								def test_delete_api_mapping_dne():
							 | 
						||
| 
								 | 
							
								    client = boto3.client("apigatewayv2", region_name="eu-west-1")
							 | 
						||
| 
								 | 
							
								    client.create_api(Name="test-api", ProtocolType="HTTP")
							 | 
						||
| 
								 | 
							
								    api_domain = client.create_domain_name(DomainName="dev.service.io")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    with pytest.raises(botocore.exceptions.ClientError) as exc:
							 | 
						||
| 
								 | 
							
								        client.delete_api_mapping(
							 | 
						||
| 
								 | 
							
								            DomainName=api_domain["DomainName"], ApiMappingId="123dne"
							 | 
						||
| 
								 | 
							
								        )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    err = exc.value.response["Error"]
							 | 
						||
| 
								 | 
							
								    err["Code"].should.equal("NotFoundException")
							 | 
						||
| 
								 | 
							
								    err["Message"].should.equal(
							 | 
						||
| 
								 | 
							
								        "The api mapping resource specified in the request was not found."
							 | 
						||
| 
								 | 
							
								    )
							 |