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

Improved Code Coverage #10

Merged
merged 6 commits into from
Feb 2, 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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 34 additions & 9 deletions Hyperspace.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,17 @@
objects = {

/* Begin PBXBuildFile section */
3026E459202008720003A321 /* NetworkSessionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3026E457202008470003A321 /* NetworkSessionTest.swift */; };
3026E45A2020087C0003A321 /* NetworkSessionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3026E457202008470003A321 /* NetworkSessionTest.swift */; };
30F0735420210A890045CB01 /* HTTPTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30F07352202109F60045CB01 /* HTTPTest.swift */; };
30F0735520210A8B0045CB01 /* HTTPTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30F07352202109F60045CB01 /* HTTPTest.swift */; };
30F07358202172420045CB01 /* MockBackendService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30F073562021720B0045CB01 /* MockBackendService.swift */; };
30F07359202172450045CB01 /* MockBackendService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30F073562021720B0045CB01 /* MockBackendService.swift */; };
30F0735E202205350045CB01 /* URL+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60AC833F1FF596B600120172 /* URL+Additions.swift */; };
30F07361202213E50045CB01 /* NetworkRequestTestDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30F0735F202213E00045CB01 /* NetworkRequestTestDefaults.swift */; };
30F07362202213E60045CB01 /* NetworkRequestTestDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30F0735F202213E00045CB01 /* NetworkRequestTestDefaults.swift */; };
30F07367202227790045CB01 /* NetworkServiceMockSubclass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30F073652022246E0045CB01 /* NetworkServiceMockSubclass.swift */; };
30F073682022277A0045CB01 /* NetworkServiceMockSubclass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30F073652022246E0045CB01 /* NetworkServiceMockSubclass.swift */; };
60326016201D1DED008CEFC8 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60D6C433201D170F00B3B012 /* Models.swift */; };
60326017201D1DF1008CEFC8 /* NetworkRequests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60D6C434201D170F00B3B012 /* NetworkRequests.swift */; };
60836787201D1A2B00007247 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60D6C433201D170F00B3B012 /* Models.swift */; };
Expand Down Expand Up @@ -36,7 +47,6 @@
60D6C376201CC81100B3B012 /* NetworkService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60AC834C1FF596B600120172 /* NetworkService.swift */; };
60D6C377201CC81100B3B012 /* BackendServiceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60AC834E1FF596B600120172 /* BackendServiceProtocol.swift */; };
60D6C378201CC81100B3B012 /* BackendService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60AC834F1FF596B600120172 /* BackendService.swift */; };
60D6C379201CCCAE00B3B012 /* URL+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60AC833F1FF596B600120172 /* URL+Additions.swift */; };
60D6C37A201CCCAE00B3B012 /* URLQueryItem+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60AC83401FF596B600120172 /* URLQueryItem+Extensions.swift */; };
60D6C37B201CCCAE00B3B012 /* HTTP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60AC83421FF596B600120172 /* HTTP.swift */; };
60D6C37C201CCCAE00B3B012 /* AnyNetworkRequest+DecodableContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60AC83441FF596B600120172 /* AnyNetworkRequest+DecodableContainer.swift */; };
Expand Down Expand Up @@ -87,8 +97,6 @@
60D6C414201CFCCF00B3B012 /* Object.json in Resources */ = {isa = PBXBuildFile; fileRef = 60D6C3FB201CFCCF00B3B012 /* Object.json */; };
60D6C415201CFCCF00B3B012 /* RootKeyArray.json in Resources */ = {isa = PBXBuildFile; fileRef = 60D6C3FC201CFCCF00B3B012 /* RootKeyArray.json */; };
60D6C416201CFCCF00B3B012 /* RootKeyArray.json in Resources */ = {isa = PBXBuildFile; fileRef = 60D6C3FC201CFCCF00B3B012 /* RootKeyArray.json */; };
60D6C417201CFCCF00B3B012 /* NetworkRequestTestDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60D6C3FE201CFCCF00B3B012 /* NetworkRequestTestDefaults.swift */; };
60D6C418201CFCCF00B3B012 /* NetworkRequestTestDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60D6C3FE201CFCCF00B3B012 /* NetworkRequestTestDefaults.swift */; };
60D6C422201D156500B3B012 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60D6C421201D156500B3B012 /* AppDelegate.swift */; };
60D6C424201D156500B3B012 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60D6C423201D156500B3B012 /* ViewController.swift */; };
60D6C427201D156500B3B012 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 60D6C425201D156500B3B012 /* Main.storyboard */; };
Expand Down Expand Up @@ -246,6 +254,11 @@
/* End PBXCopyFilesBuildPhase section */

