Skip to content

Commit

Permalink
[FX-1509] Fix isFirstResponder state update in rosetta PIN input (#171)
Browse files Browse the repository at this point in the history
* fix response monitor unit tests

* call firstResponderDidChange delegate method on didBeginEditing & didEndEditing

* refactor firstResponder delegate method calls and add tests

* update tests & run lint

* add more detail to isFirstResponder tests
  • Loading branch information
evanfreeze authored Jun 17, 2024
1 parent 75cbd9c commit 3804192
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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 = ""
Expand Down
53 changes: 53 additions & 0 deletions Tests/ForageSDKTests/ForagePINTextFieldTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
4 changes: 2 additions & 2 deletions Tests/ForageSDKTests/ResponseMonitorTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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)
Expand Down

0 comments on commit 3804192

Please sign in to comment.