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

Feature/unit test cleanup #22

Merged
merged 6 commits into from
Mar 26, 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
12 changes: 6 additions & 6 deletions Hyperspace.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
/* 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 */; };
30F0735420210A890045CB01 /* HTTPTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30F07352202109F60045CB01 /* HTTPTests.swift */; };
30F0735520210A8B0045CB01 /* HTTPTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30F07352202109F60045CB01 /* HTTPTests.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 */; };
Expand Down Expand Up @@ -258,7 +258,7 @@

/* 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>"; };
30F07352202109F60045CB01 /* HTTPTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTTPTests.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>"; };
Expand Down Expand Up @@ -497,7 +497,7 @@
60D6C3F7201CFCCF00B3B012 /* NetworkRequestTests.swift */,
60D6C3EF201CFCCF00B3B012 /* NetworkServiceTests.swift */,
3026E457202008470003A321 /* NetworkSessionTest.swift */,
30F07352202109F60045CB01 /* HTTPTest.swift */,
30F07352202109F60045CB01 /* HTTPTests.swift */,
B4C32C32201E9F9300FC82C1 /* NetworkActivityIndicatorTests.swift */,
60D6C419201CFCE500B3B012 /* Helper */,
60EB8FDA1FF59FB000AC0B55 /* Supporting Files */,
Expand Down Expand Up @@ -1130,7 +1130,7 @@
60D6C403201CFCCF00B3B012 /* DecodingTests.swift in Sources */,
30F07361202213E50045CB01 /* NetworkRequestTestDefaults.swift in Sources */,
60D6C40D201CFCCF00B3B012 /* NetworkRequestTests.swift in Sources */,
30F0735420210A890045CB01 /* HTTPTest.swift in Sources */,
30F0735420210A890045CB01 /* HTTPTests.swift in Sources */,
3026E459202008720003A321 /* NetworkSessionTest.swift in Sources */,
60D6C40B201CFCCF00B3B012 /* MockDecodableContainer.swift in Sources */,
60D6C407201CFCCF00B3B012 /* MockNetworkSessionDataTask.swift in Sources */,
Expand Down Expand Up @@ -1194,7 +1194,7 @@
60D6C404201CFCCF00B3B012 /* DecodingTests.swift in Sources */,
30F07362202213E60045CB01 /* NetworkRequestTestDefaults.swift in Sources */,
60D6C40E201CFCCF00B3B012 /* NetworkRequestTests.swift in Sources */,
30F0735520210A8B0045CB01 /* HTTPTest.swift in Sources */,
30F0735520210A8B0045CB01 /* HTTPTests.swift in Sources */,
3026E45A2020087C0003A321 /* NetworkSessionTest.swift in Sources */,
60D6C40C201CFCCF00B3B012 /* MockDecodableContainer.swift in Sources */,
60D6C408201CFCCF00B3B012 /* MockNetworkSessionDataTask.swift in Sources */,
Expand Down
29 changes: 11 additions & 18 deletions Tests/BackendServiceTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,17 @@ class BackendServiceTests: XCTestCase {
XCTAssertEqual(mockNetworkService.cancelAllTasksCallCount, 1)
}

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

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

// MARK: - Private

private func executeBackendService(mockedNetworkServiceResult: Result<NetworkServiceSuccess, NetworkServiceFailure>,
Expand Down Expand Up @@ -111,22 +122,4 @@ 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() {
Copy link
Contributor Author

Choose a reason for hiding this comment

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

I ended up removing this test since it didn't actually test anything and it didn't appear to actually affect code coverage after removal.

let mock = MockBackendService()
mock.execute(request: NetworkRequestTests.SimpleGETRequest()) { _ in
XCTAssert(true)
}
}
}
90 changes: 45 additions & 45 deletions Tests/HTTPTest.swift → Tests/HTTPTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,37 +9,37 @@
import XCTest
@testable import Hyperspace

