deferFulfillment all the things (#1306)

This commit is contained in:
David Langley 2023-07-12 18:59:46 +01:00 committed by GitHub
parent af699d9a68
commit 3ff257c075
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 101 additions and 82 deletions

View File

@ -71,17 +71,17 @@ class BugReportViewModelTests: XCTestCase {
deviceID: nil,
screenshot: nil, isModallyPresented: false)
let context = viewModel.context
let deferred = deferFulfillment(viewModel.actions.collect(2).first())
context.send(viewAction: .submit)
let actions = try await deferred.fulfill()
_ = await viewModel
.actions
.values
.first {
guard case .submitFinished = $0 else {
return false
}
return true
}
guard case .submitStarted = actions[0] else {
return XCTFail("Action 1 was not .submitFailed")
}
guard case .submitFinished = actions[1] else {
return XCTFail("Action 2 was not .submitFinished")
}
XCTAssert(mockService.submitBugReportProgressListenerCallsCount == 1)
XCTAssert(mockService.submitBugReportProgressListenerReceivedArguments?.bugReport == BugReport(userID: "@mock.client.com", deviceID: nil, text: "", includeLogs: true, includeCrashLog: true, canContact: false, githubLabels: [], files: []))
@ -96,19 +96,20 @@ class BugReportViewModelTests: XCTestCase {
userID: "@mock.client.com",
deviceID: nil,
screenshot: nil, isModallyPresented: false)
let deferred = deferFulfillment(viewModel.actions.collect(2).first())
let context = viewModel.context
context.send(viewAction: .submit)
_ = await viewModel
.actions
.values
.first {
guard case .submitFailed = $0 else {
return false
}
return true
}
let actions = try await deferred.fulfill()
guard case .submitStarted = actions[0] else {
return XCTFail("Action 1 was not .submitFailed")
}
guard case .submitFailed = actions[1] else {
return XCTFail("Action 2 was not .submitFailed")
}
XCTAssert(mockService.submitBugReportProgressListenerCallsCount == 1)
XCTAssert(mockService.submitBugReportProgressListenerReceivedArguments?.bugReport == BugReport(userID: "@mock.client.com", deviceID: nil, text: "", includeLogs: true, includeCrashLog: true, canContact: false, githubLabels: [], files: []))
}

View File

