diff --git a/ElementX/Sources/Services/Users/UserDiscoveryService.swift b/ElementX/Sources/Services/Users/UserDiscoveryService.swift index 662346707..92c3b8de7 100644 --- a/ElementX/Sources/Services/Users/UserDiscoveryService.swift +++ b/ElementX/Sources/Services/Users/UserDiscoveryService.swift @@ -22,18 +22,18 @@ final class UserDiscoveryService: UserDiscoveryServiceProtocol { init(clientProxy: ClientProxyProtocol) { self.clientProxy = clientProxy } - + func fetchSuggestions() async -> Result<[UserProfileProxy], UserDiscoveryErrorType> { - .success([.mockAlice, .mockBob, .mockCharlie]) + .success(filterAccountOwner([.mockAlice, .mockBob, .mockCharlie])) } - + func searchProfiles(with searchQuery: String) async -> Result<[UserProfileProxy], UserDiscoveryErrorType> { async let queriedProfile = profileIfPossible(with: searchQuery) - + do { async let searchedUsers = clientProxy.searchUsers(searchTerm: searchQuery, limit: 10).get() let users = try await merge(queriedProfile: queriedProfile, searchResults: searchedUsers) - return .success(users) + return .success(filterAccountOwner(users)) } catch { // we want to show the profile (if any) even if the search fails if let queriedProfile = await queriedProfile { @@ -43,14 +43,14 @@ final class UserDiscoveryService: UserDiscoveryServiceProtocol { } } } - + private func merge(queriedProfile: UserProfileProxy?, searchResults: SearchUsersResultsProxy) -> [UserProfileProxy] { let searchResults = searchResults.results guard let queriedProfile else { return searchResults } - + let filteredSearchResult = searchResults.filter { $0.userID != queriedProfile.userID } @@ -59,7 +59,7 @@ final class UserDiscoveryService: UserDiscoveryServiceProtocol { } private func profileIfPossible(with searchQuery: String) async -> UserProfileProxy? { - guard searchQuery.isMatrixIdentifier else { + guard searchQuery.isMatrixIdentifier, searchQuery != clientProxy.userID else { return nil } @@ -68,6 +68,11 @@ final class UserDiscoveryService: UserDiscoveryServiceProtocol { // fallback to a "local profile" if the profile api fails return getProfileResult ?? .init(userID: searchQuery) } + + private func filterAccountOwner(_ profiles: [UserProfileProxy]) -> [UserProfileProxy] { + let accountOwnerID = clientProxy.userID + return profiles.filter { $0.userID != accountOwnerID } + } } private extension String { diff --git a/UnitTests/Sources/UserDiscoveryService/UserDiscoveryServiceTest.swift b/UnitTests/Sources/UserDiscoveryService/UserDiscoveryServiceTest.swift index 28a5fc788..f8b3a88cb 100644 --- a/UnitTests/Sources/UserDiscoveryService/UserDiscoveryServiceTest.swift +++ b/UnitTests/Sources/UserDiscoveryService/UserDiscoveryServiceTest.swift @@ -24,7 +24,7 @@ class UserDiscoveryServiceTest: XCTestCase { var clientProxy: MockClientProxy! override func setUpWithError() throws { - clientProxy = .init(userID: "") + clientProxy = .init(userID: "@foo:matrix.org") service = UserDiscoveryService(clientProxy: clientProxy) } @@ -34,6 +34,13 @@ class UserDiscoveryServiceTest: XCTestCase { let results = await (try? search(query: "AAA").get()) ?? [] assertSearchResults(results, toBe: 1) } + + func testOwnerIsFiltered() async throws { + clientProxy.searchUsersResult = .success(.init(results: [UserProfileProxy(userID: "@foo:matrix.org")], limited: true)) + + let results = await (try? search(query: "AAA").get()) ?? [] + assertSearchResults(results, toBe: 0) + } func testGetProfileIsNotCalled() async { clientProxy.searchUsersResult = .success(.init(results: searchResults, limited: true)) @@ -43,6 +50,15 @@ class UserDiscoveryServiceTest: XCTestCase { assertSearchResults(results, toBe: 3) XCTAssertFalse(clientProxy.getProfileCalled) } + + func testGetProfileIsNotCalledForAccountOwnerID() async { + clientProxy.searchUsersResult = .success(.init(results: searchResults, limited: true)) + clientProxy.getProfileResult = .success(.init(userID: "@alice:matrix.org")) + + let results = await (try? search(query: "foo:matrix.org").get()) ?? [] + assertSearchResults(results, toBe: 3) + XCTAssertFalse(clientProxy.getProfileCalled) + } func testLocalResultShows() async { clientProxy.searchUsersResult = .success(.init(results: searchResults, limited: true))