class HTTPTest: XCTestCase {
class HTTPTests: XCTestCase {

func test_HTTP_GetAuthorizationBearer() {
// MARK: - Tests

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

XCTAssert(authorizationBearer.rawValue == "Bearer 1234567890")
XCTAssertEqual(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"
func test_HeaderKey_RawValuesAreCorrect() {
let headerKeys: [HTTP.HeaderKey: String] = [
.accept: "Accept",
.acceptCharset: "Accept-Charset",
.acceptEncoding: "Accept-Encoding",
.acceptLanguage: "Accept-Language",
.acceptDatetime: "Accept-Datetime",
.authorization: "Authorization",
.contentLength: "Content-Length",
.contentMD5: "Content-MD5",
.contentType: "Content-Type",
.date: "Date",
.userAgent: "User-Agent"
]

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

func test_HTTP_EqualityHeaderValue() {
let items: [String: HTTP.HeaderValue] = [
func test_HeaderValue_RawValuesAreCorrect() {
let headerValues: [String: HTTP.HeaderValue] = [
"application/json": .applicationJSON,
"application/x-www-form-urlencoded": .applicationFormURLEncoded,
"application/xml": .applicationXML,
Expand All @@ -58,106 +58,106 @@ class HTTPTest: XCTestCase {
"application/vnd.apple.pkpass": .passKit
]

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

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

XCTAssert(dataString == content)
XCTAssertEqual(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)
XCTAssertEqual(status, HTTP.Status.Success.ok)
default:
XCTFail("HTTP Response indicates failure")
XCTFail("200 status should produce a 'success - ok' response")
}
}

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)
XCTAssertEqual(status, HTTP.Status.Success.unknown)
default:
XCTFail("HTTP Response indicates failure")
XCTFail("299 status should produce a 'success - unknown' response")
}
}

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)
XCTAssertEqual(status, HTTP.Status.Redirection.multipleChoices)
default:
XCTFail("HTTP Response indicates failure")
XCTFail("300 status should produce a 'redirection - multiple choices' response")
}
}

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)
XCTAssertEqual(status, HTTP.Status.Redirection.unknown)
default:
XCTFail("HTTP Response indicates failure")
XCTFail("399 status should produce a 'redirection - unknown' response")
}
}

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)
XCTAssertEqual(status, HTTP.Status.ClientError.badRequest)
default:
XCTFail("HTTP Response indicates failure")
XCTFail("400 status should produce a 'client error - bad request' response")
}
}

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)
XCTAssertEqual(status, HTTP.Status.ClientError.unknown)
default:
XCTFail("HTTP Response indicates failure")
XCTFail("499 status should produce a 'client error - unknown' response")
}
}

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)
XCTAssertEqual(status, HTTP.Status.ServerError.internalServerError)
default:
XCTFail("HTTP Response indicates failure")
XCTFail("500 status should produce a 'server error - internal server error' response")
}
}

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)
XCTAssertEqual(status, HTTP.Status.ServerError.unknown)
default:
XCTFail("HTTP Response indicates failure")
XCTFail("599 status should produce a 'server error - unknown' response")
}
}

func test_HTTPStatusInitWithCode100_ProducesStatusUnknown() {
let response = HTTP.Response(code: 100, data: nil)
switch response.status {
case .unknown(let code):
XCTAssert(code == 100)
XCTAssertEqual(code, 100)
default:
XCTFail("HTTP Response indicates failure")
XCTFail("100 status should produce an 'unknown' response")
}
}
}
3 changes: 1 addition & 2 deletions Tests/NetworkServiceTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -161,11 +161,10 @@ class NetworkServiceTests: XCTestCase {
let asyncExpectation = expectation(description: "\(NetworkService.self) completion")

service.execute(request: defaultRequest) { (result) in
XCTAssertTrue(result == expectedResult, file: file, line: line)
XCTAssertTrue(result == expectedResult, "Result '\(result)' did not equal expected result '\(expectedResult)'", file: file, line: line)
Copy link
Contributor Author

Choose a reason for hiding this comment

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

I unfortunately wasn't able to convert this to an XCTAssertEqual(...) so I added some error messaging instead. I tried

XCTAssertEqual(result as Result<NetworkServiceSuccess, NetworkServiceFailure>, expectedResult)

and

XCTAssertEqual(result, expectedResult as NetworkServiceResult)

but had no luck. It's weird because the compiler seems to think they're different types, but the error message it emits lists them as being the same type. ¯_(ツ)_/¯

Copy link
Contributor

Choose a reason for hiding this comment

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

Adding in the explicit output should be a good enough stopgap, in my opinion.

asyncExpectation.fulfill()
}

waitForExpectations(timeout: 1.0, handler: nil)
}

}
8 changes: 5 additions & 3 deletions Tests/NetworkSessionTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,16 @@ import Hyperspace

class NetworkSessionTest: XCTestCase {

// MARK: - Properties

private let defaultRequest = URLRequest(url: NetworkRequestTestDefaults.defaultURL)

// MARK: - Tests

func test_URLSessionNetworkSessionImplementation_ReturnsURLSessionDataTask() {

let networkSession: NetworkSession = URLSession.shared
let networkSessionDataTask: NetworkSessionDataTask = networkSession.dataTask(with: defaultRequest, completionHandler: { _, _, _ in })
let networkSessionDataTask: NetworkSessionDataTask = networkSession.dataTask(with: defaultRequest, completionHandler: { _, _, _ in })

XCTAssert(networkSessionDataTask is URLSessionDataTask)
}

}