mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-10-31 16:24:11 +00:00
0d222e8ac0
* Make sure user profiles are up to date when mentioning. * Automatically focus the custom status text field. * Make sure to clear the previous custom status text before input. * Attempt to fix the user status sheet sometimes disappearing.
453 lines
28 KiB
Swift
453 lines
28 KiB
Swift
//
|
|
// Copyright 2025 Element Creations Ltd.
|
|
// Copyright 2023-2025 New Vector Ltd.
|
|
//
|
|
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
|
|
// Please see LICENSE files in the repository root for full details.
|
|
//
|
|
|
|
@testable import ElementX
|
|
import Testing
|
|
|
|
@MainActor
|
|
struct CompletionSuggestionServiceTests {
|
|
// MARK: User Suggestions
|
|
|
|
@Test
|
|
func userSuggestions() async throws {
|
|
let alice: RoomMemberProxyMock = .mockAlice
|
|
let members: [RoomMemberProxyMock] = [alice, .mockBob, .mockCharlie, .mockMe]
|
|
let roomProxyMock = JoinedRoomProxyMock(.init(id: "roomID", name: "test", members: members))
|
|
let roomSummaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))
|
|
let service = CompletionSuggestionService(roomProxy: roomProxyMock,
|
|
roomListPublisher: roomSummaryProvider.roomListPublisher.eraseToAnyPublisher())
|
|
|
|
var deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == []
|
|
}
|
|
|
|
try await deferred.fulfill()
|
|
|
|
deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == [.init(suggestionType: .user(.init(id: alice.userID, displayName: alice.displayName, avatarURL: alice.avatarURL)), range: .init(), rawSuggestionText: "ali")]
|
|
}
|
|
service.setSuggestionTrigger(.init(type: .user, text: "ali", range: .init()))
|
|
try await deferred.fulfill()
|
|
|
|
deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == []
|
|
}
|
|
service.setSuggestionTrigger(.init(type: .user, text: "me", range: .init()))
|
|
try await deferred.fulfill()
|
|
|
|
deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == []
|
|
}
|
|
service.setSuggestionTrigger(.init(type: .user, text: "room", range: .init()))
|
|
try await deferred.fulfill()
|
|
|
|
deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == []
|
|
}
|
|
service.setSuggestionTrigger(.init(type: .user, text: "everyon", range: .init()))
|
|
try await deferred.fulfill()
|
|
}
|
|
|
|
@Test
|
|
func userSuggestionsIncludingAllUsers() async throws {
|
|
let alice: RoomMemberProxyMock = .mockAlice
|
|
let members: [RoomMemberProxyMock] = [alice, .mockBob, .mockCharlie, .mockMe]
|
|
let roomProxyMock = JoinedRoomProxyMock(.init(id: "roomID",
|
|
name: "test",
|
|
members: members,
|
|
powerLevelsConfiguration: .init(canUserTriggerRoomNotification: true)))
|
|
|
|
let roomSummaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))
|
|
let service = CompletionSuggestionService(roomProxy: roomProxyMock,
|
|
roomListPublisher: roomSummaryProvider.roomListPublisher.eraseToAnyPublisher())
|
|
|
|
var deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == []
|
|
}
|
|
|
|
try await deferred.fulfill()
|
|
|
|
deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == [.init(suggestionType: .allUsers(.room(id: "roomID", name: "test", avatarURL: nil)), range: .init(), rawSuggestionText: "ro")]
|
|
}
|
|
service.setSuggestionTrigger(.init(type: .user, text: "ro", range: .init()))
|
|
try await deferred.fulfill()
|
|
|
|
deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == [.init(suggestionType: .allUsers(.room(id: "roomID", name: "test", avatarURL: nil)), range: .init(), rawSuggestionText: "every")]
|
|
}
|
|
service.setSuggestionTrigger(.init(type: .user, text: "every", range: .init()))
|
|
try await deferred.fulfill()
|
|
}
|
|
|
|
@Test
|
|
func userSuggestionsWithEmptyText() async throws {
|
|
let alice: RoomMemberProxyMock = .mockAlice
|
|
let bob: RoomMemberProxyMock = .mockBob
|
|
let members: [RoomMemberProxyMock] = [alice, bob, .mockMe]
|
|
let roomProxyMock = JoinedRoomProxyMock(.init(id: "roomID",
|
|
name: "test",
|
|
members: members,
|
|
powerLevelsConfiguration: .init(canUserTriggerRoomNotification: true)))
|
|
let roomSummaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))
|
|
let service = CompletionSuggestionService(roomProxy: roomProxyMock,
|
|
roomListPublisher: roomSummaryProvider.roomListPublisher.eraseToAnyPublisher())
|
|
|
|
var deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == []
|
|
}
|
|
|
|
try await deferred.fulfill()
|
|
|
|
deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == [.init(suggestionType: .allUsers(.room(id: "roomID", name: "test", avatarURL: nil)), range: .init(), rawSuggestionText: ""),
|
|
.init(suggestionType: .user(.init(id: alice.userID, displayName: alice.displayName, avatarURL: alice.avatarURL)), range: .init(), rawSuggestionText: ""),
|
|
.init(suggestionType: .user(.init(id: bob.userID, displayName: bob.displayName, avatarURL: bob.avatarURL)), range: .init(), rawSuggestionText: "")]
|
|
}
|
|
service.setSuggestionTrigger(.init(type: .user, text: "", range: .init()))
|
|
try await deferred.fulfill()
|
|
|
|
// Let's test the same with the processTextMessage method
|
|
deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == [.init(suggestionType: .allUsers(.room(id: "roomID", name: "test", avatarURL: nil)), range: .init(location: 0, length: 1), rawSuggestionText: ""),
|
|
.init(suggestionType: .user(.init(id: alice.userID, displayName: alice.displayName, avatarURL: alice.avatarURL)), range: .init(location: 0, length: 1), rawSuggestionText: ""),
|
|
.init(suggestionType: .user(.init(id: bob.userID, displayName: bob.displayName, avatarURL: bob.avatarURL)), range: .init(location: 0, length: 1), rawSuggestionText: "")]
|
|
}
|
|
service.processTextMessage("@", selectedRange: .init(location: 0, length: 1))
|
|
try await deferred.fulfill()
|
|
}
|
|
|
|
@Test
|
|
func userSuggestionInDifferentMessagePositions() async throws {
|
|
let alice: RoomMemberProxyMock = .mockAlice
|
|
let members: [RoomMemberProxyMock] = [alice, .mockBob, .mockCharlie, .mockMe]
|
|
let roomProxyMock = JoinedRoomProxyMock(.init(name: "test", members: members))
|
|
let roomSummaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))
|
|
let service = CompletionSuggestionService(roomProxy: roomProxyMock,
|
|
roomListPublisher: roomSummaryProvider.roomListPublisher.eraseToAnyPublisher())
|
|
|
|
var deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == [.init(suggestionType: .user(.init(id: alice.userID, displayName: alice.displayName, avatarURL: alice.avatarURL)), range: .init(location: 0, length: 3), rawSuggestionText: "al")]
|
|
}
|
|
service.processTextMessage("@al hello", selectedRange: .init(location: 0, length: 1))
|
|
try await deferred.fulfill()
|
|
|
|
deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == [.init(suggestionType: .user(.init(id: alice.userID, displayName: alice.displayName, avatarURL: alice.avatarURL)), range: .init(location: 5, length: 3), rawSuggestionText: "al")]
|
|
}
|
|
service.processTextMessage("test @al", selectedRange: .init(location: 5, length: 1))
|
|
try await deferred.fulfill()
|
|
|
|
deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == [.init(suggestionType: .user(.init(id: alice.userID, displayName: alice.displayName, avatarURL: alice.avatarURL)), range: .init(location: 5, length: 3), rawSuggestionText: "al")]
|
|
}
|
|
service.processTextMessage("test @al test", selectedRange: .init(location: 5, length: 1))
|
|
try await deferred.fulfill()
|
|
}
|
|
|
|
@Test
|
|
func userSuggestionWithMultipleMentionSymbol() async throws {
|
|
let alice: RoomMemberProxyMock = .mockAlice
|
|
let bob: RoomMemberProxyMock = .mockBob
|
|
let members: [RoomMemberProxyMock] = [alice, bob, .mockCharlie, .mockMe]
|
|
let roomProxyMock = JoinedRoomProxyMock(.init(name: "test", members: members))
|
|
let roomSummaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))
|
|
let service = CompletionSuggestionService(roomProxy: roomProxyMock,
|
|
roomListPublisher: roomSummaryProvider.roomListPublisher.eraseToAnyPublisher())
|
|
|
|
var deffered = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == [.init(suggestionType: .user(.init(id: alice.userID, displayName: alice.displayName, avatarURL: alice.avatarURL)), range: .init(location: 0, length: 3), rawSuggestionText: "al")]
|
|
}
|
|
service.processTextMessage("@al test @bo", selectedRange: .init(location: 0, length: 1))
|
|
try await deffered.fulfill()
|
|
|
|
deffered = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == [.init(suggestionType: .user(.init(id: bob.userID, displayName: bob.displayName, avatarURL: bob.avatarURL)), range: .init(location: 9, length: 3), rawSuggestionText: "bo")]
|
|
}
|
|
service.processTextMessage("@al test @bo", selectedRange: .init(location: 9, length: 1))
|
|
try await deffered.fulfill()
|
|
|
|
deffered = deferFulfillment(service.suggestionsPublisher) { suggestion in
|
|
suggestion == []
|
|
}
|
|
service.processTextMessage("@al test @bo", selectedRange: .init(location: 4, length: 1))
|
|
try await deffered.fulfill()
|
|
}
|
|
|
|
@Test
|
|
func userSuggestionRefreshesMembers() async throws {
|
|
let members: [RoomMemberProxyMock] = [.mockAlice, .mockBob, .mockMe]
|
|
let roomProxyMock = JoinedRoomProxyMock(.init(id: "roomID", name: "test", members: members))
|
|
let roomSummaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))
|
|
|
|
let (refreshesStream, refreshesContinuation) = AsyncStream<Void>.makeStream()
|
|
roomProxyMock.updateMembersClosure = { refreshesContinuation.yield() }
|
|
|
|
let service = CompletionSuggestionService(roomProxy: roomProxyMock,
|
|
roomListPublisher: roomSummaryProvider.roomListPublisher.eraseToAnyPublisher())
|
|
#expect(!roomProxyMock.updateMembersCalled)
|
|
|
|
// Beginning a mention refreshes the members once…
|
|
var deferred = deferFulfillment(refreshesStream) { _ in true }
|
|
service.setSuggestionTrigger(.init(type: .user, text: "", range: .init()))
|
|
try await deferred.fulfill()
|
|
#expect(roomProxyMock.updateMembersCallsCount == 1)
|
|
|
|
// …but typing further within the same mention doesn't refresh again.
|
|
service.setSuggestionTrigger(.init(type: .user, text: "a", range: .init()))
|
|
service.setSuggestionTrigger(.init(type: .user, text: "al", range: .init()))
|
|
#expect(roomProxyMock.updateMembersCallsCount == 1)
|
|
|
|
// Clearing and starting a new mention refreshes a second time.
|
|
deferred = deferFulfillment(refreshesStream) { _ in true }
|
|
service.setSuggestionTrigger(nil)
|
|
service.setSuggestionTrigger(.init(type: .user, text: "", range: .init()))
|
|
try await deferred.fulfill()
|
|
#expect(roomProxyMock.updateMembersCallsCount == 2)
|
|
}
|
|
|
|
// MARK: Room Suggestions
|
|
|
|
@Test
|
|
func roomSuggestions() async throws {
|
|
let alice: RoomMemberProxyMock = .mockAlice
|
|
// We keep the users in the tests since they should not appear in the suggestions when using the room trigger
|
|
let members: [RoomMemberProxyMock] = [alice, .mockBob, .mockCharlie, .mockMe]
|
|
let roomProxyMock = JoinedRoomProxyMock(.init(id: "roomID", name: "test", members: members))
|
|
let roomSummaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))
|
|
let service = CompletionSuggestionService(roomProxy: roomProxyMock,
|
|
roomListPublisher: roomSummaryProvider.roomListPublisher.eraseToAnyPublisher())
|
|
|
|
var deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == []
|
|
}
|
|
|
|
try await deferred.fulfill()
|
|
|
|
// The empty # should trigger suggestions from any room with an alias
|
|
deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == [.init(suggestionType: .room(.init(id: "2",
|
|
canonicalAlias: "#foundation-and-empire:matrix.org",
|
|
name: "Foundation and Empire",
|
|
avatar: .room(id: "2",
|
|
name: "Foundation and Empire",
|
|
avatarURL: .mockMXCAvatar))),
|
|
range: .init(),
|
|
rawSuggestionText: ""),
|
|
.init(suggestionType: .room(.init(id: "6",
|
|
canonicalAlias: "#prelude-foundation:matrix.org",
|
|
name: "Prelude to Foundation",
|
|
avatar: .room(id: "6",
|
|
name: "Prelude to Foundation",
|
|
avatarURL: nil))),
|
|
range: .init(),
|
|
rawSuggestionText: "")]
|
|
}
|
|
service.setSuggestionTrigger(.init(type: .room, text: "", range: .init()))
|
|
try await deferred.fulfill()
|
|
|
|
// Same but with the processTextMessage method
|
|
deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == [.init(suggestionType: .room(.init(id: "2",
|
|
canonicalAlias: "#foundation-and-empire:matrix.org",
|
|
name: "Foundation and Empire",
|
|
avatar: .room(id: "2",
|
|
name: "Foundation and Empire",
|
|
avatarURL: .mockMXCAvatar))),
|
|
range: .init(location: 0, length: 1),
|
|
rawSuggestionText: ""),
|
|
.init(suggestionType: .room(.init(id: "6",
|
|
canonicalAlias: "#prelude-foundation:matrix.org",
|
|
name: "Prelude to Foundation",
|
|
avatar: .room(id: "6",
|
|
name: "Prelude to Foundation",
|
|
avatarURL: nil))),
|
|
range: .init(location: 0, length: 1),
|
|
rawSuggestionText: "")]
|
|
}
|
|
service.processTextMessage("#", selectedRange: .init(location: 0, length: 1))
|
|
try await deferred.fulfill()
|
|
|
|
deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == [.init(suggestionType: .room(.init(id: "6",
|
|
canonicalAlias: "#prelude-foundation:matrix.org",
|
|
name: "Prelude to Foundation",
|
|
avatar: .room(id: "6",
|
|
name: "Prelude to Foundation",
|
|
avatarURL: nil))),
|
|
range: .init(),
|
|
rawSuggestionText: "prelude")]
|
|
}
|
|
service.setSuggestionTrigger(.init(type: .room, text: "prelude", range: .init()))
|
|
try await deferred.fulfill()
|
|
}
|
|
|
|
@Test
|
|
func roomSuggestionInDifferentMessagePositions() async throws {
|
|
let alice: RoomMemberProxyMock = .mockAlice
|
|
// We keep the users in the tests since they should not appear in the suggestions when using the room trigger
|
|
let members: [RoomMemberProxyMock] = [alice, .mockBob, .mockCharlie, .mockMe]
|
|
let roomProxyMock = JoinedRoomProxyMock(.init(id: "roomID", name: "test", members: members))
|
|
let roomSummaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))
|
|
let service = CompletionSuggestionService(roomProxy: roomProxyMock,
|
|
roomListPublisher: roomSummaryProvider.roomListPublisher.eraseToAnyPublisher())
|
|
|
|
var deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == [.init(suggestionType: .room(.init(id: "6",
|
|
canonicalAlias: "#prelude-foundation:matrix.org",
|
|
name: "Prelude to Foundation",
|
|
avatar: .room(id: "6",
|
|
name: "Prelude to Foundation",
|
|
avatarURL: nil))),
|
|
range: .init(location: 0, length: 3),
|
|
rawSuggestionText: "pr")]
|
|
}
|
|
service.processTextMessage("#pr hello", selectedRange: .init(location: 0, length: 1))
|
|
try await deferred.fulfill()
|
|
|
|
deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == [.init(suggestionType: .room(.init(id: "6",
|
|
canonicalAlias: "#prelude-foundation:matrix.org",
|
|
name: "Prelude to Foundation",
|
|
avatar: .room(id: "6",
|
|
name: "Prelude to Foundation",
|
|
avatarURL: nil))),
|
|
range: .init(location: 5, length: 3),
|
|
rawSuggestionText: "pr")]
|
|
}
|
|
service.processTextMessage("test #pr", selectedRange: .init(location: 5, length: 1))
|
|
try await deferred.fulfill()
|
|
|
|
deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == [.init(suggestionType: .room(.init(id: "6",
|
|
canonicalAlias: "#prelude-foundation:matrix.org",
|
|
name: "Prelude to Foundation",
|
|
avatar: .room(id: "6",
|
|
name: "Prelude to Foundation",
|
|
avatarURL: nil))),
|
|
range: .init(location: 5, length: 3),
|
|
rawSuggestionText: "pr")]
|
|
}
|
|
service.processTextMessage("test #pr test", selectedRange: .init(location: 5, length: 1))
|
|
try await deferred.fulfill()
|
|
}
|
|
|
|
@Test
|
|
func roomSuggestionWithMultipleMentionSymbol() async throws {
|
|
let alice: RoomMemberProxyMock = .mockAlice
|
|
// We keep the users in the tests since they should not appear in the suggestions when using the room trigger
|
|
let members: [RoomMemberProxyMock] = [alice, .mockBob, .mockCharlie, .mockMe]
|
|
let roomProxyMock = JoinedRoomProxyMock(.init(id: "roomID", name: "test", members: members))
|
|
let roomSummaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))
|
|
let service = CompletionSuggestionService(roomProxy: roomProxyMock,
|
|
roomListPublisher: roomSummaryProvider.roomListPublisher.eraseToAnyPublisher())
|
|
|
|
var deffered = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == [.init(suggestionType: .room(.init(id: "6",
|
|
canonicalAlias: "#prelude-foundation:matrix.org",
|
|
name: "Prelude to Foundation",
|
|
avatar: .room(id: "6",
|
|
name: "Prelude to Foundation",
|
|
avatarURL: nil))),
|
|
range: .init(location: 0, length: 3),
|
|
rawSuggestionText: "pr")]
|
|
}
|
|
service.processTextMessage("#pr test #fo", selectedRange: .init(location: 0, length: 1))
|
|
try await deffered.fulfill()
|
|
|
|
deffered = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == [.init(suggestionType: .room(.init(id: "2",
|
|
canonicalAlias: "#foundation-and-empire:matrix.org",
|
|
name: "Foundation and Empire",
|
|
avatar: .room(id: "2",
|
|
name: "Foundation and Empire",
|
|
avatarURL: .mockMXCAvatar))),
|
|
range: .init(location: 9, length: 3),
|
|
rawSuggestionText: "fo"),
|
|
.init(suggestionType: .room(.init(id: "6",
|
|
canonicalAlias: "#prelude-foundation:matrix.org",
|
|
name: "Prelude to Foundation",
|
|
avatar: .room(id: "6",
|
|
name: "Prelude to Foundation",
|
|
avatarURL: nil))),
|
|
range: .init(location: 9, length: 3),
|
|
rawSuggestionText: "fo")]
|
|
}
|
|
service.processTextMessage("#pr test #fo", selectedRange: .init(location: 9, length: 1))
|
|
try await deffered.fulfill()
|
|
|
|
deffered = deferFulfillment(service.suggestionsPublisher) { suggestion in
|
|
suggestion == []
|
|
}
|
|
service.processTextMessage("#pr test #fo", selectedRange: .init(location: 4, length: 1))
|
|
try await deffered.fulfill()
|
|
}
|
|
|
|
// MARK: Common
|
|
|
|
@Test
|
|
func suggestionsWithMultipleDifferentTriggers() async throws {
|
|
let alice: RoomMemberProxyMock = .mockAlice
|
|
// We keep the users in the tests since they should not appear in the suggestions when using the room trigger
|
|
let members: [RoomMemberProxyMock] = [alice, .mockBob, .mockCharlie, .mockMe]
|
|
let roomProxyMock = JoinedRoomProxyMock(.init(id: "roomID", name: "test", members: members))
|
|
let roomSummaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))
|
|
let service = CompletionSuggestionService(roomProxy: roomProxyMock,
|
|
roomListPublisher: roomSummaryProvider.roomListPublisher.eraseToAnyPublisher())
|
|
|
|
var deffered = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == [.init(suggestionType: .room(.init(id: "6",
|
|
canonicalAlias: "#prelude-foundation:matrix.org",
|
|
name: "Prelude to Foundation",
|
|
avatar: .room(id: "6",
|
|
name: "Prelude to Foundation",
|
|
avatarURL: nil))),
|
|
range: .init(location: 0, length: 3),
|
|
rawSuggestionText: "pr")]
|
|
}
|
|
service.processTextMessage("#pr test @al", selectedRange: .init(location: 0, length: 1))
|
|
try await deffered.fulfill()
|
|
|
|
deffered = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == [.init(suggestionType: .user(.init(id: alice.userID, displayName: alice.displayName, avatarURL: alice.avatarURL)), range: .init(location: 9, length: 3), rawSuggestionText: "al")]
|
|
}
|
|
service.processTextMessage("#pr test @al", selectedRange: .init(location: 9, length: 1))
|
|
try await deffered.fulfill()
|
|
}
|
|
|
|
@Test
|
|
func suggestionsContainingNonAlphanumericCharacters() async throws {
|
|
let alice: RoomMemberProxyMock = .mockAlice
|
|
// We keep the users in the tests since they should not appear in the suggestions when using the room trigger
|
|
let members: [RoomMemberProxyMock] = [alice, .mockBob, .mockCharlie, .mockMe]
|
|
let roomProxyMock = JoinedRoomProxyMock(.init(id: "roomID", name: "test", members: members))
|
|
let roomSummaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))
|
|
let service = CompletionSuggestionService(roomProxy: roomProxyMock,
|
|
roomListPublisher: roomSummaryProvider.roomListPublisher.eraseToAnyPublisher())
|
|
|
|
var deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == []
|
|
}
|
|
|
|
try await deferred.fulfill()
|
|
|
|
deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in
|
|
suggestions == [.init(suggestionType: .room(.init(id: "6",
|
|
canonicalAlias: "#prelude-foundation:matrix.org",
|
|
name: "Prelude to Foundation",
|
|
avatar: .room(id: "6",
|
|
name: "Prelude to Foundation",
|
|
avatarURL: nil))),
|
|
range: .init(),
|
|
rawSuggestionText: "#prelude-")]
|
|
}
|
|
service.setSuggestionTrigger(.init(type: .room, text: "#prelude-", range: .init()))
|
|
try await deferred.fulfill()
|
|
}
|
|
}
|