218 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			218 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | import boto3 | ||
|  | import os | ||
|  | import pytest | ||
|  | 
 | ||
|  | from botocore.exceptions import ClientError | ||
|  | from moto import mock_apigateway | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_apigateway | ||
|  | def test_put_rest_api__api_details_are_persisted(): | ||
|  |     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"] | ||
|  | 
 | ||
|  |     path = os.path.dirname(os.path.abspath(__file__)) | ||
|  |     with open(path + "/resources/test_api.json", "rb") as api_json: | ||
|  |         response = client.put_rest_api( | ||
|  |             restApiId=api_id, | ||
|  |             mode="overwrite", | ||
|  |             failOnWarnings=True, | ||
|  |             body=api_json.read(), | ||
|  |         ) | ||
|  | 
 | ||
|  |     response.should.have.key("id").which.should.equal(api_id) | ||
|  |     response.should.have.key("name").which.should.equal("my_api") | ||
|  |     response.should.have.key("description").which.should.equal("this is my api") | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_apigateway | ||
|  | def test_put_rest_api__methods_are_created(): | ||
|  |     client = boto3.client("apigateway", region_name="us-east-2") | ||
|  | 
 | ||
|  |     response = client.create_rest_api(name="my_api", description="this is my api") | ||
|  |     api_id = response["id"] | ||
|  | 
 | ||
|  |     path = os.path.dirname(os.path.abspath(__file__)) | ||
|  |     with open(path + "/resources/test_api.json", "rb") as api_json: | ||
|  |         client.put_rest_api(restApiId=api_id, body=api_json.read()) | ||
|  | 
 | ||
|  |     resources = client.get_resources(restApiId=api_id) | ||
|  |     root_id = [res for res in resources["items"] if res["path"] == "/"][0]["id"] | ||
|  | 
 | ||
|  |     # We have a GET-method | ||
|  |     resp = client.get_method(restApiId=api_id, resourceId=root_id, httpMethod="GET") | ||
|  |     resp["methodResponses"].should.equal({"200": {"statusCode": "200"}}) | ||
|  | 
 | ||
|  |     # We have a POST on /test | ||
|  |     test_path_id = [res for res in resources["items"] if res["path"] == "/test"][0][ | ||
|  |         "id" | ||
|  |     ] | ||
|  |     resp = client.get_method( | ||
|  |         restApiId=api_id, resourceId=test_path_id, httpMethod="POST" | ||
|  |     ) | ||
|  |     resp["methodResponses"].should.equal({"201": {"statusCode": "201"}}) | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_apigateway | ||
|  | def test_put_rest_api__existing_methods_are_overwritten(): | ||
|  |     client = boto3.client("apigateway", region_name="us-east-2") | ||
|  | 
 | ||
|  |     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 = [resource for resource in resources["items"] if resource["path"] == "/"][ | ||
|  |         0 | ||
|  |     ]["id"] | ||
|  | 
 | ||
|  |     client.put_method( | ||
|  |         restApiId=api_id, | ||
|  |         resourceId=root_id, | ||
|  |         httpMethod="POST", | ||
|  |         authorizationType="none", | ||
|  |     ) | ||
|  | 
 | ||
|  |     response = client.get_method( | ||
|  |         restApiId=api_id, resourceId=root_id, httpMethod="POST" | ||
|  |     ) | ||
|  |     response.should.have.key("httpMethod").equals("POST") | ||
|  | 
 | ||
|  |     path = os.path.dirname(os.path.abspath(__file__)) | ||
|  |     with open(path + "/resources/test_api.json", "rb") as api_json: | ||
|  |         client.put_rest_api( | ||
|  |             restApiId=api_id, | ||
|  |             mode="overwrite", | ||
|  |             failOnWarnings=True, | ||
|  |             body=api_json.read(), | ||
|  |         ) | ||
|  | 
 | ||
|  |     # Since we chose mode=overwrite, the root_id is different | ||
|  |     resources = client.get_resources(restApiId=api_id) | ||
|  |     new_root_id = [ | ||
|  |         resource for resource in resources["items"] if resource["path"] == "/" | ||
|  |     ][0]["id"] | ||
|  | 
 | ||
|  |     new_root_id.shouldnt.equal(root_id) | ||
|  | 
 | ||
|  |     # Our POST-method should be gone | ||
|  |     with pytest.raises(ClientError) as exc: | ||
|  |         client.get_method(restApiId=api_id, resourceId=new_root_id, httpMethod="POST") | ||
|  |     err = exc.value.response["Error"] | ||
|  |     err["Code"].should.equal("NotFoundException") | ||
|  | 
 | ||
|  |     # We just have a GET-method, as defined in the JSON | ||
|  |     client.get_method(restApiId=api_id, resourceId=new_root_id, httpMethod="GET") | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_apigateway | ||
|  | def test_put_rest_api__existing_methods_still_exist(): | ||
|  |     client = boto3.client("apigateway", region_name="us-east-2") | ||
|  | 
 | ||
