Skip to content

Commit 465f0ac

Browse files
committed
Fix MemberListState processing of batch updates
1 parent 0b18189 commit 465f0ac

File tree

2 files changed

+32
-21
lines changed

2 files changed

+32
-21
lines changed

stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/internal/state/MemberListStateImpl.kt

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package io.getstream.feeds.android.client.internal.state
1717

18+
import io.getstream.android.core.api.sort.CompositeComparator
1819
import io.getstream.android.core.api.sort.Sort
1920
import io.getstream.feeds.android.client.api.model.FeedMemberData
2021
import io.getstream.feeds.android.client.api.model.ModelUpdates
@@ -93,14 +94,19 @@ internal class MemberListStateImpl(override val query: MembersQuery) : MemberLis
9394
val updatesMap = updates.updated.associateBy(FeedMemberData::id)
9495

9596
_members.update { current ->
96-
// Apply updates and filter out removed members in a single pass
97-
current.mapNotNull { member ->
98-
if (member.id in updates.removedIds) {
99-
null
100-
} else {
101-
updatesMap[member.id] ?: member
97+
current
98+
.mapNotNullTo(mutableListOf()) { member ->
99+
// Apply updates and filter out removed members in a single pass
100+
if (member.id in updates.removedIds) {
101+
null
102+
} else {
103+
updatesMap[member.id] ?: member
104+
}
105+
}
106+
.apply {
107+
addAll(updates.added)
108+
sortWith(CompositeComparator(membersSorting))
102109
}
103-
}
104110
}
105111
}
106112

stream-feeds-android-client/src/test/kotlin/io/getstream/feeds/android/client/internal/state/MemberListStateImplTest.kt

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import io.getstream.feeds.android.client.api.state.query.MembersQueryConfig
2525
import io.getstream.feeds.android.client.api.state.query.MembersSort
2626
import io.getstream.feeds.android.client.internal.test.TestData.defaultPaginationResult
2727
import io.getstream.feeds.android.client.internal.test.TestData.feedMemberData
28+
import java.util.Date
2829
import kotlinx.coroutines.test.runTest
2930
import org.junit.Assert.assertEquals
3031
import org.junit.Assert.assertNull
@@ -61,9 +62,8 @@ internal class MemberListStateImplTest {
6162
val updatedMember = feedMemberData("user-1", role = "admin")
6263
memberListState.onMemberUpdated(updatedMember)
6364

64-
val updatedMembers = memberListState.members.value
65-
assertEquals(updatedMember, updatedMembers.find { it.id == updatedMember.id })
66-
assertEquals(initialMembers[1], updatedMembers.find { it.id == initialMembers[1].id })
65+
val expectedMembers = listOf(updatedMember, initialMembers[1])
66+
assertEquals(expectedMembers, memberListState.members.value)
6767
}
6868

6969
@Test
@@ -79,22 +79,29 @@ internal class MemberListStateImplTest {
7979
}
8080

8181
@Test
82-
fun `on membersUpdated, then apply multiple updates`() = runTest {
83-
val initialMembers = listOf(feedMemberData(), feedMemberData("user-2"))
82+
fun `on membersUpdated, then apply add update and remove operations`() = runTest {
83+
val initialMembers =
84+
listOf(
85+
feedMemberData("user-3", createdAt = Date(3000)),
86+
feedMemberData("user-2", createdAt = Date(2000)),
87+
feedMemberData("user-1", createdAt = Date(1000)),
88+
)
8489
val paginationResult = defaultPaginationResult(initialMembers)
8590
memberListState.onQueryMoreMembers(paginationResult, queryConfig)
8691

87-
val updatedMember = feedMemberData("user-1", role = "admin")
92+
val updatedMember = feedMemberData("user-1", role = "admin", createdAt = Date(5000))
93+
val newMember = feedMemberData("user-4", createdAt = Date(4000))
8894
val updates =
8995
ModelUpdates(
90-
added = emptyList(),
96+
added = listOf(newMember),
9197
updated = listOf(updatedMember),
92-
removedIds = listOf(initialMembers[1].id),
98+
removedIds = listOf("user-2"),
9399
)
94100
memberListState.onMembersUpdated(updates)
95101

96-
val finalMembers = memberListState.members.value
97-
assertEquals(listOf(updatedMember), finalMembers)
102+
// Members should be sorted by createdAt in descending order
103+
val expectedMembers = listOf(updatedMember, newMember, initialMembers[0])
104+
assertEquals(expectedMembers, memberListState.members.value)
98105
}
99106

100107
@Test
@@ -119,10 +126,8 @@ internal class MemberListStateImplTest {
119126
val updatedMember = feedMemberData("user-1", role = "admin")
120127
memberListState.onMemberAdded(updatedMember)
121128

122-
val updatedMembers = memberListState.members.value
123-
assertEquals(2, updatedMembers.size)
124-
assertEquals(updatedMember, updatedMembers.find { it.id == updatedMember.id })
125-
assertEquals(initialMembers[1], updatedMembers.find { it.id == initialMembers[1].id })
129+
val expectedMembers = listOf(updatedMember, initialMembers[1])
130+
assertEquals(expectedMembers, memberListState.members.value)
126131
}
127132

128133
@Test

0 commit comments

Comments
 (0)