diff --git a/Example/HCaptcha_Tests/Core/HCaptchaWebViewManager__Tests.swift b/Example/HCaptcha_Tests/Core/HCaptchaWebViewManager__Tests.swift index 5b03464..a43e01d 100644 --- a/Example/HCaptcha_Tests/Core/HCaptchaWebViewManager__Tests.swift +++ b/Example/HCaptcha_Tests/Core/HCaptchaWebViewManager__Tests.swift @@ -571,7 +571,7 @@ class HCaptchaWebViewManager__Tests: XCTestCase { } } - let manager = HCaptchaWebViewManager(messageBody: "{token: key, action: \"openExternalPage\"}", + let manager = HCaptchaWebViewManager(messageBody: "{action: \"openExternalPage\"}", apiKey: apiKey, urlOpener: TestURLOpener(exp1, exp2)) manager.configureWebView { _ in @@ -617,4 +617,34 @@ class HCaptchaWebViewManager__Tests: XCTestCase { waitForExpectations(timeout: 10) } + + func test__Validate_Passive_Key_On_Nil_View() { + let exp = expectation(description: "wait for completion") + + let manager = HCaptchaWebViewManager(messageBody: "{token: \"success-token\"}", passiveApiKey: true) + manager.shouldResetOnError = false + manager.completion = { response in + XCTAssertEqual(try? response.dematerialize(), "success-token") + exp.fulfill() + } + manager.validate(on: nil) + + waitForExpectations(timeout: 10) + } + + func test__Validate_Non_Passive_Key_On_Nil_View() { + let exp = expectation(description: "didLoad never called") + + let manager = HCaptchaWebViewManager(messageBody: "{token: \"should-not-be-delivered\"}", passiveApiKey: false) + manager.shouldResetOnError = false + + manager.completion = { response in + XCTAssertEqual(HCaptchaError.failedSetup, response.error) + exp.fulfill() + } + + manager.validate(on: nil) + + waitForExpectations(timeout: 10) + } } diff --git a/HCaptcha/Classes/HCaptcha.swift b/HCaptcha/Classes/HCaptcha.swift index 09a1ce0..2f02a76 100644 --- a/HCaptcha/Classes/HCaptcha.swift +++ b/HCaptcha/Classes/HCaptcha.swift @@ -139,7 +139,8 @@ public class HCaptcha: NSObject { Starts the challenge validation */ @objc - public func validate(on view: UIView, resetOnError: Bool = true, completion: @escaping (HCaptchaResult) -> Void) { + public func validate(on view: UIView? = nil, resetOnError: Bool = true, + completion: @escaping (HCaptchaResult) -> Void) { Log.debug(".validate on: \(view) resetOnError: \(resetOnError)") manager.shouldResetOnError = resetOnError diff --git a/HCaptcha/Classes/HCaptchaWebViewManager.swift b/HCaptcha/Classes/HCaptchaWebViewManager.swift index 4cb3ee9..524b711 100644 --- a/HCaptcha/Classes/HCaptchaWebViewManager.swift +++ b/HCaptcha/Classes/HCaptchaWebViewManager.swift @@ -148,11 +148,16 @@ internal class HCaptchaWebViewManager: NSObject { Starts the challenge validation */ - func validate(on view: UIView) { + func validate(on view: UIView?) { Log.debug("WebViewManager.validate on: \(view)") resultHandled = false if !passiveApiKey { + guard let view = view else { + completion?(HCaptchaResult(self, error: .failedSetup)) + return + } + view.addSubview(webView) if self.didFinishLoading && (webView.bounds.size == CGSize.zero || webView.bounds.size == webViewInitSize) { self.doConfigureWebView()