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." | ||
|  |     ) |