diff --git a/Sources/ForageSDK/Component/ForagePINTextField/Vault/RosettaPINTextField.swift b/Sources/ForageSDK/Component/ForagePINTextField/Vault/RosettaPINTextField.swift index 65e37978..703e0e5d 100644 --- a/Sources/ForageSDK/Component/ForagePINTextField/Vault/RosettaPINTextField.swift +++ b/Sources/ForageSDK/Component/ForagePINTextField/Vault/RosettaPINTextField.swift @@ -96,6 +96,8 @@ class RosettaPINTextField: UIView, VaultWrapper, UITextFieldDelegate { inputHeightConstraint = textField.heightAnchor.constraint(greaterThanOrEqualToConstant: 36) inputHeightConstraint?.isActive = true textField.addTarget(self, action: #selector(textFieldDidChange), for: .editingChanged) + textField.addTarget(self, action: #selector(editingBegan), for: .editingDidBegin) + textField.addTarget(self, action: #selector(editingEnded), for: .editingDidEnd) } @objc func textFieldDidChange(_ textField: UITextField) { @@ -105,6 +107,14 @@ class RosettaPINTextField: UIView, VaultWrapper, UITextFieldDelegate { self.delegate?.textFieldDidChange(self) } + @objc func editingBegan(_ textField: UITextField) { + self.delegate?.firstResponderDidChange(self) + } + + @objc func editingEnded(_ textField: UITextField) { + self.delegate?.firstResponderDidChange(self) + } + func clearText() { DispatchQueue.main.async { self.textField.text = "" diff --git a/Tests/ForageSDKTests/ForagePINTextFieldTests.swift b/Tests/ForageSDKTests/ForagePINTextFieldTests.swift index 9894a53f..09c6a05c 100644 --- a/Tests/ForageSDKTests/ForagePINTextFieldTests.swift +++ b/Tests/ForageSDKTests/ForagePINTextFieldTests.swift @@ -415,6 +415,59 @@ final class ForagePINTextFieldTests: XCTestCase { let result = rosettaPINTextField.textField(UITextField(), shouldChangeCharactersIn: NSRange(), replacementString: "1234") XCTAssertEqual(result, true) } + + func test_RosettaPINTextField_delegateMethodCalls() { + class MockDelegate: VaultWrapperDelegate { + var textFieldDidChangeCalledTimes = 0 + var firstResponderDidChangeCalledTimes = 0 + + func textFieldDidChange(_ textField: any VaultWrapper) { + textFieldDidChangeCalledTimes += 1 + } + + func firstResponderDidChange(_ textField: any VaultWrapper) { + firstResponderDidChangeCalledTimes += 1 + } + + } + + let rosettaPINTextField = RosettaPINTextField() + let mockDelegate = MockDelegate() + let textField = UITextField() + let window = UIWindow() + + rosettaPINTextField.delegate = mockDelegate + window.addSubview(rosettaPINTextField) + + // textFieldDidChange + rosettaPINTextField.textFieldDidChange(textField) + XCTAssertEqual(mockDelegate.textFieldDidChangeCalledTimes, 1) + + // firstResponderDidChange + XCTAssertFalse(rosettaPINTextField.isFirstResponder) + + // simulating the system firing the .editingDidBegin event + rosettaPINTextField.becomeFirstResponder() + rosettaPINTextField.editingBegan(textField) + + // wait for the responder chain to update + RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.1)) + + // Assert that we called the right delegate methods and the isFirstResponder status was updated + XCTAssertEqual(mockDelegate.firstResponderDidChangeCalledTimes, 1) + XCTAssertTrue(rosettaPINTextField.isFirstResponder) + + // simulating the system firing the .editingDidEnd event + rosettaPINTextField.resignFirstResponder() + rosettaPINTextField.editingEnded(textField) + + // wait for the responder chain to update + RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.1)) + + // Assert that we called the right delegate methods and the isFirstResponder status was updated + XCTAssertEqual(mockDelegate.firstResponderDidChangeCalledTimes, 2) + XCTAssertFalse(rosettaPINTextField.isFirstResponder) + } } extension ForagePINTextFieldTests: ForageElementDelegate { diff --git a/Tests/ForageSDKTests/ResponseMonitorTests.swift b/Tests/ForageSDKTests/ResponseMonitorTests.swift index 9174cd17..a92c7a7b 100644 --- a/Tests/ForageSDKTests/ResponseMonitorTests.swift +++ b/Tests/ForageSDKTests/ResponseMonitorTests.swift @@ -152,7 +152,7 @@ final class ResponseMonitorTests: XCTestCase { monitor.setEventOutcome(.failure) // set to failure, but missing forage_error_code! - let attributes = ResponseAttributes(responseTimeMs: 123) + let attributes = ResponseAttributes(responseTimeMs: 123, code: 400) monitor.logWithResponseAttributes( metricsLogger: mockMetricsLogger, @@ -171,7 +171,7 @@ final class ResponseMonitorTests: XCTestCase { ) monitor.setEventOutcome(.success) - let attributes = ResponseAttributes(responseTimeMs: 123.23) + let attributes = ResponseAttributes(responseTimeMs: 123.23, code: 200) monitor.logWithResponseAttributes(metricsLogger: mockMetricsLogger, responseAttributes: attributes) XCTAssertEqual(mockMetricsLogger.loggedInfos.count, 1)