Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Typealias RequestError to avoid KituraContracts import #1267

Merged
merged 4 commits into from May 11, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 5 additions & 0 deletions Sources/Kitura/CodableRouter.swift
Expand Up @@ -19,6 +19,11 @@ import LoggerAPI
import KituraNet
import KituraContracts

/// Bridge [RequestError](https://ibm-swift.github.io/KituraContracts/Structs/RequestError.html)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As far as I can tell, this dummy class was only necessary because the file otherwise contains only a typealias. In this case I dropped the typealias into the existing CodableRouter.swift since I could argue it belongs there.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK as long as Jazzy is generating the typealias OK then we're fine :)

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tested locally, it generates fine.

/// from [KituraContracts](https://ibm-swift.github.io/KituraContracts) so that you only need to import
/// `Kitura` to access it.
public typealias RequestError = KituraContracts.RequestError

// Codable router

extension Router {
Expand Down
82 changes: 82 additions & 0 deletions Tests/KituraTests/TestBridgingRequestError.swift
@@ -0,0 +1,82 @@
/**
* Copyright IBM Corporation 2018
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/

import XCTest
import Foundation

@testable import Kitura

#if os(Linux)
import Glibc
#else
import Darwin
#endif

// This file does not import KituraContracts and is relying on the typealias of
// RequestError. This tests that a Codable handler can be declared, and built and
// run without error in the absence of this import. Other existing tests that
// import KituraContracts should be sufficient to show that the typealias does not
// interfere in that case.
class TestBridgingRequestError: KituraTest {

static var allTests: [(String, (TestBridgingRequestError) -> () throws -> Void)] {
return [
("testRequestError", testRequestError)
]
}

/// An error message that will be returned as a RequestError body. Equatable
/// in order to assert that the correct body was received in the response.
struct AccessError: Codable, Equatable {
let errorReason: String

static func ==(lhs: TestBridgingRequestError.AccessError, rhs: TestBridgingRequestError.AccessError) -> Bool {
return lhs.errorReason == rhs.errorReason
}
}

/// The error instance that will be used when responding, and used to validate
/// that the deserialized response contains the same error.
static let expectedError = AccessError(errorReason: "impossible")

/// Used only in the signature of our route, never created as we return an error
/// instead.
struct Dummy: Codable {
let dummy: String
}

let router = TestBridgingRequestError.setupRouter()

/// Tests that a RequestError can be received, of the correct class, and that
/// a custom error body containing the expected content can be decoded.
func testRequestError() {
buildServerTest(router, timeout: 30)
.request("get", path: "/mission")
.hasStatus(.badRequest)
.hasContentType(withPrefix: "application/json")
.hasData(TestBridgingRequestError.expectedError)
.run()
}

static func setupRouter() -> Router {
let router = Router()
router.get("/mission") { (respondWith: ([Dummy]?, RequestError?) -> Void) in
let error = RequestError(.badRequest, body: expectedError)
respondWith(nil, error)
}
return router
}
}
2 changes: 2 additions & 0 deletions Tests/LinuxMain.swift
Expand Up @@ -58,5 +58,7 @@ XCTMain([
testCase(TestTemplateEngine.allTests.shuffled()),
testCase(TestStack.allTests.shuffled()),
testCase(TestCodableRouter.allTests.shuffled()),
testCase(TestBridgingHTTPStatusCode.allTests.shuffled()),
testCase(TestBridgingRequestError.allTests.shuffled()),
// testCase(TestCRUDTypeRouter.allTests.shuffled()),
].shuffled())