From 03be09cbc71f98db261647691cbf2311a880dfcd Mon Sep 17 00:00:00 2001 From: Mauro Romito Date: Wed, 5 Mar 2025 17:09:25 +0100 Subject: [PATCH] updated tests --- .../Mocks/RoomSummaryProviderMock.swift | 2 +- .../CompletionSuggestionService.swift | 2 +- .../test_globalSearchScreen-iPad-en-GB.1.png | 4 +- .../test_globalSearchScreen-iPad-pseudo.1.png | 4 +- ...t_globalSearchScreen-iPhone-16-en-GB.1.png | 4 +- ..._globalSearchScreen-iPhone-16-pseudo.1.png | 4 +- ...t_messageForwardingScreen-iPad-en-GB.1.png | 4 +- ..._messageForwardingScreen-iPad-pseudo.1.png | 4 +- ...sageForwardingScreen-iPhone-16-en-GB.1.png | 4 +- ...ageForwardingScreen-iPhone-16-pseudo.1.png | 4 +- .../test_roomSelectionScreen-iPad-en-GB.1.png | 4 +- ...test_roomSelectionScreen-iPad-pseudo.1.png | 4 +- ..._roomSelectionScreen-iPhone-16-en-GB.1.png | 4 +- ...roomSelectionScreen-iPhone-16-pseudo.1.png | 4 +- .../CompletionSuggestionServiceTests.swift | 225 +++++++++++++++++- 15 files changed, 246 insertions(+), 31 deletions(-) diff --git a/ElementX/Sources/Mocks/RoomSummaryProviderMock.swift b/ElementX/Sources/Mocks/RoomSummaryProviderMock.swift index b65612b570..d4bc0a4e02 100644 --- a/ElementX/Sources/Mocks/RoomSummaryProviderMock.swift +++ b/ElementX/Sources/Mocks/RoomSummaryProviderMock.swift @@ -197,7 +197,7 @@ extension Array where Element == RoomSummary { unreadMentionsCount: 0, unreadNotificationsCount: 0, notificationMode: .mute, - canonicalAlias: nil, + canonicalAlias: "#prelude-foundation:matrix.org", alternativeAliases: [], hasOngoingCall: true, isMarkedUnread: false, diff --git a/ElementX/Sources/Screens/RoomScreen/ComposerToolbar/CompletionSuggestionService.swift b/ElementX/Sources/Screens/RoomScreen/ComposerToolbar/CompletionSuggestionService.swift index a880a603c7..0026819d56 100644 --- a/ElementX/Sources/Screens/RoomScreen/ComposerToolbar/CompletionSuggestionService.swift +++ b/ElementX/Sources/Screens/RoomScreen/ComposerToolbar/CompletionSuggestionService.swift @@ -9,7 +9,7 @@ import Combine import Foundation private enum SuggestionTriggerRegex { - static let atOrHash = /[@#]\w+/ + static let atOrHash = /[@#]\w*/ static let at: Character = "@" static let hash: Character = "#" diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_globalSearchScreen-iPad-en-GB.1.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_globalSearchScreen-iPad-en-GB.1.png index 40f302627c..eae437f6e7 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_globalSearchScreen-iPad-en-GB.1.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_globalSearchScreen-iPad-en-GB.1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:61ebfb0d15c41532a779c91b2ff490a7eb2daaeed9cbc8d9b804535e6d721758 -size 158570 +oid sha256:35951ab2ca021aacb1d40c8ae270efe23f47b38d0715b0475b93e0878300253d +size 163854 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_globalSearchScreen-iPad-pseudo.1.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_globalSearchScreen-iPad-pseudo.1.png index 89a6b35f0a..bd78981f5c 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_globalSearchScreen-iPad-pseudo.1.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_globalSearchScreen-iPad-pseudo.1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5bf11205a434cc0ff90b275e4475e86134ed15e861f21fb37f96a9fc3b25e262 -size 158954 +oid sha256:31ddb9be88bf2a6469fc8d3c8178170ca246b7c5429f9db98bb6f737cb282703 +size 164238 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_globalSearchScreen-iPhone-16-en-GB.1.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_globalSearchScreen-iPhone-16-en-GB.1.png index 9d042a8815..c96a20ce4e 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_globalSearchScreen-iPhone-16-en-GB.1.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_globalSearchScreen-iPhone-16-en-GB.1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b0088c448b0a3e1106a869a747c7dc85c882c3a3553e529eb3e502ccbbb22e25 -size 94620 +oid sha256:8687afad034254066ea656378022ae61aed58cc2b2214edaf323ab13aded7c73 +size 99720 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_globalSearchScreen-iPhone-16-pseudo.1.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_globalSearchScreen-iPhone-16-pseudo.1.png index fea211012f..380e0548b8 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_globalSearchScreen-iPhone-16-pseudo.1.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_globalSearchScreen-iPhone-16-pseudo.1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ba7e2d7a550a145a8f2872986b8eb6d437306390feaa2019329192c16398f642 -size 94955 +oid sha256:03d9f85d77b1e75bbc8ab40ce84756067a30d35d09a7ce6e821302ba35dbdece +size 100052 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_messageForwardingScreen-iPad-en-GB.1.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_messageForwardingScreen-iPad-en-GB.1.png index 5c4683c8f0..8e96b2dca8 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_messageForwardingScreen-iPad-en-GB.1.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_messageForwardingScreen-iPad-en-GB.1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9c92c6e353e7759adf0f75cf9a21297656c5c6daad3cfdbbf39301440b5bf8a0 -size 159902 +oid sha256:18a5a2705faf3823e0db694088206dc582621b4c52f31b7e5bdf5682889d5b94 +size 165467 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_messageForwardingScreen-iPad-pseudo.1.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_messageForwardingScreen-iPad-pseudo.1.png index 9e7764fc1b..7b6a4d8420 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_messageForwardingScreen-iPad-pseudo.1.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_messageForwardingScreen-iPad-pseudo.1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dae65098eaf100bb2b762b5a25b4caa3a366e2780690e9a41a976d0bce707a74 -size 161798 +oid sha256:cae43b115dc17061874c1338042c62d71b0e41eebfee30e8c6e8c094490be64a +size 167363 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_messageForwardingScreen-iPhone-16-en-GB.1.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_messageForwardingScreen-iPhone-16-en-GB.1.png index b55e66f7af..27a303fbc3 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_messageForwardingScreen-iPhone-16-en-GB.1.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_messageForwardingScreen-iPhone-16-en-GB.1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bac9d7d51106483c23a118e85a567aafa466ba0a118eae797bd27e8f69d97417 -size 108070 +oid sha256:70ad8dc0e88cd46109fea561c0b7e220ca6bad6c7eb124d5b9f14b233f537820 +size 112987 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_messageForwardingScreen-iPhone-16-pseudo.1.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_messageForwardingScreen-iPhone-16-pseudo.1.png index a15cc2952d..1ca291f7f8 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_messageForwardingScreen-iPhone-16-pseudo.1.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_messageForwardingScreen-iPhone-16-pseudo.1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:94508db7f079602a32529ba110fd027d9660c75c1d81f38a2e28a9448f12d5cc -size 107929 +oid sha256:b2c4306135e1efa0552deddcaa09e22cae4f23687b0dcf840c9e39bad61635c0 +size 112846 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomSelectionScreen-iPad-en-GB.1.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomSelectionScreen-iPad-en-GB.1.png index e48d445e50..8684c48479 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomSelectionScreen-iPad-en-GB.1.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomSelectionScreen-iPad-en-GB.1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:29ecf5613971aad7c7890ed563d8b69d3c13ad1b2d9189c6cb3a80af53c6568b -size 156966 +oid sha256:69544d0b3042e3997689f0131e87af191929ef1b62647b22b13bfe362307db1d +size 162531 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomSelectionScreen-iPad-pseudo.1.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomSelectionScreen-iPad-pseudo.1.png index 7f4f3b8d6f..153a14eb73 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomSelectionScreen-iPad-pseudo.1.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomSelectionScreen-iPad-pseudo.1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:270c52cdad79a7495bded4560a8500f4b9266e0af8d3ec0742a42a2fd7c79888 -size 158449 +oid sha256:d224a0f3ea5243508744166a1ce4b635eeb4f08363e6c2558bf1ec2574ce8a1d +size 164014 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomSelectionScreen-iPhone-16-en-GB.1.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomSelectionScreen-iPhone-16-en-GB.1.png index c6b0b25203..fcb69de22a 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomSelectionScreen-iPhone-16-en-GB.1.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomSelectionScreen-iPhone-16-en-GB.1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:429ace579d36361e16639266d2b14b6a515da57b14a25205c5e2460a1a8fe85e -size 105969 +oid sha256:a995e503150a60c80666fba9135b70b3d21a59134ec400f8caf9bac3df16c54c +size 110886 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomSelectionScreen-iPhone-16-pseudo.1.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomSelectionScreen-iPhone-16-pseudo.1.png index 0f7ac0010a..6b91338d4a 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomSelectionScreen-iPhone-16-pseudo.1.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomSelectionScreen-iPhone-16-pseudo.1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f29a6ad8b2d81b1e3ffe1d9d8b526488d7c021bf17b04e74d8d3db38f2955944 -size 107269 +oid sha256:f5921b93c625428f436a43fec74d940a277d11fabbcf0e1412efbe574222101d +size 112186 diff --git a/UnitTests/Sources/CompletionSuggestionServiceTests.swift b/UnitTests/Sources/CompletionSuggestionServiceTests.swift index fae2e4dcbe..b565201019 100644 --- a/UnitTests/Sources/CompletionSuggestionServiceTests.swift +++ b/UnitTests/Sources/CompletionSuggestionServiceTests.swift @@ -22,8 +22,9 @@ final class CompletionSuggestionServiceTests: XCTestCase { 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: Empty().replaceEmpty(with: []).eraseToAnyPublisher()) + roomListPublisher: roomSummaryProvider.roomListPublisher.eraseToAnyPublisher()) var deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in suggestions == [] @@ -60,8 +61,9 @@ final class CompletionSuggestionServiceTests: XCTestCase { let alice: RoomMemberProxyMock = .mockAlice let members: [RoomMemberProxyMock] = [alice, .mockBob, .mockCharlie, .mockMe] let roomProxyMock = JoinedRoomProxyMock(.init(id: "roomID", name: "test", members: members, canUserTriggerRoomNotification: true)) + let roomSummaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms))) let service = CompletionSuggestionService(roomProxy: roomProxyMock, - roomListPublisher: Empty().replaceEmpty(with: []).eraseToAnyPublisher()) + roomListPublisher: roomSummaryProvider.roomListPublisher.eraseToAnyPublisher()) var deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in suggestions == [] @@ -87,8 +89,9 @@ final class CompletionSuggestionServiceTests: XCTestCase { let bob: RoomMemberProxyMock = .mockBob let members: [RoomMemberProxyMock] = [alice, bob, .mockMe] let roomProxyMock = JoinedRoomProxyMock(.init(id: "roomID", name: "test", members: members, canUserTriggerRoomNotification: true)) + let roomSummaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms))) let service = CompletionSuggestionService(roomProxy: roomProxyMock, - roomListPublisher: Empty().replaceEmpty(with: []).eraseToAnyPublisher()) + roomListPublisher: roomSummaryProvider.roomListPublisher.eraseToAnyPublisher()) var deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in suggestions == [] @@ -103,14 +106,24 @@ final class CompletionSuggestionServiceTests: XCTestCase { } 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() } func testUserSuggestionInDifferentMessagePositions() 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: Empty().replaceEmpty(with: []).eraseToAnyPublisher()) + 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")] @@ -136,8 +149,9 @@ final class CompletionSuggestionServiceTests: XCTestCase { 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: Empty().replaceEmpty(with: []).eraseToAnyPublisher()) + 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")] @@ -157,4 +171,205 @@ final class CompletionSuggestionServiceTests: XCTestCase { service.processTextMessage("@al test @bo", selectedRange: .init(location: 4, length: 1)) try await deffered.fulfill() } + + func testRoomSuggestions() 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() + } + + func testRoomSuggestionInDifferentMessagePositions() 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() + } + + func testRoomSuggestionWithMultipleMentionSymbol() 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() + } + + func testSuggestionsWithMultipleDifferentTriggers() 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() + } }