diff --git a/Example/ReCaptcha.xcodeproj/project.pbxproj b/Example/ReCaptcha.xcodeproj/project.pbxproj index c63b680..30394bd 100644 --- a/Example/ReCaptcha.xcodeproj/project.pbxproj +++ b/Example/ReCaptcha.xcodeproj/project.pbxproj @@ -16,6 +16,7 @@ D091B6E053FD250B4757E34C /* Pods_ReCaptcha_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9417A28DC340FF0BC1627B3F /* Pods_ReCaptcha_Tests.framework */; }; F206BAD51F8D3FEB00A25807 /* Cartfile in Resources */ = {isa = PBXBuildFile; fileRef = F206BAD41F8D3FEB00A25807 /* Cartfile */; }; F231B3971FEC325A00F82943 /* DispatchQueue__Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F231B3961FEC325A00F82943 /* DispatchQueue__Tests.swift */; }; + F231B39F1FED4A8C00F82943 /* ReCaptchaDecoder+Helper.swift in Sources */ = {isa = PBXBuildFile; fileRef = F231B39E1FED4A8C00F82943 /* ReCaptchaDecoder+Helper.swift */; }; F288E9451F9537760018688D /* ReCaptchaError+Equatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F288E9441F9537760018688D /* ReCaptchaError+Equatable.swift */; }; F2E2685E1F7AEE3400CD876D /* ReCaptcha__Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2E2685D1F7AEE3400CD876D /* ReCaptcha__Tests.swift */; }; F2ECCF8A1E9FCEFE0097B199 /* ReCaptchaDecoder__Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2ECCF891E9FCEFE0097B199 /* ReCaptchaDecoder__Tests.swift */; }; @@ -56,6 +57,7 @@ F206BAD41F8D3FEB00A25807 /* Cartfile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = Cartfile; path = ../Cartfile; sourceTree = ""; }; F21901D91F98D62F00D8E2C9 /* CHANGELOG.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = CHANGELOG.md; path = ../CHANGELOG.md; sourceTree = ""; }; F231B3961FEC325A00F82943 /* DispatchQueue__Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DispatchQueue__Tests.swift; sourceTree = ""; }; + F231B39E1FED4A8C00F82943 /* ReCaptchaDecoder+Helper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ReCaptchaDecoder+Helper.swift"; sourceTree = ""; }; F288E9441F9537760018688D /* ReCaptchaError+Equatable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ReCaptchaError+Equatable.swift"; sourceTree = ""; }; F2E2685D1F7AEE3400CD876D /* ReCaptcha__Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReCaptcha__Tests.swift; sourceTree = ""; }; F2ECCF761E9FC47B0097B199 /* ReCaptcha_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ReCaptcha_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -191,6 +193,7 @@ F2ECCF951EA00A5B0097B199 /* ReCaptchaWebViewManager+Helpers.swift */, F2ECCF971EA011370097B199 /* Result+Helpers.swift */, F288E9441F9537760018688D /* ReCaptchaError+Equatable.swift */, + F231B39E1FED4A8C00F82943 /* ReCaptchaDecoder+Helper.swift */, ); path = Helpers; sourceTree = ""; @@ -456,6 +459,7 @@ F2ECCF8E1E9FE68C0097B199 /* ReCaptchaWebViewManager__Tests.swift in Sources */, F2ECCF981EA011370097B199 /* Result+Helpers.swift in Sources */, F231B3971FEC325A00F82943 /* DispatchQueue__Tests.swift in Sources */, + F231B39F1FED4A8C00F82943 /* ReCaptchaDecoder+Helper.swift in Sources */, F2E2685E1F7AEE3400CD876D /* ReCaptcha__Tests.swift in Sources */, F2ECCF931EA009360097B199 /* ReCaptcha+Rx__Tests.swift in Sources */, F288E9451F9537760018688D /* ReCaptchaError+Equatable.swift in Sources */, diff --git a/Example/ReCaptcha_Tests/Core/ReCaptchaDecoder__Tests.swift b/Example/ReCaptcha_Tests/Core/ReCaptchaDecoder__Tests.swift index 8d62f28..b883347 100644 --- a/Example/ReCaptcha_Tests/Core/ReCaptchaDecoder__Tests.swift +++ b/Example/ReCaptcha_Tests/Core/ReCaptchaDecoder__Tests.swift @@ -33,7 +33,7 @@ class ReCaptchaDecoder__Tests: XCTestCase { func test__Send_Error() { - let exp = expectation(description: "send message") + let exp = expectation(description: "send error message") var result: Result? assertResult = { res in @@ -51,9 +51,7 @@ class ReCaptchaDecoder__Tests: XCTestCase { // Check XCTAssertNotNil(result) - XCTAssertEqual(result?.error, err) - XCTAssertNil(result?.token) - XCTAssertFalse(result!.showReCaptcha) + XCTAssertEqual(result, .error(err)) } @@ -75,14 +73,12 @@ class ReCaptchaDecoder__Tests: XCTestCase { // Check - XCTAssertEqual(result?.error, .wrongMessageFormat) - XCTAssertNil(result?.token) - XCTAssertFalse(result!.showReCaptcha) + XCTAssertEqual(result, .error(ReCaptchaError.wrongMessageFormat)) } - func test__Decode__Undefined() { - let exp = expectation(description: "send message with undefined body") + func test__Decode__Unexpected_Action() { + let exp = expectation(description: "send message with unexpected action") var result: Result? assertResult = { res in @@ -92,21 +88,19 @@ class ReCaptchaDecoder__Tests: XCTestCase { // Send - let message = MockMessage(message: ["foo": "bar"]) + let message = MockMessage(message: ["action": "bar"]) decoder.send(message: message) waitForExpectations(timeout: 1) // Check - XCTAssertEqual(result?.error, .wrongMessageFormat) - XCTAssertNil(result?.token) - XCTAssertFalse(result!.showReCaptcha) + XCTAssertEqual(result, .error(ReCaptchaError.wrongMessageFormat)) } func test__Decode__ShowReCaptcha() { - let exp = expectation(description: "send message with undefined body") + let exp = expectation(description: "send showReCaptcha message") var result: Result? assertResult = { res in @@ -123,14 +117,12 @@ class ReCaptchaDecoder__Tests: XCTestCase { // Check - XCTAssertNil(result?.error) - XCTAssertNil(result?.token) - XCTAssertTrue(result!.showReCaptcha) + XCTAssertEqual(result, .showReCaptcha) } func test__Decode__Token() { - let exp = expectation(description: "send message with undefined body") + let exp = expectation(description: "send token message") var result: Result? assertResult = { res in @@ -148,48 +140,28 @@ class ReCaptchaDecoder__Tests: XCTestCase { // Check - XCTAssertNil(result?.error) - XCTAssertEqual(result?.token, token) - XCTAssertFalse(result!.showReCaptcha) - } -} - - -class MockMessage: WKScriptMessage { - override var body: Any { - return storedBody - } - - fileprivate let storedBody: Any - - init(message: Any) { - storedBody = message - } -} - - -// MARK: - Decoder Helpers -fileprivate extension ReCaptchaDecoder { - func send(message: MockMessage) { - userContentController(WKUserContentController(), didReceive: message) - } -} - - -// MARK: - Result Helpers -extension ReCaptchaDecoder.Result { - var token: String? { - guard case .token(let token) = self else { return nil } - return token - } - - var showReCaptcha: Bool { - guard case .showReCaptcha = self else { return false } - return true - } - - var error: ReCaptchaError? { - guard case .error(let error) = self else { return nil } - return error + XCTAssertEqual(result, .token(token)) + } + + + func test__Decode__DidLoad() { + let exp = expectation(description: "send did load message") + var result: Result? + + assertResult = { res in + result = res + exp.fulfill() + } + + + // Send + let message = MockMessage(message: ["action": "didLoad"]) + decoder.send(message: message) + + waitForExpectations(timeout: 1) + + + // Check + XCTAssertEqual(result, .didLoad) } } diff --git a/Example/ReCaptcha_Tests/Core/ReCaptcha__Tests.swift b/Example/ReCaptcha_Tests/Core/ReCaptcha__Tests.swift index dc5bcb3..822d7a8 100644 --- a/Example/ReCaptcha_Tests/Core/ReCaptcha__Tests.swift +++ b/Example/ReCaptcha_Tests/Core/ReCaptcha__Tests.swift @@ -31,6 +31,7 @@ class ReCaptcha__Tests: XCTestCase { _ = try ReCaptcha() XCTFail("Should have failed") } catch let e as ReCaptchaError { + print(e) XCTAssertEqual(e, ReCaptchaError.htmlLoadError) } catch let e { XCTFail("Unexpected error: \(e)") @@ -49,6 +50,7 @@ class ReCaptcha__Tests: XCTestCase { _ = try ReCaptcha.Config(apiKey: "", infoPlistKey: nil, baseURL: nil, infoPlistURL: nil) XCTFail("Should have failed") } catch let e as ReCaptchaError { + print(e) XCTAssertEqual(e, ReCaptchaError.baseURLNotFound) } catch let e { XCTFail("Unexpected error: \(e)") @@ -71,6 +73,7 @@ class ReCaptcha__Tests: XCTestCase { _ = try ReCaptcha.Config(apiKey: nil, infoPlistKey: nil, baseURL: nil, infoPlistURL: nil) XCTFail("Should have failed") } catch let e as ReCaptchaError { + print(e) XCTAssertEqual(e, ReCaptchaError.apiKeyNotFound) } catch let e { XCTFail("Unexpected error: \(e)") diff --git a/Example/ReCaptcha_Tests/Helpers/ReCaptchaDecoder+Helper.swift b/Example/ReCaptcha_Tests/Helpers/ReCaptchaDecoder+Helper.swift new file mode 100644 index 0000000..916520e --- /dev/null +++ b/Example/ReCaptcha_Tests/Helpers/ReCaptchaDecoder+Helper.swift @@ -0,0 +1,55 @@ +// +// ReCaptchaDecoder+Helper.swift +// ReCaptcha +// +// Created by Flávio Caetano on 22/12/17. +// Copyright © 2017 ReCaptcha. All rights reserved. +// + +import Foundation +@testable import ReCaptcha +import WebKit + +class MockMessage: WKScriptMessage { + override var body: Any { + return storedBody + } + + fileprivate let storedBody: Any + + init(message: Any) { + storedBody = message + } +} + +// MARK: - Decoder Helpers +extension ReCaptchaDecoder { + func send(message: MockMessage) { + userContentController(WKUserContentController(), didReceive: message) + } +} + +// MARK: - Result Helpers +extension ReCaptchaDecoder.Result: Equatable { + var error: ReCaptchaError? { + guard case .error(let error) = self else { return nil } + return error + } + + public static func == (lhs: ReCaptchaDecoder.Result, rhs: ReCaptchaDecoder.Result) -> Bool { + switch (lhs, rhs) { + case (.showReCaptcha, .showReCaptcha), + (.didLoad, .didLoad): + return true + + case (.token(let lht), .token(let rht)): + return lht == rht + + case (.error(let lhe), .error(let rhe)): + return lhe == rhe + + default: + return false + } + } +}