Accept and decline invites (#806)

* Add accept/decline invite api

* Fix isDirect logic

* Add logic for accepting/decling invites

* Add error handling structure

* Add decline alert

* Add navigation to joined room

* Add generic error

* Add changelog.d file

* Cleanup

* Fix failing UTs

* Add UTs

* Add UI tests

* Cleanup

* Update ref screenshots

* Refactor invitesScreen state

* Improve switch handling in UserSessionFlowCoordinator

* Fix build error
This commit is contained in:
Alfonso Grillo
2023-04-19 17:05:24 +02:00
committed by GitHub
parent 616b8453b5
commit 9921b315b3
21 changed files with 249 additions and 27 deletions
+39 -7
View File
@@ -32,24 +32,56 @@ class InvitesViewModelTests: XCTestCase {
userSession = MockUserSession(clientProxy: clientProxy, mediaProvider: MockMediaProvider())
}
func testEmptyState() throws {
func testEmptyState() async throws {
setupViewModel()
_ = await context.nextViewState()
let invites = try XCTUnwrap(context.viewState.invites)
XCTAssertTrue(invites.isEmpty)
}
func testListState() throws {
let summaryProvider = MockRoomSummaryProvider(state: .loaded(.mockInvites))
clientProxy.invitesSummaryProvider = summaryProvider
clientProxy.visibleRoomsSummaryProvider = summaryProvider
setupViewModel()
func testListState() async throws {
setupViewModel(roomSummaries: .mockInvites)
_ = await context.nextViewState()
let invites = try XCTUnwrap(context.viewState.invites)
XCTAssertEqual(invites.count, 2)
}
func testAcceptInvite() async throws {
let invites: [RoomSummary] = .mockInvites
guard case .filled(let details) = invites.first else {
XCTFail("No invite found")
return
}
setupViewModel(roomSummaries: invites)
context.send(viewAction: .accept(.init(roomDetails: details)))
let action: InvitesViewModelAction? = await viewModel.actions.values.first()
guard case .openRoom(let roomID) = action else {
XCTFail("Wrong view model action")
return
}
XCTAssertEqual(details.id, roomID)
}
func testDeclineInvite() async throws {
let invites: [RoomSummary] = .mockInvites
guard case .filled(let details) = invites.first else {
XCTFail("No invite found")
return
}
setupViewModel(roomSummaries: invites)
context.send(viewAction: .decline(.init(roomDetails: details)))
XCTAssertNotNil(context.alertInfo)
}
// MARK: - Private
private func setupViewModel() {
private func setupViewModel(roomSummaries: [RoomSummary]? = nil) {
if let roomSummaries {
let summaryProvider = MockRoomSummaryProvider(state: .loaded(roomSummaries))
clientProxy.invitesSummaryProvider = summaryProvider
clientProxy.visibleRoomsSummaryProvider = summaryProvider
}
viewModel = InvitesViewModel(userSession: userSession)
}
}