How to use _botocore_serializer_integration_test method in localstack

Best Python code snippet using localstack_python

test_serializer.py

Source:test_serializer.py Github

copy

Full Screen

...14)15from localstack.aws.spec import load_service16from localstack.utils.common import to_str17_skip_assert = {}18def _botocore_serializer_integration_test(19 service: str,20 action: str,21 response: dict,22 status_code=200,23 expected_response_content: dict = None,24):25 """26 Performs an integration test for the serializer using botocore as parser.27 It executes the following steps:28 - Load the given service (f.e. "sqs")29 - Serialize the response with the appropriate serializer from the AWS Serivce Framework30 - Parse the serialized response using the botocore parser31 - Checks if the metadata is correct (status code, requestID,...)32 - Checks if the parsed response content is equal to the input to the serializer33 :param service: to load the correct service specification, serializer, and parser34 :param action: to load the correct service specification, serializer, and parser35 :param response: which should be serialized and tested against36 :param status_code: Optional - expected status code of the response - defaults to 20037 :param expected_response_content: Optional - if the input data ("response") differs from the actually expected data38 (because f.e. it contains None values)39 :return: None40 """41 # Load the appropriate service42 service = load_service(service)43 # Use our serializer to serialize the response44 response_serializer = create_serializer(service)45 # The serializer changes the incoming dict, therefore copy it before passing it to the serializer46 response_to_parse = copy.deepcopy(response)47 serialized_response = response_serializer.serialize_to_response(48 response_to_parse, service.operation_model(action)49 )50 # Use the parser from botocore to parse the serialized response51 response_parser = create_parser(service.protocol)52 parsed_response = response_parser.parse(53 serialized_response.to_readonly_response_dict(),54 service.operation_model(action).output_shape,55 )56 return_response = copy.deepcopy(parsed_response)57 # Check if the result is equal to the initial response params58 assert "ResponseMetadata" in parsed_response59 assert "HTTPStatusCode" in parsed_response["ResponseMetadata"]60 assert parsed_response["ResponseMetadata"]["HTTPStatusCode"] == status_code61 assert "RequestId" in parsed_response["ResponseMetadata"]62 assert len(parsed_response["ResponseMetadata"]["RequestId"]) == 5263 del parsed_response["ResponseMetadata"]64 if expected_response_content is None:65 expected_response_content = response66 if expected_response_content is not _skip_assert:67 assert parsed_response == expected_response_content68 return return_response69def _botocore_error_serializer_integration_test(70 service: str,71 action: str,72 exception: ServiceException,73 code: str,74 status_code: int,75 message: Optional[str],76 is_sender_fault: bool = False,77):78 """79 Performs an integration test for the error serialization using botocore as parser.80 It executes the following steps:81 - Load the given service (f.e. "sqs")82 - Serialize the _error_ response with the appropriate serializer from the AWS Serivce Framework83 - Parse the serialized error response using the botocore parser84 - Checks the the metadata is correct (status code, requestID,...)85 - Checks if the parsed error response content is correct86 :param service: to load the correct service specification, serializer, and parser87 :param action: to load the correct service specification, serializer, and parser88 :param exception: which should be serialized and tested against89 :param code: expected "code" of the exception (i.e. the AWS specific exception ID, f.e.90 "CloudFrontOriginAccessIdentityAlreadyExists")91 :param status_code: expected HTTP response status code92 :param message: expected error message93 :return: None94 """95 # Load the appropriate service96 service = load_service(service)97 # Use our serializer to serialize the response98 response_serializer = create_serializer(service)99 serialized_response = response_serializer.serialize_error_to_response(100 exception, service.operation_model(action)101 )102 # Use the parser from botocore to parse the serialized response103 response_parser: ResponseParser = create_parser(service.protocol)104 parsed_response = response_parser.parse(105 serialized_response.to_readonly_response_dict(),106 service.operation_model(action).output_shape,107 )108 # Check if the result is equal to the initial response params109 assert "Error" in parsed_response110 assert "Code" in parsed_response["Error"]111 assert "Message" in parsed_response["Error"]112 assert parsed_response["Error"]["Code"] == code113 assert parsed_response["Error"]["Message"] == message114 assert "ResponseMetadata" in parsed_response115 assert "RequestId" in parsed_response["ResponseMetadata"]116 assert len(parsed_response["ResponseMetadata"]["RequestId"]) == 52117 assert "HTTPStatusCode" in parsed_response["ResponseMetadata"]118 assert parsed_response["ResponseMetadata"]["HTTPStatusCode"] == status_code119 type = parsed_response["Error"].get("Type")120 if is_sender_fault:121 assert type == "Sender"122 else:123 assert type is None124def test_rest_xml_serializer_cloudfront_with_botocore():125 parameters = {126 "TestResult": {127 "FunctionSummary": {128 "Name": "string",129 "Status": "string",130 "FunctionConfig": {"Comment": "string", "Runtime": "cloudfront-js-1.0"},131 "FunctionMetadata": {132 "FunctionARN": "string",133 "Stage": "LIVE",134 # Test the timestamp precision by adding hours, minutes, seconds and some milliseconds135 # (as microseconds).136 "CreatedTime": datetime(2015, 1, 1, 23, 59, 59, 6000, tzinfo=tzutc()),137 "LastModifiedTime": datetime(2015, 1, 1, 23, 59, 59, 6000, tzinfo=tzutc()),138 },139 },140 "ComputeUtilization": "string",141 "FunctionExecutionLogs": [142 "string",143 ],144 "FunctionErrorMessage": "string",145 "FunctionOutput": "string",146 }147 }148 _botocore_serializer_integration_test("cloudfront", "TestFunction", parameters)149def test_rest_xml_serializer_route53_with_botocore():150 parameters = {151 "HostedZone": {152 "Id": "/hostedzone/9WXI4LV03NAZVS1",153 "Name": "fuu.",154 "Config": {"PrivateZone": False},155 "ResourceRecordSetCount": 0,156 },157 "DelegationSet": {"NameServers": ["dns.localhost.localstack.cloud"]},158 }159 _botocore_serializer_integration_test("route53", "CreateHostedZone", parameters, 201)160def test_rest_xml_serializer_s3_with_botocore():161 parameters = {162 "AnalyticsConfiguration": {163 "Id": "string",164 "Filter": {165 "Prefix": "string",166 "Tag": {"Key": "string", "Value": "string"},167 "And": {168 "Prefix": "string",169 "Tags": [170 {"Key": "string", "Value": "string"},171 ],172 },173 },174 "StorageClassAnalysis": {175 "DataExport": {176 "OutputSchemaVersion": "V_1",177 "Destination": {178 "S3BucketDestination": {179 "Format": "CSV",180 "BucketAccountId": "string",181 "Bucket": "string",182 "Prefix": "string",183 }184 },185 }186 },187 }188 }189 _botocore_serializer_integration_test("s3", "GetBucketAnalyticsConfiguration", parameters)190def test_rest_xml_serializer_s3_2_with_botocore():191 # These date fields in this response are encoded in the header. The max precision is seconds.192 parameters = {193 "Body": "body",194 "DeleteMarker": True,195 "AcceptRanges": "string",196 "Expiration": "string",197 "Restore": "string",198 "LastModified": datetime(2015, 1, 1, 23, 59, 59, tzinfo=tzutc()),199 "ContentLength": 4,200 "ETag": "string",201 "MissingMeta": 123,202 "VersionId": "string",203 "CacheControl": "string",204 "ContentDisposition": "string",205 "ContentEncoding": "string",206 "ContentLanguage": "string",207 "ContentRange": "string",208 "ContentType": "string",209 "Expires": datetime(2015, 1, 1, 23, 59, 59, tzinfo=tzutc()),210 "WebsiteRedirectLocation": "string",211 "ServerSideEncryption": "AES256",212 "Metadata": {"string": "string"},213 "SSECustomerAlgorithm": "string",214 "SSECustomerKeyMD5": "string",215 "SSEKMSKeyId": "string",216 "BucketKeyEnabled": True | False,217 "StorageClass": "STANDARD",218 "RequestCharged": "requester",219 "ReplicationStatus": "COMPLETE",220 "PartsCount": 123,221 "TagCount": 123,222 "ObjectLockMode": "GOVERNANCE",223 "ObjectLockRetainUntilDate": datetime(2015, 1, 1, 23, 59, 59, tzinfo=tzutc()),224 "ObjectLockLegalHoldStatus": "ON",225 }226 _botocore_serializer_integration_test("s3", "GetObject", parameters)227def test_query_serializer_cloudformation_with_botocore():228 parameters = {229 "StackResourceDrift": {230 "StackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/MyStack/d0a825a0-e4cd-xmpl-b9fb-061c69e99204",231 "LogicalResourceId": "MyFunction",232 "PhysicalResourceId": "my-function-SEZV4XMPL4S5",233 "ResourceType": "AWS::Lambda::Function",234 "ExpectedProperties": '{"Description":"Write a file to S3.","Environment":{"Variables":{"bucket":"my-stack-bucket-1vc62xmplgguf"}},"Handler":"index.handler","MemorySize":128,"Role":"arn:aws:iam::123456789012:role/my-functionRole-HIZXMPLEOM9E","Runtime":"nodejs10.x","Tags":[{"Key":"lambda:createdBy","Value":"SAM"}],"Timeout":900,"TracingConfig":{"Mode":"Active"}}',235 "ActualProperties": '{"Description":"Write a file to S3.","Environment":{"Variables":{"bucket":"my-stack-bucket-1vc62xmplgguf"}},"Handler":"index.handler","MemorySize":256,"Role":"arn:aws:iam::123456789012:role/my-functionRole-HIZXMPLEOM9E","Runtime":"nodejs10.x","Tags":[{"Key":"lambda:createdBy","Value":"SAM"}],"Timeout":22,"TracingConfig":{"Mode":"Active"}}',236 "PropertyDifferences": [237 {238 "PropertyPath": "/MemorySize",239 "ExpectedValue": "128",240 "ActualValue": "256",241 "DifferenceType": "NOT_EQUAL",242 },243 {244 "PropertyPath": "/Timeout",245 "ExpectedValue": "900",246 "ActualValue": "22",247 "DifferenceType": "NOT_EQUAL",248 },249 ],250 "StackResourceDriftStatus": "MODIFIED",251 "Timestamp": datetime(2015, 1, 1, 23, 59, 59, 6000, tzinfo=tzutc()),252 }253 }254 _botocore_serializer_integration_test("cloudformation", "DetectStackResourceDrift", parameters)255def test_query_serializer_redshift_with_botocore():256 parameters = {257 "Marker": "string",258 "ClusterDbRevisions": [259 {260 "ClusterIdentifier": "string",261 "CurrentDatabaseRevision": "string",262 "DatabaseRevisionReleaseDate": datetime(263 2015, 1, 1, 23, 59, 59, 6000, tzinfo=tzutc()264 ),265 "RevisionTargets": [266 {267 "DatabaseRevision": "string",268 "Description": "string",269 "DatabaseRevisionReleaseDate": datetime(270 2015, 1, 1, 23, 59, 59, 6000, tzinfo=tzutc()271 ),272 },273 ],274 },275 ],276 }277 _botocore_serializer_integration_test("redshift", "DescribeClusterDbRevisions", parameters)278def test_query_serializer_sqs_empty_return_shape_with_botocore():279 _botocore_serializer_integration_test("sqs", "SetQueueAttributes", {})280def test_query_serializer_sqs_flattened_list_with_botocore():281 response = {282 "QueueUrls": [283 "http://localhost:4566/000000000000/myqueue1",284 "http://localhost:4566/000000000000/myqueue2",285 ]286 }287 _botocore_serializer_integration_test("sqs", "ListQueues", response)288def test_query_serializer_sqs_flattened_map_with_botocore():289 response = {290 "Attributes": {291 "QueueArn": "arn:aws:sqs:us-east-1:000000000000:test-queue-01",292 "DelaySeconds": "0",293 }294 }295 _botocore_serializer_integration_test("sqs", "GetQueueAttributes", response)296def test_query_serializer_sqs_flattened_list_map_with_botocore():297 response = {298 "Messages": [299 {300 "MessageId": "ac9baa5c-13b1-4206-aa28-2ac45ae168af",301 "ReceiptHandle": "AQEBZ14sCjWJuot0T8G2Eg3S8C+sJGg+QRKYCJjfd8iiOsrPfUzbXSjlQquT9NZP1Mxxkcud3HcaxvS7I1gxoM9MSjbpenKgkti8TPCc7nQBUk9y6xXYWlhysjgAi9YjExUIxO2ozYZuwyksOvIxS4NZs2aBctyR74N3XjOO/t8GByAz2u7KR5vYJu418Y9apAuYB1n6ZZ6aE1NrjIK9mjGCKSqE3YxN5SNkKXf1zRwTUjq8cE73F7cK7DBXNFWBTZSYkLLnFg/QuqKh0dfwGgLseeKhHUxw2KiP9qH4kvXBn2UdeI8jkFMbPERiSf2KMrGKyMCtz3jL+YVRYkB4BB0hx15Brrgo/zhePXHbT692VxKF98MIMQc/v+dc6aewQZldjuq6ANrp4RM+LdjlTPg7ow==",302 "MD5OfBody": "13c0c73bbf11056450c43bf3159b3585",303 "Body": '{"foo": "bared"}',304 }305 ]306 }307 _botocore_serializer_integration_test("sqs", "ReceiveMessage", response)308def test_query_serializer_sqs_none_value_in_map():309 response = {310 "Messages": [311 {312 "MessageId": "ac9baa5c-13b1-4206-aa28-2ac45ae168af",313 "ReceiptHandle": "AQEBZ14sCjWJuot0T8G2Eg3S8C+sJGg+QRKYCJjfd8iiOsrPfUzbXSjlQquT9NZP1Mxxkcud3HcaxvS7I1gxoM9MSjbpenKgkti8TPCc7nQBUk9y6xXYWlhysjgAi9YjExUIxO2ozYZuwyksOvIxS4NZs2aBctyR74N3XjOO/t8GByAz2u7KR5vYJu418Y9apAuYB1n6ZZ6aE1NrjIK9mjGCKSqE3YxN5SNkKXf1zRwTUjq8cE73F7cK7DBXNFWBTZSYkLLnFg/QuqKh0dfwGgLseeKhHUxw2KiP9qH4kvXBn2UdeI8jkFMbPERiSf2KMrGKyMCtz3jL+YVRYkB4BB0hx15Brrgo/zhePXHbT692VxKF98MIMQc/v+dc6aewQZldjuq6ANrp4RM+LdjlTPg7ow==",314 "Attributes": None,315 "MD5OfBody": "13c0c73bbf11056450c43bf3159b3585",316 "Body": '{"foo": "bared"}',317 }318 ]319 }320 expected_response = copy.deepcopy(response)321 del expected_response["Messages"][0]["Attributes"]322 _botocore_serializer_integration_test("sqs", "ReceiveMessage", response, 200, expected_response)323def test_query_protocol_error_serialization():324 # Specific error of the SendMessage operation in SQS as the scaffold would generate it325 class InvalidMessageContents(ServiceException):326 """The message contains characters outside the allowed set."""327 pass328 exception = InvalidMessageContents("Exception message!")329 _botocore_error_serializer_integration_test(330 "sqs", "SendMessage", exception, "InvalidMessageContents", 400, "Exception message!"331 )332def test_query_protocol_error_serialization_plain():333 # Specific error of the ChangeMessageVisibility operation in SQS as the scaffold would generate it334 class ReceiptHandleIsInvalid(ServiceException):335 pass336 exception = ReceiptHandleIsInvalid(337 'The input receipt handle "garbage" is not a valid receipt handle.'338 )339 # Load the SQS service340 service = load_service("sqs")341 # Use our serializer to serialize the response342 response_serializer = create_serializer(service)343 serialized_response = response_serializer.serialize_error_to_response(344 exception, service.operation_model("ChangeMessageVisibility")345 )346 serialized_response_dict = serialized_response.to_readonly_response_dict()347 # Replace the random request ID with a static value for comparison348 serialized_response_body = re.sub(349 "<RequestId>.*</RequestId>",350 "<RequestId>static_request_id</RequestId>",351 to_str(serialized_response_dict["body"]),352 )353 # This expected_response_body differs from the actual response in the following ways:354 # - The original response does not define an encoding.355 # - There is no newline after the XML declaration.356 # - The response does not contain a Type nor Detail tag (since they aren't contained in the spec).357 # - The original response uses double quotes for the xml declaration.358 # Most of these differences should be handled equally by parsing clients, however, we might adopt some of these359 # changes in the future.360 expected_response_body = (361 "<?xml version='1.0' encoding='utf-8'?>\n"362 '<ErrorResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/">'363 "<Error>"364 "<Code>ReceiptHandleIsInvalid</Code>"365 "<Message>The input receipt handle &quot;garbage&quot; is not a valid receipt handle."366 "</Message>"367 "</Error>"368 "<RequestId>static_request_id</RequestId>"369 "</ErrorResponse>"370 )371 assert serialized_response_body == expected_response_body372 assert serialized_response_dict["headers"].get("Content-Type") is not None373 assert serialized_response_dict["headers"]["Content-Type"] == "text/xml"374def test_query_protocol_custom_error_serialization():375 exception = CommonServiceException("InvalidParameterValue", "Parameter x was invalid!")376 _botocore_error_serializer_integration_test(377 "sqs", "SendMessage", exception, "InvalidParameterValue", 400, "Parameter x was invalid!"378 )379def test_query_protocol_error_serialization_sender_fault():380 # Specific exception thrown by SQS which defines the "Sender" fault381 class UnsupportedOperation(ServiceException):382 pass383 exception = UnsupportedOperation("Operation not supported.")384 _botocore_error_serializer_integration_test(385 "sqs",386 "SendMessage",387 exception,388 "AWS.SimpleQueueService.UnsupportedOperation",389 400,390 "Operation not supported.",391 True,392 )393def test_restxml_protocol_error_serialization_not_specified_for_operation():394 """395 Tests if the serializer can serialize an error which is not explicitly defined as an error shape for the396 specific operation.397 This can happen if the specification is not specific enough (f.e. S3's GetBucketAcl does not define the NoSuchBucket398 error, even though it obviously can be raised).399 """400 class NoSuchBucket(ServiceException):401 pass402 exception = NoSuchBucket("Exception message!")403 _botocore_error_serializer_integration_test(404 "s3",405 "GetBucketAcl",406 exception,407 "NoSuchBucket",408 400,409 "Exception message!",410 )411def test_restxml_protocol_error_serialization():412 class CloudFrontOriginAccessIdentityAlreadyExists(ServiceException):413 pass414 exception = CloudFrontOriginAccessIdentityAlreadyExists("Exception message!")415 _botocore_error_serializer_integration_test(416 "cloudfront",417 "CreateCloudFrontOriginAccessIdentity",418 exception,419 "CloudFrontOriginAccessIdentityAlreadyExists",420 409,421 "Exception message!",422 )423def test_restxml_protocol_custom_error_serialization():424 exception = CommonServiceException(425 "APIAccessCensorship",426 "You shall not access this API! Sincerely, your friendly neighbourhood firefighter.",427 status_code=451,428 )429 _botocore_error_serializer_integration_test(430 "cloudfront",431 "CreateCloudFrontOriginAccessIdentity",432 exception,433 "APIAccessCensorship",434 451,435 "You shall not access this API! Sincerely, your friendly neighbourhood firefighter.",436 )437def test_json_protocol_error_serialization():438 class UserPoolTaggingException(ServiceException):439 pass440 exception = UserPoolTaggingException("Exception message!")441 _botocore_error_serializer_integration_test(442 "cognito-idp",443 "CreateUserPool",444 exception,445 "UserPoolTaggingException",446 400,447 "Exception message!",448 )449def test_json_protocol_custom_error_serialization():450 exception = CommonServiceException(451 "APIAccessCensorship",452 "You shall not access this API! Sincerely, your friendly neighbourhood firefighter.",453 status_code=451,454 )455 _botocore_error_serializer_integration_test(456 "cognito-idp",457 "CreateUserPool",458 exception,459 "APIAccessCensorship",460 451,461 "You shall not access this API! Sincerely, your friendly neighbourhood firefighter.",462 )463def test_json_serializer_cognito_with_botocore():464 parameters = {465 "UserPool": {466 "Id": "string",467 "Name": "string",468 "Policies": {469 "PasswordPolicy": {470 "MinimumLength": 123,471 "RequireUppercase": True,472 "RequireLowercase": True,473 "RequireNumbers": True,474 "RequireSymbols": True,475 "TemporaryPasswordValidityDays": 123,476 }477 },478 "LambdaConfig": {479 "PreSignUp": "string",480 "CustomMessage": "string",481 "PostConfirmation": "string",482 "PreAuthentication": "string",483 "PostAuthentication": "string",484 "DefineAuthChallenge": "string",485 "CreateAuthChallenge": "string",486 "VerifyAuthChallengeResponse": "string",487 "PreTokenGeneration": "string",488 "UserMigration": "string",489 "CustomSMSSender": {"LambdaVersion": "V1_0", "LambdaArn": "string"},490 "CustomEmailSender": {"LambdaVersion": "V1_0", "LambdaArn": "string"},491 "KMSKeyID": "string",492 },493 "Status": "Enabled",494 "LastModifiedDate": datetime(2015, 1, 1, 23, 59, 59, 6000, tzinfo=tzutc()),495 "CreationDate": datetime(2015, 1, 1, 23, 59, 59, 6000, tzinfo=tzutc()),496 "SchemaAttributes": [497 {498 "Name": "string",499 "AttributeDataType": "String",500 "DeveloperOnlyAttribute": True,501 "Mutable": True,502 "Required": True,503 "NumberAttributeConstraints": {"MinValue": "string", "MaxValue": "string"},504 "StringAttributeConstraints": {"MinLength": "string", "MaxLength": "string"},505 },506 ],507 "AutoVerifiedAttributes": [508 "phone_number",509 ],510 "AliasAttributes": [511 "phone_number",512 ],513 "UsernameAttributes": [514 "phone_number",515 ],516 "SmsVerificationMessage": "string",517 "EmailVerificationMessage": "string",518 "EmailVerificationSubject": "string",519 "VerificationMessageTemplate": {520 "SmsMessage": "string",521 "EmailMessage": "string",522 "EmailSubject": "string",523 "EmailMessageByLink": "string",524 "EmailSubjectByLink": "string",525 "DefaultEmailOption": "CONFIRM_WITH_LINK",526 },527 "SmsAuthenticationMessage": "string",528 "MfaConfiguration": "OFF",529 "DeviceConfiguration": {530 "ChallengeRequiredOnNewDevice": True,531 "DeviceOnlyRememberedOnUserPrompt": True,532 },533 "EstimatedNumberOfUsers": 123,534 "EmailConfiguration": {535 "SourceArn": "string",536 "ReplyToEmailAddress": "string",537 "EmailSendingAccount": "COGNITO_DEFAULT",538 "From": "string",539 "ConfigurationSet": "string",540 },541 "SmsConfiguration": {"SnsCallerArn": "string", "ExternalId": "string"},542 "UserPoolTags": {"string": "string"},543 "SmsConfigurationFailure": "string",544 "EmailConfigurationFailure": "string",545 "Domain": "string",546 "CustomDomain": "string",547 "AdminCreateUserConfig": {548 "AllowAdminCreateUserOnly": True,549 "UnusedAccountValidityDays": 123,550 "InviteMessageTemplate": {551 "SMSMessage": "string",552 "EmailMessage": "string",553 "EmailSubject": "string",554 },555 },556 "UserPoolAddOns": {"AdvancedSecurityMode": "OFF"},557 "UsernameConfiguration": {"CaseSensitive": True},558 "Arn": "string",559 "AccountRecoverySetting": {560 "RecoveryMechanisms": [561 {"Priority": 123, "Name": "verified_email"},562 ]563 },564 }565 }566 _botocore_serializer_integration_test("cognito-idp", "DescribeUserPool", parameters)567def test_json_serializer_date_serialization_with_botocore():568 parameters = {569 "UserPool": {570 "LastModifiedDate": datetime(2022, 2, 8, 9, 17, 40, 122939, tzinfo=tzlocal()),571 }572 }573 _botocore_serializer_integration_test("cognito-idp", "DescribeUserPool", parameters)574def test_restjson_protocol_error_serialization():575 class ThrottledException(ServiceException):576 pass577 exception = ThrottledException("Exception message!")578 _botocore_error_serializer_integration_test(579 "xray",580 "UpdateSamplingRule",581 exception,582 "ThrottledException",583 429,584 "Exception message!",585 )586def test_restjson_protocol_custom_error_serialization():587 exception = CommonServiceException(588 "APIAccessCensorship",589 "You shall not access this API! Sincerely, your friendly neighbourhood firefighter.",590 status_code=451,591 )592 _botocore_error_serializer_integration_test(593 "xray",594 "UpdateSamplingRule",595 exception,596 "APIAccessCensorship",597 451,598 "You shall not access this API! Sincerely, your friendly neighbourhood firefighter.",599 )600def test_restjson_serializer_xray_with_botocore():601 parameters = {602 "SamplingRuleRecord": {603 "SamplingRule": {604 "RuleName": "string",605 "RuleARN": "123456789001234567890",606 "ResourceARN": "123456789001234567890",607 "Priority": 123,608 "FixedRate": 123.0,609 "ReservoirSize": 123,610 "ServiceName": "string",611 "ServiceType": "string",612 "Host": "string",613 "HTTPMethod": "string",614 "URLPath": "string",615 "Version": 123,616 "Attributes": {"string": "string"},617 },618 "CreatedAt": datetime(2015, 1, 1, 23, 59, 59, 6000, tzinfo=tzutc()),619 "ModifiedAt": datetime(2015, 1, 1, 23, 59, 59, 1000, tzinfo=tzutc()),620 }621 }622 _botocore_serializer_integration_test("xray", "UpdateSamplingRule", parameters)623def test_restjson_header_target_serialization():624 """625 Tests the serialization of attributes into a specified header key based on this example from glacier:626 "InitiateJobOutput":{627 "type":"structure",628 "members":{629 "location":{630 "shape":"string",631 "location":"header",632 "locationName":"Location"633 },634 "jobId":{635 "shape":"string",636 "location":"header",637 "locationName":"x-amz-job-id"638 },639 "jobOutputPath":{640 "shape":"string",641 "location":"header",642 "locationName":"x-amz-job-output-path"643 }644 },645 "documentation":"<p>Contains the Amazon S3 Glacier response to your request.</p>"646 },647 """648 response = {649 "location": "/here",650 "jobId": "42069",651 "jobOutputPath": "/there",652 }653 result = _botocore_serializer_integration_test(654 "glacier",655 "InitiateJob",656 response,657 status_code=202,658 )659 headers = result["ResponseMetadata"]["HTTPHeaders"]660 assert "location" in headers661 assert "x-amz-job-id" in headers662 assert "x-amz-job-output-path" in headers663 assert "locationName" not in headers664 assert "jobOutputPath" not in headers665 assert headers["location"] == "/here"666 assert headers["x-amz-job-id"] == "42069"667 assert headers["x-amz-job-output-path"] == "/there"668def test_restjson_headers_target_serialization():669 # SendApiAssetResponse670 response = {671 "Body": "hello",672 "ResponseHeaders": {673 "foo": "bar",674 "baz": "ed",675 },676 }677 # skipping assert here, because the response will contain all HTTP headers (given the nature of "ResponseHeaders"678 # attribute).679 result = _botocore_serializer_integration_test(680 "dataexchange", "SendApiAsset", response, expected_response_content=_skip_assert681 )682 assert result["Body"] == "hello"683 assert result["ResponseHeaders"]["foo"] == "bar"684 assert result["ResponseHeaders"]["baz"] == "ed"685 headers = result["ResponseMetadata"]["HTTPHeaders"]686 assert "foo" in headers687 assert "baz" in headers688 assert headers["foo"] == "bar"689 assert headers["baz"] == "ed"690def test_restjson_statuscode_target_serialization():691 _botocore_serializer_integration_test(692 "lambda",693 "Invoke",694 {695 "StatusCode": 203,696 "LogResult": "Log Message!",697 "ExecutedVersion": "Latest",698 "Payload": "test payload",699 },700 status_code=203,701 )702def test_restjson_payload_serialization():703 """704 Tests the serialization of specific member attributes as payload, based on an appconfig example:705 "Configuration":{706 "type":"structure",707 "members":{708 "Content":{709 "shape":"Blob",710 },711 "ConfigurationVersion":{712 "shape":"Version",713 "location":"header",714 "locationName":"Configuration-Version"715 },716 "ContentType":{717 "shape":"String",718 "location":"header",719 "locationName":"Content-Type"720 }721 },722 "payload":"Content"723 },724 """725 response = {726 "Content": '{"foo": "bar"}',727 "ConfigurationVersion": "123",728 "ContentType": "application/json",729 }730 result = _botocore_serializer_integration_test(731 "appconfig",732 "GetConfiguration",733 response,734 status_code=200,735 )736 headers = result["ResponseMetadata"]["HTTPHeaders"]737 assert "configuration-version" in headers738 assert headers["configuration-version"] == "123"739 assert headers["content-type"] == "application/json"740def test_restjson_none_serialization():741 parameters = {742 "FunctionName": "test-name",743 "VpcConfig": {"SubnetIds": None, "SecurityGroupIds": [None], "VpcId": "123"},744 "TracingConfig": None,745 "DeadLetterConfig": {},746 }747 expected = {748 "FunctionName": "test-name",749 "VpcConfig": {"SecurityGroupIds": [], "VpcId": "123"},750 "DeadLetterConfig": {},751 }752 _botocore_serializer_integration_test(753 "lambda", "CreateFunction", parameters, status_code=201, expected_response_content=expected754 )755 exception = CommonServiceException("CodeVerificationFailedException", None)756 _botocore_error_serializer_integration_test(757 "lambda",758 "CreateFunction",759 exception,760 "CodeVerificationFailedException",761 400,762 "",763 )764def test_restxml_none_serialization():765 # Structure = None766 _botocore_serializer_integration_test(767 "route53", "ListHostedZonesByName", {}, expected_response_content={}768 )769 # Structure Value = None770 parameters = {"HostedZones": None}771 _botocore_serializer_integration_test(772 "route53", "ListHostedZonesByName", parameters, expected_response_content={}773 )774 # List Value = None775 parameters = {"HostedZones": [None]}776 expected = {"HostedZones": []}777 _botocore_serializer_integration_test(778 "route53", "ListHostedZonesByName", parameters, expected_response_content=expected779 )780 # Exception without a message781 exception = CommonServiceException("NoSuchKeySigningKey", None)782 _botocore_error_serializer_integration_test(783 "route53",784 "DeleteKeySigningKey",785 exception,786 "NoSuchKeySigningKey",787 400,788 "",789 )790def test_restjson_int_header_serialization():791 response = {792 "Configuration": '{"foo": "bar"}',793 "ContentType": "application/json",794 "NextPollConfigurationToken": "abcdefg",795 "NextPollIntervalInSeconds": 42,796 }797 _botocore_serializer_integration_test("appconfigdata", "GetLatestConfiguration", response)798def test_ec2_serializer_ec2_with_botocore():799 parameters = {800 "InstanceEventWindow": {801 "InstanceEventWindowId": "string",802 "TimeRanges": [803 {804 "StartWeekDay": "sunday",805 "StartHour": 123,806 "EndWeekDay": "sunday",807 "EndHour": 123,808 },809 ],810 "Name": "string",811 "CronExpression": "string",812 "AssociationTarget": {813 "InstanceIds": [814 "string",815 ],816 "Tags": [817 {"Key": "string", "Value": "string"},818 ],819 "DedicatedHostIds": [820 "string",821 ],822 },823 "State": "creating",824 "Tags": [825 {"Key": "string", "Value": "string"},826 ],827 }828 }829 _botocore_serializer_integration_test("ec2", "CreateInstanceEventWindow", parameters)830def test_ec2_serializer_ec2_with_empty_response():831 _botocore_serializer_integration_test("ec2", "CreateTags", {})832def test_ec2_protocol_custom_error_serialization():833 exception = CommonServiceException(834 "IdempotentParameterMismatch", "Different payload, same token?!"835 )836 _botocore_error_serializer_integration_test(837 "ec2",838 "StartInstances",839 exception,840 "IdempotentParameterMismatch",841 400,842 "Different payload, same token?!",843 )844def test_restxml_without_output_shape():845 _botocore_serializer_integration_test("cloudfront", "DeleteDistribution", {}, status_code=204)846def test_restxml_header_location():847 """Tests fields with the location trait "header" for rest-xml."""848 _botocore_serializer_integration_test(849 "cloudfront",850 "CreateCloudFrontOriginAccessIdentity",851 {852 "Location": "location-header-field",853 "ETag": "location-etag-field",854 "CloudFrontOriginAccessIdentity": {},855 },856 status_code=201,857 )858 # Test a boolean header location field859 parameters = {860 "ContentLength": 0,861 "Body": "",862 "DeleteMarker": True,863 "ContentType": "string",864 "Metadata": {"string": "string"},865 }866 _botocore_serializer_integration_test("s3", "GetObject", parameters)867def test_restxml_headers_location():868 """Tests fields with the location trait "headers" for rest-xml."""869 _botocore_serializer_integration_test(870 "s3",871 "HeadObject",872 {873 "DeleteMarker": False,874 "Metadata": {"headers_key1": "headers_value1", "headers_key2": "headers_value2"},875 "ContentType": "application/octet-stream",876 # The content length should explicitly be tested here.877 "ContentLength": 159,878 },879 )880def test_restjson_header_location():881 """Tests fields with the location trait "header" for rest-xml."""882 _botocore_serializer_integration_test(883 "ebs", "GetSnapshotBlock", {"BlockData": "binary-data", "DataLength": 15}884 )885def test_restjson_headers_location():886 """Tests fields with the location trait "headers" for rest-json."""887 response = _botocore_serializer_integration_test(888 "dataexchange",889 "SendApiAsset",890 {891 "ResponseHeaders": {"headers_key1": "headers_value1", "headers_key2": "headers_value2"},892 },893 expected_response_content=_skip_assert,894 )895 # The spec does not define a locationName for ResponseHeaders, which means there is no header field prefix.896 # Therefore, _all_ header fields are parsed by botocore (which is technically correct).897 # We only check if the two header fields are present.898 assert "ResponseHeaders" in response899 assert "headers_key1" in response["ResponseHeaders"]900 assert "headers_key2" in response["ResponseHeaders"]901 assert "headers_value1" == response["ResponseHeaders"]["headers_key1"]902 assert "headers_value2" == response["ResponseHeaders"]["headers_key2"]903def test_all_non_existing_key():904 """Tests the different protocols to allow non-existing keys in strucutres / dicts."""905 # query906 _botocore_serializer_integration_test(907 "cloudformation",908 "DetectStackResourceDrift",909 {910 "StackResourceDrift": {911 "StackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/MyStack/d0a825a0-e4cd-xmpl-b9fb-061c69e99204",912 "unknown": {"foo": "bar"},913 }914 },915 expected_response_content={916 "StackResourceDrift": {917 "StackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/MyStack/d0a825a0-e4cd-xmpl-b9fb-061c69e99204",918 }919 },920 )921 # ec2922 _botocore_serializer_integration_test(923 "ec2",924 "CreateInstanceEventWindow",925 {926 "InstanceEventWindow": {927 "InstanceEventWindowId": "string",928 "unknown": {"foo": "bar"},929 },930 "unknown": {"foo": "bar"},931 },932 expected_response_content={933 "InstanceEventWindow": {934 "InstanceEventWindowId": "string",935 }936 },937 )938 # json939 _botocore_serializer_integration_test(940 "cognito-idp",941 "DescribeUserPool",942 {943 "UserPool": {944 "Id": "string",945 "Unknown": "Ignored",946 }947 },948 expected_response_content={949 "UserPool": {950 "Id": "string",951 }952 },953 )954 # rest-json955 _botocore_serializer_integration_test(956 "xray",957 "UpdateSamplingRule",958 {959 "SamplingRuleRecord": {960 "SamplingRule": {961 "ResourceARN": "123456789001234567890",962 "Unknown": "Ignored",963 },964 }965 },966 expected_response_content={967 "SamplingRuleRecord": {968 "SamplingRule": {969 "ResourceARN": "123456789001234567890",970 },971 }972 },973 )974 # rest-xml975 _botocore_serializer_integration_test(976 "cloudfront",977 "TestFunction",978 {979 "TestResult": {980 "FunctionErrorMessage": "string",981 },982 "Unknown": "Ignored",983 },984 expected_response_content={985 "TestResult": {986 "FunctionErrorMessage": "string",987 },988 },989 )...

Full Screen

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run localstack automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful