Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
125 commits
Select commit Hold shift + click to select a range
25d228f
Add empty project for prototype
crisfeim Apr 10, 2025
af42ac1
Add prototype table view
crisfeim Apr 10, 2025
0fc7eb4
Add FeedViewController and header + footer
crisfeim Apr 10, 2025
f64d4d1
Add prototype feed data for demoing purposes
crisfeim Apr 10, 2025
98560c5
Add `FeedImageCell` with storyboard connections
crisfeim Apr 10, 2025
0e139ca
Fix width of location label (set constraint equal to its superview so…
crisfeim Apr 10, 2025
115af90
Render prototype feed data on the table view
crisfeim Apr 10, 2025
22d8469
Add fade in animation to simulate asynchronous image loading
crisfeim Apr 10, 2025
1a2a0b1
Add prototype icon
crisfeim Apr 10, 2025
3316b0e
Make `EssentialFEed` and `EssentialFeedTests` targets support macOS a…
crisfeim Apr 10, 2025
423ce9d
Make the `EssentialFeedAPIEndToEndTests`target support macOS and iOS …
crisfeim Apr 10, 2025
48dc739
Make `EssentialFeedCacheIntegrationTests` support macOS and iOS platf…
crisfeim Apr 10, 2025
8e576aa
Add `EssentialFeediOS` framework (prod and test) targets for iOS plat…
crisfeim Apr 10, 2025
350cdc3
Move `EsssentialFeedApiEndTests.xctestplan` to its test target folder…
crisfeim Apr 10, 2025
9b6c8ae
Move `EssentialFeedCacheIntegrationTests.xctestplan` to its test targ…
crisfeim Apr 10, 2025
c2b332c
build: disable module definition to remove umbrella header warning in…
crisfeim Apr 10, 2025
617cf3e
Add separate CI schemes for macOS and iOS as we now have an iOS-speci…
crisfeim Apr 10, 2025
c748567
Add `UIRefreshController` to prototype to simualte async load on feed
crisfeim Apr 10, 2025
e175873
Add shimmering effect to images to mimic load state
crisfeim Apr 10, 2025
f6ac9d3
`FeedViewController` doesnt load data upon initialization
crisfeim Apr 10, 2025
5c249ed
Load feed on view did load
crisfeim Apr 10, 2025
4f981bb
Build: Set defines module to No so we can get rid of warning (again...)
crisfeim Apr 10, 2025
0eaaebb
Replace the concrete loader spy dependency with the `FeedLoader` prot…
crisfeim Apr 10, 2025
b5f6da1
Extracy system under test (sut) creation into a factory method
crisfeim Apr 10, 2025
1476155
Prove tht pull to refresh loads feed
crisfeim Apr 10, 2025
f7a070d
Show loading indicator on view is appear
crisfeim Apr 11, 2025
deed955
Show loader once on viewIsAppearing
crisfeim Apr 11, 2025
fb57689
Extract view apperance duplicated test code into a helper
crisfeim Apr 11, 2025
e17316b
Add short-circuit loading check on `simulateAppearance` so we can rem…
crisfeim Apr 11, 2025
ac80b3c
Test view did load does not show refresh control
crisfeim Apr 11, 2025
75cb8ad
Remove unneeded extra assertion on test as it's already tested by ant…
crisfeim Apr 11, 2025
376a659
Hide loading indicator on loader completion
crisfeim Apr 11, 2025
2a8e7f3
Pull to refresh shows loading indicator
crisfeim Apr 11, 2025
c0156b5
Pull to refresh hides loading indicator on loader completion
crisfeim Apr 11, 2025
f63955c
Decouple tests from specific UI controls for user initiated with test…
crisfeim Apr 11, 2025
5e5d7e6
Make extensions private as for now they only concern current test scope
crisfeim Apr 11, 2025
53fdeb9
Decouple tests from specific UI loading indicaaors with test-specific…
crisfeim Apr 11, 2025
6ae4bed
Rename test to improve clarity
crisfeim Apr 11, 2025
4e35979
Fix test error that may lead to test failing: refreshControl replacem…
crisfeim Apr 11, 2025
d0d2100
Unify assertions into single tests as they're is temporal coupling du…
crisfeim Apr 11, 2025
cc74d37
Move life cycle related tests to the top of the class for better orga…
crisfeim Apr 11, 2025
1c6e261
Add explicit comments to asserts so we can have better debugging on t…
crisfeim Apr 11, 2025
9c1dd34
Rename test to better reflect its new intent
crisfeim Apr 11, 2025
813bb7f
Move `FeedViewController` to production
crisfeim Apr 11, 2025
198ae3a
Turn off library evolution support to avoid binary compatibility warn…
crisfeim Apr 11, 2025
4beb85c
Render loaded feed on succesfull load completion
crisfeim Apr 11, 2025
a8d8706
Does not alter current feed rendering state on load error
crisfeim Apr 11, 2025
2d0d9d6
Hide loading indicator on both error and success
crisfeim Apr 11, 2025
366a523
Load image url when load view is visible
crisfeim Apr 11, 2025
8c95739
Cancel image loading when image view is not visible anymore
crisfeim Apr 11, 2025
0bd0ed7
Extract the `cancelImageDataLoad(from:)` method from `FeedImageDataLo…
crisfeim Apr 11, 2025
a1d2e9d
Feed image view loding indicator is visible while loading image
crisfeim Apr 11, 2025
8bf19eb
Rendered loaded images from URL
crisfeim Apr 11, 2025
e8399b4
Feed image view retry button is visible on image url load error
crisfeim Apr 11, 2025
96ffb7d
Feed image retry button is visible when image loader delivers invalid…
crisfeim Apr 11, 2025
a4c5694
Retry failed image load on retry action
crisfeim Apr 11, 2025
42196c8
Preload image url when image view is near visible
crisfeim Apr 11, 2025
f237534
Cancel image URL prefetching when image view is not near visible anymore
crisfeim Apr 11, 2025
38e13df
Group controllers , views and data loader into their own folders for …
crisfeim Apr 14, 2025
550e593
wip: refactoring
crisfeim Apr 14, 2025
c1f84ad
Extract `UIRefreshControl` creation/configuration and refresh logic w…
crisfeim Apr 14, 2025
03c10c6
Reame init parameter
crisfeim Apr 14, 2025
f225727
Fix test assertion descriptions
crisfeim Apr 14, 2025
6d19abc
Extract `FeedImageCell` creation/configuration and image load logic w…
crisfeim Apr 14, 2025
7c32c98
Extract dependency creation and composition logic from the `FeedView…
crisfeim Apr 14, 2025
d4124a3
Extract adapter pattern into a separate function to clarify intent
crisfeim Apr 14, 2025
f22fef4
Remvoe `EssentialFeed`dependency on `FeedRefreshViewController` by mo…
crisfeim Apr 14, 2025
4a90698
Remove mutable state from `FeedViewModel`. The `FeedViewModel`only ne…
crisfeim Apr 14, 2025
4f08ecd
Extract task, load, and cancel logic from `FeedImageCellController` i…
crisfeim Apr 14, 2025
82cf735
Decouple `FeedImageViewModel` from `UIKit` by creating a transformati…
crisfeim Apr 14, 2025
516a2b3
Remove `EssentialFeed` module import form the `FeedViewController` fi…
crisfeim Apr 14, 2025
4111a3b
Add `FeedPresenter` holding feed presentation logic
crisfeim Apr 14, 2025
10c6657
Move memory management to composer layer: The `FeedPresenter` shoudln…
crisfeim Apr 14, 2025
f0715a3
Remove unused `FeedViewModel` (replaced by the new `FeedPrresenter`
crisfeim Apr 14, 2025
59ec2f5
Add Presentable View Models as pure data to clarify communication bet…
crisfeim Apr 14, 2025
da556d5
Decouple `FeedRefreshViewController` from the concrete `FeedPresenter…
crisfeim Apr 14, 2025
a4f27c2
Decouple `FeedPresenter` from `FeedLoader` with an adapter in the Com…
crisfeim Apr 14, 2025
e835f1f
Replace closure event handler with delegate protocol to demonstrate d…
crisfeim Apr 14, 2025
6e82a5e
Move from property injection to construction injection in the `FeedPr…
crisfeim Apr 14, 2025
3b8fb69
WIP: refactoring to presenter
crisfeim Apr 15, 2025
befacf6
WIP: ViewModel to Presenter (added view protocols)
crisfeim Apr 15, 2025
b0ac04c
🟢 Make presenter views weak
crisfeim Apr 15, 2025
120a0c3
🟢 WIP: Invert control of retention on presenter for its views
crisfeim Apr 15, 2025
0b11c3f
Remove unneeded `AnyObject` constraint on `FeedLoadingView`
crisfeim Apr 15, 2025
f08f6ae
🟢 Remove unused `FeedImageViewModel` (replaced by `FeedImagePresenter)
crisfeim Apr 15, 2025
a7fa156
Create viewModels for presenter views
crisfeim Apr 15, 2025
a40cbeb
Refactoring:
crisfeim Apr 15, 2025
33ba1d9
Move generic to associatedType on `FeedImageView` protocol to gain cl…
crisfeim Apr 15, 2025
044d970
Extract animation logic into a computed var with a setter
crisfeim Apr 15, 2025
5bae18e
Add `Feed.storyboard` and `Feed.xcassets` from prototype
crisfeim Apr 15, 2025
9a0caea
Instantiate `FeedViewController` from `Feed.storyboard`
crisfeim Apr 15, 2025
f919041
Move `FeedViewController` + `FeedRefreshViewController` composition (…
crisfeim Apr 15, 2025
eec72dc
Merge `FeedRefreshViewController` with `FeedViewController` since the…
crisfeim Apr 15, 2025
267c8a3
Move tableView prefetchDataSource setup to the storyboard
crisfeim Apr 15, 2025
57e4913
Reuse table view cells from storyboard configuration
crisfeim Apr 15, 2025
92fcade
Add UI table view helper to dequeue cells by class name
crisfeim Apr 15, 2025
782c2cc
Display image with animation
crisfeim Apr 15, 2025
bb75ed7
Add UITableViewController with extended life cycle methods
crisfeim Apr 15, 2025
ebd6e7e
Move title string creation from FeedViewController to FeedPresenter —…
crisfeim Apr 15, 2025
b772bdc
Move title configuration from viewController to composer — The View C…
crisfeim Apr 15, 2025
2d0f53d
Extract the `FeedViewController` creation and configuration into a fa…
crisfeim Apr 15, 2025
e7dbf06
Localize feed view title string
crisfeim Apr 15, 2025
b05b0cd
Create test helper to find missing localized strings
crisfeim Apr 15, 2025
fd9fbd9
Rename FeedViewControllerTests to FeedUIIntegrationTests since we're …
crisfeim Apr 15, 2025
534e55c
Add support for greek and portuguese localization
crisfeim Apr 15, 2025
4ac09bb
Add localization tests to guarantee all localized keys have translato…
crisfeim Apr 15, 2025
00adbe3
Dispatch background feed copletion to main thread before updating the…
crisfeim Apr 15, 2025
743cc5c
Move main thread dispatch to the presenter
crisfeim Apr 15, 2025
6f9f329
Move main thread dispatch to the composition layer with a decorator
crisfeim Apr 15, 2025
67574c3
Generalize MainQueueDispatchDecorator so we can reuse it
crisfeim Apr 15, 2025
68dd82e
Dispatch background load imaga data comlpletion to main thread before…
crisfeim Apr 15, 2025
395dba1
Move composition helpers to their own file
crisfeim Apr 15, 2025
e41b4c4
Add environment variable so we can crash the tests if UI is modified …
crisfeim Apr 15, 2025
5141c0f
Fix: rename `CI` scheme to `CI_macOS` so it matches the name used on …
crisfeim Apr 15, 2025
9962e9c
Rename `CI.xctestplan` to `CI_macOS.xctestplan`
crisfeim Apr 18, 2025
4634bfc
Update test server url on end to end tests as 301 redirection was mak…
crisfeim Apr 18, 2025
39b156b
Make `CI_iOS` scheme shared so it can be run on CI
crisfeim Apr 18, 2025
d9a4211
Update CI simulator device
crisfeim Apr 18, 2025
f2c8ec1
Disable parallelization on `CI_iOS` to verify if this is the reason …
crisfeim Apr 18, 2025
136e3b6
Remove parallelization for ci_iOS to verify if cache integration test…
crisfeim Apr 18, 2025
66e693a
Use flag on CI schemes so we match local environment configurations
crisfeim Apr 18, 2025
f3191d0
Remove `testPlan` flag as it's used by default if not specified (CI t…
crisfeim Apr 18, 2025
af63289
Use static model to instantiate it only once across tests
crisfeim Apr 18, 2025
e9b8093
Fix (again) CI failing by removing parallel testing on run as that is…
crisfeim Apr 18, 2025
d403578
Clean up coordinators on deinit.
crisfeim Apr 18, 2025
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
22 changes: 18 additions & 4 deletions .github/workflows/CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,23 @@ jobs:

- name: Select Xcode
run: sudo xcode-select -switch /Applications/Xcode_16.2.app

- name: Xcode version
run: /usr/bin/xcodebuild -version

- name: Build and Test
run: xcodebuild clean build test -project EssentialFeed/EssentialFeed.xcodeproj -scheme "CI" CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO

- name: Build and Test - CI (macOS)
run: |
xcodebuild clean build test \
-project EssentialFeed/EssentialFeed.xcodeproj \
-scheme "CI_macOS" \
-destination 'platform=macOS' \
CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO

- name: Build and Test - CI (iOS)
run: |
xcodebuild clean build test \
-project EssentialFeed/EssentialFeed.xcodeproj \
-scheme "CI_iOS" \
-parallel-testing-enabled NO \
-destination 'platform=iOS Simulator,name=iPhone 16' \
CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO
61 changes: 61 additions & 0 deletions EssentialFeed/CI_iOS.xctestplan
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
{
"configurations" : [
{
"id" : "FB6DC599-8749-4C8A-B598-7DA402070AD5",
"name" : "Test Scheme Action",
"options" : {

}
}
],
"defaultOptions" : {
"codeCoverage" : {
"targets" : [
{
"containerPath" : "container:EssentialFeed.xcodeproj",
"identifier" : "080EDEF021B6DA7E00813479",
"name" : "EssentialFeed"
},
{
"containerPath" : "container:EssentialFeed.xcodeproj",
"identifier" : "40D5EE232DA7C5F100D344B3",
"name" : "EssentialFeediOS"
}
]
},
"testExecutionOrdering" : "random"
},
"testTargets" : [
{
"parallelizable" : true,
"target" : {
"containerPath" : "container:EssentialFeed.xcodeproj",
"identifier" : "40B002442CF9E9DB0058D3E0",
"name" : "EssentialFeedAPIEndToEndTests"
}
},
{
"parallelizable" : false,
"target" : {
"containerPath" : "container:EssentialFeed.xcodeproj",
"identifier" : "40412A492DA67465004677C4",
"name" : "EssentialFeedCacheIntegrationTests"
}
},
{
"target" : {
"containerPath" : "container:EssentialFeed.xcodeproj",
"identifier" : "080EDEF921B6DA7E00813479",
"name" : "EssentialFeedTests"
}
},
{
"target" : {
"containerPath" : "container:EssentialFeed.xcodeproj",
"identifier" : "40D5EE2A2DA7C5F100D344B3",
"name" : "EssentialFeediOSTests"
}
}
],
"version" : 1
}
File renamed without changes.
Loading