/* Begin PBXFileReference section */
3026E457202008470003A321 /* NetworkSessionTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkSessionTest.swift; sourceTree = "<group>"; };
30F07352202109F60045CB01 /* HTTPTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTTPTest.swift; sourceTree = "<group>"; };
30F073562021720B0045CB01 /* MockBackendService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockBackendService.swift; sourceTree = "<group>"; };
30F0735F202213E00045CB01 /* NetworkRequestTestDefaults.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NetworkRequestTestDefaults.swift; path = "Tests/Helper/Test Defaults/NetworkRequestTestDefaults.swift"; sourceTree = SOURCE_ROOT; };
30F073652022246E0045CB01 /* NetworkServiceMockSubclass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkServiceMockSubclass.swift; sourceTree = "<group>"; };
60326019201D1F1F008CEFC8 /* Hyperspace_DELETE.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = Hyperspace_DELETE.playground; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
6032601A201D1F1F008CEFC8 /* Hyperspace.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = Hyperspace.playground; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
6032601B201D1F1F008CEFC8 /* Hyperspace_AnyNetworkRequest.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = Hyperspace_AnyNetworkRequest.playground; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
Expand Down Expand Up @@ -294,7 +307,6 @@
60D6C3FA201CFCCF00B3B012 /* RootKeyObject.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = RootKeyObject.json; sourceTree = "<group>"; };
60D6C3FB201CFCCF00B3B012 /* Object.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = Object.json; sourceTree = "<group>"; };
60D6C3FC201CFCCF00B3B012 /* RootKeyArray.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = RootKeyArray.json; sourceTree = "<group>"; };
60D6C3FE201CFCCF00B3B012 /* NetworkRequestTestDefaults.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkRequestTestDefaults.swift; sourceTree = "<group>"; };
60D6C41A201D13EC00B3B012 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
60D6C41F201D156500B3B012 /* Hyperspace-iOSExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Hyperspace-iOSExample.app"; sourceTree = BUILT_PRODUCTS_DIR; };
60D6C421201D156500B3B012 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -480,6 +492,8 @@
60D6C3F1201CFCCF00B3B012 /* DecodingTests.swift */,
60D6C3F7201CFCCF00B3B012 /* NetworkRequestTests.swift */,
60D6C3EF201CFCCF00B3B012 /* NetworkServiceTests.swift */,
3026E457202008470003A321 /* NetworkSessionTest.swift */,
30F07352202109F60045CB01 /* HTTPTest.swift */,
B4C32C32201E9F9300FC82C1 /* NetworkActivityIndicatorTests.swift */,
60D6C419201CFCE500B3B012 /* Helper */,
60EB8FDA1FF59FB000AC0B55 /* Supporting Files */,
Expand Down Expand Up @@ -573,6 +587,8 @@
60D6C3F4201CFCCF00B3B012 /* MockNetworkSessionDataTask.swift */,
60D6C3F5201CFCCF00B3B012 /* MockNetworkService.swift */,
60D6C3F6201CFCCF00B3B012 /* MockDecodableContainer.swift */,
30F073562021720B0045CB01 /* MockBackendService.swift */,
30F073652022246E0045CB01 /* NetworkServiceMockSubclass.swift */,
);
path = Mocks;
sourceTree = "<group>";
Expand All @@ -591,9 +607,10 @@
60D6C3FD201CFCCF00B3B012 /* Test Defaults */ = {
isa = PBXGroup;
children = (
60D6C3FE201CFCCF00B3B012 /* NetworkRequestTestDefaults.swift */,
30F0735F202213E00045CB01 /* NetworkRequestTestDefaults.swift */,
);
path = "Test Defaults";
name = "Test Defaults";
path = "../Test Defaults";
sourceTree = "<group>";
};
60D6C419201CFCE500B3B012 /* Helper */ = {
Expand Down Expand Up @@ -1058,15 +1075,19 @@
files = (
B4C32C33201E9F9300FC82C1 /* NetworkActivityIndicatorTests.swift in Sources */,
60D6C409201CFCCF00B3B012 /* MockNetworkService.swift in Sources */,
60D6C417201CFCCF00B3B012 /* NetworkRequestTestDefaults.swift in Sources */,
60D6C403201CFCCF00B3B012 /* DecodingTests.swift in Sources */,
30F07361202213E50045CB01 /* NetworkRequestTestDefaults.swift in Sources */,
60D6C40D201CFCCF00B3B012 /* NetworkRequestTests.swift in Sources */,
30F0735420210A890045CB01 /* HTTPTest.swift in Sources */,
3026E459202008720003A321 /* NetworkSessionTest.swift in Sources */,
60D6C40B201CFCCF00B3B012 /* MockDecodableContainer.swift in Sources */,
60D6C407201CFCCF00B3B012 /* MockNetworkSessionDataTask.swift in Sources */,
60D6C401201CFCCF00B3B012 /* BackendServiceTests.swift in Sources */,
30F07358202172420045CB01 /* MockBackendService.swift in Sources */,
B4C32C30201E9F8400FC82C1 /* MockNetworkActivityIndicator.swift in Sources */,
60D6C3FF201CFCCF00B3B012 /* NetworkServiceTests.swift in Sources */,
60D6C405201CFCCF00B3B012 /* MockNetworkSession.swift in Sources */,
30F07367202227790045CB01 /* NetworkServiceMockSubclass.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -1094,7 +1115,6 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
60D6C379201CCCAE00B3B012 /* URL+Additions.swift in Sources */,
60D6C37A201CCCAE00B3B012 /* URLQueryItem+Extensions.swift in Sources */,
60D6C37B201CCCAE00B3B012 /* HTTP.swift in Sources */,
60D6C37C201CCCAE00B3B012 /* AnyNetworkRequest+DecodableContainer.swift in Sources */,
Expand All @@ -1105,6 +1125,7 @@
60D6C381201CCCAE00B3B012 /* NetworkSession.swift in Sources */,
60D6C382201CCCAE00B3B012 /* NetworkService.swift in Sources */,
60D6C383201CCCAE00B3B012 /* BackendServiceProtocol.swift in Sources */,
30F0735E202205350045CB01 /* URL+Additions.swift in Sources */,
B4C32C2D201E9F2D00FC82C1 /* NetworkActivityIndicatable.swift in Sources */,
60D6C384201CCCAE00B3B012 /* BackendService.swift in Sources */,
);
Expand All @@ -1116,15 +1137,19 @@
files = (
B4C32C34201E9F9300FC82C1 /* NetworkActivityIndicatorTests.swift in Sources */,
60D6C40A201CFCCF00B3B012 /* MockNetworkService.swift in Sources */,
60D6C418201CFCCF00B3B012 /* NetworkRequestTestDefaults.swift in Sources */,
60D6C404201CFCCF00B3B012 /* DecodingTests.swift in Sources */,
30F07362202213E60045CB01 /* NetworkRequestTestDefaults.swift in Sources */,
60D6C40E201CFCCF00B3B012 /* NetworkRequestTests.swift in Sources */,
30F0735520210A8B0045CB01 /* HTTPTest.swift in Sources */,
3026E45A2020087C0003A321 /* NetworkSessionTest.swift in Sources */,
60D6C40C201CFCCF00B3B012 /* MockDecodableContainer.swift in Sources */,
60D6C408201CFCCF00B3B012 /* MockNetworkSessionDataTask.swift in Sources */,
60D6C402201CFCCF00B3B012 /* BackendServiceTests.swift in Sources */,
30F07359202172450045CB01 /* MockBackendService.swift in Sources */,
B4C32C31201E9F8400FC82C1 /* MockNetworkActivityIndicator.swift in Sources */,
60D6C400201CFCCF00B3B012 /* NetworkServiceTests.swift in Sources */,
60D6C406201CFCCF00B3B012 /* MockNetworkSession.swift in Sources */,
30F073682022277A0045CB01 /* NetworkServiceMockSubclass.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,6 @@ extension BackendServiceError: Equatable {

extension AnyError: BackendServiceErrorInitializable {
public init(_ backendServiceError: BackendServiceError) {
self.init(backendServiceError)
self.init(backendServiceError as Error)
}
}
18 changes: 18 additions & 0 deletions Tests/BackendServiceTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -111,4 +111,22 @@ class BackendServiceTests: XCTestCase {

waitForExpectations(timeout: 1.0, handler: nil)
}

func test_BackendServiceErrorInitializable_Init() {
let error = AnyError(BackendServiceError.networkError(.unknownError, nil))
XCTAssert(error.error is BackendServiceError)
}

func test_BackendServiceError_EquatableNotMatching() {
let lhs = BackendServiceError.networkError(.unknownError, nil)
let rhs = BackendServiceError.dataTransformationError(NSError(domain: "Test", code: 1, userInfo: nil))
XCTAssertFalse(lhs == rhs)
}

func test_BackendServiceProtocol_Execute() {
let mock = MockBackendService()
mock.execute(request: NetworkRequestTests.SimpleGETRequest()) { (result: Result<NetworkRequestTests.SimpleGETRequest.ResponseType, NetworkRequestTests.SimpleGETRequest.ErrorType>) in
XCTAssert(true)
}
}
}
164 changes: 164 additions & 0 deletions Tests/HTTPTest.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
//
// HTTPTest.swift
// HyperspaceTests
//
// Created by Adam Brzozowski on 1/30/18.
// Copyright © 2018 Bottle Rocket Studios. All rights reserved.
//

import XCTest
@testable import Hyperspace

class HTTPTest: XCTestCase {

func test_HTTP_GetAuthorizationBearer() {
let authorizationBearer = HTTP.HeaderValue.authorizationBearer(token: "1234567890")

XCTAssert(authorizationBearer.rawValue == "Bearer 1234567890")
}

func test_HTTP_CompareHeaderKey() {

let items = [
HTTP.HeaderKey.accept: "Accept",
HTTP.HeaderKey.acceptCharset: "Accept-Charset",
HTTP.HeaderKey.acceptEncoding: "Accept-Encoding",
HTTP.HeaderKey.acceptLanguage: "Accept-Language",
HTTP.HeaderKey.acceptDatetime: "Accept-Datetime",
HTTP.HeaderKey.authorization: "Authorization",
HTTP.HeaderKey.contentLength: "Content-Length",
HTTP.HeaderKey.contentMD5: "Content-MD5",
HTTP.HeaderKey.contentType: "Content-Type",
HTTP.HeaderKey.date: "Date",
HTTP.HeaderKey.userAgent: "User-Agent"
]

items.forEach { (key, value) in
XCTAssert(key == HTTP.HeaderKey(rawValue: value), "\(key) == \(HTTP.HeaderKey(rawValue: value))")
}
}

func test_HTTP_EqualityHeaderValue() {
let items: [String: HTTP.HeaderValue] = [
"application/json": .applicationJSON,
"application/x-www-form-urlencoded": .applicationFormURLEncoded,
"application/xml": .applicationXML,
"multipart/form-data": .multipartForm,
"text/plain": .textPlain,
"image/png": .imagePNG,
"image/jpeg": .imageJPEG,
"image/gif": .imageGIF,
"compress": .encodingCompress,
"deflate": .encodingDeflate,
"exi": .encodingExi,
"gzip": .encodingGzip,
"identity": .encodingIdentity,
"pack200-gzip": .encodingPack200Gzip,
"br": .encodingBr,
"application/vnd.apple.pkpass": .passKit
]


items.forEach { (key, value) in
XCTAssert(HTTP.HeaderValue(rawValue: key) == value)
}
}

func test_HTTPResponse_GetDataString() {
let content = "This is my data"
let response = HTTP.Response(code: 200, data: content.data(using: .utf8))
let dataString = response.dataString

XCTAssert(dataString == content)
}

func test_HTTPResponseInitWithCode200_ProducesStatusSuccessOK() {
let response = HTTP.Response(code: 200, data: nil)
switch response.status {
case .success(let status):
XCTAssert(status == HTTP.Status.Success.ok)
default:
XCTFail()
}
}

func test_HTTPStatusInitWithCode299_ProducesStatusSuccessUnknown() {
let response = HTTP.Response(code: 299, data: nil)
switch response.status {
case .success(let status):
XCTAssert(status == HTTP.Status.Success.unknown)
default:
XCTFail()
}
}

func test_HTTPStatusInitWithCode300_ProducesStatusRedirectionMultipleChoices() {
let response = HTTP.Response(code: 300, data: nil)
switch response.status {
case .redirection(let status):
XCTAssert(status == HTTP.Status.Redirection.multipleChoices)
default:
XCTFail()
}
}

func test_HTTPStatusInitWithCode399_ProducesStatusRedirectionUnknown() {
let response = HTTP.Response(code: 399, data: nil)
switch response.status {
case .redirection(let status):
XCTAssert(status == HTTP.Status.Redirection.unknown)
default:
XCTFail()
}
}

func test_HTTPStatusInitWithCode400_ProducesStatusClientErrorBadRequest() {
let response = HTTP.Response(code: 400, data: nil)
switch response.status {
case .clientError(let status):
XCTAssert(status == HTTP.Status.ClientError.badRequest)
default:
XCTFail()
}
}

func test_HTTPStatusInitWithCode499_ProducesStatusClientErrorUnknown() {
let response = HTTP.Response(code: 499, data: nil)
switch response.status {
case .clientError(let status):
XCTAssert(status == HTTP.Status.ClientError.unknown)
default:
XCTFail()
}
}

func test_HTTPStatusInitWithCode500_ProducesStatusServerErrorInternalServerError() {
let response = HTTP.Response(code: 500, data: nil)
switch response.status {
case .serverError(let status):
XCTAssert(status == HTTP.Status.ServerError.internalServerError)
default:
XCTFail()
}
}

func test_HTTPStatusInitWithCode599_ProducesStatusServerErrorUnknown() {
let response = HTTP.Response(code: 599, data: nil)
switch response.status {
case .serverError(let status):
XCTAssert(status == HTTP.Status.ServerError.unknown)
default:
XCTFail()
}
}

func test_HTTPStatusInitWithCode100_ProducesStatusUnknown() {
let response = HTTP.Response(code: 100, data: nil)
switch response.status {
case .unknown(let code):
XCTAssert(code == 100)
default:
XCTFail()
}
}
}
26 changes: 26 additions & 0 deletions Tests/Helper/Mocks/MockBackendService.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
//
// MockBackendService.swift
// HyperspaceTests
//
// Created by Adam Brzozowski on 1/30/18.
// Copyright © 2018 Bottle Rocket Studios. All rights reserved.
//

import Foundation
import Hyperspace
import Result

struct MockBackendService: BackendServiceProtocol
{
func cancelTask(for request: URLRequest) {

}

func cancelAllTasks() {

}

func execute<T>(request: T, completion: @escaping (Result<T.ResponseType, BackendServiceError>) -> Void) where T : NetworkRequest {
completion( Result.failure(BackendServiceError.networkError(NetworkServiceError.timedOut, nil)))
}
}
Loading