diff --git a/RiotSwiftUI/Modules/UserSessions/UserOtherSessions/Test/Unit/UserOtherSessionsViewModelTests.swift b/RiotSwiftUI/Modules/UserSessions/UserOtherSessions/Test/Unit/UserOtherSessionsViewModelTests.swift index 05a25b5f5..271812859 100644 --- a/RiotSwiftUI/Modules/UserSessions/UserOtherSessions/Test/Unit/UserOtherSessionsViewModelTests.swift +++ b/RiotSwiftUI/Modules/UserSessions/UserOtherSessions/Test/Unit/UserOtherSessionsViewModelTests.swift @@ -55,9 +55,13 @@ class UserOtherSessionsViewModelTests: XCTestCase { let sut = createSUT(sessionInfos: sessionInfos, filter: .inactive) let expectedItems = sessionInfos.filter { !$0.isActive }.asViewData() - let expectedState = UserOtherSessionsViewState(bindings: UserOtherSessionsBindings(filter: .inactive), + let bindings = UserOtherSessionsBindings(filter: .inactive, isEditModeEnabled: false) + let expectedState = UserOtherSessionsViewState(bindings: bindings, title: "Title", - sections: [.sessionItems(header: inactiveSectionHeader, items: expectedItems)]) + items: expectedItems, + header: inactiveSectionHeader, + emptyItemsTitle: VectorL10n.userOtherSessionNoInactiveSessions, + allItemsSelected: false) XCTAssertEqual(sut.state, expectedState) } @@ -67,9 +71,13 @@ class UserOtherSessionsViewModelTests: XCTestCase { let sut = createSUT(sessionInfos: sessionInfos, filter: .all) let expectedItems = sessionInfos.filter { !$0.isCurrent }.asViewData() - let expectedState = UserOtherSessionsViewState(bindings: UserOtherSessionsBindings(filter: .all), + let bindings = UserOtherSessionsBindings(filter: .all, isEditModeEnabled: false) + let expectedState = UserOtherSessionsViewState(bindings: bindings, title: "Title", - sections: [.sessionItems(header: allSectionHeader, items: expectedItems)]) + items: expectedItems, + header: allSectionHeader, + emptyItemsTitle: "", + allItemsSelected: false) XCTAssertEqual(sut.state, expectedState) } @@ -79,9 +87,13 @@ class UserOtherSessionsViewModelTests: XCTestCase { let sut = createSUT(sessionInfos: sessionInfos, filter: .unverified) let expectedItems = sessionInfos.filter { !$0.isCurrent }.asViewData() - let expectedState = UserOtherSessionsViewState(bindings: UserOtherSessionsBindings(filter: .unverified), + let bindings = UserOtherSessionsBindings(filter: .unverified, isEditModeEnabled: false) + let expectedState = UserOtherSessionsViewState(bindings: bindings, title: "Title", - sections: [.sessionItems(header: unverifiedSectionHeader, items: expectedItems)]) + items: expectedItems, + header: unverifiedSectionHeader, + emptyItemsTitle: VectorL10n.userOtherSessionNoUnverifiedSessions, + allItemsSelected: false) XCTAssertEqual(sut.state, expectedState) } @@ -91,9 +103,13 @@ class UserOtherSessionsViewModelTests: XCTestCase { let sut = createSUT(sessionInfos: sessionInfos, filter: .verified) let expectedItems = sessionInfos.filter { !$0.isCurrent }.asViewData() - let expectedState = UserOtherSessionsViewState(bindings: UserOtherSessionsBindings(filter: .verified), + let bindings = UserOtherSessionsBindings(filter: .verified, isEditModeEnabled: false) + let expectedState = UserOtherSessionsViewState(bindings: bindings, title: "Title", - sections: [.sessionItems(header: verifiedSectionHeader, items: expectedItems)]) + items: expectedItems, + header: verifiedSectionHeader, + emptyItemsTitle: VectorL10n.userOtherSessionNoVerifiedSessions, + allItemsSelected: false) XCTAssertEqual(sut.state, expectedState) } @@ -101,10 +117,13 @@ class UserOtherSessionsViewModelTests: XCTestCase { let sessionInfos = [createUserSessionInfo(sessionId: "session 1", isVerified: false), createUserSessionInfo(sessionId: "session 2", isVerified: false)] let sut = createSUT(sessionInfos: sessionInfos, filter: .verified) - - let expectedState = UserOtherSessionsViewState(bindings: UserOtherSessionsBindings(filter: .verified), + let bindings = UserOtherSessionsBindings(filter: .verified, isEditModeEnabled: false) + let expectedState = UserOtherSessionsViewState(bindings: bindings, title: "Title", - sections: [.emptySessionItems(header: verifiedSectionHeader, title: VectorL10n.userOtherSessionNoVerifiedSessions)]) + items: [], + header: verifiedSectionHeader, + emptyItemsTitle: VectorL10n.userOtherSessionNoVerifiedSessions, + allItemsSelected: false) XCTAssertEqual(sut.state, expectedState) } @@ -112,10 +131,13 @@ class UserOtherSessionsViewModelTests: XCTestCase { let sessionInfos = [createUserSessionInfo(sessionId: "session 1", isVerified: true), createUserSessionInfo(sessionId: "session 2", isVerified: true)] let sut = createSUT(sessionInfos: sessionInfos, filter: .unverified) - - let expectedState = UserOtherSessionsViewState(bindings: UserOtherSessionsBindings(filter: .unverified), + let bindings = UserOtherSessionsBindings(filter: .unverified, isEditModeEnabled: false) + let expectedState = UserOtherSessionsViewState(bindings: bindings, title: "Title", - sections: [.emptySessionItems(header: unverifiedSectionHeader, title: VectorL10n.userOtherSessionNoUnverifiedSessions)]) + items: [], + header: unverifiedSectionHeader, + emptyItemsTitle: VectorL10n.userOtherSessionNoUnverifiedSessions, + allItemsSelected: false) XCTAssertEqual(sut.state, expectedState) } @@ -123,13 +145,134 @@ class UserOtherSessionsViewModelTests: XCTestCase { let sessionInfos = [createUserSessionInfo(sessionId: "session 1", isActive: true), createUserSessionInfo(sessionId: "session 2", isActive: true)] let sut = createSUT(sessionInfos: sessionInfos, filter: .inactive) - - let expectedState = UserOtherSessionsViewState(bindings: UserOtherSessionsBindings(filter: .inactive), + let bindings = UserOtherSessionsBindings(filter: .inactive, isEditModeEnabled: false) + let expectedState = UserOtherSessionsViewState(bindings: bindings, title: "Title", - sections: [.emptySessionItems(header: inactiveSectionHeader, title: VectorL10n.userOtherSessionNoInactiveSessions)]) + items: [], + header: inactiveSectionHeader, + emptyItemsTitle: VectorL10n.userOtherSessionNoInactiveSessions, + allItemsSelected: false) XCTAssertEqual(sut.state, expectedState) } + func test_whenEditModeEnabledAndAllItemsSelected_viewStateIsCorrect() { + let sessionInfos = [createUserSessionInfo(sessionId: "session 1"), + createUserSessionInfo(sessionId: "session 2")] + let sut = createSUT(sessionInfos: sessionInfos, filter: .all) + toggleEditMode(for: sut, value: true) + sut.process(viewAction: .userOtherSessionSelected(sessionId: "session 1")) + sut.process(viewAction: .userOtherSessionSelected(sessionId: "session 2")) + + let expectedItems = sessionInfos.map { UserSessionListItemViewDataFactory().create(from: $0, isSelected: true) } + let bindings = UserOtherSessionsBindings(filter: .all, isEditModeEnabled: true) + let expectedState = UserOtherSessionsViewState(bindings: bindings, + title: VectorL10n.userOtherSessionSelectedCount("2"), + items: expectedItems, + header: allSectionHeader, + emptyItemsTitle: "", + allItemsSelected: true) + XCTAssertEqual(sut.state, expectedState) + } + + func test_whenEditModeEnabledAndItemSelectedAndDeselected_viewStateIsCorrect() { + let sessionInfos = [createUserSessionInfo(sessionId: "session 1"), + createUserSessionInfo(sessionId: "session 2")] + let sut = createSUT(sessionInfos: sessionInfos, filter: .all) + toggleEditMode(for: sut, value: true) + sut.process(viewAction: .userOtherSessionSelected(sessionId: "session 1")) + sut.process(viewAction: .userOtherSessionSelected(sessionId: "session 1")) + + let expectedItems = sessionInfos.map { UserSessionListItemViewDataFactory().create(from: $0, isSelected: false) } + let bindings = UserOtherSessionsBindings(filter: .all, isEditModeEnabled: true) + let expectedState = UserOtherSessionsViewState(bindings: bindings, + title: VectorL10n.userOtherSessionSelectedCount("0"), + items: expectedItems, + header: allSectionHeader, + emptyItemsTitle: "", + allItemsSelected: false) + XCTAssertEqual(sut.state, expectedState) + } + + func test_whenEditModeEnabledAndNotAllItemsSelected_viewStateIsCorrect() { + let sessionInfos = [createUserSessionInfo(sessionId: "session 1"), + createUserSessionInfo(sessionId: "session 2")] + let sut = createSUT(sessionInfos: sessionInfos, filter: .all) + toggleEditMode(for: sut, value: true) + sut.process(viewAction: .userOtherSessionSelected(sessionId: "session 2")) + + let expectedItems = sessionInfos.map { UserSessionListItemViewDataFactory().create(from: $0, isSelected: $0.id == "session 2") } + let bindings = UserOtherSessionsBindings(filter: .all, isEditModeEnabled: true) + let expectedState = UserOtherSessionsViewState(bindings: bindings, + title: VectorL10n.userOtherSessionSelectedCount("1"), + items: expectedItems, + header: allSectionHeader, + emptyItemsTitle: "", + allItemsSelected: false) + XCTAssertEqual(sut.state, expectedState) + } + + func test_whenEditModeEnabledAndAllItemsSelectedByButton_viewStateIsCorrect() { + let sessionInfos = [createUserSessionInfo(sessionId: "session 1"), + createUserSessionInfo(sessionId: "session 2")] + let sut = createSUT(sessionInfos: sessionInfos, filter: .all) + toggleEditMode(for: sut, value: true) + sut.process(viewAction: .toggleAllSelection) + + let expectedItems = sessionInfos.map { UserSessionListItemViewDataFactory().create(from: $0, isSelected: true) } + let bindings = UserOtherSessionsBindings(filter: .all, isEditModeEnabled: true) + let expectedState = UserOtherSessionsViewState(bindings: bindings, + title: VectorL10n.userOtherSessionSelectedCount("2"), + items: expectedItems, + header: allSectionHeader, + emptyItemsTitle: "", + allItemsSelected: true) + XCTAssertEqual(sut.state, expectedState) + } + + func test_whenEditModeEnabledAndAllItemsDeselectedByButton_viewStateIsCorrect() { + let sessionInfos = [createUserSessionInfo(sessionId: "session 1"), + createUserSessionInfo(sessionId: "session 2")] + let sut = createSUT(sessionInfos: sessionInfos, filter: .all) + toggleEditMode(for: sut, value: true) + sut.process(viewAction: .toggleAllSelection) + sut.process(viewAction: .toggleAllSelection) + let expectedItems = sessionInfos.map { UserSessionListItemViewDataFactory().create(from: $0, isSelected: false) } + let bindings = UserOtherSessionsBindings(filter: .all, isEditModeEnabled: true) + let expectedState = UserOtherSessionsViewState(bindings: bindings, + title: VectorL10n.userOtherSessionSelectedCount("0"), + items: expectedItems, + header: allSectionHeader, + emptyItemsTitle: "", + allItemsSelected: false) + XCTAssertEqual(sut.state, expectedState) + } + + func test_whenEditModeEnabledDisabledAndEnabled_viewStateIsCorrect() { + let sessionInfos = [createUserSessionInfo(sessionId: "session 1"), + createUserSessionInfo(sessionId: "session 2")] + let sut = createSUT(sessionInfos: sessionInfos, filter: .all) + toggleEditMode(for: sut, value: true) + sut.process(viewAction: .editModeWasToggled) + sut.process(viewAction: .userOtherSessionSelected(sessionId: "session 1")) + sut.process(viewAction: .userOtherSessionSelected(sessionId: "session 2")) + toggleEditMode(for: sut, value: false) + toggleEditMode(for: sut, value: true) + let expectedItems = sessionInfos.map { UserSessionListItemViewDataFactory().create(from: $0, isSelected: false) } + let bindings = UserOtherSessionsBindings(filter: .all, isEditModeEnabled: true) + let expectedState = UserOtherSessionsViewState(bindings: bindings, + title: VectorL10n.userOtherSessionSelectedCount("0"), + items: expectedItems, + header: allSectionHeader, + emptyItemsTitle: "", + allItemsSelected: false) + XCTAssertEqual(sut.state, expectedState) + } + + private func toggleEditMode(for model: UserOtherSessionsViewModel, value: Bool) { + model.context.isEditModeEnabled = value + model.process(viewAction: .editModeWasToggled) + } + private func createSUT(sessionInfos: [UserSessionInfo], filter: UserOtherSessionsFilter, title: String = "Title") -> UserOtherSessionsViewModel {