From 469023314557a4c03229376f224cb73188282554 Mon Sep 17 00:00:00 2001 From: "Gutierrez, Idelfonso" Date: Tue, 26 Apr 2022 19:43:20 -0500 Subject: [PATCH 01/11] feature: Create LambdaProxyEvent Type --- .../AWSLambdaEvents/LambdaProxyEvent.swift | 88 ++++++++++++ .../LambdaProxyEventTests.swift | 131 ++++++++++++++++++ 2 files changed, 219 insertions(+) create mode 100644 Sources/AWSLambdaEvents/LambdaProxyEvent.swift create mode 100644 Tests/AWSLambdaEventsTests/LambdaProxyEventTests.swift diff --git a/Sources/AWSLambdaEvents/LambdaProxyEvent.swift b/Sources/AWSLambdaEvents/LambdaProxyEvent.swift new file mode 100644 index 0000000..7c03027 --- /dev/null +++ b/Sources/AWSLambdaEvents/LambdaProxyEvent.swift @@ -0,0 +1,88 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the SwiftAWSLambdaRuntime open source project +// +// Copyright (c) 2017-2022 Apple Inc. and the SwiftAWSLambdaRuntime project authors +// Licensed under Apache License v2.0 +// +// See LICENSE.txt for license information +// See CONTRIBUTORS.txt for the list of SwiftAWSLambdaRuntime project authors +// +// SPDX-License-Identifier: Apache-2.0 +// +//===----------------------------------------------------------------------===// + +public struct LambdaProxyEvent: Codable { + public struct Context: Codable { + public struct HTTP: Codable { + public let httpMethod: HTTPMethod + public let path: String + public let `protocol`: String + public let sourceIp: String + public let userAgent: String + } + + /// Authorizer contains authorizer information for the request context. + public struct Authorizer: Codable { + public let claims: [String: String]? + public let scopes: [String]? + } + + public let accountId: String + public let apiId: String + public let domainName: String + public let domainPrefix: String + public let stage: String + public let requestId: String + + public let httpMethod: HTTPMethod + public let authorizer: Authorizer? + + public let resourcePath: String? + public let path: String? + + /// The request time in format: 23/Apr/2020:11:08:18 +0000 + public let time: String? + public let requestTime: String? + public let requestTimeEpoch: UInt64 + } + + public let resource: String + public let path: String + public let httpMethod: String + public let stageVariables: [String: String]? + + public let cookies: [String]? + public let headers: HTTPHeaders + public let queryStringParameters: [String: String]? + public let pathParameters: [String: String]? + + public let context: Context + + public let body: String? + public let isBase64Encoded: Bool + + enum CodingKeys: String, CodingKey { + case resource + case path + case httpMethod + + case cookies + case headers + case queryStringParameters + case pathParameters + + case context = "requestContext" + case stageVariables + + case body + case isBase64Encoded + } +} + +#if swift(>=5.6) +extension LambdaProxyEvent: Sendable {} +extension LambdaProxyEvent.Context: Sendable {} +extension LambdaProxyEvent.Context.HTTP: Sendable {} +extension LambdaProxyEvent.Context.Authorizer: Sendable {} +#endif diff --git a/Tests/AWSLambdaEventsTests/LambdaProxyEventTests.swift b/Tests/AWSLambdaEventsTests/LambdaProxyEventTests.swift new file mode 100644 index 0000000..3ef8474 --- /dev/null +++ b/Tests/AWSLambdaEventsTests/LambdaProxyEventTests.swift @@ -0,0 +1,131 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the SwiftAWSLambdaRuntime open source project +// +// Copyright (c) 2017-2020 Apple Inc. and the SwiftAWSLambdaRuntime project authors +// Licensed under Apache License v2.0 +// +// See LICENSE.txt for license information +// See CONTRIBUTORS.txt for the list of SwiftAWSLambdaRuntime project authors +// +// SPDX-License-Identifier: Apache-2.0 +// +//===----------------------------------------------------------------------===// + +@testable import AWSLambdaEvents +import XCTest + +class LambdaProxyEventTests: XCTestCase { + static let exampleLambdaProxyEvent = """ + { + "resource": "/hello", + "path": "/hello", + "httpMethod": "GET", + "headers": { + "x-forwarded-proto":"https", + "x-forwarded-for":"91.64.117.86", + "x-forwarded-port":"443", + "authorization":"Bearer abc123", + "host":"hello.test.com", + "x-amzn-trace-id":"Root=1-5ea3263d-07c5d5ddfd0788bed7dad831", + "user-agent":"Paw/3.1.10 (Macintosh; OS X/10.15.4) GCDHTTPRequest", + "content-length":"0" + }, + "multiValueHeaders": { + "header1": [ + "value1" + ], + "header2": [ + "value1", + "value2" + ] + }, + "queryStringParameters": { + "foo":"bar" + }, + "multiValueQueryStringParameters": { + "parameter1": [ + "value1", + "value2" + ], + "parameter2": [ + "value" + ] + }, + "requestContext": { + "accountId": "123456789012", + "apiId":"pb5dg6g3rg", + "authorizer": { + "scopes":[ + "hello" + ], + "claims":{ + "aud":"customers", + "iss":"https://hello.test.com/", + "iat":"1587749276", + "exp":"1587756476" + } + }, + "domainName": "id.execute-api.us-east-1.amazonaws.com", + "domainPrefix": "id", + "extendedRequestId": "request-id", + "httpMethod": "GET", + "identity": { + "accessKey": null, + "accountId": null, + "caller": null, + "cognitoAuthenticationProvider": null, + "cognitoAuthenticationType": null, + "cognitoIdentityId": null, + "cognitoIdentityPoolId": null, + "principalOrgId": null, + "sourceIp":"91.64.117.86", + "user": null, + "userAgent":"Paw/3.1.10 (Macintosh; OS X/10.15.4) GCDHTTPRequest", + "userArn": null, + "clientCert": { + "clientCertPem": "CERT_CONTENT", + "subjectDN": "www.example.com", + "issuerDN": "Example issuer", + "serialNumber": "a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1", + "validity": { + "notBefore": "May 28 12:30:02 2019 GMT", + "notAfter": "Aug 5 09:36:04 2021 GMT" + } + } + }, + "path": "/hello", + "protocol": "HTTP/1.1", + "requestId":"LgLpnibOFiAEPCA=", + "requestTime": "04/Mar/2020:19:15:17 +0000", + "requestTimeEpoch": 1587750461466, + "resourceId": null, + "resourcePath": "/my/path", + "stage": "$default" + }, + "pathParameters": null, + "stageVariables":{ + "foo":"bar" + }, + "body": "Hello from Lambda!", + "isBase64Encoded": false + } + """ + + // MARK: - Request - + + // MARK: Decoding + + func testRequestDecodingExampleProxyRequest() { + let data = LambdaProxyEventTests.exampleLambdaProxyEvent.data(using: .utf8)! + var req: LambdaProxyEvent? + XCTAssertNoThrow(req = try JSONDecoder().decode(LambdaProxyEvent.self, from: data)) + + XCTAssertEqual(req?.path, "/hello") + XCTAssertEqual(req?.context.httpMethod, .GET) + XCTAssertEqual(req?.queryStringParameters?.count, 1) + XCTAssertEqual(req?.headers.count, 8) + XCTAssertNotNil(req?.body) + } + +} From 4b8c1f4c9c6552dd502a4aa80c310ca2e17f86b9 Mon Sep 17 00:00:00 2001 From: Idelfonso Gutierrez Date: Thu, 28 Apr 2022 06:42:56 -0500 Subject: [PATCH 02/11] Update Sources/AWSLambdaEvents/LambdaProxyEvent.swift Co-authored-by: Fabian Fett --- Sources/AWSLambdaEvents/LambdaProxyEvent.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/AWSLambdaEvents/LambdaProxyEvent.swift b/Sources/AWSLambdaEvents/LambdaProxyEvent.swift index 7c03027..b57f8c9 100644 --- a/Sources/AWSLambdaEvents/LambdaProxyEvent.swift +++ b/Sources/AWSLambdaEvents/LambdaProxyEvent.swift @@ -2,7 +2,7 @@ // // This source file is part of the SwiftAWSLambdaRuntime open source project // -// Copyright (c) 2017-2022 Apple Inc. and the SwiftAWSLambdaRuntime project authors +// Copyright (c) 2022 Apple Inc. and the SwiftAWSLambdaRuntime project authors // Licensed under Apache License v2.0 // // See LICENSE.txt for license information From 7ec86379537bd73022f48df94017bc4dba754e42 Mon Sep 17 00:00:00 2001 From: Idelfonso Gutierrez Date: Thu, 28 Apr 2022 06:43:03 -0500 Subject: [PATCH 03/11] Update Sources/AWSLambdaEvents/LambdaProxyEvent.swift Co-authored-by: Fabian Fett --- Sources/AWSLambdaEvents/LambdaProxyEvent.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/AWSLambdaEvents/LambdaProxyEvent.swift b/Sources/AWSLambdaEvents/LambdaProxyEvent.swift index b57f8c9..a079d69 100644 --- a/Sources/AWSLambdaEvents/LambdaProxyEvent.swift +++ b/Sources/AWSLambdaEvents/LambdaProxyEvent.swift @@ -29,7 +29,7 @@ public struct LambdaProxyEvent: Codable { } public let accountId: String - public let apiId: String + public let apiID: String public let domainName: String public let domainPrefix: String public let stage: String From 5d2f8c8aa843550c92ba69da86adce0d0bcc309b Mon Sep 17 00:00:00 2001 From: Idelfonso Gutierrez Date: Thu, 28 Apr 2022 06:43:10 -0500 Subject: [PATCH 04/11] Update Sources/AWSLambdaEvents/LambdaProxyEvent.swift Co-authored-by: Fabian Fett --- Sources/AWSLambdaEvents/LambdaProxyEvent.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/AWSLambdaEvents/LambdaProxyEvent.swift b/Sources/AWSLambdaEvents/LambdaProxyEvent.swift index a079d69..bb2e554 100644 --- a/Sources/AWSLambdaEvents/LambdaProxyEvent.swift +++ b/Sources/AWSLambdaEvents/LambdaProxyEvent.swift @@ -28,7 +28,7 @@ public struct LambdaProxyEvent: Codable { public let scopes: [String]? } - public let accountId: String + public let accountID: String public let apiID: String public let domainName: String public let domainPrefix: String From dfffd95a9c4bd7f2bf94d1f8ba0ee8fdeb990c27 Mon Sep 17 00:00:00 2001 From: Idelfonso Gutierrez Date: Thu, 28 Apr 2022 06:43:17 -0500 Subject: [PATCH 05/11] Update Sources/AWSLambdaEvents/LambdaProxyEvent.swift Co-authored-by: Fabian Fett --- Sources/AWSLambdaEvents/LambdaProxyEvent.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/AWSLambdaEvents/LambdaProxyEvent.swift b/Sources/AWSLambdaEvents/LambdaProxyEvent.swift index bb2e554..2ce5d5f 100644 --- a/Sources/AWSLambdaEvents/LambdaProxyEvent.swift +++ b/Sources/AWSLambdaEvents/LambdaProxyEvent.swift @@ -33,7 +33,7 @@ public struct LambdaProxyEvent: Codable { public let domainName: String public let domainPrefix: String public let stage: String - public let requestId: String + public let requestID: String public let httpMethod: HTTPMethod public let authorizer: Authorizer? From 205d003adf646c9216d0891a59d1888ceafc21ce Mon Sep 17 00:00:00 2001 From: Idelfonso Gutierrez Date: Thu, 28 Apr 2022 06:43:58 -0500 Subject: [PATCH 06/11] Update Sources/AWSLambdaEvents/LambdaProxyEvent.swift Co-authored-by: Fabian Fett --- Sources/AWSLambdaEvents/LambdaProxyEvent.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/AWSLambdaEvents/LambdaProxyEvent.swift b/Sources/AWSLambdaEvents/LambdaProxyEvent.swift index 2ce5d5f..bdf96ab 100644 --- a/Sources/AWSLambdaEvents/LambdaProxyEvent.swift +++ b/Sources/AWSLambdaEvents/LambdaProxyEvent.swift @@ -13,7 +13,7 @@ //===----------------------------------------------------------------------===// public struct LambdaProxyEvent: Codable { - public struct Context: Codable { + public struct RequestContext: Codable { public struct HTTP: Codable { public let httpMethod: HTTPMethod public let path: String From 7a48afff738f0e09248df27878eb7d46a17721f9 Mon Sep 17 00:00:00 2001 From: Idelfonso Gutierrez Date: Thu, 28 Apr 2022 06:44:04 -0500 Subject: [PATCH 07/11] Update Sources/AWSLambdaEvents/LambdaProxyEvent.swift Co-authored-by: Fabian Fett --- Sources/AWSLambdaEvents/LambdaProxyEvent.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/AWSLambdaEvents/LambdaProxyEvent.swift b/Sources/AWSLambdaEvents/LambdaProxyEvent.swift index bdf96ab..60d28c2 100644 --- a/Sources/AWSLambdaEvents/LambdaProxyEvent.swift +++ b/Sources/AWSLambdaEvents/LambdaProxyEvent.swift @@ -57,7 +57,7 @@ public struct LambdaProxyEvent: Codable { public let queryStringParameters: [String: String]? public let pathParameters: [String: String]? - public let context: Context + public let requestContext: RequestContext public let body: String? public let isBase64Encoded: Bool From 2759412899da25d61075760c9a182ae30c7215cf Mon Sep 17 00:00:00 2001 From: Idelfonso Gutierrez Date: Thu, 28 Apr 2022 06:44:10 -0500 Subject: [PATCH 08/11] Update Sources/AWSLambdaEvents/LambdaProxyEvent.swift Co-authored-by: Fabian Fett --- Sources/AWSLambdaEvents/LambdaProxyEvent.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Sources/AWSLambdaEvents/LambdaProxyEvent.swift b/Sources/AWSLambdaEvents/LambdaProxyEvent.swift index 60d28c2..24eb47b 100644 --- a/Sources/AWSLambdaEvents/LambdaProxyEvent.swift +++ b/Sources/AWSLambdaEvents/LambdaProxyEvent.swift @@ -82,7 +82,7 @@ public struct LambdaProxyEvent: Codable { #if swift(>=5.6) extension LambdaProxyEvent: Sendable {} -extension LambdaProxyEvent.Context: Sendable {} -extension LambdaProxyEvent.Context.HTTP: Sendable {} -extension LambdaProxyEvent.Context.Authorizer: Sendable {} +extension LambdaProxyEvent.RequestContext: Sendable {} +extension LambdaProxyEvent.RequestContext.HTTP: Sendable {} +extension LambdaProxyEvent.RequestContext.Authorizer: Sendable {} #endif From 4419e6dc06ae51f1d876427c989972faf58410c6 Mon Sep 17 00:00:00 2001 From: Idelfonso Gutierrez Date: Thu, 28 Apr 2022 06:44:17 -0500 Subject: [PATCH 09/11] Update Sources/AWSLambdaEvents/LambdaProxyEvent.swift Co-authored-by: Fabian Fett --- Sources/AWSLambdaEvents/LambdaProxyEvent.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/AWSLambdaEvents/LambdaProxyEvent.swift b/Sources/AWSLambdaEvents/LambdaProxyEvent.swift index 24eb47b..eac9062 100644 --- a/Sources/AWSLambdaEvents/LambdaProxyEvent.swift +++ b/Sources/AWSLambdaEvents/LambdaProxyEvent.swift @@ -72,7 +72,7 @@ public struct LambdaProxyEvent: Codable { case queryStringParameters case pathParameters - case context = "requestContext" + case requestContext case stageVariables case body From f3d1270124a274bd5a5a49a6840e02cbdcfa37a2 Mon Sep 17 00:00:00 2001 From: "Gutierrez, Idelfonso" Date: Thu, 28 Apr 2022 07:24:01 -0500 Subject: [PATCH 10/11] chore: address PR feedback --- .../AWSLambdaEvents/LambdaProxyEvent.swift | 46 ++++++++----------- .../LambdaProxyEventTests.swift | 2 +- 2 files changed, 20 insertions(+), 28 deletions(-) diff --git a/Sources/AWSLambdaEvents/LambdaProxyEvent.swift b/Sources/AWSLambdaEvents/LambdaProxyEvent.swift index eac9062..cc5da51 100644 --- a/Sources/AWSLambdaEvents/LambdaProxyEvent.swift +++ b/Sources/AWSLambdaEvents/LambdaProxyEvent.swift @@ -14,14 +14,6 @@ public struct LambdaProxyEvent: Codable { public struct RequestContext: Codable { - public struct HTTP: Codable { - public let httpMethod: HTTPMethod - public let path: String - public let `protocol`: String - public let sourceIp: String - public let userAgent: String - } - /// Authorizer contains authorizer information for the request context. public struct Authorizer: Codable { public let claims: [String: String]? @@ -42,9 +34,27 @@ public struct LambdaProxyEvent: Codable { public let path: String? /// The request time in format: 23/Apr/2020:11:08:18 +0000 - public let time: String? public let requestTime: String? public let requestTimeEpoch: UInt64 + + enum CodingKeys: String, CodingKey { + case accountID = "accountId" + case apiID = "apiId" + case domainName + case domainPrefix + case stage + + case httpMethod + case authorizer + + case requestID = "requestId" + + case resourcePath + case path + + case requestTime + case requestTimeEpoch + } } public let resource: String @@ -61,28 +71,10 @@ public struct LambdaProxyEvent: Codable { public let body: String? public let isBase64Encoded: Bool - - enum CodingKeys: String, CodingKey { - case resource - case path - case httpMethod - - case cookies - case headers - case queryStringParameters - case pathParameters - - case requestContext - case stageVariables - - case body - case isBase64Encoded - } } #if swift(>=5.6) extension LambdaProxyEvent: Sendable {} extension LambdaProxyEvent.RequestContext: Sendable {} -extension LambdaProxyEvent.RequestContext.HTTP: Sendable {} extension LambdaProxyEvent.RequestContext.Authorizer: Sendable {} #endif diff --git a/Tests/AWSLambdaEventsTests/LambdaProxyEventTests.swift b/Tests/AWSLambdaEventsTests/LambdaProxyEventTests.swift index 3ef8474..094067f 100644 --- a/Tests/AWSLambdaEventsTests/LambdaProxyEventTests.swift +++ b/Tests/AWSLambdaEventsTests/LambdaProxyEventTests.swift @@ -122,7 +122,7 @@ class LambdaProxyEventTests: XCTestCase { XCTAssertNoThrow(req = try JSONDecoder().decode(LambdaProxyEvent.self, from: data)) XCTAssertEqual(req?.path, "/hello") - XCTAssertEqual(req?.context.httpMethod, .GET) + XCTAssertEqual(req?.requestContext.httpMethod, .GET) XCTAssertEqual(req?.queryStringParameters?.count, 1) XCTAssertEqual(req?.headers.count, 8) XCTAssertNotNil(req?.body) From 18c181ff0f846f126ec78a154e62630fd5048605 Mon Sep 17 00:00:00 2001 From: "Gutierrez, Idelfonso" Date: Thu, 28 Apr 2022 15:06:32 -0500 Subject: [PATCH 11/11] chore: edit Type name chore: make Type only Decoable chore: run soundness.sh --- ...nt.swift => LambdaGatewayProxyEvent.swift} | 29 ++++++++++--------- ...ift => LambdaGatewayProxyEventTests.swift} | 13 ++++----- 2 files changed, 21 insertions(+), 21 deletions(-) rename Sources/AWSLambdaEvents/{LambdaProxyEvent.swift => LambdaGatewayProxyEvent.swift} (82%) rename Tests/AWSLambdaEventsTests/{LambdaProxyEventTests.swift => LambdaGatewayProxyEventTests.swift} (93%) diff --git a/Sources/AWSLambdaEvents/LambdaProxyEvent.swift b/Sources/AWSLambdaEvents/LambdaGatewayProxyEvent.swift similarity index 82% rename from Sources/AWSLambdaEvents/LambdaProxyEvent.swift rename to Sources/AWSLambdaEvents/LambdaGatewayProxyEvent.swift index cc5da51..1459867 100644 --- a/Sources/AWSLambdaEvents/LambdaProxyEvent.swift +++ b/Sources/AWSLambdaEvents/LambdaGatewayProxyEvent.swift @@ -2,7 +2,7 @@ // // This source file is part of the SwiftAWSLambdaRuntime open source project // -// Copyright (c) 2022 Apple Inc. and the SwiftAWSLambdaRuntime project authors +// Copyright (c) 2017-2022 Apple Inc. and the SwiftAWSLambdaRuntime project authors // Licensed under Apache License v2.0 // // See LICENSE.txt for license information @@ -12,8 +12,9 @@ // //===----------------------------------------------------------------------===// -public struct LambdaProxyEvent: Codable { - public struct RequestContext: Codable { +/// LambdaGatewayProxyEvent contains data coming from the new HTTP API Gateway Proxy +public struct LambdaGatewayProxyEvent: Decodable { + public struct RequestContext: Decodable { /// Authorizer contains authorizer information for the request context. public struct Authorizer: Codable { public let claims: [String: String]? @@ -26,32 +27,32 @@ public struct LambdaProxyEvent: Codable { public let domainPrefix: String public let stage: String public let requestID: String - + public let httpMethod: HTTPMethod public let authorizer: Authorizer? public let resourcePath: String? public let path: String? - + /// The request time in format: 23/Apr/2020:11:08:18 +0000 public let requestTime: String? public let requestTimeEpoch: UInt64 - + enum CodingKeys: String, CodingKey { case accountID = "accountId" case apiID = "apiId" case domainName case domainPrefix case stage - + case httpMethod case authorizer - + case requestID = "requestId" - + case resourcePath case path - + case requestTime case requestTimeEpoch } @@ -61,7 +62,7 @@ public struct LambdaProxyEvent: Codable { public let path: String public let httpMethod: String public let stageVariables: [String: String]? - + public let cookies: [String]? public let headers: HTTPHeaders public let queryStringParameters: [String: String]? @@ -74,7 +75,7 @@ public struct LambdaProxyEvent: Codable { } #if swift(>=5.6) -extension LambdaProxyEvent: Sendable {} -extension LambdaProxyEvent.RequestContext: Sendable {} -extension LambdaProxyEvent.RequestContext.Authorizer: Sendable {} +extension LambdaGatewayProxyEvent: Sendable {} +extension LambdaGatewayProxyEvent.RequestContext: Sendable {} +extension LambdaGatewayProxyEvent.RequestContext.Authorizer: Sendable {} #endif diff --git a/Tests/AWSLambdaEventsTests/LambdaProxyEventTests.swift b/Tests/AWSLambdaEventsTests/LambdaGatewayProxyEventTests.swift similarity index 93% rename from Tests/AWSLambdaEventsTests/LambdaProxyEventTests.swift rename to Tests/AWSLambdaEventsTests/LambdaGatewayProxyEventTests.swift index 094067f..1fc1549 100644 --- a/Tests/AWSLambdaEventsTests/LambdaProxyEventTests.swift +++ b/Tests/AWSLambdaEventsTests/LambdaGatewayProxyEventTests.swift @@ -15,7 +15,7 @@ @testable import AWSLambdaEvents import XCTest -class LambdaProxyEventTests: XCTestCase { +class LambdaGatewayProxyEventTests: XCTestCase { static let exampleLambdaProxyEvent = """ { "resource": "/hello", @@ -115,17 +115,16 @@ class LambdaProxyEventTests: XCTestCase { // MARK: - Request - // MARK: Decoding - + func testRequestDecodingExampleProxyRequest() { - let data = LambdaProxyEventTests.exampleLambdaProxyEvent.data(using: .utf8)! - var req: LambdaProxyEvent? - XCTAssertNoThrow(req = try JSONDecoder().decode(LambdaProxyEvent.self, from: data)) - + let data = LambdaGatewayProxyEventTests.exampleLambdaProxyEvent.data(using: .utf8)! + var req: LambdaGatewayProxyEvent? + XCTAssertNoThrow(req = try JSONDecoder().decode(LambdaGatewayProxyEvent.self, from: data)) + XCTAssertEqual(req?.path, "/hello") XCTAssertEqual(req?.requestContext.httpMethod, .GET) XCTAssertEqual(req?.queryStringParameters?.count, 1) XCTAssertEqual(req?.headers.count, 8) XCTAssertNotNil(req?.body) } - }