|  |     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 = [resource for resource in resources["items"] if resource["path"] == "/"][ | ||
|  |         0 | ||
|  |     ]["id"] | ||
|  | 
 | ||
|  |     client.put_method( | ||
|  |         restApiId=api_id, | ||
|  |         resourceId=root_id, | ||
|  |         httpMethod="POST", | ||
|  |         authorizationType="none", | ||
|  |     ) | ||
|  | 
 | ||
|  |     path = os.path.dirname(os.path.abspath(__file__)) | ||
|  |     with open(path + "/resources/test_api.json", "rb") as api_json: | ||
|  |         client.put_rest_api( | ||
|  |             restApiId=api_id, | ||
|  |             mode="merge", | ||
|  |             failOnWarnings=True, | ||
|  |             body=api_json.read(), | ||
|  |         ) | ||
|  | 
 | ||
|  |     response = client.get_method( | ||
|  |         restApiId=api_id, resourceId=root_id, httpMethod="POST" | ||
|  |     ) | ||
|  |     response.should.have.key("httpMethod").equals("POST") | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_apigateway | ||
|  | def test_put_rest_api__fail_on_invalid_spec(): | ||
|  |     client = boto3.client("apigateway", region_name="us-east-2") | ||
|  | 
 | ||
|  |     response = client.create_rest_api(name="my_api", description="this is my api") | ||
|  |     api_id = response["id"] | ||
|  | 
 | ||
|  |     path = os.path.dirname(os.path.abspath(__file__)) | ||
|  |     with open(path + "/resources/test_api_invalid.json", "rb") as api_json: | ||
|  |         with pytest.raises(ClientError) as exc: | ||
|  |             client.put_rest_api( | ||
|  |                 restApiId=api_id, failOnWarnings=True, body=api_json.read() | ||
|  |             ) | ||
|  |         err = exc.value.response["Error"] | ||
|  |         err["Code"].should.equal("BadRequestException") | ||
|  |         err["Message"].should.equal( | ||
|  |             "Failed to parse the uploaded OpenAPI document due to: 'paths' is a required property" | ||
|  |         ) | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_apigateway | ||
|  | def test_put_rest_api__fail_on_invalid_version(): | ||
|  |     client = boto3.client("apigateway", region_name="us-east-2") | ||
|  | 
 | ||
|  |     response = client.create_rest_api(name="my_api", description="this is my api") | ||
|  |     api_id = response["id"] | ||
|  | 
 | ||
|  |     path = os.path.dirname(os.path.abspath(__file__)) | ||
|  |     with open(path + "/resources/test_api_invalid_version.json", "rb") as api_json: | ||
|  |         with pytest.raises(ClientError) as exc: | ||
|  |             client.put_rest_api( | ||
|  |                 restApiId=api_id, failOnWarnings=True, body=api_json.read() | ||
|  |             ) | ||
|  |         err = exc.value.response["Error"] | ||
|  |         err["Code"].should.equal("BadRequestException") | ||
|  |         err["Message"].should.equal("Only OpenAPI 3.x.x are currently supported") | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_apigateway | ||
|  | def test_put_rest_api__fail_on_invalid_mode(): | ||
|  |     client = boto3.client("apigateway", region_name="us-east-2") | ||
|  | 
 | ||
|  |     response = client.create_rest_api(name="my_api", description="this is my api") | ||
|  |     api_id = response["id"] | ||
|  | 
 | ||
|  |     path = os.path.dirname(os.path.abspath(__file__)) | ||
|  |     with open(path + "/resources/test_api.json", "rb") as api_json: | ||
|  |         with pytest.raises(ClientError) as exc: | ||
|  |             client.put_rest_api(restApiId=api_id, mode="unknown", body=api_json.read()) | ||
|  |         err = exc.value.response["Error"] | ||
|  |         err["Code"].should.equal("BadRequestException") | ||
|  |         err["Message"].should.equal( | ||
|  |             'Enumeration value of OpenAPI import mode must be "overwrite" or "merge"' | ||
|  |         ) | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_apigateway | ||
|  | def test_put_rest_api__as_yaml(): | ||
|  |     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"] | ||
|  | 
 | ||
|  |     path = os.path.dirname(os.path.abspath(__file__)) | ||
|  |     with open(path + "/resources/test_api.yaml", "rb") as api_yaml: | ||
|  |         response = client.put_rest_api( | ||
|  |             restApiId=api_id, | ||
|  |             mode="overwrite", | ||
|  |             failOnWarnings=True, | ||
|  |             body=api_yaml.read(), | ||
|  |         ) | ||
|  | 
 | ||
|  |     response.should.have.key("id").which.should.equal(api_id) | ||
|  |     response.should.have.key("name").which.should.equal("my_api") | ||
|  |     response.should.have.key("description").which.should.equal("this is my api") |