Skip to content

Commit 8b28a03

Browse files
author
Andrea Scuderi
committed
Fix Unit Tests
1 parent 5a12994 commit 8b28a03

File tree

6 files changed

+80
-49
lines changed

6 files changed

+80
-49
lines changed

Sources/BreezeDemoHTTPApplication/BreezeDemoHTTPApplication.swift

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,9 @@ struct BreezeDemoApplication {
4040
timeout: .seconds(60),
4141
logger: logger
4242
)
43-
let lambdaService = BreezeLambdaWebHookService<DemoLambdaHandler>.init(
44-
serviceConfig: BreezeClientServiceConfig(
45-
httpClientService: httpClientService,
46-
logger: logger
47-
)
43+
let serviceConfig = BreezeClientServiceConfig(httpClientService: httpClientService)
44+
let lambdaService = BreezeLambdaWebHookService<DemoLambdaHandler>(
45+
serviceConfig: serviceConfig
4846
)
4947
try await lambdaService.run()
5048
} catch {

Sources/BreezeHTTPClientService/BreezeClientServiceConfig.swift

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,8 @@ public enum BreezeClientServiceError: Error {
2121
public struct BreezeClientServiceConfig: Sendable {
2222

2323
public let httpClientService: BreezeHTTPClientServing
24-
public let logger: Logger
2524

26-
public init(
27-
httpClientService: BreezeHTTPClientServing,
28-
logger: Logger
29-
) {
25+
public init(httpClientService: BreezeHTTPClientServing) {
3026
self.httpClientService = httpClientService
31-
self.logger = logger
3227
}
3328
}

Sources/BreezeLambdaWebHookService/BreezeLambdaWebHookHandler.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public protocol BreezeLambdaWebHookHandler: LambdaHandler {
2525

2626
public extension BreezeLambdaWebHookHandler {
2727
var handler: String? {
28-
handlerContext.handler
28+
Lambda.env("_HANDLER")
2929
}
3030
var httpClient: AsyncHTTPClient.HTTPClient {
3131
handlerContext.httpClient

Sources/BreezeLambdaWebHookService/BreezeLambdaWebHookService.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,11 @@ import BreezeHTTPClientService
2121
import Logging
2222

2323
public struct HandlerContext: Sendable {
24-
public let handler: String?
2524
public let httpClient: HTTPClient
25+
26+
public init(httpClient: HTTPClient) {
27+
self.httpClient = httpClient
28+
}
2629
}
2730

2831
public actor BreezeLambdaWebHookService<Handler: BreezeLambdaWebHookHandler>: Service {
@@ -35,10 +38,8 @@ public actor BreezeLambdaWebHookService<Handler: BreezeLambdaWebHookHandler>: Se
3538
}
3639

3740
public func run() async throws {
38-
let _handler = Lambda.env("_HANDLER")
39-
serviceConfig.logger.info("handler: \(_handler ?? "")")
4041
let httpClient = await serviceConfig.httpClientService.httpClient
41-
let handlerContext = HandlerContext(handler: _handler, httpClient: httpClient)
42+
let handlerContext = HandlerContext(httpClient: httpClient)
4243
self.handlerContext = handlerContext
4344
let runtime = LambdaRuntime(body: handler)
4445
try await runtime.run()

Tests/BreezeLambdaWebHookTests/BreezeLambdaWebHookTests.swift

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,31 +15,39 @@
1515
import AWSLambdaEvents
1616
import AWSLambdaRuntime
1717
import AsyncHTTPClient
18+
import BreezeHTTPClientService
1819
@testable import BreezeLambdaWebHookService
1920
import XCTest
21+
import Logging
2022

2123
final class BreezeLambdaWebHookTests: XCTestCase {
2224

2325
let decoder = JSONDecoder()
26+
let config = BreezeClientServiceConfig(
27+
httpClientService: BreezeHTTPClientService(
28+
timeout: .seconds(1),
29+
logger: Logger(label: "test")
30+
)
31+
)
2432

2533
override func setUpWithError() throws {
2634
try super.setUpWithError()
2735
setEnvironmentVar(name: "LOCAL_LAMBDA_SERVER_ENABLED", value: "true", overwrite: true)
28-
LambdaInitializationContext.WebHook.timeout = 1
36+
// LambdaInitializationContext.WebHook.timeout = 1
2937
}
3038

3139
override func tearDownWithError() throws {
3240
unsetenv("LOCAL_LAMBDA_SERVER_ENABLED")
3341
unsetenv("_HANDLER")
34-
LambdaInitializationContext.WebHook.timeout = 30
42+
// LambdaInitializationContext.WebHook.timeout = 30
3543
try super.tearDownWithError()
3644
}
3745

3846
func test_postWhenMissingBody_thenError() async throws {
3947
setEnvironmentVar(name: "_HANDLER", value: "build/webhook.get", overwrite: true)
4048
let createRequest = try Fixtures.fixture(name: Fixtures.getWebHook, type: "json")
4149
let request = try decoder.decode(APIGatewayV2Request.self, from: createRequest)
42-
let apiResponse: APIGatewayV2Response = try await Lambda.test(BreezeLambdaWebHook<MyPostWebHook>.self, with: request)
50+
let apiResponse: APIGatewayV2Response = try await Lambda.test(MyPostWebHook.self, config: config, with: request)
4351
let response: APIGatewayV2Response.BodyError = try apiResponse.decodeBody()
4452
XCTAssertEqual(apiResponse.statusCode, .badRequest)
4553
XCTAssertEqual(apiResponse.headers, [ "Content-Type": "application/json" ])
@@ -50,7 +58,7 @@ final class BreezeLambdaWebHookTests: XCTestCase {
5058
setEnvironmentVar(name: "_HANDLER", value: "build/webhook.post", overwrite: true)
5159
let createRequest = try Fixtures.fixture(name: Fixtures.postWebHook, type: "json")
5260
let request = try decoder.decode(APIGatewayV2Request.self, from: createRequest)
53-
let apiResponse: APIGatewayV2Response = try await Lambda.test(BreezeLambdaWebHook<MyPostWebHook>.self, with: request)
61+
let apiResponse: APIGatewayV2Response = try await Lambda.test(MyPostWebHook.self, config: config, with: request)
5462
let response: MyPostResponse = try apiResponse.decodeBody()
5563
XCTAssertEqual(apiResponse.statusCode, .ok)
5664
XCTAssertEqual(apiResponse.headers, [ "Content-Type": "application/json" ])
@@ -63,7 +71,7 @@ final class BreezeLambdaWebHookTests: XCTestCase {
6371
setEnvironmentVar(name: "_HANDLER", value: "build/webhook.get", overwrite: true)
6472
let createRequest = try Fixtures.fixture(name: Fixtures.postWebHook, type: "json")
6573
let request = try decoder.decode(APIGatewayV2Request.self, from: createRequest)
66-
let apiResponse: APIGatewayV2Response = try await Lambda.test(BreezeLambdaWebHook<MyGetWebHook>.self, with: request)
74+
let apiResponse: APIGatewayV2Response = try await Lambda.test(MyGetWebHook.self, config: config, with: request)
6775
let response: APIGatewayV2Response.BodyError = try apiResponse.decodeBody()
6876
XCTAssertEqual(apiResponse.statusCode, .badRequest)
6977
XCTAssertEqual(apiResponse.headers, [ "Content-Type": "application/json" ])
@@ -74,7 +82,7 @@ final class BreezeLambdaWebHookTests: XCTestCase {
7482
setEnvironmentVar(name: "_HANDLER", value: "build/webhook.post", overwrite: true)
7583
let createRequest = try Fixtures.fixture(name: Fixtures.getWebHook, type: "json")
7684
let request = try decoder.decode(APIGatewayV2Request.self, from: createRequest)
77-
let apiResponse: APIGatewayV2Response = try await Lambda.test(BreezeLambdaWebHook<MyGetWebHook>.self, with: request)
85+
let apiResponse: APIGatewayV2Response = try await Lambda.test(MyGetWebHook.self, config: config, with: request)
7886
let response: [String: String] = try apiResponse.decodeBody()
7987
XCTAssertEqual(apiResponse.statusCode, .ok)
8088
XCTAssertEqual(apiResponse.headers, [ "Content-Type": "application/json" ])

Tests/BreezeLambdaWebHookTests/Lambda.swift

Lines changed: 56 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -13,41 +13,70 @@
1313
// limitations under the License.
1414

1515
import AWSLambdaEvents
16-
import AWSLambdaRuntime
16+
import BreezeLambdaWebHookService
17+
import BreezeHTTPClientService
18+
import Foundation
1719
@testable import AWSLambdaRuntime
1820
import Logging
1921
import NIO
2022

2123
extension Lambda {
22-
public static func test<Handler: LambdaHandler>(
23-
_ handlerType: Handler.Type,
24-
with event: Handler.Event
25-
) async throws -> Handler.Output {
26-
let logger = Logger(label: "test")
27-
let eventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: 1)
28-
defer {
29-
try! eventLoopGroup.syncShutdownGracefully()
24+
public static func test(
25+
_ handlerType: any BreezeLambdaWebHookHandler.Type,
26+
config: BreezeClientServiceConfig,
27+
with event: APIGatewayV2Request) async throws -> APIGatewayV2Response {
28+
29+
let logger = Logger(label: "evaluateHandler")
30+
let decoder = JSONDecoder()
31+
let encoder = JSONEncoder()
32+
33+
let sut = await handlerType.init(
34+
handlerContext: HandlerContext(httpClient: config.httpClientService.httpClient)
35+
)
36+
let closureHandler = ClosureHandler { event, context in
37+
//Inject Mock Response
38+
try await sut.handle(event, context: context)
3039
}
31-
let eventLoop = eventLoopGroup.next()
32-
33-
let initContext = LambdaInitializationContext.__forTestsOnly(
34-
logger: logger,
35-
eventLoop: eventLoop
40+
41+
var handler = LambdaCodableAdapter(
42+
encoder: encoder,
43+
decoder: decoder,
44+
handler: LambdaHandlerAdapter(handler: closureHandler)
3645
)
37-
46+
let data = try encoder.encode(event)
47+
let event = ByteBuffer(data: data)
48+
let writer = MockLambdaResponseStreamWriter()
3849
let context = LambdaContext.__forTestsOnly(
39-
requestID: config.requestID,
40-
traceID: config.traceID,
41-
invokedFunctionARN: config.invokedFunctionARN,
42-
timeout: config.timeout,
43-
logger: logger,
44-
eventLoop: eventLoop
50+
requestID: UUID().uuidString,
51+
traceID: UUID().uuidString,
52+
invokedFunctionARN: "arn:",
53+
timeout: .milliseconds(6000),
54+
logger: logger
4555
)
46-
let handler = try await Handler(context: initContext)
47-
defer {
48-
let eventLoop = initContext.eventLoop.next()
49-
try? initContext.terminator.terminate(eventLoop: eventLoop).wait()
50-
}
51-
return try await handler.handle(event, context: context)
56+
try await handler.handle(event, responseWriter: writer, context: context)
57+
let result = await writer.output ?? ByteBuffer()
58+
try await config.httpClientService.httpClient.shutdown()
59+
return try decoder.decode(APIGatewayV2Response.self, from: result)
5260
}
5361
}
62+
63+
final actor MockLambdaResponseStreamWriter: LambdaResponseStreamWriter {
64+
private var buffer: ByteBuffer?
65+
66+
var output: ByteBuffer? {
67+
self.buffer
68+
}
69+
70+
func writeAndFinish(_ buffer: ByteBuffer) async throws {
71+
self.buffer = buffer
72+
}
73+
74+
func write(_ buffer: ByteBuffer) async throws {
75+
fatalError("Unexpected call")
76+
}
77+
78+
func finish() async throws {
79+
fatalError("Unexpected call")
80+
}
81+
}
82+

0 commit comments

Comments
 (0)