Skip to content

Commit 9495625

Browse files
committed
T10203244: archiving of chat/past meetings seems to be broken [4fec198]
1 parent aef99af commit 9495625

File tree

9 files changed

+84
-51
lines changed

9 files changed

+84
-51
lines changed

MEGAData/Repository/Chat/ChatRepository.swift

+8-7
Original file line numberDiff line numberDiff line change
@@ -125,13 +125,14 @@ public final class ChatRepository: ChatRepositoryProtocol {
125125
chatSDK.firstActiveCall?.toCallEntity()
126126
}
127127

128-
public func chatsList(ofType type: ChatTypeEntity) -> [ChatListItemEntity]? {
129-
guard let chatList = chatSDK.chatListItems(by: type.toMEGAChatType()) else { return nil }
130-
var chatListItems = [ChatListItemEntity]()
131-
for i in 0 ..< chatList.size {
132-
chatListItems.append(chatList.chatListItem(at: i).toChatListItemEntity())
133-
}
134-
return chatListItems
128+
public func fetchMeetings() -> [ChatListItemEntity]? {
129+
guard let chatList = chatSDK.chatListItems(by: [.meetingOrNonMeeting, .archivedOrNonArchived], filter: .meeting) else { return nil }
130+
return (0..<chatList.size).map { chatList.chatListItem(at: $0).toChatListItemEntity() }
131+
}
132+
133+
public func fetchNonMeetings() -> [ChatListItemEntity]? {
134+
guard let chatList = chatSDK.chatListItems(by: [.meetingOrNonMeeting, .archivedOrNonArchived], filter: []) else { return nil }
135+
return (0..<chatList.size).map { chatList.chatListItem(at: $0).toChatListItemEntity() }
135136
}
136137

137138
public func isCallInProgress(for chatRoomId: HandleEntity) -> Bool {

MEGAUnitTests/Chat/ChatRoomsListViewModelTests.swift

+41-32
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,12 @@ import Combine
66

77
final class ChatRoomsListViewModelTests: XCTestCase {
88
var subscription: AnyCancellable?
9-
let chatsListMock = [ChatListItemEntity(chatId: 1, title: "Chat1"), ChatListItemEntity(chatId: 3, title: "Chat2"), ChatListItemEntity(chatId: 67, title: "Chat3")]
10-
let meetingsListMock = [ChatListItemEntity(chatId: 11, title: "Meeting 1"), ChatListItemEntity(chatId: 14, title: "Meeting 2"), ChatListItemEntity(chatId: 51, title: "Meeting 3")]
9+
let chatsListMock = [ChatListItemEntity(chatId: 1, title: "Chat1"),
10+
ChatListItemEntity(chatId: 3, title: "Chat2"),
11+
ChatListItemEntity(chatId: 67, title: "Chat3")]
12+
let meetingsListMock = [ChatListItemEntity(chatId: 11, title: "Meeting 1", meeting: true),
13+
ChatListItemEntity(chatId: 14, title: "Meeting 2", meeting: true),
14+
ChatListItemEntity(chatId: 51, title: "Meeting 3", meeting: true)]
1115

1216
func test_remoteChatStatusChange() {
1317
let userHandle: HandleEntity = 100
@@ -53,25 +57,6 @@ final class ChatRoomsListViewModelTests: XCTestCase {
5357
XCTAssert(router.presentStartConversation_calledTimes == 1)
5458
}
5559

56-
func testAction_selectChatsMode() {
57-
let viewModel = ChatRoomsListViewModel(
58-
chatUseCase: MockChatUseCase(items: chatsListMock),
59-
chatViewMode: .meetings
60-
)
61-
62-
viewModel.loadChatRoomsIfNeeded()
63-
viewModel.selectChatMode(.chats)
64-
65-
guard let chatRoomsCount = viewModel.displayChatRooms?.count else {
66-
XCTFail("No Chat Rooms, count should be equal to chatsListMock.count")
67-
return
68-
}
69-
70-
for index in 0..<chatRoomsCount {
71-
XCTAssert(viewModel.displayChatRooms?[index].chatListItem.chatId == chatsListMock[index].chatId)
72-
}
73-
}
74-
7560
func testSelectChatMode_inviteContactNow_shouldMatch() throws {
7661
let router = MockChatRoomsListRouter()
7762
let viewModel = ChatRoomsListViewModel(router: router, chatViewMode: .meetings)
@@ -117,23 +102,47 @@ final class ChatRoomsListViewModelTests: XCTestCase {
117102
XCTAssertTrue(state.description == Strings.Localizable.seeWhoSAlreadyOnMEGA)
118103
}
119104

120-
func testAction_selectMeetingsMode() {
105+
func testSelectChatsMode_inputAsChats_viewModelesShouldMatch() {
106+
let mockList = chatsListMock
121107
let viewModel = ChatRoomsListViewModel(
122-
chatUseCase: MockChatUseCase(items: meetingsListMock),
108+
chatUseCase: MockChatUseCase(items: mockList),
123109
chatViewMode: .meetings
124110
)
125-
126111
viewModel.loadChatRoomsIfNeeded()
127-
viewModel.selectChatMode(.chats)
112+
113+
114+
let expectation = expectation(description: "Compare the past meetings")
115+
subscription = viewModel
116+
.$displayChatRooms
117+
.dropFirst()
118+
.sink {
119+
XCTAssert(mockList.map { ChatRoomViewModel(chatListItem: $0) } == $0)
120+
expectation.fulfill()
121+
}
128122

129-
guard let chatRoomsCount = viewModel.displayChatRooms?.count else {
130-
XCTFail("No Chat Rooms, count should be equal to chatsListMock.count")
131-
return
132-
}
123+
viewModel.selectChatMode(.chats)
124+
wait(for: [expectation], timeout: 6)
125+
}
126+
127+
func testSelectChatsMode_inputAsMeeting_viewModelsShouldMatch() {
128+
let mockList = meetingsListMock
129+
let viewModel = ChatRoomsListViewModel(
130+
chatUseCase: MockChatUseCase(items: mockList),
131+
chatViewMode: .chats
132+
)
133+
viewModel.loadChatRoomsIfNeeded()
133134

134-
for index in 0..<chatRoomsCount {
135-
XCTAssert(viewModel.displayChatRooms?[index].chatListItem.chatId == meetingsListMock[index].chatId)
136-
}
135+
let expectation = expectation(description: "Compare the past meetings")
136+
subscription = viewModel
137+
.$displayPastMeetings
138+
.filter { $0?.count == 3 }
139+
.sink {
140+
XCTAssert(mockList.map { ChatRoomViewModel(chatListItem: $0) } == $0)
141+
expectation.fulfill()
142+
}
143+
144+
viewModel.selectChatMode(.meetings)
145+
wait(for: [expectation], timeout: 6)
137146
}
138147

139148
func test_EmptyChatsList() {

MEGAUnitTests/Meeting/Mocks/ChatRoomViewModel+Additions.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ extension ChatRoomViewModel {
1414
megaHandleUseCase: MEGAHandleUseCaseProtocol = MockMEGAHandleUseCase(),
1515
callUseCase: CallUseCaseProtocol = MockCallUseCase(),
1616
audioSessionUseCase: AudioSessionUseCaseProtocol = MockAudioSessionUseCase(),
17-
scheduledMeetingUseCase: ScheduledMeetingUseCaseProtocol,
17+
scheduledMeetingUseCase: ScheduledMeetingUseCaseProtocol = MockScheduledMeetingUseCase(),
1818
chatNotificationControl: ChatNotificationControl = ChatNotificationControl(delegate: MockPushNotificationControl()),
1919
notificationCenter: NotificationCenter = .default,
2020
isTesting: Bool = true

MEGAUnitTests/Meeting/ScheduleMeetingCreationRecurrenceOptionsViewModelTests.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ final class ScheduleMeetingCreationRecurrenceOptionsViewModelTests: XCTestCase {
333333
let router = ScheduleMeetingCreationRecurrenceOptionsRouter(
334334
presenter: UINavigationController(),
335335
rules: inputRules[0],
336-
startDate: Date.now
336+
startDate: date
337337
)
338338

339339
let expectation = expectation(description: "Selection updated from monthly to daily")

Modules/MEGADomain/Sources/MEGADomain/RepositoryProtocol/Chat/ChatRepositoryProtocol.swift

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ public protocol ChatRepositoryProtocol: RepositoryProtocol {
88
func monitorChatListItemUpdate() -> AnyPublisher<[ChatListItemEntity], Never>
99
func existsActiveCall() -> Bool
1010
func activeCall() -> CallEntity?
11-
func chatsList(ofType type: ChatTypeEntity) -> [ChatListItemEntity]?
11+
func fetchMeetings() -> [ChatListItemEntity]?
12+
func fetchNonMeetings() -> [ChatListItemEntity]?
1213
func isCallInProgress(for chatRoomId: HandleEntity) -> Bool
1314
func myFullName() -> String?
1415
func archivedChatListCount() -> UInt

Modules/MEGADomain/Sources/MEGADomain/UseCase/Chat/ChatUseCase.swift

+8-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ public protocol ChatUseCaseProtocol {
99
func monitorChatListItemUpdate() -> AnyPublisher<[ChatListItemEntity], Never>
1010
func existsActiveCall() -> Bool
1111
func activeCall() -> CallEntity?
12-
func chatsList(ofType type: ChatTypeEntity) -> [ChatListItemEntity]?
12+
func fetchNonMeetings() -> [ChatListItemEntity]?
13+
func fetchMeetings() -> [ChatListItemEntity]?
1314
func isCallInProgress(for chatRoomId: HandleEntity) -> Bool
1415
func myFullName() -> String?
1516
func archivedChatListCount() -> UInt
@@ -59,9 +60,13 @@ public struct ChatUseCase<T: ChatRepositoryProtocol>: ChatUseCaseProtocol {
5960
public func activeCall() -> CallEntity? {
6061
chatRepo.activeCall()
6162
}
63+
64+
public func fetchMeetings() -> [ChatListItemEntity]? {
65+
chatRepo.fetchMeetings()?.sorted(by: { $0.lastMessageDate.compare($1.lastMessageDate) == .orderedDescending })
66+
}
6267

63-
public func chatsList(ofType type: ChatTypeEntity) -> [ChatListItemEntity]? {
64-
chatRepo.chatsList(ofType: type)?.sorted(by: { $0.lastMessageDate.compare($1.lastMessageDate) == .orderedDescending })
68+
public func fetchNonMeetings() -> [ChatListItemEntity]? {
69+
chatRepo.fetchNonMeetings()?.sorted(by: { $0.lastMessageDate.compare($1.lastMessageDate) == .orderedDescending })
6570
}
6671

6772
public func isCallInProgress(for chatRoomId: HandleEntity) -> Bool {

Modules/MEGADomain/Sources/MEGADomainMock/MockUseCases/MockChatUseCase.swift

+5-1
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,11 @@ public final class MockChatUseCase: ChatUseCaseProtocol {
8181
activeCallEntity
8282
}
8383

84-
public func chatsList(ofType type: ChatTypeEntity) -> [ChatListItemEntity]? {
84+
public func fetchNonMeetings() -> [ChatListItemEntity]? {
85+
items
86+
}
87+
88+
public func fetchMeetings() -> [ChatListItemEntity]? {
8589
items
8690
}
8791

iMEGA/Chat/ChatRoomsViewController.m

+16-3
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,7 @@ - (void)viewDidLoad {
110110

111111
switch (self.chatRoomsType) {
112112
case ChatRoomsTypeDefault:
113-
[self configureSelectorViewForChatType:MEGAChatTypeNonMeeting];
114-
self.chatListItemList = [[MEGASdkManager sharedMEGAChatSdk] chatListItemsByType:self.chatTypeSelected];
113+
[self loadChatListItemListForSelectedChatType];
115114
self.archivedChatListItemList = [[MEGASdkManager sharedMEGAChatSdk] archivedChatListItems];
116115
self.addBarButtonItem.enabled = [MEGAReachabilityManager isReachable] && MEGASdkManager.sharedMEGASdk.businessStatus != BusinessStatusExpired;
117116
break;
@@ -646,8 +645,22 @@ - (void)presentGroupOrContactDetailsForChatListItem:(MEGAChatListItem *)chatList
646645
}
647646
}
648647

648+
- (void)loadChatListItemListForSelectedChatType {
649+
if (self.chatTypeSelected == MEGAChatTypeMeeting) {
650+
self.chatListItemList = [MEGAChatSdk.shared chatListItemsByMask:MEGAChatListMaskMeetingOrNonMeeting | MEGAChatListMaskArchivedOrNonArchived
651+
filter:MEGAChatListFilterMeeting | MEGAChatListFilterNonArchived];
652+
} else {
653+
self.chatListItemList = [MEGAChatSdk.shared chatListItemsByMask:MEGAChatListMaskMeetingOrNonMeeting | MEGAChatListMaskArchivedOrNonArchived
654+
filter:MEGAChatListFilterNonMeeting | MEGAChatListFilterNonArchived];
655+
}
656+
}
657+
649658
- (void)reloadData {
650-
self.chatListItemList = self.chatRoomsType == ChatRoomsTypeDefault ? [[MEGASdkManager sharedMEGAChatSdk] chatListItemsByType:self.chatTypeSelected] : [[MEGASdkManager sharedMEGAChatSdk] archivedChatListItems];
659+
if (self.chatRoomsType == ChatRoomsTypeDefault) {
660+
[self loadChatListItemListForSelectedChatType];
661+
} else {
662+
self.chatListItemList = [MEGAChatSdk.shared archivedChatListItems];
663+
}
651664
self.archivedChatListItemList = [[MEGASdkManager sharedMEGAChatSdk] archivedChatListItems];
652665
[self reorderList];
653666
[self updateChatIdIndexPathDictionary];

iMEGA/ChatRoomsListScene/ChatRoomsListViewModel.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ final class ChatRoomsListViewModel: ObservableObject {
298298
private func fetchNonMeetingChats() async {
299299
guard isViewOnScreen else { return }
300300

301-
let chatListItems = chatUseCase.chatsList(ofType: .nonMeeting) ?? []
301+
let chatListItems = chatUseCase.fetchNonMeetings() ?? []
302302
chatRooms = chatListItems.map(constructChatRoomViewModel)
303303

304304
await filterChats()
@@ -310,7 +310,7 @@ final class ChatRoomsListViewModel: ObservableObject {
310310
return
311311
}
312312

313-
let chatListItems = chatUseCase.chatsList(ofType: .meeting) ?? []
313+
let chatListItems = chatUseCase.fetchMeetings() ?? []
314314

315315
fetchFutureScheduledMeetings()
316316

0 commit comments

Comments
 (0)