@ -59,17 +59,27 @@ class InviteUsersScreenViewModelTests: XCTestCase {
XCTAssertTrue(context.viewState.selectedUsers.isEmpty)
}
func testInviteButton() async {
func testInviteButton() async throws {
let mockedMembers: [RoomMemberProxyMock] = [.mockAlice, .mockBob]
setupWithRoomType(roomType: .room(roomProxy: RoomProxyMock(with: .init(displayName: "test", members: mockedMembers))))
_ = await viewModel.context.$viewState.values.first(where: { $0.membershipState.isEmpty == false })
let deferredState = deferFulfillment(viewModel.context.$viewState
.map(\.membershipState)
.map(\.isEmpty)
.removeDuplicates()
.collect(2).first(), message: "2 states should be published.")
context.send(viewAction: .toggleUser(.mockAlice))
let states = try await deferredState.fulfill()
XCTAssertEqual(states, [true, false])
let deferredAction = deferFulfillment(viewModel.actions.first(), message: "1 action should be published.")
Task.detached(priority: .low) {
await self.context.send(viewAction: .proceed)
}
let action = await viewModel.actions.values.first()
let action = try await deferredAction.fulfill()
guard case let .invite(members) = action else {
XCTFail("Sent action should be 'invite'")

View File

@ -55,8 +55,11 @@ class InvitesScreenViewModelTests: XCTestCase {
return
}
setupViewModel(roomSummaries: invites)
let deferred = deferFulfillment(viewModel.actions.first(), message: "1 action should be published.")
context.send(viewAction: .accept(.init(roomDetails: details, isUnread: false)))
let action: InvitesScreenViewModelAction? = await viewModel.actions.values.first()
let action = try await deferred.fulfill()
guard case .openRoom(let roomID) = action else {
XCTFail("Wrong view model action")
return

View File

@ -91,12 +91,14 @@ class RoomDetailsEditScreenViewModelTests: XCTestCase {
XCTAssertTrue(context.showMediaSheet)
}
func testSaveTriggersViewModelAction() async {
func testSaveTriggersViewModelAction() async throws {
setupViewModel(accountOwner: .mockOwner(allowedStateEvents: [.roomAvatar, .roomName, .roomTopic]),
roomProxyConfiguration: .init(name: "Some room", displayName: "Some room"))
let deferred = deferFulfillment(viewModel.actions.first())
context.name = "name"
context.send(viewAction: .save)
let action = await viewModel.actions.values.first()
let action = try await deferred.fulfill()
XCTAssertEqual(action, .saveFinished)
}

View File

@ -35,30 +35,36 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
AppSettings.reset()
}
func testLeaveRoomTappedWhenPublic() async {
func testLeaveRoomTappedWhenPublic() async throws {
let mockedMembers: [RoomMemberProxyMock] = [.mockBob, .mockAlice]
roomProxyMock = RoomProxyMock(with: .init(displayName: "Test", isPublic: true, members: mockedMembers))
viewModel = RoomDetailsScreenViewModel(accountUserID: "@owner:somewhere.com",
roomProxy: roomProxyMock,
mediaProvider: MockMediaProvider(),
userIndicatorController: ServiceLocator.shared.userIndicatorController)
await context.nextViewState()
let deferred = deferFulfillment(context.$viewState.collect(2).first())
context.send(viewAction: .processTapLeave)
XCTAssertEqual(context.leaveRoomAlertItem?.state, .public)
XCTAssertEqual(context.leaveRoomAlertItem?.subtitle, L10n.leaveRoomAlertSubtitle)
let states = try await deferred.fulfill()
XCTAssertNil(states[0].bindings.leaveRoomAlertItem)
XCTAssertEqual(states[1].bindings.leaveRoomAlertItem?.state, .public)
XCTAssertEqual(states[1].bindings.leaveRoomAlertItem?.subtitle, L10n.leaveRoomAlertSubtitle)
}
func testLeaveRoomTappedWhenRoomNotPublic() async {
func testLeaveRoomTappedWhenRoomNotPublic() async throws {
let mockedMembers: [RoomMemberProxyMock] = [.mockBob, .mockAlice]
roomProxyMock = RoomProxyMock(with: .init(displayName: "Test", isPublic: false, members: mockedMembers))
viewModel = RoomDetailsScreenViewModel(accountUserID: "@owner:somewhere.com",
roomProxy: roomProxyMock,
mediaProvider: MockMediaProvider(),
userIndicatorController: ServiceLocator.shared.userIndicatorController)
await context.nextViewState()
let deferred = deferFulfillment(context.$viewState.collect(2).first())
context.send(viewAction: .processTapLeave)
XCTAssertEqual(context.leaveRoomAlertItem?.state, .private)
XCTAssertEqual(context.leaveRoomAlertItem?.subtitle, L10n.leaveRoomAlertPrivateSubtitle)
let states = try await deferred.fulfill()
context.send(viewAction: .processTapLeave)
XCTAssertNil(states[0].bindings.leaveRoomAlertItem)
XCTAssertEqual(states[1].bindings.leaveRoomAlertItem?.state, .private)
XCTAssertEqual(states[1].bindings.leaveRoomAlertItem?.subtitle, L10n.leaveRoomAlertPrivateSubtitle)
}
func testLeaveRoomTappedWithLessThanTwoMembers() async {
@ -127,13 +133,13 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
await context.nextViewState()
XCTAssertEqual(context.viewState.dmRecipient, RoomMemberDetails(withProxy: recipient))
let deferred = deferFulfillment(context.$viewState.map(\.isProcessingIgnoreRequest)
.removeDuplicates()
.collect(3).first())
context.send(viewAction: .ignoreConfirmed)
_ = await context.$viewState.values.first { $0.isProcessingIgnoreRequest == true }
XCTAssertTrue(context.viewState.isProcessingIgnoreRequest)
_ = await context.$viewState.values.first { $0.isProcessingIgnoreRequest == false }
XCTAssertFalse(context.viewState.isProcessingIgnoreRequest)
let states = try await deferred.fulfill()
XCTAssertEqual(states, [false, true, false])
XCTAssert(context.viewState.dmRecipient?.isIgnored == true)
}
@ -152,13 +158,13 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
await context.nextViewState()
XCTAssertEqual(context.viewState.dmRecipient, RoomMemberDetails(withProxy: recipient))
let deferred = deferFulfillment(context.$viewState.map(\.isProcessingIgnoreRequest)
.removeDuplicates()
.collect(3).first())
context.send(viewAction: .ignoreConfirmed)
_ = await context.$viewState.values.first { $0.isProcessingIgnoreRequest == true }
XCTAssertTrue(context.viewState.isProcessingIgnoreRequest)
_ = await context.$viewState.values.first { $0.isProcessingIgnoreRequest == false }
XCTAssertFalse(context.viewState.isProcessingIgnoreRequest)
let states = try await deferred.fulfill()
XCTAssertEqual(states, [false, true, false])
XCTAssert(context.viewState.dmRecipient?.isIgnored == false)
XCTAssertNotNil(context.alertInfo)
}
@ -178,13 +184,13 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
await context.nextViewState()
XCTAssertEqual(context.viewState.dmRecipient, RoomMemberDetails(withProxy: recipient))
let deferred = deferFulfillment(context.$viewState.map(\.isProcessingIgnoreRequest)
.removeDuplicates()
.collect(3).first())
context.send(viewAction: .unignoreConfirmed)
_ = await context.$viewState.values.first { $0.isProcessingIgnoreRequest == true }
XCTAssertTrue(context.viewState.isProcessingIgnoreRequest)
_ = await context.$viewState.values.first { $0.isProcessingIgnoreRequest == false }
XCTAssertFalse(context.viewState.isProcessingIgnoreRequest)
let states = try await deferred.fulfill()
XCTAssertEqual(states, [false, true, false])
XCTAssert(context.viewState.dmRecipient?.isIgnored == false)
}
@ -203,13 +209,13 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
await context.nextViewState()
XCTAssertEqual(context.viewState.dmRecipient, RoomMemberDetails(withProxy: recipient))
let deferred = deferFulfillment(context.$viewState.map(\.isProcessingIgnoreRequest)
.removeDuplicates()
.collect(3).first())
context.send(viewAction: .unignoreConfirmed)
_ = await context.$viewState.values.first { $0.isProcessingIgnoreRequest == true }
XCTAssertTrue(context.viewState.isProcessingIgnoreRequest)
_ = await context.$viewState.values.first { $0.isProcessingIgnoreRequest == false }
XCTAssertFalse(context.viewState.isProcessingIgnoreRequest)
let states = try await deferred.fulfill()
XCTAssertEqual(states, [false, true, false])
XCTAssert(context.viewState.dmRecipient?.isIgnored == true)
XCTAssertNotNil(context.alertInfo)
}

View File

@ -44,13 +44,13 @@ class RoomMemberDetailsViewModelTests: XCTestCase {
context.send(viewAction: .showIgnoreAlert)
XCTAssertEqual(context.ignoreUserAlert, .init(action: .ignore))
let deferred = deferFulfillment(context.$viewState.map(\.isProcessingIgnoreRequest)
.removeDuplicates()
.collect(3).first())
context.send(viewAction: .ignoreConfirmed)
_ = await context.$viewState.values.first { $0.isProcessingIgnoreRequest == true }
XCTAssertTrue(context.viewState.isProcessingIgnoreRequest)
XCTAssertFalse(context.viewState.details.isIgnored)
_ = await context.$viewState.values.first { $0.isProcessingIgnoreRequest == false }
let states = try await deferred.fulfill()
XCTAssertEqual(states, [false, true, false])
XCTAssertFalse(context.viewState.isProcessingIgnoreRequest)
XCTAssertTrue(context.viewState.details.isIgnored)
}
@ -65,14 +65,13 @@ class RoomMemberDetailsViewModelTests: XCTestCase {
context.send(viewAction: .showIgnoreAlert)
XCTAssertEqual(context.ignoreUserAlert, .init(action: .ignore))
let deferred = deferFulfillment(context.$viewState.map(\.isProcessingIgnoreRequest)
.removeDuplicates()
.collect(3).first())
context.send(viewAction: .ignoreConfirmed)
_ = await context.$viewState.values.first { $0.isProcessingIgnoreRequest == true }
XCTAssertTrue(context.viewState.isProcessingIgnoreRequest)
XCTAssertFalse(context.viewState.details.isIgnored)
_ = await context.$viewState.values.first { $0.isProcessingIgnoreRequest == false }
XCTAssertFalse(context.viewState.isProcessingIgnoreRequest)
let states = try await deferred.fulfill()
XCTAssertEqual(states, [false, true, false])
XCTAssertNotNil(context.alertInfo)
XCTAssertFalse(context.viewState.details.isIgnored)
}
@ -88,14 +87,13 @@ class RoomMemberDetailsViewModelTests: XCTestCase {
context.send(viewAction: .showUnignoreAlert)
XCTAssertEqual(context.ignoreUserAlert, .init(action: .unignore))
let deferred = deferFulfillment(context.$viewState.map(\.isProcessingIgnoreRequest)
.removeDuplicates()
.collect(3).first())
context.send(viewAction: .unignoreConfirmed)
_ = await context.$viewState.values.first { $0.isProcessingIgnoreRequest == true }
XCTAssertTrue(context.viewState.isProcessingIgnoreRequest)
XCTAssertTrue(context.viewState.details.isIgnored)
_ = await context.$viewState.values.first { $0.isProcessingIgnoreRequest == false }
XCTAssertFalse(context.viewState.isProcessingIgnoreRequest)
let states = try await deferred.fulfill()
XCTAssertEqual(states, [false, true, false])
XCTAssertFalse(context.viewState.details.isIgnored)
}
@ -110,14 +108,13 @@ class RoomMemberDetailsViewModelTests: XCTestCase {
context.send(viewAction: .showUnignoreAlert)
XCTAssertEqual(context.ignoreUserAlert, .init(action: .unignore))
let deferred = deferFulfillment(context.$viewState.map(\.isProcessingIgnoreRequest)
.removeDuplicates()
.collect(3).first())
context.send(viewAction: .unignoreConfirmed)
_ = await context.$viewState.values.first { $0.isProcessingIgnoreRequest == true }
XCTAssertTrue(context.viewState.isProcessingIgnoreRequest)
XCTAssertTrue(context.viewState.details.isIgnored)
_ = await context.$viewState.values.first { $0.isProcessingIgnoreRequest == false }
XCTAssertFalse(context.viewState.isProcessingIgnoreRequest)
let states = try await deferred.fulfill()
XCTAssertEqual(states, [false, true, false])
XCTAssertTrue(context.viewState.details.isIgnored)
XCTAssertNotNil(context.alertInfo)
}