Skip to content

Commit 30fec46

Browse files
committed
Update unit tests for GroupChannelEditViewModel and AddMembersViewController to cover edge cases.
- Add test to verify that `GroupChannelEditViewModel` ignores duplicate gallery imports while an import is already in progress. - Add test to ensure `GroupChannelEditViewModel` preserves the existing pending image state if a gallery import fails. - Add test to confirm that `AddMembersViewController` cancels ongoing `LoadMore` jobs when the search query is changed.
1 parent 189f535 commit 30fec46

2 files changed

Lines changed: 65 additions & 0 deletions

File tree

stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/viewmodel/channel/GroupChannelEditViewModelTest.kt

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,44 @@ internal class GroupChannelEditViewModelTest {
141141
}
142142
}
143143

144+
@Test
145+
fun `duplicate gallery import is ignored while already importing`() = runTest {
146+
val copyEntered = CountDownLatch(1)
147+
val unblockCopy = CountDownLatch(1)
148+
val copyCount = java.util.concurrent.atomic.AtomicInteger(0)
149+
val blockingCopier = GalleryImageCopier {
150+
copyCount.incrementAndGet()
151+
copyEntered.countDown()
152+
unblockCopy.await()
153+
File.createTempFile("gallery", ".jpg").also { it.deleteOnExit() }
154+
}
155+
val sut = Fixture(galleryImageCopier = blockingCopier).get()
156+
157+
sut.importGalleryImage(Uri.parse("content://first"))
158+
assertTrue(copyEntered.await(5, TimeUnit.SECONDS))
159+
160+
sut.importGalleryImage(Uri.parse("content://second"))
161+
unblockCopy.countDown()
162+
163+
assertEquals(1, copyCount.get())
164+
}
165+
166+
@Test
167+
fun `gallery import failure preserves existing pending image`() = runTest {
168+
val existingFile = File.createTempFile("existing", ".jpg").also { it.deleteOnExit() }
169+
val failingCopier = GalleryImageCopier { null }
170+
val sut = Fixture(galleryImageCopier = failingCopier).get()
171+
172+
sut.setPendingImage(existingFile)
173+
sut.importGalleryImage(Uri.parse("content://bad"))
174+
175+
sut.state.test {
176+
val state = awaitItem()
177+
assertEquals(existingFile, state.pendingImageFile)
178+
assertFalse(state.removeImage)
179+
}
180+
}
181+
144182
@Test
145183
fun `save is ignored while gallery import is in progress`() = runTest {
146184
val copyEntered = CountDownLatch(1)

stream-chat-android-ui-common/src/test/kotlin/io/getstream/chat/android/ui/common/feature/channel/info/AddMembersViewControllerTest.kt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,33 @@ internal class AddMembersViewControllerTest {
247247
}
248248
}
249249

250+
@Test
251+
fun `QueryChanged after LoadMore cancels loadMore job`() = runTest {
252+
val initialUsers = listOf(randomUser(), randomUser())
253+
val moreUsers = listOf(randomUser())
254+
val newSearchUsers = listOf(randomUser())
255+
val sut = Fixture()
256+
.givenQueryUsers(users = initialUsers) // initial search
257+
.givenQueryUsers(users = moreUsers) // loadMore
258+
.givenQueryUsers(users = newSearchUsers) // new search after query change
259+
.get(backgroundScope)
260+
261+
sut.state.test {
262+
skipItems(2) // initial state + initial search result
263+
264+
sut.onViewAction(AddMembersViewAction.LoadMore)
265+
skipItems(2) // isLoadingMore + loadMore result
266+
267+
sut.onViewAction(AddMembersViewAction.QueryChanged("new"))
268+
skipItems(1) // query state update
269+
270+
assertTrue(awaitItem().isLoading)
271+
val state = awaitItem()
272+
assertFalse(state.isLoading)
273+
assertEquals(newSearchUsers, state.searchResult)
274+
}
275+
}
276+
250277
@Test
251278
fun `LoadMore appends results to searchResult`() = runTest {
252279
val initialUsers = listOf(randomUser(), randomUser())

0 commit comments

Comments
 (0)