Join room by address (#3840)

* Implemented join room by address

* improved the text field typing

* some improvements to how the text is edited

* remove navigation link

* moved room directory search to the start chat flow

* updated preview tests

* added unit tests and improved the code

* updated strings

* some pr suggestions:

- moving the file
- changing the name of the action
- reintroduce the debounce text queries
- add comments

* renamed the auth text field style to Element

updated tests
This commit is contained in:
Mauro
2025-02-28 13:35:15 +01:00
committed by GitHub
parent 2b58f57483
commit 7f6ea1c2ae
54 changed files with 611 additions and 340 deletions
@@ -27,7 +27,8 @@ class StartChatScreenViewModelTests: XCTestCase {
viewModel = StartChatScreenViewModel(userSession: userSession,
analytics: ServiceLocator.shared.analytics,
userIndicatorController: UserIndicatorControllerMock(),
userDiscoveryService: userDiscoveryService)
userDiscoveryService: userDiscoveryService,
appSettings: ServiceLocator.shared.settings)
}
func testQueryShowingNoResults() async throws {
@@ -44,6 +45,42 @@ class StartChatScreenViewModelTests: XCTestCase {
XCTAssertTrue(userDiscoveryService.searchProfilesWithCalled)
}
func testJoinRoomByAddress() async throws {
clientProxy.resolveRoomAliasReturnValue = .success(.init(roomId: "id", servers: []))
let deferredViewState = deferFulfillment(viewModel.context.$viewState) { viewState in
viewState.joinByAddressState == .addressFound(address: "#room:example.com", roomID: "id")
}
viewModel.context.roomAddress = "#room:example.com"
try await deferredViewState.fulfill()
let deferredAction = deferFulfillment(viewModel.actions) { action in
action == .showRoom(withIdentifier: "id")
}
context.send(viewAction: .joinRoomByAddress)
try await deferredAction.fulfill()
}
func testJoinRoomByAddressFailsBecauseInvalid() async throws {
let deferred = deferFulfillment(viewModel.context.$viewState) { viewState in
viewState.joinByAddressState == .invalidAddress
}
viewModel.context.roomAddress = ":"
context.send(viewAction: .joinRoomByAddress)
try await deferred.fulfill()
}
func testJoinRoomByAddressFailsBecauseNotFound() async throws {
clientProxy.resolveRoomAliasReturnValue = .failure(.failedResolvingRoomAlias)
let deferred = deferFulfillment(viewModel.context.$viewState) { viewState in
viewState.joinByAddressState == .addressNotFound
}
viewModel.context.roomAddress = "#room:example.com"
context.send(viewAction: .joinRoomByAddress)
try await deferred.fulfill()
}
// MARK: - Private
private func assertSearchResults(toBe count: Int) {