From 9436244b34fddd51fdb1c1099d308b58f929438b Mon Sep 17 00:00:00 2001 From: Javier Cicchelli Date: Fri, 22 Mar 2024 15:40:47 +0100 Subject: [PATCH] Implemented some test cases for the "openItemAt(:)" function of the FeedListViewModel view model in the Feed framework. --- .../Logic/View Models/FeedListViewModel.swift | 17 ++-- .../View Models/FeedListViewModelTests.swift | 91 ++++++++++++++++++- 2 files changed, 99 insertions(+), 9 deletions(-) diff --git a/Frameworks/Feed/Bundle/Sources/Logic/View Models/FeedListViewModel.swift b/Frameworks/Feed/Bundle/Sources/Logic/View Models/FeedListViewModel.swift index 5ee2de6..f853281 100644 --- a/Frameworks/Feed/Bundle/Sources/Logic/View Models/FeedListViewModel.swift +++ b/Frameworks/Feed/Bundle/Sources/Logic/View Models/FeedListViewModel.swift @@ -116,16 +116,19 @@ extension FeedListViewController { } func item(for index: Int) -> Review? { - guard - !items.isEmpty, - index < items.count - else { + guard !items.isEmpty else { return nil } - return isWordsShowing - ? items[index - 1] - : items[index] + let indexToUse = isWordsShowing + ? index - 1 + : index + + guard indexToUse < items.count else { + return nil + } + + return items[indexToUse] } func openItem(at index: Int) { diff --git a/Frameworks/Feed/Test/Tests/View Models/FeedListViewModelTests.swift b/Frameworks/Feed/Test/Tests/View Models/FeedListViewModelTests.swift index 9f5a79e..6c13227 100644 --- a/Frameworks/Feed/Test/Tests/View Models/FeedListViewModelTests.swift +++ b/Frameworks/Feed/Test/Tests/View Models/FeedListViewModelTests.swift @@ -15,6 +15,9 @@ import XCTest final class FeedListViewModelTests: XCTestCase { + // MARK: Constants + private let coordination: FeedListCoordinationSpy = .init() + // MARK: Properties private var sut: FeedListViewController.ViewModel! @@ -24,7 +27,7 @@ final class FeedListViewModelTests: XCTestCase { override func setUp() async throws { sut = .init( configuration: .init(session: .mock), - coordination: nil + coordination: coordination ) } @@ -454,7 +457,7 @@ final class FeedListViewModelTests: XCTestCase { let item = sut.item(for: 1) // THEN - XCTAssertNil(item) + XCTAssertNotNil(item) } func testItemFor_indexOutOfBounds_withFilteredItems() async { @@ -491,4 +494,88 @@ final class FeedListViewModelTests: XCTestCase { XCTAssertNil(item) } + func testOpenItemAt_index_withSomeItems() async { + // GIVEN + MockURLProtocol.response = .init( + statusCode: 200, + object: Feed(entries: .sample) + ) + + // WHEN + await sut.fetch() + + sut.openItem(at: 0) + + // THEN + XCTAssertTrue(coordination.itemOpened) + } + + func testOpenItemAt_indexOutOfBounds_withSomeItems() async { + // GIVEN + MockURLProtocol.response = .init( + statusCode: 200, + object: Feed(entries: .sample) + ) + + // WHEN + await sut.fetch() + + sut.openItem(at: 10) + + // THEN + XCTAssertFalse(coordination.itemOpened) + } + + func testOpenItemAt_index_withFilteredItems() async { + // GIVEN + MockURLProtocol.response = .init( + statusCode: 200, + object: Feed(entries: .sample) + ) + + // WHEN + sut.filter(by: .only1Star) + + await sut.fetch() + + sut.openItem(at: 1) + + // THEN + XCTAssertTrue(coordination.itemOpened) + } + + func testOpenItemAt_indexOutOfBounds_withFilteredItems() async { + // GIVEN + MockURLProtocol.response = .init( + statusCode: 200, + object: Feed(entries: .sample) + ) + + // WHEN + sut.filter(by: .only1Star) + + await sut.fetch() + + sut.openItem(at: 2) + + // THEN + XCTAssertFalse(coordination.itemOpened) + } + + func testOpenItemAt_index_withNoItems() async { + // GIVEN + MockURLProtocol.response = .init( + statusCode: 200, + object: Feed(entries: .none) + ) + + // WHEN + await sut.fetch() + + sut.openItem(at: 0) + + // THEN + XCTAssertFalse(coordination.itemOpened) + } + }