Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions EssentialApp/EssentialAppTests/FeedUIIntegrationTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,23 @@ final class FeedUIIntegrationTests: XCTestCase {
XCTAssertEqual(loader.cancelledImageURLs, [image0.url, image1.url], "Expected two cancelled image URL requests once second image is also not visible anymore")
}

func test_feedImageView_reloadsImageURLWhenBecomingVisibleAgain() {
let image0 = makeImage(url: URL(string: "http://url-0.com")!)
let image1 = makeImage(url: URL(string: "http://url-1.com")!)
let (sut, loader) = makeSUT()

sut.simulateAppearance()
loader.completeFeedLoading(with: [image0, image1])

sut.simulateFeedImageBecomingVisibleAgain(at: 0)

XCTAssertEqual(loader.loadedImageURLs, [image0.url, image0.url], "Expected two image URL request after first view becomes visible again")

sut.simulateFeedImageBecomingVisibleAgain(at: 1)

XCTAssertEqual(loader.loadedImageURLs, [image0.url, image0.url, image1.url, image1.url], "Expected two new image URL request after second view becomes visible again")
}

func test_feedImageViewLoadingIndicator_isVisibleWhileLoadingImage() {
let (sut, loader) = makeSUT()

Expand All @@ -182,6 +199,10 @@ final class FeedUIIntegrationTests: XCTestCase {
loader.completeImageLoadingWithError(at: 1)
XCTAssertEqual(view0?.isShowingImageLoadingIndicator, false, "Expected no loading indicator state change for first view once second image loading completes with error")
XCTAssertEqual(view1?.isShowingImageLoadingIndicator, false, "Expected no loading indicator for second view once second image loading completes with error")

view1?.simulateRetryAction()
XCTAssertEqual(view0?.isShowingImageLoadingIndicator, false, "Expected no loading indicator state change for first view once second image loading completes with error")
XCTAssertEqual(view1?.isShowingImageLoadingIndicator, true, "Expected loading indicator state change for second view on retry action")
}

func test_feedImageView_rendersImageLoadedFromURL() {
Expand Down Expand Up @@ -326,6 +347,26 @@ final class FeedUIIntegrationTests: XCTestCase {
XCTAssertEqual(newView.renderedImage, imageData)
}

func test_feedImageView_configuresViewCorrectlyWhenCellBecomingVisibleAgain() {
let (sut, loader) = makeSUT()

sut.simulateAppearance()
loader.completeFeedLoading(with: [makeImage()])

let view0 = sut.simulateFeedImageBecomingVisibleAgain(at: 0)

XCTAssertEqual(view0?.renderedImage, nil, "Expected no rendered image when view becomes visible again")
XCTAssertEqual(view0?.isShowingRetryAction, false, "Expected no retry action when view becomes visible again")
XCTAssertEqual(view0?.isShowingImageLoadingIndicator, true, "Expected loading indicator when view becomes visible again")

let imageData = UIImage.make(withColor: .red).pngData()!
loader.completeImageLoading(with: imageData, at: 1)

XCTAssertEqual(view0?.renderedImage, imageData, "Expected rendered image when image loads successfully after view becomes visible again")
XCTAssertEqual(view0?.isShowingRetryAction, false, "Expected no retry when image loads successfully after view becomes visible again")
XCTAssertEqual(view0?.isShowingImageLoadingIndicator, false, "Expected no loading indicator when image loads successfully after view becomes visible again")
}

func test_feedImageView_doesNotRenderLoadedImageWhenNotVisibleAnymore() {
let (sut, loader) = makeSUT()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,17 @@ extension ListViewController {
return feedImageView(at: index) as? FeedImageCell
}

@discardableResult
func simulateFeedImageBecomingVisibleAgain(at row: Int) -> FeedImageCell? {
let view = simulateFeedImageViewNotVisible(at: row)

let delegate = tableView.delegate
let index = IndexPath(row: row, section: feedImagesSection)
delegate?.tableView?(tableView, willDisplay: view!, forRowAt: index)

return view
}

@discardableResult
func simulateFeedImageViewNotVisible(at row: Int) -> FeedImageCell? {
let view = simulateFeedImageViewVisible(at: row)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@ extension FeedImageCellController: UITableViewDataSource, UITableViewDelegate, U
return cell!
}

public func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
self.cell = cell as? FeedImageCell
delegate.didRequestImage()
}

public func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
cancelLoad()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,11 @@ public final class ListViewController: UITableViewController, UITableViewDataSou
onViewIsAppearing?(self)
}

public override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let dl = cellController(at: indexPath)?.delegate
dl?.tableView?(tableView, willDisplay: cell, forRowAt: indexPath)
}

public override func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let dl = cellController(at: indexPath)?.delegate
dl?.tableView?(tableView, didEndDisplaying: cell, forRowAt: indexPath)
Expand Down