Skip to content

Commit b08015a

Browse files
committed
add Tests for CallViewModel
Signed-off-by: Marcel Hibbe <[email protected]>
1 parent 00a3048 commit b08015a

File tree

2 files changed

+131
-1
lines changed

2 files changed

+131
-1
lines changed

app/src/main/java/com/nextcloud/talk/activities/CallViewModel.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,9 @@ class CallViewModel @Inject constructor() : ViewModel() {
7373
}
7474
}
7575

76-
override fun onCleared() {
76+
public override fun onCleared() {
7777
participantHandlers.values.forEach { it.destroy() }
78+
participantHandlers.clear()
79+
_participants.value = emptyList()
7880
}
7981
}
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
/*
2+
* Nextcloud Talk - Android Client
3+
*
4+
* SPDX-FileCopyrightText: 2025 Marcel Hibbe <[email protected]>
5+
* SPDX-License-Identifier: GPL-3.0-or-later
6+
*/
7+
package com.nextcloud.talk.activities
8+
9+
import com.nextcloud.talk.signaling.SignalingMessageReceiver
10+
import kotlinx.coroutines.Dispatchers
11+
import kotlinx.coroutines.ExperimentalCoroutinesApi
12+
import kotlinx.coroutines.test.StandardTestDispatcher
13+
import kotlinx.coroutines.test.TestScope
14+
import kotlinx.coroutines.test.runTest
15+
import kotlinx.coroutines.test.setMain
16+
import org.junit.Assert.assertEquals
17+
import org.junit.Assert.assertFalse
18+
import org.junit.Assert.assertNotNull
19+
import org.junit.Assert.assertNull
20+
import org.junit.Assert.assertTrue
21+
import org.junit.Before
22+
import org.junit.Test
23+
import org.mockito.kotlin.mock
24+
25+
@OptIn(ExperimentalCoroutinesApi::class)
26+
class CallViewModelTest {
27+
28+
private lateinit var viewModel: CallViewModel
29+
private val testDispatcher = StandardTestDispatcher()
30+
private val testScope = TestScope(testDispatcher)
31+
32+
@Before
33+
fun setup() {
34+
Dispatchers.setMain(testDispatcher)
35+
viewModel = CallViewModel()
36+
}
37+
38+
@Test
39+
fun `addParticipant adds new participant and updates participants list`() =
40+
testScope.runTest {
41+
val sessionId = "session1"
42+
val mockReceiver = mock<SignalingMessageReceiver>()
43+
44+
viewModel.addParticipant(sessionId, mockReceiver)
45+
testDispatcher.scheduler.advanceUntilIdle()
46+
47+
assertTrue(viewModel.doesParticipantExist(sessionId))
48+
assertTrue(viewModel.participants.value.any { it.sessionKey == sessionId })
49+
}
50+
51+
@Test
52+
fun `doesParticipantExist returns true when participant is added`() {
53+
val sessionId = "session2"
54+
val receiver = mock<SignalingMessageReceiver>()
55+
56+
viewModel.addParticipant(sessionId, receiver)
57+
assertTrue(viewModel.doesParticipantExist(sessionId))
58+
}
59+
60+
@Test
61+
fun `doesParticipantExist returns false for unknown participant`() {
62+
assertFalse(viewModel.doesParticipantExist("unknown"))
63+
}
64+
65+
@Test
66+
fun `onShareScreen sets active screen share session`() {
67+
val sessionId = "screen1"
68+
val receiver = mock<SignalingMessageReceiver>()
69+
viewModel.addParticipant(sessionId, receiver)
70+
viewModel.onShareScreen(sessionId)
71+
72+
val activeSession = viewModel.activeScreenShareSession.value
73+
assertEquals(sessionId, activeSession?.sessionKey)
74+
}
75+
76+
@Test
77+
fun `onUnshareScreen clears active session when same session unshares`() {
78+
val sessionId = "screen2"
79+
val receiver = mock<SignalingMessageReceiver>()
80+
viewModel.addParticipant(sessionId, receiver)
81+
viewModel.onShareScreen(sessionId)
82+
viewModel.onUnshareScreen(sessionId)
83+
84+
assertNull(viewModel.activeScreenShareSession.value)
85+
}
86+
87+
@Test
88+
fun `removeParticipant removes participant and updates participants list`() =
89+
testScope.runTest {
90+
val sessionId = "session3"
91+
val receiver = mock<SignalingMessageReceiver>()
92+
93+
viewModel.addParticipant(sessionId, receiver)
94+
viewModel.removeParticipant(sessionId)
95+
96+
assertFalse(viewModel.doesParticipantExist(sessionId))
97+
assertTrue(viewModel.participants.value.isEmpty())
98+
}
99+
100+
@Test
101+
fun `setActiveScreenShareSession sets proper participant`() {
102+
val sessionId = "screen3"
103+
val receiver = mock<SignalingMessageReceiver>()
104+
105+
viewModel.addParticipant(sessionId, receiver)
106+
viewModel.setActiveScreenShareSession(sessionId)
107+
108+
val active = viewModel.activeScreenShareSession.value
109+
assertNotNull(active)
110+
assertEquals(sessionId, active?.sessionKey)
111+
}
112+
113+
@Test
114+
fun `onCleared destroys all participant handlers`() =
115+
testScope.runTest {
116+
val sessionId = "session1"
117+
val mockReceiver = mock<SignalingMessageReceiver>()
118+
119+
viewModel.addParticipant(sessionId, mockReceiver)
120+
testDispatcher.scheduler.advanceUntilIdle()
121+
122+
assertEquals(1, viewModel.participants.value.size)
123+
124+
viewModel.onCleared()
125+
126+
assertEquals(0, viewModel.participants.value.size)
127+
}
128+
}

0 commit comments

Comments
 (0)