From f5c43ed68f356f77e10cc04d178850439ed9ed41 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Mon, 26 Feb 2024 14:01:41 +0200 Subject: [PATCH] Fix flakiness for tests that rely on room members loading quickly. --- .../RoomScreen/RoomScreenViewModel.swift | 19 +++++++++++-------- .../test_readReceiptsSummaryView.1.png | 4 ++-- .../RoomMembersListViewModelTests.swift | 6 +++--- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift b/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift index 43a01f02d..01a9adf0e 100644 --- a/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift @@ -110,6 +110,8 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol } buildTimelineViews() + + updateMembers(roomProxy.membersPublisher.value) // Note: beware if we get to e.g. restore a reply / edit, // maybe we are tracking a non-needed first initial state @@ -269,7 +271,13 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol Task { await roomScreenInteractionHandler.scrubVoiceMessagePlayback(scrubbing: scrubbing) } } } - + + private func updateMembers(_ members: [RoomMemberProxyProtocol]) { + state.members = members.reduce(into: [String: RoomMemberState]()) { dictionary, member in + dictionary[member.userID] = RoomMemberState(displayName: member.displayName, avatarURL: member.avatarURL) + } + } + private func setupSubscriptions() { timelineController.callbacks .receive(on: DispatchQueue.main) @@ -318,15 +326,10 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol appSettings.$sharePresence .weakAssign(to: \.state.showReadReceipts, on: self) .store(in: &cancellables) - + roomProxy.membersPublisher - .map { members in - members.reduce(into: [String: RoomMemberState]()) { dictionary, member in - dictionary[member.userID] = RoomMemberState(displayName: member.displayName, avatarURL: member.avatarURL) - } - } .receive(on: DispatchQueue.main) - .weakAssign(to: \.state.members, on: self) + .sink { [weak self] in self?.updateMembers($0) } .store(in: &cancellables) roomProxy.typingMembersPublisher diff --git a/PreviewTests/__Snapshots__/PreviewTests/test_readReceiptsSummaryView.1.png b/PreviewTests/__Snapshots__/PreviewTests/test_readReceiptsSummaryView.1.png index 33f436fa5..ff1193044 100644 --- a/PreviewTests/__Snapshots__/PreviewTests/test_readReceiptsSummaryView.1.png +++ b/PreviewTests/__Snapshots__/PreviewTests/test_readReceiptsSummaryView.1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:15512881ca14cf2eae9556c280880243cc619817f87e27ed05887c07e8f21329 -size 112214 +oid sha256:8f7b0844007df5ea840a959b85171d3c256cf091a69972a1f7f30c0c2280958e +size 125301 diff --git a/UnitTests/Sources/RoomMembersListViewModelTests.swift b/UnitTests/Sources/RoomMembersListViewModelTests.swift index 3681a7c69..7eca3ce0c 100644 --- a/UnitTests/Sources/RoomMembersListViewModelTests.swift +++ b/UnitTests/Sources/RoomMembersListViewModelTests.swift @@ -128,7 +128,7 @@ class RoomMembersListScreenViewModelTests: XCTestCase { func testKickMember() async throws { setup(with: .allMembers) - var deferred = deferFulfillment(context.$viewState) { !$0.visibleJoinedMembers.isEmpty } + let deferred = deferFulfillment(context.$viewState) { !$0.visibleJoinedMembers.isEmpty } try await deferred.fulfill() context.send(viewAction: .kickMember(viewModel.state.visibleJoinedMembers[0])) @@ -141,7 +141,7 @@ class RoomMembersListScreenViewModelTests: XCTestCase { func testBanMember() async throws { setup(with: .allMembers) - var deferred = deferFulfillment(context.$viewState) { !$0.visibleJoinedMembers.isEmpty } + let deferred = deferFulfillment(context.$viewState) { !$0.visibleJoinedMembers.isEmpty } try await deferred.fulfill() context.send(viewAction: .banMember(viewModel.state.visibleJoinedMembers[0])) @@ -154,7 +154,7 @@ class RoomMembersListScreenViewModelTests: XCTestCase { func testUnbanMember() async throws { setup(with: .allMembers) - var deferred = deferFulfillment(context.$viewState) { !$0.visibleJoinedMembers.isEmpty } + let deferred = deferFulfillment(context.$viewState) { !$0.visibleJoinedMembers.isEmpty } try await deferred.fulfill() context.send(viewAction: .unbanMember(viewModel.state.visibleJoinedMembers[0]))