mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-02 21:33:26 +00:00
Move search users into a dedicated service (#789)
* add users provider with test * add ui test for search users * add changelog * Update ElementX/Sources/Services/Users/UsersProvider.swift Co-authored-by: Alfonso Grillo <alfogrillo@gmail.com> * add error handling in usersprovider * remove empty section * add search in invite users * add CancellableTask, add setup App Settings in UnitTest, screenshots * rename of UserDiscoveryService * Update ElementX/Sources/Other/Extensions/Publisher.swift Co-authored-by: Doug <6060466+pixlwave@users.noreply.github.com> * new error management for User Discovery Service * Update ElementX/Sources/Other/CancellableTask.swift Co-authored-by: Alfonso Grillo <alfogrillo@gmail.com> * Update ElementX/Sources/Services/Users/UserDiscoveryService.swift Co-authored-by: Alfonso Grillo <alfogrillo@gmail.com> * fix invite users and start chat errors * use only one task to fetch user profile --------- Co-authored-by: Alfonso Grillo <alfogrillo@gmail.com> Co-authored-by: Doug <6060466+pixlwave@users.noreply.github.com>
This commit is contained in:
@@ -22,6 +22,7 @@ import XCTest
|
||||
class StartChatScreenViewModelTests: XCTestCase {
|
||||
var viewModel: StartChatViewModelProtocol!
|
||||
var clientProxy: MockClientProxy!
|
||||
var userDiscoveryService: UserDiscoveryServiceMock!
|
||||
|
||||
var context: StartChatViewModel.Context {
|
||||
viewModel.context
|
||||
@@ -29,66 +30,29 @@ class StartChatScreenViewModelTests: XCTestCase {
|
||||
|
||||
override func setUpWithError() throws {
|
||||
clientProxy = .init(userID: "")
|
||||
userDiscoveryService = UserDiscoveryServiceMock()
|
||||
userDiscoveryService.fetchSuggestionsReturnValue = .success([])
|
||||
userDiscoveryService.searchProfilesWithReturnValue = .success([])
|
||||
let userSession = MockUserSession(clientProxy: clientProxy, mediaProvider: MockMediaProvider())
|
||||
viewModel = StartChatViewModel(userSession: userSession, userIndicatorController: nil)
|
||||
viewModel = StartChatViewModel(userSession: userSession, userIndicatorController: nil, userDiscoveryService: userDiscoveryService)
|
||||
|
||||
setupAppSettings()
|
||||
ServiceLocator.shared.settings.startChatUserSuggestionsEnabled = true
|
||||
}
|
||||
|
||||
func testQueryShowingNoResults() async throws {
|
||||
await search(query: "A")
|
||||
XCTAssertEqual(context.viewState.usersSection.type, .empty)
|
||||
XCTAssertEqual(context.viewState.usersSection.type, .suggestions)
|
||||
XCTAssertTrue(userDiscoveryService.fetchSuggestionsCalled)
|
||||
|
||||
await search(query: "AA")
|
||||
XCTAssertEqual(context.viewState.usersSection.type, .empty)
|
||||
XCTAssertEqual(context.viewState.usersSection.type, .suggestions)
|
||||
XCTAssertFalse(userDiscoveryService.searchProfilesWithCalled)
|
||||
|
||||
await search(query: "AAA")
|
||||
assertSearchResults(toBe: 0)
|
||||
}
|
||||
|
||||
func testQueryShowingResults() async throws {
|
||||
clientProxy.searchUsersResult = .success(.init(results: [UserProfile.mockAlice], limited: true))
|
||||
|
||||
await search(query: "AAA")
|
||||
assertSearchResults(toBe: 1)
|
||||
}
|
||||
|
||||
func testGetProfileIsNotCalled() async {
|
||||
clientProxy.searchUsersResult = .success(.init(results: searchResults, limited: true))
|
||||
clientProxy.getProfileResult = .success(.init(userID: "@alice:matrix.org"))
|
||||
|
||||
await search(query: "AAA")
|
||||
assertSearchResults(toBe: 3)
|
||||
XCTAssertFalse(clientProxy.getProfileCalled)
|
||||
}
|
||||
|
||||
func testLocalResultShows() async {
|
||||
clientProxy.searchUsersResult = .success(.init(results: searchResults, limited: true))
|
||||
clientProxy.getProfileResult = .success(.init(userID: "@some:matrix.org"))
|
||||
|
||||
await search(query: "@a:b.com")
|
||||
|
||||
assertSearchResults(toBe: 4)
|
||||
XCTAssertTrue(clientProxy.getProfileCalled)
|
||||
}
|
||||
|
||||
func testLocalResultWithDuplicates() async {
|
||||
clientProxy.searchUsersResult = .success(.init(results: searchResults, limited: true))
|
||||
clientProxy.getProfileResult = .success(.init(userID: "@bob:matrix.org"))
|
||||
|
||||
await search(query: "@a:b.com")
|
||||
|
||||
assertSearchResults(toBe: 3)
|
||||
let firstUserID = viewModel.context.viewState.usersSection.users.first?.userID
|
||||
XCTAssertEqual(firstUserID, "@bob:matrix.org")
|
||||
XCTAssertTrue(clientProxy.getProfileCalled)
|
||||
}
|
||||
|
||||
func testSearchResultsShowWhenGetProfileFails() async {
|
||||
clientProxy.searchUsersResult = .success(.init(results: searchResults, limited: true))
|
||||
clientProxy.getProfileResult = .failure(.failedGettingUserProfile)
|
||||
|
||||
await search(query: "@a:b.com")
|
||||
|
||||
assertSearchResults(toBe: 4)
|
||||
XCTAssertTrue(userDiscoveryService.searchProfilesWithCalled)
|
||||
}
|
||||
|
||||
// MARK: - Private
|
||||
@@ -105,12 +69,4 @@ class StartChatScreenViewModelTests: XCTestCase {
|
||||
viewModel.context.searchQuery = query
|
||||
return await context.$viewState.nextValue
|
||||
}
|
||||
|
||||
private var searchResults: [UserProfile] {
|
||||
[
|
||||
.mockAlice,
|
||||
.mockBob,
|
||||
.mockCharlie
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user