Skip to content

Commit

Permalink
Merge pull request #3 from jemmons/implicit_start
Browse files Browse the repository at this point in the history
Makes `start` implicit with initialization.
  • Loading branch information
jemmons committed Feb 11, 2024
2 parents 2e65175 + 0110e32 commit 2b489dd
Show file tree
Hide file tree
Showing 6 changed files with 238 additions and 221 deletions.
35 changes: 13 additions & 22 deletions Sources/Perfidy/FakeServer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,17 @@ public class FakeServer {
private let routeManager = RouteManager()
private let port: Int
private let defaultStatus: Int
private var group: EventLoopGroup?
private var channel: Channel?


public static let defaultURL: URL = URL(string: "http://localhost:\(Default.port)")!


private var group: EventLoopGroup?
private var channel: Channel?


public init(port: Int = Default.port, defaultStatusCode: Int = Default.status) {
public init(port: Int = Default.port, defaultStatusCode: Int = Default.status) throws {
self.port = port
self.defaultStatus = defaultStatusCode
try start()
}
}

Expand Down Expand Up @@ -63,22 +62,6 @@ public extension FakeServer {
}


static func runWith(port: Int = Default.port, defaultStatusCode: Int = Default.status, ƒ: (FakeServer)->Void) {
let server = FakeServer(port: port, defaultStatusCode: defaultStatusCode)
try! server.start()
defer {
server.stop()
}
ƒ(server)
}


func start() throws {
group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
channel = try Helper.doBootstrap(port: port, defaultStatus: defaultStatus, group: group!, delegate: routeManager)
}


func stop() {
routeManager.clear()

Expand All @@ -89,7 +72,6 @@ public extension FakeServer {
}



func add(_ route: Route, response: Response = 200, handler: ((URLRequest) -> Void)? = nil) {
routeManager.add(response: response, forRoute: route)
if let someHandler = handler {
Expand Down Expand Up @@ -163,6 +145,15 @@ public extension FakeServer {



private extension FakeServer {
func start() throws {
group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
channel = try Helper.doBootstrap(port: port, defaultStatus: defaultStatus, group: group!, delegate: routeManager)
}
}



// MARK: - Helper
private enum Helper {
static func doBootstrap(port: Int, defaultStatus: Int, group: EventLoopGroup, delegate: HTTPHandlerDelegate) throws -> Channel {
Expand Down
10 changes: 4 additions & 6 deletions Tests/PerfidyTests/FromFileTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,10 @@ private enum K {


class FromFileTests: XCTestCase {

func testMockInterface() {
let server = FakeServer()
try! server.add(fromFileName: "mockinterface", bundle: fetchFakeBundle())
try! server.start()
func testMockInterface() throws {
let server = try FakeServer()
defer { server.stop() }
try server.add(fromFileName: "mockinterface", bundle: fetchFakeBundle())

let expectedGETResponse = expectation(description: "Waiting for GET response")
let expectedPOSTResponse = expectation(description: "Waiting for POST response")
Expand Down Expand Up @@ -48,7 +46,7 @@ class FromFileTests: XCTestCase {
expectedPUTResponse.fulfill()
}

wait(for: [expectedGETResponse, expectedPOSTResponse, expectedPUTResponse], timeout: 1)
wait(for: [expectedGETResponse, expectedPOSTResponse, expectedPUTResponse], timeout: 10)
}
}

44 changes: 22 additions & 22 deletions Tests/PerfidyTests/RequestTrackingTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,46 +5,46 @@ import Perfidy


class RequestTrackingTests: XCTestCase {
func testRequestWasSent() {
func testRequestWasSent() throws {
let responseReceived = expectation(description: "Waiting for response")
let route: Route = "PUT /hello"

FakeServer.runWith { server in
server.add(route)
let server = try FakeServer()
defer { server.stop() }
server.add(route)

XCTAssertFalse(server.didRequest(route: route))
XCTAssertFalse(server.didRequest(route: route))

session.resumeRequest("PUT", "/hello") { _, _, _ in
XCTAssert(server.didRequest(route: route))
responseReceived.fulfill()
}
wait(for: [responseReceived], timeout: 1)
session.resumeRequest("PUT", "/hello") { _, _, _ in
XCTAssert(server.didRequest(route: route))
responseReceived.fulfill()
}
wait(for: [responseReceived], timeout: 1)
}


func testRequestWasSentTwice() {
func testRequestWasSentTwice() throws {
let responseReceived = expectation(description: "Waiting for responses")
responseReceived.expectedFulfillmentCount = 2

let route: Route = "POST /content/111"

FakeServer.runWith { server in
server.add(route)
let server = try FakeServer()
defer { server.stop() }
server.add(route)

XCTAssertEqual(server.numberOfRequests(for: route), 0)
XCTAssertEqual(server.numberOfRequests(for: route), 0)

session.resumeRequest("POST", "/content/111") { _, _, _ in
responseReceived.fulfill()
}
session.resumeRequest("POST", "/content/111") { _, _, _ in
responseReceived.fulfill()
}

session.resumeRequest("POST", "/content/111") { _, _, _ in
responseReceived.fulfill()
}
session.resumeRequest("POST", "/content/111") { _, _, _ in
responseReceived.fulfill()
}

waitForExpectations(timeout: 1) { _ in
XCTAssertEqual(server.numberOfRequests(for: route), 2)
}
waitForExpectations(timeout: 1) { _ in
XCTAssertEqual(server.numberOfRequests(for: route), 2)
}
}
}
12 changes: 6 additions & 6 deletions Tests/PerfidyTests/ResponseTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ class ResponseTests : XCTestCase{
}


func testRawJSON() {
let subject = try! Response(rawJSON: "{\"foo\":\"bar\"}")
func testRawJSON() throws {
let subject = try Response(rawJSON: "{\"foo\":\"bar\"}")
XCTAssertEqual(String(data: subject.body!, encoding: String.Encoding.utf8), "{\"foo\":\"bar\"}")
XCTAssertEqual(subject.headers[lengthKey], "13")
XCTAssertEqual(subject.headers[typeKey], "application/json")
Expand All @@ -51,16 +51,16 @@ class ResponseTests : XCTestCase{
}


func testJSONObject() {
let subject = try! Response(jsonObject: ["foo":"bar"])
func testJSONObject() throws {
let subject = try Response(jsonObject: ["foo":"bar"])
XCTAssertEqual(String(data: subject.body!, encoding: .utf8), "{\"foo\":\"bar\"}")
XCTAssertEqual(subject.headers[lengthKey], "13")
XCTAssertEqual(subject.headers[typeKey], "application/json")
}


func testJSONArray() {
let subject = try! Response(jsonArray: [1,2,3])
func testJSONArray() throws {
let subject = try Response(jsonArray: [1,2,3])
XCTAssertEqual(String(data: subject.body!, encoding: .utf8), "[1,2,3]")
XCTAssertEqual(subject.headers[lengthKey], "7")
XCTAssertEqual(subject.headers[typeKey], "application/json")
Expand Down

0 comments on commit 2b489dd

Please sign in to comment.