mirror of
https://github.com/swift-server/swift-openapi-lambda.git
synced 2026-06-02 07:27:32 +00:00
migrate to swift-test (#9)
* migrate to swift-test * differentiate Swift 6.x from Swift 5.x * swift-format
This commit is contained in:
committed by
GitHub
parent
f967634375
commit
ccf4ef01fe
+10
-3
@@ -1,4 +1,4 @@
|
||||
// swift-tools-version: 5.9
|
||||
// swift-tools-version: 6.0
|
||||
// The swift-tools-version declares the minimum version of Swift required to build this package.
|
||||
|
||||
import PackageDescription
|
||||
@@ -11,9 +11,10 @@ let package = Package(
|
||||
products: [.library(name: "OpenAPILambda", targets: ["OpenAPILambda"])],
|
||||
dependencies: [
|
||||
.package(url: "https://github.com/apple/swift-openapi-runtime.git", from: "1.0.0"),
|
||||
.package(url: "https://github.com/swift-server/swift-aws-lambda-runtime.git", from: "1.0.0-alpha.1"),
|
||||
.package(url: "https://github.com/swift-server/swift-aws-lambda-runtime.git", from: "1.0.0-alpha.3"),
|
||||
.package(url: "https://github.com/swift-server/swift-aws-lambda-events.git", from: "0.3.0"),
|
||||
.package(url: "https://github.com/apple/swift-docc-plugin", from: "1.3.0"),
|
||||
.package(url: "https://github.com/apple/swift-testing.git", branch: "main"),
|
||||
],
|
||||
targets: [
|
||||
.target(
|
||||
@@ -27,6 +28,12 @@ let package = Package(
|
||||
swiftSettings: [.enableExperimentalFeature("StrictConcurrency=complete")]
|
||||
),
|
||||
// test targets
|
||||
.testTarget(name: "OpenAPILambdaTests", dependencies: [.byName(name: "OpenAPILambda")]),
|
||||
.testTarget(
|
||||
name: "OpenAPILambdaTests",
|
||||
dependencies: [
|
||||
.byName(name: "OpenAPILambda"),
|
||||
.product(name: "Testing", package: "swift-testing"),
|
||||
]
|
||||
),
|
||||
]
|
||||
)
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
// swift-tools-version: 5.10
|
||||
// The swift-tools-version declares the minimum version of Swift required to build this package.
|
||||
|
||||
import PackageDescription
|
||||
|
||||
let package = Package(
|
||||
name: "swift-openapi-lambda",
|
||||
platforms: [
|
||||
.macOS(.v12), .iOS(.v15), .tvOS(.v15), .watchOS(.v8),
|
||||
],
|
||||
products: [.library(name: "OpenAPILambda", targets: ["OpenAPILambda"])],
|
||||
dependencies: [
|
||||
.package(url: "https://github.com/apple/swift-openapi-runtime.git", from: "1.0.0"),
|
||||
.package(url: "https://github.com/swift-server/swift-aws-lambda-runtime.git", from: "1.0.0-alpha.3"),
|
||||
.package(url: "https://github.com/swift-server/swift-aws-lambda-events.git", from: "0.3.0"),
|
||||
.package(url: "https://github.com/apple/swift-docc-plugin", from: "1.3.0"),
|
||||
],
|
||||
targets: [
|
||||
.target(
|
||||
name: "OpenAPILambda",
|
||||
dependencies: [
|
||||
.product(name: "AWSLambdaRuntime", package: "swift-aws-lambda-runtime"),
|
||||
.product(name: "AWSLambdaEvents", package: "swift-aws-lambda-events"),
|
||||
.product(name: "OpenAPIRuntime", package: "swift-openapi-runtime"),
|
||||
],
|
||||
path: "Sources",
|
||||
swiftSettings: [.enableExperimentalFeature("StrictConcurrency=complete")]
|
||||
),
|
||||
// test targets
|
||||
.testTarget(
|
||||
name: "OpenAPILambdaTests",
|
||||
dependencies: [
|
||||
.byName(name: "OpenAPILambda")
|
||||
]
|
||||
),
|
||||
]
|
||||
)
|
||||
@@ -0,0 +1,37 @@
|
||||
// swift-tools-version: 5.9
|
||||
// The swift-tools-version declares the minimum version of Swift required to build this package.
|
||||
|
||||
import PackageDescription
|
||||
|
||||
let package = Package(
|
||||
name: "swift-openapi-lambda",
|
||||
platforms: [
|
||||
.macOS(.v12), .iOS(.v15), .tvOS(.v15), .watchOS(.v8),
|
||||
],
|
||||
products: [.library(name: "OpenAPILambda", targets: ["OpenAPILambda"])],
|
||||
dependencies: [
|
||||
.package(url: "https://github.com/apple/swift-openapi-runtime.git", from: "1.0.0"),
|
||||
.package(url: "https://github.com/swift-server/swift-aws-lambda-runtime.git", from: "1.0.0-alpha.3"),
|
||||
.package(url: "https://github.com/swift-server/swift-aws-lambda-events.git", from: "0.3.0"),
|
||||
.package(url: "https://github.com/apple/swift-docc-plugin", from: "1.3.0"),
|
||||
],
|
||||
targets: [
|
||||
.target(
|
||||
name: "OpenAPILambda",
|
||||
dependencies: [
|
||||
.product(name: "AWSLambdaRuntime", package: "swift-aws-lambda-runtime"),
|
||||
.product(name: "AWSLambdaEvents", package: "swift-aws-lambda-events"),
|
||||
.product(name: "OpenAPIRuntime", package: "swift-openapi-runtime"),
|
||||
],
|
||||
path: "Sources",
|
||||
swiftSettings: [.enableExperimentalFeature("StrictConcurrency=complete")]
|
||||
),
|
||||
// test targets
|
||||
.testTarget(
|
||||
name: "OpenAPILambdaTests",
|
||||
dependencies: [
|
||||
.byName(name: "OpenAPILambda")
|
||||
]
|
||||
),
|
||||
]
|
||||
)
|
||||
@@ -15,10 +15,14 @@
|
||||
import HTTPTypes
|
||||
import OpenAPIRuntime
|
||||
|
||||
import XCTest
|
||||
@testable import OpenAPILambda
|
||||
|
||||
final class RouterGraphTest: XCTestCase {
|
||||
// only run unit tests on Swift 6.x
|
||||
#if swift(>=6.0)
|
||||
import Testing
|
||||
|
||||
struct RouterGraphTests {
|
||||
@Test("Path with no parameters")
|
||||
func testPathNoParams() async throws {
|
||||
// given
|
||||
let strMethod = "GET"
|
||||
@@ -29,41 +33,43 @@ final class RouterGraphTest: XCTestCase {
|
||||
let handler: OpenAPIHandler = { a, b, c in (HTTPResponse(status: .ok), HTTPBody(bodyString)) }
|
||||
|
||||
// when
|
||||
XCTAssertNoThrow(try graph.add(method: method, path: path, handler: handler))
|
||||
#expect(throws: Never.self) { try graph.add(method: method, path: path, handler: handler) }
|
||||
|
||||
// then
|
||||
var node: Node? = graph.root()
|
||||
|
||||
// first node is GET
|
||||
node = node?.children[strMethod]
|
||||
if case .httpMethod(let retrievedMethod) = node?.value {
|
||||
XCTAssert(retrievedMethod == method)
|
||||
#expect(retrievedMethod == method)
|
||||
}
|
||||
else {
|
||||
XCTFail("Not an HTTP method")
|
||||
Issue.record("Not an HTTP method")
|
||||
}
|
||||
// all other nodes but last are path elements
|
||||
node = node?.children["element1"]
|
||||
XCTAssertNotNil(node)
|
||||
XCTAssert(node?.children.count == 1)
|
||||
if case .pathElement(let element) = node?.value { XCTAssert(element == "element1") }
|
||||
#expect(node != nil)
|
||||
#expect(node?.children.count == 1)
|
||||
if case .pathElement(let element) = node?.value { #expect(element == "element1") }
|
||||
node = node?.children["element2"]
|
||||
XCTAssertNotNil(node)
|
||||
XCTAssert(node?.children.count == 1)
|
||||
if case .pathElement(let element) = node?.value { XCTAssert(element == "element2") }
|
||||
#expect(node != nil)
|
||||
#expect(node?.children.count == 1)
|
||||
if case .pathElement(let element) = node?.value { #expect(element == "element2") }
|
||||
|
||||
// last node is a handler
|
||||
node = node?.children["handler"]
|
||||
if case .handler(let retrievedHandler) = node?.value {
|
||||
let request = HTTPRequest(method: .init("GET")!, scheme: "https", authority: nil, path: "")
|
||||
let (response, body) = try await retrievedHandler(request, nil, ServerRequestMetadata())
|
||||
XCTAssert(response.status == .ok)
|
||||
#expect(response.status == .ok)
|
||||
let retrievedBody = try? await String(collecting: body ?? "", upTo: 10 * 1024 * 1024)
|
||||
XCTAssert(retrievedBody == bodyString)
|
||||
#expect(retrievedBody == bodyString)
|
||||
}
|
||||
else {
|
||||
XCTFail("Not a handler")
|
||||
Issue.record("Not a handler")
|
||||
}
|
||||
}
|
||||
@Test("Path with one parameter")
|
||||
func testPathOneParams() async throws {
|
||||
// given
|
||||
let strMethod = "GET"
|
||||
@@ -74,41 +80,42 @@ final class RouterGraphTest: XCTestCase {
|
||||
let handler: OpenAPIHandler = { a, b, c in (HTTPResponse(status: .ok), HTTPBody(bodyString)) }
|
||||
|
||||
// when
|
||||
XCTAssertNoThrow(try graph.add(method: method, path: path, handler: handler))
|
||||
#expect(throws: Never.self) { try graph.add(method: method, path: path, handler: handler) }
|
||||
// then
|
||||
var node: Node? = graph.root()
|
||||
|
||||
// first node is GET
|
||||
node = node?.children[strMethod]
|
||||
if case .httpMethod(let retrievedMethod) = node?.value {
|
||||
XCTAssert(retrievedMethod == method)
|
||||
#expect(retrievedMethod == method)
|
||||
}
|
||||
else {
|
||||
XCTFail("Not an HTTP method")
|
||||
Issue.record("Not an HTTP method")
|
||||
}
|
||||
// next node is a path elements
|
||||
node = node?.children["element1"]
|
||||
XCTAssertNotNil(node)
|
||||
XCTAssert(node?.children.count == 1)
|
||||
if case .pathElement(let element) = node?.value { XCTAssert(element == "element1") }
|
||||
#expect(node != nil)
|
||||
#expect(node?.children.count == 1)
|
||||
if case .pathElement(let element) = node?.value { #expect(element == "element1") }
|
||||
node = node?.children["param1"]
|
||||
XCTAssertNotNil(node)
|
||||
XCTAssert(node?.children.count == 1)
|
||||
if case .pathParameter(let param) = node?.value { XCTAssert(param == "param1") }
|
||||
#expect(node != nil)
|
||||
#expect(node?.children.count == 1)
|
||||
if case .pathParameter(let param) = node?.value { #expect(param == "param1") }
|
||||
|
||||
// last node is a handler
|
||||
node = node?.children["handler"]
|
||||
if case .handler(let retrievedHandler) = node?.value {
|
||||
let request = HTTPRequest(method: .init("GET")!, scheme: "https", authority: nil, path: "")
|
||||
let (response, body) = try await retrievedHandler(request, nil, ServerRequestMetadata())
|
||||
XCTAssert(response.status == .ok)
|
||||
#expect(response.status == .ok)
|
||||
let retrievedBody = try? await String(collecting: body ?? "", upTo: 10 * 1024 * 1024)
|
||||
XCTAssert(retrievedBody == bodyString)
|
||||
#expect(retrievedBody == bodyString)
|
||||
}
|
||||
else {
|
||||
XCTFail("Not a handler")
|
||||
Issue.record("Not a handler")
|
||||
}
|
||||
}
|
||||
@Test("Two GET paths")
|
||||
func testTwoGETPaths() async throws {
|
||||
// given
|
||||
let strMethod = "GET"
|
||||
@@ -120,8 +127,8 @@ final class RouterGraphTest: XCTestCase {
|
||||
let handler: OpenAPIHandler = { a, b, c in (HTTPResponse(status: .ok), HTTPBody(bodyString)) }
|
||||
|
||||
// when
|
||||
XCTAssertNoThrow(try graph.add(method: method, path: path1, handler: handler))
|
||||
XCTAssertNoThrow(try graph.add(method: method, path: path2, handler: handler))
|
||||
#expect(throws: Never.self) { try graph.add(method: method, path: path1, handler: handler) }
|
||||
#expect(throws: Never.self) { try graph.add(method: method, path: path2, handler: handler) }
|
||||
|
||||
// then
|
||||
var node: Node? = graph.root()
|
||||
@@ -129,49 +136,50 @@ final class RouterGraphTest: XCTestCase {
|
||||
// first node is GET
|
||||
node = node?.children[strMethod]
|
||||
if case .httpMethod(let retrievedMethod) = node?.value {
|
||||
XCTAssert(retrievedMethod == method)
|
||||
#expect(retrievedMethod == method)
|
||||
}
|
||||
else {
|
||||
XCTFail("Not an HTTP method")
|
||||
Issue.record("Not an HTTP method")
|
||||
}
|
||||
// next nodes are a path elements
|
||||
let node1 = node?.children["element1"]
|
||||
XCTAssertNotNil(node1)
|
||||
XCTAssert(node1?.children.count == 1)
|
||||
if case .pathElement(let element) = node1?.value { XCTAssert(element == "element1") }
|
||||
#expect(node1 != nil)
|
||||
#expect(node1?.children.count == 1)
|
||||
if case .pathElement(let element) = node1?.value { #expect(element == "element1") }
|
||||
|
||||
let node2 = node?.children["element2"]
|
||||
XCTAssertNotNil(node2)
|
||||
XCTAssert(node2?.children.count == 1)
|
||||
if case .pathElement(let element) = node2?.value { XCTAssert(element == "element2") }
|
||||
#expect(node2 != nil)
|
||||
#expect(node2?.children.count == 1)
|
||||
if case .pathElement(let element) = node2?.value { #expect(element == "element2") }
|
||||
|
||||
// last node is a handler
|
||||
let node3 = node1?.children["handler"]
|
||||
XCTAssertNotNil(node3)
|
||||
#expect(node3 != nil)
|
||||
if case .handler(let retrievedHandler) = node3?.value {
|
||||
let request = HTTPRequest(method: .init("GET")!, scheme: "https", authority: nil, path: "")
|
||||
let (response, body) = try await retrievedHandler(request, nil, ServerRequestMetadata())
|
||||
XCTAssert(response.status == .ok)
|
||||
#expect(response.status == .ok)
|
||||
let retrievedBody = try? await String(collecting: body ?? "", upTo: 10 * 1024 * 1024)
|
||||
XCTAssert(retrievedBody == bodyString)
|
||||
#expect(retrievedBody == bodyString)
|
||||
}
|
||||
else {
|
||||
XCTFail("Not a handler")
|
||||
Issue.record("Not a handler")
|
||||
}
|
||||
|
||||
let node4 = node2?.children["handler"]
|
||||
XCTAssertNotNil(node3)
|
||||
try #require(node4 != nil)
|
||||
if case .handler(let retrievedHandler) = node4?.value {
|
||||
let request = HTTPRequest(method: .init("GET")!, scheme: "https", authority: nil, path: "")
|
||||
let (response, body) = try await retrievedHandler(request, nil, ServerRequestMetadata())
|
||||
XCTAssert(response.status == .ok)
|
||||
#expect(response.status == .ok)
|
||||
let retrievedBody = try? await String(collecting: body ?? "", upTo: 10 * 1024 * 1024)
|
||||
XCTAssert(retrievedBody == bodyString)
|
||||
#expect(retrievedBody == bodyString)
|
||||
}
|
||||
else {
|
||||
XCTFail("Not a handler")
|
||||
Issue.record("Not a handler")
|
||||
}
|
||||
}
|
||||
@Test("Multiple HTTP methods")
|
||||
func testMultipleHTTPMethods() throws {
|
||||
// given
|
||||
let strMethod1 = "GET"
|
||||
@@ -184,8 +192,8 @@ final class RouterGraphTest: XCTestCase {
|
||||
let handler: OpenAPIHandler = { a, b, c in (HTTPResponse(status: .ok), HTTPBody(bodyString)) }
|
||||
|
||||
// when
|
||||
XCTAssertNoThrow(try graph.add(method: method1, path: path, handler: handler))
|
||||
XCTAssertNoThrow(try graph.add(method: method2, path: path, handler: handler))
|
||||
#expect(throws: Never.self) { try graph.add(method: method1, path: path, handler: handler) }
|
||||
#expect(throws: Never.self) { try graph.add(method: method2, path: path, handler: handler) }
|
||||
|
||||
// then
|
||||
var node: Node? = graph.root()
|
||||
@@ -193,29 +201,29 @@ final class RouterGraphTest: XCTestCase {
|
||||
// first node is GET
|
||||
let node1 = node?.children[strMethod1]
|
||||
if case .httpMethod(let retrievedMethod) = node1?.value {
|
||||
XCTAssert(retrievedMethod == method1)
|
||||
#expect(retrievedMethod == method1)
|
||||
}
|
||||
else {
|
||||
XCTFail("Not an HTTP method")
|
||||
Issue.record("Not an HTTP method")
|
||||
}
|
||||
// but there is also a POST node at level 1
|
||||
let node2 = node?.children[strMethod2]
|
||||
if case .httpMethod(let retrievedMethod) = node2?.value {
|
||||
XCTAssert(retrievedMethod == method2)
|
||||
#expect(retrievedMethod == method2)
|
||||
}
|
||||
else {
|
||||
XCTFail("Not an HTTP method")
|
||||
Issue.record("Not an HTTP method")
|
||||
}
|
||||
|
||||
// all other nodes but last are path elements
|
||||
node = node1?.children["element1"]
|
||||
XCTAssertNotNil(node1)
|
||||
XCTAssert(node1?.children.count == 1)
|
||||
if case .pathElement(let element) = node1?.value { XCTAssert(element == "element1") }
|
||||
#expect(node1 != nil)
|
||||
#expect(node1?.children.count == 1)
|
||||
if case .pathElement(let element) = node1?.value { #expect(element == "element1") }
|
||||
node = node2?.children["element2"]
|
||||
XCTAssertNotNil(node2)
|
||||
XCTAssert(node2?.children.count == 1)
|
||||
if case .pathElement(let element) = node2?.value { XCTAssert(element == "element2") }
|
||||
#expect(node2 != nil)
|
||||
#expect(node2?.children.count == 1)
|
||||
if case .pathElement(let element) = node2?.value { #expect(element == "element2") }
|
||||
}
|
||||
// func testDeepSearch() {
|
||||
// // given
|
||||
@@ -270,6 +278,7 @@ final class RouterGraphTest: XCTestCase {
|
||||
// }
|
||||
// }
|
||||
|
||||
@Test("No method path")
|
||||
func testNoMethodPath() {
|
||||
// given
|
||||
let strMethod = "GET"
|
||||
@@ -279,8 +288,13 @@ final class RouterGraphTest: XCTestCase {
|
||||
// when
|
||||
// then
|
||||
let noExistingMethod = HTTPRequest.Method("POST")!
|
||||
XCTAssertThrowsError(try graph.find(method: noExistingMethod, path: "/dummy"))
|
||||
// #expect(throws: OpenAPILambdaRouterError.noRouteForMethod(noExistingMethod).self) {
|
||||
#expect(throws: OpenAPILambdaRouterError.self) {
|
||||
try graph.find(method: noExistingMethod, path: "/dummy")
|
||||
}
|
||||
}
|
||||
|
||||
@Test("No two param children")
|
||||
func testNoTwoParamChilds() {
|
||||
let strMethod = "GET"
|
||||
let method = HTTPRequest.Method(strMethod)!
|
||||
@@ -291,10 +305,15 @@ final class RouterGraphTest: XCTestCase {
|
||||
let handler: OpenAPIHandler = { a, b, c in (HTTPResponse(status: .ok), HTTPBody(bodyString)) }
|
||||
|
||||
// when
|
||||
XCTAssertNoThrow(try graph.add(method: method, path: path1, handler: handler))
|
||||
#expect(throws: Never.self) { try graph.add(method: method, path: path1, handler: handler) }
|
||||
|
||||
// then
|
||||
XCTAssertThrowsError(try graph.add(method: method, path: path2, handler: handler))
|
||||
#expect(throws: URIPathCollectionError.self) {
|
||||
try graph.add(method: method, path: path2, handler: handler)
|
||||
}
|
||||
}
|
||||
|
||||
@Test("Find handler 1")
|
||||
func testFindHandler1() throws {
|
||||
// given
|
||||
let strMethod = "GET"
|
||||
@@ -303,11 +322,13 @@ final class RouterGraphTest: XCTestCase {
|
||||
let pathToTest = "/element1/element2"
|
||||
|
||||
//when
|
||||
XCTAssertNoThrow(try graph.find(method: method, path: pathToTest))
|
||||
#expect(throws: Never.self) { try graph.find(method: method, path: pathToTest) }
|
||||
let (handler, metadata) = try graph.find(method: method, path: pathToTest)
|
||||
XCTAssert(metadata.count == 0)
|
||||
XCTAssertNotNil(handler)
|
||||
#expect(metadata.count == 0)
|
||||
#expect(handler != nil)
|
||||
}
|
||||
|
||||
@Test("Find handler 2")
|
||||
func testFindHandler2() throws {
|
||||
// given
|
||||
let strMethod = "GET"
|
||||
@@ -316,12 +337,13 @@ final class RouterGraphTest: XCTestCase {
|
||||
let pathToTest = "/element3/value1/element4"
|
||||
|
||||
//when
|
||||
XCTAssertNoThrow(try graph.find(method: method, path: pathToTest))
|
||||
#expect(throws: Never.self) { try graph.find(method: method, path: pathToTest) }
|
||||
let (handler, metadata) = try graph.find(method: method, path: pathToTest)
|
||||
XCTAssert(metadata.count == 1)
|
||||
XCTAssertNotNil(handler)
|
||||
#expect(metadata.count == 1)
|
||||
#expect(handler != nil)
|
||||
}
|
||||
|
||||
@Test("Find handler 3")
|
||||
func testFindHandler3() throws {
|
||||
// given
|
||||
let strMethod = "GET"
|
||||
@@ -330,12 +352,13 @@ final class RouterGraphTest: XCTestCase {
|
||||
let pathToTest = "/element5/value1"
|
||||
|
||||
//when
|
||||
XCTAssertNoThrow(try graph.find(method: method, path: pathToTest))
|
||||
#expect(throws: Never.self) { try graph.find(method: method, path: pathToTest) }
|
||||
let (handler, metadata) = try graph.find(method: method, path: pathToTest)
|
||||
XCTAssert(metadata.count == 1)
|
||||
XCTAssertNotNil(handler)
|
||||
#expect(metadata.count == 1)
|
||||
#expect(handler != nil)
|
||||
}
|
||||
|
||||
@Test("Find handler error 1")
|
||||
func testFindHandlerError1() throws {
|
||||
// given
|
||||
let strMethod = "GET"
|
||||
@@ -344,9 +367,12 @@ final class RouterGraphTest: XCTestCase {
|
||||
let pathToTest = "/element6/value1"
|
||||
|
||||
//when
|
||||
XCTAssertThrowsError(try graph.find(method: method, path: pathToTest))
|
||||
#expect(throws: OpenAPILambdaRouterError.self) {
|
||||
try graph.find(method: method, path: pathToTest)
|
||||
}
|
||||
}
|
||||
|
||||
@Test("Find handler error 2")
|
||||
func testFindHandlerError2() throws {
|
||||
// given
|
||||
let strMethod = "GET"
|
||||
@@ -355,9 +381,12 @@ final class RouterGraphTest: XCTestCase {
|
||||
let pathToTest = "/element6"
|
||||
|
||||
//when
|
||||
XCTAssertThrowsError(try graph.find(method: method, path: pathToTest))
|
||||
#expect(throws: OpenAPILambdaRouterError.self) {
|
||||
try graph.find(method: method, path: pathToTest)
|
||||
}
|
||||
}
|
||||
|
||||
@Test("Find handler error no HTTP method")
|
||||
func testFindHandlerErrorNoHttpMethod() throws {
|
||||
// given
|
||||
let strMethod = "GET"
|
||||
@@ -366,7 +395,9 @@ final class RouterGraphTest: XCTestCase {
|
||||
let pathToTest = "/element1/element2"
|
||||
|
||||
//when
|
||||
XCTAssertThrowsError(try graph.find(method: HTTPRequest.Method(rawValue: "POST")!, path: pathToTest))
|
||||
#expect(throws: OpenAPILambdaRouterError.self) {
|
||||
try graph.find(method: HTTPRequest.Method(rawValue: "POST")!, path: pathToTest)
|
||||
}
|
||||
}
|
||||
|
||||
private func prepareGraph(for method: HTTPRequest.Method) -> URIPath {
|
||||
@@ -376,8 +407,8 @@ final class RouterGraphTest: XCTestCase {
|
||||
let bodyString = "bodyString"
|
||||
let handler: OpenAPIHandler = { a, b, c in (HTTPResponse(status: .ok), HTTPBody(bodyString)) }
|
||||
|
||||
XCTAssertNoThrow(try graph.add(method: method, path: path1, handler: handler))
|
||||
XCTAssertNoThrow(try graph.add(method: method, path: path2, handler: handler))
|
||||
try! graph.add(method: method, path: path1, handler: handler)
|
||||
try! graph.add(method: method, path: path2, handler: handler)
|
||||
return graph
|
||||
}
|
||||
|
||||
@@ -389,11 +420,12 @@ final class RouterGraphTest: XCTestCase {
|
||||
let bodyString = "bodyString"
|
||||
let handler: OpenAPIHandler = { a, b, c in (HTTPResponse(status: .ok), HTTPBody(bodyString)) }
|
||||
|
||||
XCTAssertNoThrow(try graph.add(method: method, path: path1, handler: handler))
|
||||
XCTAssertNoThrow(try graph.add(method: method, path: path2, handler: handler))
|
||||
XCTAssertNoThrow(try graph.add(method: method, path: path3, handler: handler))
|
||||
try! graph.add(method: method, path: path1, handler: handler)
|
||||
try! graph.add(method: method, path: path2, handler: handler)
|
||||
try! graph.add(method: method, path: path3, handler: handler)
|
||||
|
||||
return graph
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -15,128 +15,150 @@
|
||||
import HTTPTypes
|
||||
import OpenAPIRuntime
|
||||
|
||||
import XCTest
|
||||
@testable import OpenAPILambda
|
||||
|
||||
final class RouterNodeTest: XCTestCase {
|
||||
// only run unit tests on Swift 6.x
|
||||
#if swift(>=6.0)
|
||||
import Testing
|
||||
|
||||
struct RouterNodeTests {
|
||||
@Test("First node is root")
|
||||
func testFirstNodeIsRoot() throws {
|
||||
// given
|
||||
let node = Node()
|
||||
// when
|
||||
guard case .root = node.value else {
|
||||
XCTFail("Top level node is not root")
|
||||
Issue.record("Top level node is not root")
|
||||
return
|
||||
}
|
||||
// then
|
||||
// succeed
|
||||
}
|
||||
|
||||
@Test("Add path element")
|
||||
func testAddPathElement() throws {
|
||||
// given
|
||||
let pathElement = "test"
|
||||
let node = Node()
|
||||
// when
|
||||
XCTAssertNoThrow(try node.add(pathElement: pathElement))
|
||||
#expect(throws: Never.self) { try node.add(pathElement: pathElement) }
|
||||
// then
|
||||
XCTAssert(node.children.count == 1)
|
||||
#expect(node.children.count == 1)
|
||||
let child = node.children[pathElement]
|
||||
if case .pathElement(let element) = child?.value {
|
||||
XCTAssert(element == pathElement)
|
||||
#expect(element == pathElement)
|
||||
}
|
||||
else {
|
||||
XCTFail("Not a path element")
|
||||
Issue.record("Not a path element")
|
||||
}
|
||||
}
|
||||
|
||||
@Test("Add HTTP method")
|
||||
func testAddHTTPMethod() throws {
|
||||
// given
|
||||
let methodStr = "GET"
|
||||
let method = HTTPRequest.Method(methodStr)!
|
||||
let node = Node()
|
||||
// when
|
||||
XCTAssertNoThrow(try node.add(httpMethod: method))
|
||||
#expect(throws: Never.self) { try node.add(httpMethod: method) }
|
||||
// then
|
||||
XCTAssert(node.children.count == 1)
|
||||
#expect(node.children.count == 1)
|
||||
let child = node.children[methodStr]
|
||||
if case .httpMethod(let retrievedMethod) = child?.value {
|
||||
XCTAssert(retrievedMethod == method)
|
||||
#expect(retrievedMethod == method)
|
||||
}
|
||||
else {
|
||||
XCTFail("Not an HTTP method")
|
||||
Issue.record("Not an HTTP method")
|
||||
}
|
||||
}
|
||||
|
||||
@Test("Add parameter")
|
||||
func testAddParameter() throws {
|
||||
// given
|
||||
let parameter = "parameter"
|
||||
let node = Node()
|
||||
// when
|
||||
XCTAssertNoThrow(try node.add(parameter: "parameter"))
|
||||
#expect(throws: Never.self) { try node.add(parameter: "parameter") }
|
||||
// then
|
||||
XCTAssert(node.children.count == 1)
|
||||
#expect(node.children.count == 1)
|
||||
let child = node.children[parameter]
|
||||
if case .pathParameter(let param) = child?.value {
|
||||
XCTAssert(param == parameter)
|
||||
#expect(param == parameter)
|
||||
}
|
||||
else {
|
||||
XCTFail("Not a parameter")
|
||||
Issue.record("Not a parameter")
|
||||
}
|
||||
}
|
||||
|
||||
@Test("Add handler")
|
||||
func testAddHandler() async throws {
|
||||
// given
|
||||
let bodyString = "bodyString"
|
||||
let handler: OpenAPIHandler = { a, b, c in (HTTPResponse(status: .ok), HTTPBody(bodyString)) }
|
||||
let node = Node()
|
||||
// when
|
||||
XCTAssertNoThrow(try node.add(handler: handler))
|
||||
#expect(throws: Never.self) { try node.add(handler: handler) }
|
||||
// then
|
||||
XCTAssert(node.children.count == 1)
|
||||
#expect(node.children.count == 1)
|
||||
let child = node.children["handler"]
|
||||
if case .handler(let retrievedHandler) = child?.value {
|
||||
let request = HTTPRequest(method: .init("GET")!, scheme: "https", authority: nil, path: "")
|
||||
let (response, body) = try await retrievedHandler(request, nil, ServerRequestMetadata())
|
||||
XCTAssert(response.status == .ok)
|
||||
#expect(response.status == .ok)
|
||||
let retrievedBody = try? await String(collecting: body ?? "", upTo: 10 * 1024 * 1024)
|
||||
XCTAssert(retrievedBody == bodyString)
|
||||
#expect(retrievedBody == bodyString)
|
||||
}
|
||||
else {
|
||||
XCTFail("Not a handler")
|
||||
Issue.record("Not a handler")
|
||||
}
|
||||
}
|
||||
|
||||
@Test("Cannot add node to handler")
|
||||
func testCanNotAddNodeToHandler() {
|
||||
// given
|
||||
let bodyString = "bodyString"
|
||||
let handler: OpenAPIHandler = { a, b, c in (HTTPResponse(status: .ok), HTTPBody(bodyString)) }
|
||||
let node = Node()
|
||||
XCTAssertNoThrow(try node.add(handler: handler))
|
||||
let _ = try? node.add(handler: handler)
|
||||
// when
|
||||
let child = node.children["handler"]
|
||||
// should throw an error
|
||||
XCTAssertThrowsError(try child?.add(pathElement: "test"))
|
||||
#expect(throws: URIPathCollectionError.self) {
|
||||
try child?.add(pathElement: "test")
|
||||
}
|
||||
}
|
||||
|
||||
@Test("Add duplicate node")
|
||||
func testAddDuplicateNode() throws {
|
||||
// given
|
||||
let pathElement = "test"
|
||||
let node = Node()
|
||||
// when
|
||||
XCTAssertNoThrow(try node.add(pathElement: pathElement))
|
||||
XCTAssertNoThrow(try node.add(pathElement: pathElement))
|
||||
#expect(throws: Never.self) { try node.add(pathElement: pathElement) }
|
||||
#expect(throws: Never.self) { try node.add(pathElement: pathElement) }
|
||||
// then
|
||||
XCTAssert(node.children.count == 1)
|
||||
#expect(node.children.count == 1)
|
||||
}
|
||||
|
||||
@Test("Returns new node")
|
||||
func testReturnsNewNode() throws {
|
||||
// given
|
||||
let pathElement = "test"
|
||||
let node = Node()
|
||||
// when
|
||||
let newNode = try? node.add(pathElement: pathElement)
|
||||
XCTAssertNotNil(newNode)
|
||||
#expect(newNode != nil)
|
||||
// then
|
||||
XCTAssert(node.children.count == 1)
|
||||
#expect(node.children.count == 1)
|
||||
if case .pathElement(let element) = newNode?.value {
|
||||
XCTAssert(element == pathElement)
|
||||
#expect(element == pathElement)
|
||||
}
|
||||
else {
|
||||
XCTFail("Not a path element")
|
||||
Issue.record("Not a path element")
|
||||
}
|
||||
}
|
||||
|
||||
@Test("Returns existing child")
|
||||
func testReturnsExistingChild() throws {
|
||||
// given
|
||||
let pathElement = "test"
|
||||
@@ -144,18 +166,20 @@ final class RouterNodeTest: XCTestCase {
|
||||
// when
|
||||
let _ = try? node.add(pathElement: pathElement)
|
||||
let existingNode = try? node.add(pathElement: pathElement)
|
||||
XCTAssertNotNil(existingNode)
|
||||
#expect(existingNode != nil)
|
||||
|
||||
// then
|
||||
XCTAssert(node.children.count == 1)
|
||||
XCTAssert(existingNode?.children.count == 0)
|
||||
#expect(node.children.count == 1)
|
||||
#expect(existingNode?.children.count == 0)
|
||||
if case .pathElement(let element) = existingNode?.value {
|
||||
XCTAssert(element == pathElement)
|
||||
#expect(element == pathElement)
|
||||
}
|
||||
else {
|
||||
XCTFail("Not a path element")
|
||||
Issue.record("Not a path element")
|
||||
}
|
||||
}
|
||||
|
||||
@Test("Retrieve param child exists")
|
||||
func testRetrieveParamChildExist() {
|
||||
// given
|
||||
let pathElement = "element1"
|
||||
@@ -163,14 +187,15 @@ final class RouterNodeTest: XCTestCase {
|
||||
|
||||
// when
|
||||
let pathNode = try? root.add(pathElement: pathElement)
|
||||
XCTAssertNotNil(pathNode)
|
||||
#expect(pathNode != nil)
|
||||
let _ = try? pathNode?.add(parameter: "param1")
|
||||
|
||||
// then
|
||||
let paramNode = pathNode!.parameterChild()
|
||||
XCTAssertNotNil(paramNode)
|
||||
|
||||
#expect(paramNode != nil)
|
||||
}
|
||||
|
||||
@Test("Retrieve param child does not exist")
|
||||
func testRetrieveParamChildNOTExist() {
|
||||
// given
|
||||
let pathElement = "element1"
|
||||
@@ -178,12 +203,13 @@ final class RouterNodeTest: XCTestCase {
|
||||
|
||||
// when
|
||||
let pathNode = try? root.add(pathElement: pathElement)
|
||||
XCTAssertNotNil(pathNode)
|
||||
#expect(pathNode != nil)
|
||||
let _ = try? pathNode?.add(pathElement: "element2")
|
||||
|
||||
// then
|
||||
let paramNode = pathNode!.parameterChild()
|
||||
XCTAssertNil(paramNode)
|
||||
#expect(paramNode == nil)
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user