Skip to content

Commit

Permalink
[#508] Add network test
Browse files Browse the repository at this point in the history
  • Loading branch information
blyscuit committed Oct 5, 2023
1 parent 034edae commit 7e653b9
Show file tree
Hide file tree
Showing 8 changed files with 141 additions and 0 deletions.
1 change: 1 addition & 0 deletions Tuist/Interfaces/SwiftUI/Project/Podfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ def testing_pods
pod 'Nimble', '~> 11.0'
pod 'Sourcery'
pod 'SwiftFormat/CLI'
pod 'OHHTTPStubs/Swift', :configurations => ['Debug Staging', 'Debug Production']
end

target '{PROJECT_NAME}' do
Expand Down
1 change: 1 addition & 0 deletions Tuist/Interfaces/UIKit/Project/Podfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ def testing_pods
pod 'Nimble'
pod 'Sourcery'
pod 'SwiftFormat/CLI'
pod 'OHHTTPStubs/Swift', :configurations => ['Debug Staging', 'Debug Production']
end

target '{PROJECT_NAME}' do
Expand Down
Empty file.
14 changes: 14 additions & 0 deletions {PROJECT_NAME}Tests/Sources/Dummy/DummyNetworkModel.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
//
// DummyNetworkModel.swift
//

import Foundation

struct DummyNetworkModel: Decodable {

static let json =
"""
{"message": "Hello"}
"""
let message: String
}
29 changes: 29 additions & 0 deletions {PROJECT_NAME}Tests/Sources/Dummy/DummyRequestConfiguration.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
//
// DummyRequestConfiguration.swift
//

import Alamofire

@testable import {PROJECT_NAME}

struct DummyRequestConfiguration: RequestConfiguration {

var baseURL: String { "https://example.com" }

var endpoint: String { "" }

var method: Alamofire.HTTPMethod { .get }

var encoding: Alamofire.ParameterEncoding { URLEncoding.queryString }
}

extension DummyRequestConfiguration: RequestConfigurationStubable {

var sampleData: Data {
DummyNetworkModel.json.data(using: .utf8) ?? Data()
}

var path: String {
(try? url.asURL().path).string
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
//
// NetworkAPISpec.swift
//

import Nimble
import Quick

@testable import {PROJECT_NAME}

final class NetworkAPISpec: QuickSpec {

override func spec() {

describe("a NetworkAPI") {

var networkAPI: NetworkAPI!
var requestConfiguration: DummyRequestConfiguration!

describe("its performRequest") {

beforeEach {
requestConfiguration = DummyRequestConfiguration()
}

afterEach {
NetworkStubber.removeAllStubs()
}

context("when network returns value") {

beforeEach {
NetworkStubber.stub(requestConfiguration)
networkAPI = NetworkAPI()
}

it("returns message as Hello") {
let response = try await networkAPI.performRequest(
requestConfiguration,
for: DummyNetworkModel.self
)
expect(response.message) == "Hello"
}
}

context("when network returns error") {

beforeEach {
NetworkStubber.stub(requestConfiguration, data: Data(), statusCode: 400)
networkAPI = NetworkAPI()
}

it("throws error") {
await expect {
try await networkAPI.performRequest(
requestConfiguration,
for: DummyNetworkModel.self
)
}.to(throwError())
}
}
}
}
}
}
Empty file.
32 changes: 32 additions & 0 deletions {PROJECT_NAME}Tests/Sources/Utilities/NetworkStubber.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
//
// NetworkStubber.swift
//

import OHHTTPStubs

protocol RequestConfigurationStubable {

var sampleData: Data { get }
var path: String { get }
}

enum NetworkStubber {

static func removeAllStubs() {
HTTPStubs.removeAllStubs()
}

static func stub(
_ request: RequestConfigurationStubable,
data: Data? = nil,
statusCode: Int32 = 200
) {
OHHTTPStubs.stub(condition: isPath(request.path)) { _ in
HTTPStubsResponse(
data: data ?? request.sampleData,
statusCode: statusCode,
headers: nil
)
}
}
}

0 comments on commit 7e653b9

Please sign in to comment.