blob: 77ede1fa94661e25dc76ba6e9f5043d3379e31da [file] [log] [blame]
Kateryna Kostiuka23348e2023-03-09 14:21:55 -05001/*
2 * Copyright (C) 2023 Savoir-faire Linux Inc.
3 *
4 * Author: Kateryna Kostiuk <kateryna.kostiuk@savoirfairelinux.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 */
20
21import XCTest
22import RxRelay
23@testable import Ring
24
25final class JamiSearchViewModelTests: XCTestCase {
26
27 var conversationVM: ConversationViewModel!
28 var injectionBag: InjectionBag!
29 var dataSource: TestableFilteredDataSource!
30 var searchViewModel: JamiSearchViewModel!
31
32 override func setUpWithError() throws {
33 try super.setUpWithError()
34 let dBManager = DBManager(profileHepler: ProfileDataHelper(),
35 conversationHelper: ConversationDataHelper(),
36 interactionHepler: InteractionDataHelper(),
37 dbConnections: DBContainer())
38 let daemonService = DaemonService(dRingAdaptor: DRingAdapter())
39 let nameService = NameService(withNameRegistrationAdapter: NameRegistrationAdapter())
40 let presenceService = PresenceService(withPresenceAdapter: PresenceAdapter())
41 let videoService = VideoService(withVideoAdapter: VideoAdapter())
42 let audioService = AudioService(withAudioAdapter: AudioAdapter())
43 let systemService = SystemService(withSystemAdapter: SystemAdapter())
44 let networkService = NetworkService()
Kateryna Kostiuk9cbd2302023-03-14 15:02:52 -040045 let callsProvider: CallsProviderService = CallsProviderService(provider: CXProvider(configuration: CallsHelpers.providerConfiguration()), controller: CXCallController())
Kateryna Kostiuka23348e2023-03-09 14:21:55 -050046 let callService: CallsService = CallsService(withCallsAdapter: CallsAdapter(), dbManager: dBManager)
47 let accountService: AccountsService = AccountsService(withAccountAdapter: AccountAdapter(), dbManager: dBManager)
48 let contactsService: ContactsService = ContactsService(withContactsAdapter: ContactsAdapter(), dbManager: dBManager)
49 let profileService: ProfilesService =
50 ProfilesService(withProfilesAdapter: ProfilesAdapter(), dbManager: dBManager)
51 let dataTransferService: DataTransferService =
52 DataTransferService(withDataTransferAdapter: DataTransferAdapter(),
53 dbManager: dBManager)
54 let conversationsService: ConversationsService =
55 ConversationsService(withConversationsAdapter: ConversationsAdapter(), dbManager: dBManager)
56 let locationSharingService: LocationSharingService =
57 LocationSharingService(dbManager: dBManager)
58 let requestsService: RequestsService =
59 RequestsService(withRequestsAdapter: RequestsAdapter(), dbManager: dBManager)
60
61 injectionBag = InjectionBag(withDaemonService: daemonService,
62 withAccountService: accountService,
63 withNameService: nameService,
64 withConversationService: conversationsService,
65 withContactsService: contactsService,
66 withPresenceService: presenceService,
67 withNetworkService: networkService,
68 withCallService: callService,
69 withVideoService: videoService,
70 withAudioService: audioService,
71 withDataTransferService: dataTransferService,
72 withProfileService: profileService,
73 withCallsProvider: callsProvider,
74 withLocationSharingService: locationSharingService,
75 withRequestsService: requestsService,
76 withSystemService: systemService)
77 conversationVM = ConversationViewModel(with: injectionBag)
Kateryna Kostiukcbb49ec2024-03-19 09:06:49 -040078 conversationVM.conversation = ConversationModel()
Kateryna Kostiuka23348e2023-03-09 14:21:55 -050079 dataSource = TestableFilteredDataSource(conversations: [conversationVM])
80 searchViewModel = JamiSearchViewModel(with: injectionBag, source: dataSource)
81 }
82
83 override func tearDownWithError() throws {
84 try super.tearDownWithError()
85 conversationVM = nil
86 injectionBag = nil
87 dataSource = nil
88 searchViewModel = nil
89 }
90
91 func createSwarmConversation(jamiId: String, type: ConversationType) -> ConversationModel {
92 let conversation = ConversationModel(withId: "", accountId: "", info: [:])
93 conversation.type = type
94 let participants = [["uri": jamiId]]
95 conversation.addParticipantsFromArray(participantsInfo: participants, accountURI: "")
96 return conversation
97 }
98
99 func createSwarmInfo(jamiId: String, name: String, containsSearchQuery: Bool, hasParticipantWithRegisteredName: Bool) -> TestableSwarmInfo {
100 let participant = ParticipantInfo(jamiId: jamiId, role: .admin)
101 participant.registeredName.accept(name)
102 let swarmInfo = TestableSwarmInfo(participants: [participant], containsSearchQuery: containsSearchQuery, hasParticipantWithRegisteredName: hasParticipantWithRegisteredName)
103 return swarmInfo
104 }
105
106 func testConversationExists_ForOneToOneConversation_QueryIsHash_Exists() {
107 // Arrange
108 let conversation = self.createSwarmConversation(jamiId: jamiId1, type: .oneToOne)
Kateryna Kostiukcbb49ec2024-03-19 09:06:49 -0400109 conversationVM.conversation = conversation
Kateryna Kostiuka23348e2023-03-09 14:21:55 -0500110 // Act
111 let searchQuery = jamiId1
112 let result = searchViewModel.isConversationExists(for: searchQuery)
113 // Assert
114 XCTAssertTrue(result)
115
116 }
117
118 func testConversationExists_ForOneToOneConversation_QueryIsHash_DoesNotExist() {
119 // Arrange
120 let conversation = self.createSwarmConversation(jamiId: jamiId1, type: .oneToOne)
Kateryna Kostiukcbb49ec2024-03-19 09:06:49 -0400121 conversationVM.conversation = conversation
Kateryna Kostiuka23348e2023-03-09 14:21:55 -0500122 // Act
123 let searchQuery = jamiId2
124 let result = searchViewModel.isConversationExists(for: searchQuery)
125 // Assert
126 XCTAssertFalse(result)
127 }
128
129 func testConversationExists_ForOneToOneConversation_QueryIsRegisteredName_Exists() {
130 // Arrange
131 let conversation = self.createSwarmConversation(jamiId: jamiId1, type: .oneToOne)
Kateryna Kostiukcbb49ec2024-03-19 09:06:49 -0400132 conversationVM.conversation = conversation
Kateryna Kostiuka23348e2023-03-09 14:21:55 -0500133 let swarmInfo = self.createSwarmInfo(jamiId: jamiId1, name: registeredName1, containsSearchQuery: true, hasParticipantWithRegisteredName: true)
134 conversationVM.swarmInfo = swarmInfo
135 // Act
136 let searchQuery = registeredName1
137 let result = searchViewModel.isConversationExists(for: searchQuery)
138 // Assert
139 XCTAssertTrue(result)
140 }
141
142 func testConversationExists_PrivateConversation_QueryIsRegisteredName_Exists() {
143 // Arrange
144 let conversation = self.createSwarmConversation(jamiId: jamiId1, type: .invitesOnly)
Kateryna Kostiukcbb49ec2024-03-19 09:06:49 -0400145 conversationVM.conversation = conversation
Kateryna Kostiuka23348e2023-03-09 14:21:55 -0500146 let swarmInfo = self.createSwarmInfo(jamiId: jamiId1, name: registeredName1, containsSearchQuery: true, hasParticipantWithRegisteredName: true)
147 conversationVM.swarmInfo = swarmInfo
148 // Act
149 let searchQuery = registeredName1
150 let result = searchViewModel.isConversationExists(for: searchQuery)
151 // Assert
152 XCTAssertFalse(result)
153 }
154
155 func testConversationExists_PrivateConversation_QueryIsRegisteredName_DoesNotExist() {
156 // Arrange
157 let conversation = self.createSwarmConversation(jamiId: jamiId1, type: .invitesOnly)
Kateryna Kostiukcbb49ec2024-03-19 09:06:49 -0400158 conversationVM.conversation = conversation
Kateryna Kostiuka23348e2023-03-09 14:21:55 -0500159 let swarmInfo = self.createSwarmInfo(jamiId: jamiId1, name: registeredName1, containsSearchQuery: false, hasParticipantWithRegisteredName: false)
160 conversationVM.swarmInfo = swarmInfo
161 // Act
162 let searchQuery = registeredName2
163 let result = searchViewModel.isConversationExists(for: searchQuery)
164 // Assert
165 XCTAssertFalse(result)
166 }
167
168 func testConversationExists_PrivateConversation_QueryIsHash_DoesNotExist() {
169 // Arrange
170 let conversation = self.createSwarmConversation(jamiId: jamiId1, type: .invitesOnly)
Kateryna Kostiukcbb49ec2024-03-19 09:06:49 -0400171 conversationVM.conversation = conversation
Kateryna Kostiuka23348e2023-03-09 14:21:55 -0500172 // Act
173 let searchQuery = jamiId2
174 let result = searchViewModel.isConversationExists(for: searchQuery)
175 // Assert
176 XCTAssertFalse(result)
177 }
178
179 func testConversationExists_PrivateConversation_QueryIsHash_Exists() {
180 // Arrange
181 let conversation = self.createSwarmConversation(jamiId: jamiId1, type: .invitesOnly)
Kateryna Kostiukcbb49ec2024-03-19 09:06:49 -0400182 conversationVM.conversation = conversation
Kateryna Kostiuka23348e2023-03-09 14:21:55 -0500183 // Act
184 let searchQuery = jamiId1
185 let result = searchViewModel.isConversationExists(for: searchQuery)
186 // Assert
187 XCTAssertFalse(result)
188 }
189
190 func testConversationExists_ForOneToOneConversation_QueryIsRegisteredName_DoesNotExist() {
191 // Arrange
192 let conversation = self.createSwarmConversation(jamiId: jamiId1, type: .oneToOne)
Kateryna Kostiukcbb49ec2024-03-19 09:06:49 -0400193 conversationVM.conversation = conversation
Kateryna Kostiuka23348e2023-03-09 14:21:55 -0500194 let swarmInfo = self.createSwarmInfo(jamiId: jamiId1, name: registeredName1, containsSearchQuery: false, hasParticipantWithRegisteredName: false)
195 conversationVM.swarmInfo = swarmInfo
196 // Act
197 let searchQuery = registeredName2
198 let result = searchViewModel.isConversationExists(for: searchQuery)
199 // Assert
200 XCTAssertFalse(result)
201 }
202
203 func testConversationMatch_OneToOneConversation_QueryIsHash_Match() {
204 // Arrange
205 let conversation = self.createSwarmConversation(jamiId: jamiId1, type: .oneToOne)
Kateryna Kostiukcbb49ec2024-03-19 09:06:49 -0400206 conversationVM.conversation = conversation
Kateryna Kostiuka23348e2023-03-09 14:21:55 -0500207 // Act
208 let searchQuery = jamiId1
209 let result = searchViewModel.isConversation(conversationVM, match: searchQuery)
210 // Assert
211 XCTAssertTrue(result)
212 }
213
214 func testConversationMatch_OneToOneConversation_QueryIsRegisteredName_Match() {
215 // Arrange
216 let conversation = self.createSwarmConversation(jamiId: jamiId1, type: .oneToOne)
Kateryna Kostiukcbb49ec2024-03-19 09:06:49 -0400217 conversationVM.conversation = conversation
Kateryna Kostiuka23348e2023-03-09 14:21:55 -0500218 let swarmInfo = self.createSwarmInfo(jamiId: jamiId1, name: registeredName1, containsSearchQuery: true, hasParticipantWithRegisteredName: true)
219 conversationVM.swarmInfo = swarmInfo
220 // Act
221 let searchQuery = registeredName1
222 let result = searchViewModel.isConversation(conversationVM, match: searchQuery)
223 // Assert
224 XCTAssertTrue(result)
225 }
226
227 func testConversationMatch_PrivateConversation_QueryIsRegisteredName_Match() {
228 // Arrange
229 let conversation = self.createSwarmConversation(jamiId: jamiId1, type: .invitesOnly)
Kateryna Kostiukcbb49ec2024-03-19 09:06:49 -0400230 conversationVM.conversation = conversation
Kateryna Kostiuka23348e2023-03-09 14:21:55 -0500231 let swarmInfo = self.createSwarmInfo(jamiId: jamiId1, name: registeredName1, containsSearchQuery: true, hasParticipantWithRegisteredName: true)
232 conversationVM.swarmInfo = swarmInfo
233 // Act
234 let searchQuery = registeredName1
235 let result = searchViewModel.isConversation(conversationVM, match: searchQuery)
236 // Assert
237 XCTAssertFalse(result)
238 }
239
240 func testConversationMatch_SwarmConversation_QueryIsRegisteredName_DoesNotMatch() {
241 // Arrange
242 let conversation = self.createSwarmConversation(jamiId: jamiId1, type: .oneToOne)
Kateryna Kostiukcbb49ec2024-03-19 09:06:49 -0400243 conversationVM.conversation = conversation
Kateryna Kostiuka23348e2023-03-09 14:21:55 -0500244 let swarmInfo = self.createSwarmInfo(jamiId: jamiId1, name: registeredName1, containsSearchQuery: false, hasParticipantWithRegisteredName: false)
245 conversationVM.swarmInfo = swarmInfo
246 // Act
247 let searchQuery = registeredName1 + "1"
248 let result = searchViewModel.isConversation(conversationVM, match: searchQuery)
249 // Assert
250 XCTAssertFalse(result)
251 }
252
253 func testConversationMatch_SipConversation_Match() {
254 // Arrange
255 let uri = JamiURI(schema: .sip, infoHash: sipTestNumber1)
256 let conversation = ConversationModel(withParticipantUri: uri, accountId: "", hash: sipTestNumber1)
Kateryna Kostiukcbb49ec2024-03-19 09:06:49 -0400257 conversationVM.conversation = conversation
Kateryna Kostiuka23348e2023-03-09 14:21:55 -0500258 conversationVM.userName.accept(sipTestNumber1)
259 // Act
260 let searchQuery = sipTestNumber1
261 let result = searchViewModel.isConversation(conversationVM, match: searchQuery)
262 // Assert
263 XCTAssertTrue(result)
264 }
265
266 func testConversationMatch_SipConversation_DoesNotMatch() {
267 // Arrange
268 let uri = JamiURI(schema: .sip, infoHash: sipTestNumber1)
269 let conversation = ConversationModel(withParticipantUri: uri, accountId: "", hash: sipTestNumber1)
Kateryna Kostiukcbb49ec2024-03-19 09:06:49 -0400270 conversationVM.conversation = conversation
Kateryna Kostiuka23348e2023-03-09 14:21:55 -0500271 conversationVM.userName.accept(sipTestNumber1)
272 // Act
273 let searchQuery = sipTestNumber1 + "1"
274 let result = searchViewModel.isConversation(conversationVM, match: searchQuery)
275 // Assert
276 XCTAssertFalse(result)
277 }
278
279 func testConversationMatch_PrivateConversaion_QueryIsHash() {
280 // Arrange
281 let conversation = self.createSwarmConversation(jamiId: jamiId1, type: .invitesOnly)
Kateryna Kostiukcbb49ec2024-03-19 09:06:49 -0400282 conversationVM.conversation = conversation
Kateryna Kostiuka23348e2023-03-09 14:21:55 -0500283 // Act
284 let searchQuery = jamiId1
285 let result = searchViewModel.isConversation(conversationVM, match: searchQuery)
286 // Assert
287 XCTAssertFalse(result)
288 }
289
290 func testConversationContains_PrivateConversation_QueryIsRegisteredName_Contains() {
291 // Arrange
292 let conversation = self.createSwarmConversation(jamiId: jamiId1, type: .invitesOnly)
Kateryna Kostiukcbb49ec2024-03-19 09:06:49 -0400293 conversationVM.conversation = conversation
Kateryna Kostiuka23348e2023-03-09 14:21:55 -0500294 let swarmInfo = self.createSwarmInfo(jamiId: jamiId1, name: registeredName1, containsSearchQuery: true, hasParticipantWithRegisteredName: true)
295 conversationVM.swarmInfo = swarmInfo
296 // Act
297 let searchQuery = registeredName1
298 let result = searchViewModel.isConversation(conversationVM, contains: searchQuery)
299 // Assert
300 XCTAssertTrue(result)
301 }
302
303 func testConversationContains_SipConversation_Contains() {
304 // Arrange
305 let uri = JamiURI(schema: .sip, infoHash: sipTestNumber1)
306 let conversation = ConversationModel(withParticipantUri: uri, accountId: "", hash: sipTestNumber1)
Kateryna Kostiukcbb49ec2024-03-19 09:06:49 -0400307 conversationVM.conversation = conversation
Kateryna Kostiuka23348e2023-03-09 14:21:55 -0500308 conversationVM.userName.accept(sipTestNumber1)
309 // Act
310 let searchQuery = sipTestNumber1
311 let result = searchViewModel.isConversation(conversationVM, contains: searchQuery)
312 // Assert
313 XCTAssertTrue(result)
314 }
315
316 func testTemporaryConversationExist_True() {
317 // Arrange
318 let conversation = self.createSwarmConversation(jamiId: jamiId1, type: .oneToOne)
319 conversationVM = ConversationViewModel(with: injectionBag)
Kateryna Kostiukcbb49ec2024-03-19 09:06:49 -0400320 conversationVM.conversation = conversation
Kateryna Kostiuka23348e2023-03-09 14:21:55 -0500321 searchViewModel.temporaryConversation.accept(conversationVM)
322 // Act
323 let result = searchViewModel.temporaryConversationExists(for: jamiId1)
324 // Assert
325 XCTAssertTrue(result)
326 }
327
328 func testTemporaryConversationExist_False() {
329 // Arrange
330 let conversation = self.createSwarmConversation(jamiId: jamiId1, type: .oneToOne)
331 conversationVM = ConversationViewModel(with: injectionBag)
Kateryna Kostiukcbb49ec2024-03-19 09:06:49 -0400332 conversationVM.conversation = conversation
Kateryna Kostiuka23348e2023-03-09 14:21:55 -0500333 searchViewModel.temporaryConversation.accept(conversationVM)
334 // Act
335 let result = searchViewModel.temporaryConversationExists(for: jamiId2)
336 // Assert
337 XCTAssertFalse(result)
338 }
339}