From 7c95db452f68b8021b26a4ee9a5fe4ba42889b77 Mon Sep 17 00:00:00 2001 From: Olivier Halligon Date: Fri, 3 Apr 2020 19:26:19 +0200 Subject: [PATCH 01/20] Adding missing assets --- .../AppIcon.appiconset/AppStore.png | Bin 0 -> 183587 bytes .../AppIcon.appiconset/Contents.json | 8 +++++--- .../AppIcon.appiconset/icon_ipad@2x.png | Bin 0 -> 17713 bytes 3 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 UnsplashApiApp/Assets.xcassets/AppIcon.appiconset/AppStore.png create mode 100644 UnsplashApiApp/Assets.xcassets/AppIcon.appiconset/icon_ipad@2x.png diff --git a/UnsplashApiApp/Assets.xcassets/AppIcon.appiconset/AppStore.png b/UnsplashApiApp/Assets.xcassets/AppIcon.appiconset/AppStore.png new file mode 100644 index 0000000000000000000000000000000000000000..68de8aa951d4b53a64d59099fb37cf6e686ffbd3 GIT binary patch literal 183587 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 IdFzOO0rJ;Ii~s-t literal 0 HcmV?d00001 diff --git a/UnsplashApiApp/Assets.xcassets/AppIcon.appiconset/Contents.json b/UnsplashApiApp/Assets.xcassets/AppIcon.appiconset/Contents.json index 5b0ac8d..299517e 100644 --- a/UnsplashApiApp/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/UnsplashApiApp/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -78,8 +78,9 @@ "scale" : "1x" }, { - "idiom" : "ipad", "size" : "76x76", + "idiom" : "ipad", + "filename" : "icon_ipad@2x.png", "scale" : "2x" }, { @@ -89,8 +90,9 @@ "scale" : "2x" }, { - "idiom" : "ios-marketing", "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "AppStore.png", "scale" : "1x" } ], @@ -98,4 +100,4 @@ "version" : 1, "author" : "xcode" } -} \ No newline at end of file +} diff --git a/UnsplashApiApp/Assets.xcassets/AppIcon.appiconset/icon_ipad@2x.png b/UnsplashApiApp/Assets.xcassets/AppIcon.appiconset/icon_ipad@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1f72fb269e7ea4dba48352ef47975f471756af75 GIT binary patch literal 17713 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 C5Caha literal 0 HcmV?d00001 From 98eeded041080b085ff152032ca6470ad882a971 Mon Sep 17 00:00:00 2001 From: Olivier Halligon Date: Fri, 3 Apr 2020 19:26:36 +0200 Subject: [PATCH 02/20] Removing warnings --- UnsplashApiApp/Helpers/CellStyle.swift | 2 +- UnsplashApiApp/Network Layer/APIRequest.swift | 2 +- UnsplashApiApp/Network Layer/URLSessionExtension+Load.swift | 2 +- UnsplashApiApp/Views/SearchBarView.swift | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/UnsplashApiApp/Helpers/CellStyle.swift b/UnsplashApiApp/Helpers/CellStyle.swift index 00b8b26..ca52621 100644 --- a/UnsplashApiApp/Helpers/CellStyle.swift +++ b/UnsplashApiApp/Helpers/CellStyle.swift @@ -29,7 +29,7 @@ extension CellStyle { } struct Fonts { - static var regular = UIFont(name: "HelveticaNeue", size: 16) + static var regular = UIFont(name: "HelveticaNeue", size: 16) ?? UIFont.systemFont(ofSize: 16) } extension ImageViewState { diff --git a/UnsplashApiApp/Network Layer/APIRequest.swift b/UnsplashApiApp/Network Layer/APIRequest.swift index df81a04..f3ffd02 100644 --- a/UnsplashApiApp/Network Layer/APIRequest.swift +++ b/UnsplashApiApp/Network Layer/APIRequest.swift @@ -18,7 +18,7 @@ extension APIRequest { var urlRequest: URLRequest { guard let urlString = components.url?.absoluteString.removingPercentEncoding, let url = URL(string: urlString) else { - preconditionFailure("We should have a valid URL \(components.url?.absoluteString.removingPercentEncoding)") + preconditionFailure("We should have a valid URL \(components.url?.absoluteString.removingPercentEncoding ?? "nil")") } var request = URLRequest(url: url) request.setValue(accessKey, forHTTPHeaderField: "Authorization") diff --git a/UnsplashApiApp/Network Layer/URLSessionExtension+Load.swift b/UnsplashApiApp/Network Layer/URLSessionExtension+Load.swift index 079ae39..c44e97b 100644 --- a/UnsplashApiApp/Network Layer/URLSessionExtension+Load.swift +++ b/UnsplashApiApp/Network Layer/URLSessionExtension+Load.swift @@ -16,7 +16,7 @@ protocol Session { class NetworkSession: URLSession, Session { func load(_ resource: Resource, completion: @escaping (A?) -> ()) { - print("👾 resource URL \(resource.apiRequest.urlRequest.url?.absoluteString)") + print("👾 resource URL \(resource.apiRequest.urlRequest.url?.absoluteString ?? "nil")") URLSession.shared.dataTask(with: resource.apiRequest.urlRequest) { data, _, error in if let error = error { print("error while fetching data \(error)") diff --git a/UnsplashApiApp/Views/SearchBarView.swift b/UnsplashApiApp/Views/SearchBarView.swift index ac0538f..6e5c0e7 100644 --- a/UnsplashApiApp/Views/SearchBarView.swift +++ b/UnsplashApiApp/Views/SearchBarView.swift @@ -134,11 +134,11 @@ private extension UISearchBar { } private extension String { - func estimateHeightForText(width: CGFloat, font: UIFont? = Fonts.regular) -> CGFloat { + func estimateHeightForText(width: CGFloat, font: UIFont = Fonts.regular) -> CGFloat { let height: CGFloat = 50 let size = CGSize(width: width, height: height) let options = NSStringDrawingOptions.usesFontLeading.union(.usesLineFragmentOrigin) - let attributes = [NSAttributedString.Key.font: font] + let attributes: [NSAttributedString.Key: Any] = [.font: font] return NSString(string: self).boundingRect(with: size, options: options, attributes: attributes, context: nil).height } From 89ead7af925b4f87d8fbe419d6e557ff59231218 Mon Sep 17 00:00:00 2001 From: Olivier Halligon Date: Fri, 3 Apr 2020 20:37:23 +0200 Subject: [PATCH 03/20] Fix README --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2d6737c..e2513ca 100644 --- a/README.md +++ b/README.md @@ -7,15 +7,15 @@ Create an app to show the images from Unsplash App. - [x] Show description of the image on hover - [x] Open the image on full screen -![full image](/full-image.gif) +![full image](./full-image.gif) - [x] On full screen you can download and share the image ( you can see the author's name too ) - [x] Be able to search for specific keywords -![search](/search.gif) +![search](./search.gif) - [x] Add big keywords on search `collections` `photos` `curated` -- [x ] Make app universal +- [x] Make app universal - [ ] Animations transitions between controllers - [ ] Unit tests - [ ] Integration tests From b7b8e59f06ca91196afccf42cbe5eea0644b2b94 Mon Sep 17 00:00:00 2001 From: Olivier Halligon Date: Fri, 3 Apr 2020 20:37:34 +0200 Subject: [PATCH 04/20] Fix Unit Test not compiling --- UnsplashApiAppTests/ImageList/ImageListViewModelTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnsplashApiAppTests/ImageList/ImageListViewModelTests.swift b/UnsplashApiAppTests/ImageList/ImageListViewModelTests.swift index bc3078e..6dffbad 100644 --- a/UnsplashApiAppTests/ImageList/ImageListViewModelTests.swift +++ b/UnsplashApiAppTests/ImageList/ImageListViewModelTests.swift @@ -25,7 +25,7 @@ class ImageListViewModelTests: XCTestCase { let urlString = ImageAPIRequest(search: search).urlRequest.url?.absoluteString viewModel.delegate = delegate - viewModel.fetch(search) + viewModel.fetchNewQuery(search) session.assertEqual(.load) session.assertParameterEqual(urlString!) From d188e36e10f7a4adc1d5780fcc2f11dce94e699d Mon Sep 17 00:00:00 2001 From: Olivier Halligon Date: Fri, 3 Apr 2020 20:37:59 +0200 Subject: [PATCH 05/20] I'm a nitpicker. --- .../Helpers/UIView+AutoLayout.swift | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/UnsplashApiApp/Helpers/UIView+AutoLayout.swift b/UnsplashApiApp/Helpers/UIView+AutoLayout.swift index 0a3f0ec..f22700f 100644 --- a/UnsplashApiApp/Helpers/UIView+AutoLayout.swift +++ b/UnsplashApiApp/Helpers/UIView+AutoLayout.swift @@ -23,7 +23,7 @@ enum Edge { // MARK: Pin superview extension UIView { - func pinToSuperview(edges: [Edge], constant: CGFloat = 0, priority: UILayoutPriority = UILayoutPriority.required) { + func pinToSuperview(edges: [Edge], constant: CGFloat = 0, priority: UILayoutPriority = .required) { for edge in edges { switch edge { case .top: pinToSuperviewTop(constant: constant, priority: priority) @@ -35,7 +35,7 @@ extension UIView { } @discardableResult func pinToSuperviewTop(constant: CGFloat = 0, - priority: UILayoutPriority = UILayoutPriority.required, + priority: UILayoutPriority = .required, relatedBy relation: NSLayoutConstraint.Relation = .equal) -> NSLayoutConstraint { guard let superview = self.superview else { preconditionFailure("view has no superview") @@ -45,7 +45,7 @@ extension UIView { } @discardableResult func pinToSuperviewLeft(constant: CGFloat = 0, - priority: UILayoutPriority = UILayoutPriority.required, + priority: UILayoutPriority = .required, relatedBy relation: NSLayoutConstraint.Relation = .equal) -> NSLayoutConstraint { guard let superview = self.superview else { preconditionFailure("view has no superview") @@ -55,7 +55,7 @@ extension UIView { } @discardableResult func pinToSuperviewRight(constant: CGFloat = 0, - priority: UILayoutPriority = UILayoutPriority.required, + priority: UILayoutPriority = .required, relatedBy relation: NSLayoutConstraint.Relation = .equal) -> NSLayoutConstraint { guard let superview = self.superview else { preconditionFailure("view has no superview") @@ -65,7 +65,7 @@ extension UIView { } @discardableResult func pinToSuperviewBottom(constant: CGFloat = 0, - priority: UILayoutPriority = UILayoutPriority.required, + priority: UILayoutPriority = .required, relatedBy relation: NSLayoutConstraint.Relation = .equal) -> NSLayoutConstraint { guard let superview = self.superview else { preconditionFailure("view has no superview") @@ -75,7 +75,7 @@ extension UIView { } @discardableResult func limitFromSuperviewBottom(withMinimumConstant constant: CGFloat = 0, - priority: UILayoutPriority = UILayoutPriority.required) -> NSLayoutConstraint { + priority: UILayoutPriority = .required) -> NSLayoutConstraint { guard let superview = self.superview else { preconditionFailure("view has no superview") } @@ -88,7 +88,7 @@ extension UIView { } @discardableResult func limitFromSuperviewRight(withMinimumConstant constant: CGFloat = 0, - priority: UILayoutPriority = UILayoutPriority.required) -> NSLayoutConstraint { + priority: UILayoutPriority = .required) -> NSLayoutConstraint { guard let superview = self.superview else { preconditionFailure("view has no superview") } @@ -116,28 +116,28 @@ extension UIView { extension UIView { @discardableResult func pinTop(to view: UIView, constant: CGFloat = 0, - priority: UILayoutPriority = UILayoutPriority.required, + priority: UILayoutPriority = .required, relatedBy relation: NSLayoutConstraint.Relation = .equal) -> NSLayoutConstraint { return pin(edge: .top, to:.top, of: view, constant: constant, priority: priority, relatedBy: relation) } @discardableResult func pinBottom(to view: UIView, constant: CGFloat = 0, - priority: UILayoutPriority = UILayoutPriority.required, + priority: UILayoutPriority = .required, relatedBy relation: NSLayoutConstraint.Relation = .equal) -> NSLayoutConstraint { return pin(edge: .bottom, to:.bottom, of: view, constant: constant, priority: priority, relatedBy: relation) } @discardableResult func pinLeft(to view: UIView, constant: CGFloat = 0, - priority: UILayoutPriority = UILayoutPriority.required, + priority: UILayoutPriority = .required, relatedBy relation: NSLayoutConstraint.Relation = .equal) -> NSLayoutConstraint { return pin(edge: .left, to:.left, of: view, constant: constant, priority: priority, relatedBy: relation) } @discardableResult func pinRight(to view: UIView, constant: CGFloat = 0, - priority: UILayoutPriority = UILayoutPriority.required, + priority: UILayoutPriority = .required, relatedBy relation: NSLayoutConstraint.Relation = .equal) -> NSLayoutConstraint { return pin(edge: .right, to:.right, of: view, constant: constant, priority: priority, relatedBy: relation) } @@ -153,7 +153,7 @@ extension UIView { to otherEdge: Edge, of view: UIView, constant: CGFloat = 0, - priority: UILayoutPriority = UILayoutPriority.required, + priority: UILayoutPriority = .required, relatedBy relation: NSLayoutConstraint.Relation = .equal) -> NSLayoutConstraint { guard let superview = self.superview else { preconditionFailure("view has no superview") @@ -182,19 +182,19 @@ extension UIView { extension UIView { @discardableResult func addMaxWidthConstraint(with constant: CGFloat, - priority: UILayoutPriority = UILayoutPriority.required) -> NSLayoutConstraint { + priority: UILayoutPriority = .required) -> NSLayoutConstraint { return addWidthConstraint(with: constant, priority: priority, relatedBy: .lessThanOrEqual) } @discardableResult func addMinWidthConstraint(with constant: CGFloat, - priority: UILayoutPriority = UILayoutPriority.required) -> NSLayoutConstraint { + priority: UILayoutPriority = .required) -> NSLayoutConstraint { return addWidthConstraint(with: constant, priority: priority, relatedBy: .greaterThanOrEqual) } @discardableResult func addWidthConstraint(with constant: CGFloat, - priority: UILayoutPriority = UILayoutPriority.required, + priority: UILayoutPriority = .required, relatedBy relation: NSLayoutConstraint.Relation = .equal) -> NSLayoutConstraint { translatesAutoresizingMaskIntoConstraints = false @@ -212,7 +212,7 @@ extension UIView { } @discardableResult func addHeightConstraint(with constant: CGFloat, - priority: UILayoutPriority = UILayoutPriority.required, + priority: UILayoutPriority = .required, relatedBy relation: NSLayoutConstraint.Relation = .equal) -> NSLayoutConstraint { translatesAutoresizingMaskIntoConstraints = false @@ -235,7 +235,7 @@ extension UIView { extension UIView { @discardableResult func centerYToSuperview(constant: CGFloat = 0, - priority: UILayoutPriority = UILayoutPriority.required, + priority: UILayoutPriority = .required, relatedBy relation: NSLayoutConstraint.Relation = .equal) -> NSLayoutConstraint { guard let superview = self.superview else { preconditionFailure("view has no superview") @@ -256,7 +256,7 @@ extension UIView { } @discardableResult func centerXToSuperview(constant: CGFloat = 0, - priority: UILayoutPriority = UILayoutPriority.required, + priority: UILayoutPriority = .required, relatedBy relation: NSLayoutConstraint.Relation = .equal) -> NSLayoutConstraint { guard let superview = self.superview else { preconditionFailure("view has no superview") From 1434e1e2f45f0724c08bfaa360e8a934b80ba255 Mon Sep 17 00:00:00 2001 From: Olivier Halligon Date: Fri, 3 Apr 2020 20:44:35 +0200 Subject: [PATCH 06/20] HSB colorspace makes it way easier to determine color brightness --- UnsplashApiApp/Helpers/UIColor+HexInit.swift | 32 ++++++-------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/UnsplashApiApp/Helpers/UIColor+HexInit.swift b/UnsplashApiApp/Helpers/UIColor+HexInit.swift index 24509bc..4f3b94b 100644 --- a/UnsplashApiApp/Helpers/UIColor+HexInit.swift +++ b/UnsplashApiApp/Helpers/UIColor+HexInit.swift @@ -7,35 +7,23 @@ extension UIColor { .replacingOccurrences(of: "#", with: "") var rgbValue: UInt32 = 0 - if Scanner(string: hexString).scanHexInt32(&rgbValue) { - self.init( - red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0, - green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0, - blue: CGFloat(rgbValue & 0x0000FF) / 255.0, - alpha: CGFloat(1.0) - ) - } else { + guard Scanner(string: hexString).scanHexInt32(&rgbValue) else { return nil } + self.init( + red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0, + green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0, + blue: CGFloat(rgbValue & 0x0000FF) / 255.0, + alpha: CGFloat(1.0) + ) } // Check if the color is light or dark, as defined by the injected lightness threshold. // Some people report that 0.7 is best. // A false value is returned if the lightness couldn't be determined. - func isLight(threshold: Float = 0.5) -> Bool { - let originalCGColor = self.cgColor - - // Now we need to convert it to the RGB colorspace. UIColor.white / UIColor.black are greyscale and not RGB. - // If you don't do this then you will crash when accessing components index 2 below when evaluating greyscale colors. - let RGBCGColor = originalCGColor.converted(to: CGColorSpaceCreateDeviceRGB(), intent: .defaultIntent, options: nil) - guard let components = RGBCGColor?.components else { - return false - } - guard components.count >= 3 else { - return false - } - - let brightness = Float(((components[0] * 299) + (components[1] * 587) + (components[2] * 114)) / 1000) + func isLight(threshold: CGFloat = 0.5) -> Bool { + var brightness: CGFloat = 0.0 + self.getHue(nil, saturation: nil, brightness: &brightness, alpha: nil) return (brightness > threshold) } } From 2b9250901187c510e70bfef1891df18da59df596 Mon Sep 17 00:00:00 2001 From: Olivier Halligon Date: Fri, 3 Apr 2020 20:57:08 +0200 Subject: [PATCH 07/20] =?UTF-8?q?CellStyle.defaultSize=20uses=20UIApplicat?= =?UTF-8?q?ion.shared,=20not=20ideal.=20defaultSize=20is=20unused=20anyway?= =?UTF-8?q?=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- UnsplashApiApp/Helpers/CellStyle.swift | 3 --- 1 file changed, 3 deletions(-) diff --git a/UnsplashApiApp/Helpers/CellStyle.swift b/UnsplashApiApp/Helpers/CellStyle.swift index ca52621..70d42c8 100644 --- a/UnsplashApiApp/Helpers/CellStyle.swift +++ b/UnsplashApiApp/Helpers/CellStyle.swift @@ -13,18 +13,15 @@ import UIKit struct CellStyle { let reuseIdentifier: String let insets: UIEdgeInsets - let defaultSize: CGSize let itemsPerRow: CGFloat } extension CellStyle { static var iphone = CellStyle(reuseIdentifier: "ImageCell", insets: UIEdgeInsets(top: 16, left: 16, bottom: 16, right: 16), - defaultSize: CGSize(width: UIApplication.shared.keyWindow?.bounds.width ?? 300, height: 300), itemsPerRow: 1) static var ipad = CellStyle(reuseIdentifier: "ImageCell", insets: UIEdgeInsets(top: 16, left: 16, bottom: 16, right: 16), - defaultSize: CGSize(width: UIApplication.shared.keyWindow?.bounds.width ?? 300, height: 300), itemsPerRow: 2) } From 05ab305eec99b72bb601776b8a96e1eaebaf29c1 Mon Sep 17 00:00:00 2001 From: Olivier Halligon Date: Fri, 3 Apr 2020 21:16:34 +0200 Subject: [PATCH 08/20] Simplfying code for UIImageView+AsyncDownload and LoadAPIRequest + naming conventions and logic --- .../Helpers/UIImageView+AsyncDownload.swift | 22 ++++--------------- UnsplashApiApp/Network Layer/APIRequest.swift | 19 ++++++---------- .../Views/ImageCollectionViewCell.swift | 2 +- .../Views/ImageFullScreenView.swift | 2 +- 4 files changed, 13 insertions(+), 32 deletions(-) diff --git a/UnsplashApiApp/Helpers/UIImageView+AsyncDownload.swift b/UnsplashApiApp/Helpers/UIImageView+AsyncDownload.swift index 6b7bf03..20d91b8 100644 --- a/UnsplashApiApp/Helpers/UIImageView+AsyncDownload.swift +++ b/UnsplashApiApp/Helpers/UIImageView+AsyncDownload.swift @@ -10,30 +10,16 @@ import UIKit import Foundation extension UIImageView { - func imageFromServerURL(_ imageURL: String, placeHolder: UIImage?) { - func setPlaceHolder() { - DispatchQueue.main.async { - self.image = placeHolder - } - } - func setImage(_ downloadedImage: UIImage) { - DispatchQueue.main.async { - self.image = downloadedImage - } - } + func setImage(fromURL imageURL: String, placeHolder: UIImage?) { self.image = nil let request = LoadAPIRequest(imageURL: imageURL) let resource = Resource(get: request) Dependencies.enviroment.session.download(resource) { imageData, _ in - guard let data = imageData, - let image = UIImage(data: data) else { - setPlaceHolder() - return + let image = imageData.map(UIImage.init(data:)) + DispatchQueue.main.async { + self.image = image ?? placeHolder } - setImage(image) } - - } } diff --git a/UnsplashApiApp/Network Layer/APIRequest.swift b/UnsplashApiApp/Network Layer/APIRequest.swift index f3ffd02..ff1e243 100644 --- a/UnsplashApiApp/Network Layer/APIRequest.swift +++ b/UnsplashApiApp/Network Layer/APIRequest.swift @@ -84,18 +84,13 @@ final class DownloadAPIRequest: APIRequest { //Each Image parsed from the API comes with the urls for downloading the images, we use this request to get the proper URL for downloading for each image final class LoadAPIRequest: APIRequest { - var components: URLComponents { - var component = URLComponents() - component.scheme = "https" - component.host = "images.unsplash.com" - component.path = "\(imageURL)" - component.queryItems = self.queryItems - return component - } - var queryItems: [URLQueryItem] = [] - private let imageURL: String - + + let components: URLComponents + let queryItems: [URLQueryItem] = [] + init(imageURL: String) { - self.imageURL = imageURL.replacingOccurrences(of: "https://images.unsplash.com", with: "") + var components = URLComponents(string: imageURL) + components?.queryItems = self.queryItems + self.components = components ?? URLComponents() } } diff --git a/UnsplashApiApp/Views/ImageCollectionViewCell.swift b/UnsplashApiApp/Views/ImageCollectionViewCell.swift index 1b68b06..6fb2184 100644 --- a/UnsplashApiApp/Views/ImageCollectionViewCell.swift +++ b/UnsplashApiApp/Views/ImageCollectionViewCell.swift @@ -50,7 +50,7 @@ class ImageCollectionViewCell: UICollectionViewCell { } func update(with image: ImageViewState) { - imageView.imageFromServerURL(image.imageSmall, placeHolder: #imageLiteral(resourceName: "placeholder-square")) + imageView.setImage(fromURL: image.imageSmall, placeHolder: #imageLiteral(resourceName: "placeholder-square")) backgroundColor = image.colors.imageColor descriptionLabel.text = image.description hoverView.backgroundColor = image.colors.imageColor diff --git a/UnsplashApiApp/Views/ImageFullScreenView.swift b/UnsplashApiApp/Views/ImageFullScreenView.swift index 503094c..0b46c2d 100644 --- a/UnsplashApiApp/Views/ImageFullScreenView.swift +++ b/UnsplashApiApp/Views/ImageFullScreenView.swift @@ -85,7 +85,7 @@ class ImageFullScreenView: UIView { func bind(_ image: ImageViewState) { self.image = image - imageView.imageFromServerURL(image.imageRegular, placeHolder: #imageLiteral(resourceName: "placeholder-square")) + imageView.setImage(fromURL: image.imageRegular, placeHolder: #imageLiteral(resourceName: "placeholder-square")) backgroundColor = image.colors.textColor backgroundView.backgroundColor = image.colors.imageColor containerView.backgroundColor = image.colors.containerColor From 3a6ffdb10b820e3443025de4780bbdeb3fd5b7fc Mon Sep 17 00:00:00 2001 From: Olivier Halligon Date: Fri, 3 Apr 2020 21:17:30 +0200 Subject: [PATCH 09/20] isFetchingresults -> isFetchingResults --- UnsplashApiApp/View Controllers/ImageListViewController.swift | 2 +- UnsplashApiApp/View Model/ImageListViewModel.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/UnsplashApiApp/View Controllers/ImageListViewController.swift b/UnsplashApiApp/View Controllers/ImageListViewController.swift index 40d6424..52d1496 100644 --- a/UnsplashApiApp/View Controllers/ImageListViewController.swift +++ b/UnsplashApiApp/View Controllers/ImageListViewController.swift @@ -90,7 +90,7 @@ extension ImageListViewController: UICollectionViewDelegate, UICollectionViewDat } func scrollViewDidScroll(_ scrollView: UIScrollView) { - guard scrollView.isNearBottomEdge(padding: imageCellStyle.insets.bottom) && !viewModel.isFetchingresults else { + guard scrollView.isNearBottomEdge(padding: imageCellStyle.insets.bottom) && !viewModel.isFetchingResults else { return } fetchNextPage() diff --git a/UnsplashApiApp/View Model/ImageListViewModel.swift b/UnsplashApiApp/View Model/ImageListViewModel.swift index 6ecd71b..2f29d31 100644 --- a/UnsplashApiApp/View Model/ImageListViewModel.swift +++ b/UnsplashApiApp/View Model/ImageListViewModel.swift @@ -22,7 +22,7 @@ final class ImageListViewModel { return response.results.count } - var isFetchingresults: Bool { + var isFetchingResults: Bool { return loading } From 76607870a8de2f4dc2ac777af47d85d40c5362ab Mon Sep 17 00:00:00 2001 From: Olivier Halligon Date: Fri, 3 Apr 2020 21:46:21 +0200 Subject: [PATCH 10/20] Improved NetworkSession impl --- UnsplashApiApp.xcodeproj/project.pbxproj | 8 ++++---- ...RLSessionExtension+Load.swift => NetworkSession.swift} | 7 ++++--- 2 files changed, 8 insertions(+), 7 deletions(-) rename UnsplashApiApp/Network Layer/{URLSessionExtension+Load.swift => NetworkSession.swift} (81%) diff --git a/UnsplashApiApp.xcodeproj/project.pbxproj b/UnsplashApiApp.xcodeproj/project.pbxproj index 5f1a9cf..1363e5a 100644 --- a/UnsplashApiApp.xcodeproj/project.pbxproj +++ b/UnsplashApiApp.xcodeproj/project.pbxproj @@ -9,7 +9,7 @@ /* Begin PBXBuildFile section */ 0E134ECC22FAFE7600810484 /* HttpMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E134ECB22FAFE7600810484 /* HttpMethod.swift */; }; 0E134ECF22FAFE9A00810484 /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E134ECE22FAFE9A00810484 /* Image.swift */; }; - 0E134ED122FAFEC400810484 /* URLSessionExtension+Load.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E134ED022FAFEC400810484 /* URLSessionExtension+Load.swift */; }; + 0E134ED122FAFEC400810484 /* NetworkSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E134ED022FAFEC400810484 /* NetworkSession.swift */; }; 0E134ED322FAFF2300810484 /* APIRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E134ED222FAFF2300810484 /* APIRequest.swift */; }; 0E134ED622FC5DAC00810484 /* APIRequestsTestDoubles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E134ED522FC5DAC00810484 /* APIRequestsTestDoubles.swift */; }; 0E134EDB22FC620300810484 /* Dependencies.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E134EDA22FC620300810484 /* Dependencies.swift */; }; @@ -56,7 +56,7 @@ /* Begin PBXFileReference section */ 0E134ECB22FAFE7600810484 /* HttpMethod.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HttpMethod.swift; sourceTree = ""; }; 0E134ECE22FAFE9A00810484 /* Image.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Image.swift; sourceTree = ""; }; - 0E134ED022FAFEC400810484 /* URLSessionExtension+Load.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URLSessionExtension+Load.swift"; sourceTree = ""; }; + 0E134ED022FAFEC400810484 /* NetworkSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkSession.swift; sourceTree = ""; }; 0E134ED222FAFF2300810484 /* APIRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIRequest.swift; sourceTree = ""; }; 0E134ED522FC5DAC00810484 /* APIRequestsTestDoubles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIRequestsTestDoubles.swift; sourceTree = ""; }; 0E134EDA22FC620300810484 /* Dependencies.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Dependencies.swift; sourceTree = ""; }; @@ -206,7 +206,7 @@ children = ( 0E57708422FAFA2F004F78DE /* Resource.swift */, 0E134ECB22FAFE7600810484 /* HttpMethod.swift */, - 0E134ED022FAFEC400810484 /* URLSessionExtension+Load.swift */, + 0E134ED022FAFEC400810484 /* NetworkSession.swift */, 0E134ED222FAFF2300810484 /* APIRequest.swift */, ); path = "Network Layer"; @@ -383,7 +383,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 0E134ED122FAFEC400810484 /* URLSessionExtension+Load.swift in Sources */, + 0E134ED122FAFEC400810484 /* NetworkSession.swift in Sources */, 0E134EF52300CFBD00810484 /* UIView+AutoLayout.swift in Sources */, 0E134F002300E0DC00810484 /* CellStyle.swift in Sources */, 0E7435A1230B5889007C1EA5 /* SearchCategory.swift in Sources */, diff --git a/UnsplashApiApp/Network Layer/URLSessionExtension+Load.swift b/UnsplashApiApp/Network Layer/NetworkSession.swift similarity index 81% rename from UnsplashApiApp/Network Layer/URLSessionExtension+Load.swift rename to UnsplashApiApp/Network Layer/NetworkSession.swift index c44e97b..0384a66 100644 --- a/UnsplashApiApp/Network Layer/URLSessionExtension+Load.swift +++ b/UnsplashApiApp/Network Layer/NetworkSession.swift @@ -13,11 +13,12 @@ protocol Session { func download(_ resource: Resource, completion: @escaping (Data?, Error?) -> ()) } -class NetworkSession: URLSession, Session { +class NetworkSession: Session { + private let urlSession: URLSession = .shared func load(_ resource: Resource, completion: @escaping (A?) -> ()) { print("👾 resource URL \(resource.apiRequest.urlRequest.url?.absoluteString ?? "nil")") - URLSession.shared.dataTask(with: resource.apiRequest.urlRequest) { data, _, error in + urlSession.dataTask(with: resource.apiRequest.urlRequest) { data, _, error in if let error = error { print("error while fetching data \(error)") completion(nil) @@ -27,7 +28,7 @@ class NetworkSession: URLSession, Session { } func download(_ resource: Resource, completion: @escaping (Data?, Error?) -> ()) { - URLSession.shared.dataTask(with: resource.apiRequest.urlRequest) { data, _, error in + urlSession.dataTask(with: resource.apiRequest.urlRequest) { data, _, error in if let error = error { print("error while fetching data \(error)") completion(nil, error) From 2b7c4f93e1886a67f16c929817e46b1997fa5653 Mon Sep 17 00:00:00 2001 From: Olivier Halligon Date: Fri, 3 Apr 2020 21:51:04 +0200 Subject: [PATCH 11/20] Move declaration of Fonts constants to dedicated file --- UnsplashApiApp.xcodeproj/project.pbxproj | 4 ++++ UnsplashApiApp/Global/Fonts.swift | 13 +++++++++++++ UnsplashApiApp/Helpers/CellStyle.swift | 4 ---- 3 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 UnsplashApiApp/Global/Fonts.swift diff --git a/UnsplashApiApp.xcodeproj/project.pbxproj b/UnsplashApiApp.xcodeproj/project.pbxproj index 1363e5a..a88774d 100644 --- a/UnsplashApiApp.xcodeproj/project.pbxproj +++ b/UnsplashApiApp.xcodeproj/project.pbxproj @@ -41,6 +41,7 @@ 0ED7463C243255A300E8E625 /* TestSpy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ED7463B243255A300E8E625 /* TestSpy.swift */; }; 0EDA929623018F3F0044F35A /* ImageFullScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EDA929523018F3F0044F35A /* ImageFullScreenView.swift */; }; 0EDA92982304874B0044F35A /* ImageFullViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EDA92972304874A0044F35A /* ImageFullViewController.swift */; }; + 380BAFD12437CB0000C8ABE9 /* Fonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 380BAFD02437CB0000C8ABE9 /* Fonts.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -92,6 +93,7 @@ 0ED7463B243255A300E8E625 /* TestSpy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestSpy.swift; sourceTree = ""; }; 0EDA929523018F3F0044F35A /* ImageFullScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageFullScreenView.swift; sourceTree = ""; }; 0EDA92972304874A0044F35A /* ImageFullViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageFullViewController.swift; sourceTree = ""; }; + 380BAFD02437CB0000C8ABE9 /* Fonts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Fonts.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -157,6 +159,7 @@ children = ( 0E134EDA22FC620300810484 /* Dependencies.swift */, 0E6432A0230B677000B2A027 /* Colors.swift */, + 380BAFD02437CB0000C8ABE9 /* Fonts.swift */, ); path = Global; sourceTree = ""; @@ -399,6 +402,7 @@ 0E743597230AEE1C007C1EA5 /* SearchParameters.swift in Sources */, 0E134EF72300D0F000810484 /* ImageViewState.swift in Sources */, 0E57708522FAFA2F004F78DE /* Resource.swift in Sources */, + 380BAFD12437CB0000C8ABE9 /* Fonts.swift in Sources */, 0E134EDB22FC620300810484 /* Dependencies.swift in Sources */, 0E134EEC2300CDEA00810484 /* ImageListViewController.swift in Sources */, 0E134EF92300D14200810484 /* UIColor+HexInit.swift in Sources */, diff --git a/UnsplashApiApp/Global/Fonts.swift b/UnsplashApiApp/Global/Fonts.swift new file mode 100644 index 0000000..de419ff --- /dev/null +++ b/UnsplashApiApp/Global/Fonts.swift @@ -0,0 +1,13 @@ +// +// Fonts.swift +// UnsplashApiApp +// +// Created by Olivier Halligon on 03/04/2020. +// Copyright © 2020 Berta Devant. All rights reserved. +// + +import UIKit + +struct Fonts { + static var regular = UIFont(name: "HelveticaNeue", size: 16) ?? UIFont.systemFont(ofSize: 16) +} diff --git a/UnsplashApiApp/Helpers/CellStyle.swift b/UnsplashApiApp/Helpers/CellStyle.swift index 70d42c8..9079331 100644 --- a/UnsplashApiApp/Helpers/CellStyle.swift +++ b/UnsplashApiApp/Helpers/CellStyle.swift @@ -25,10 +25,6 @@ extension CellStyle { itemsPerRow: 2) } -struct Fonts { - static var regular = UIFont(name: "HelveticaNeue", size: 16) ?? UIFont.systemFont(ofSize: 16) -} - extension ImageViewState { func sizeFor(collectionWidth: CGFloat, cellStyle: CellStyle) -> CGSize { let padding: CGFloat = cellStyle.insets.left + cellStyle.insets.right From 844c93bef1acbc10bd99c37e87f59d9197f44e5b Mon Sep 17 00:00:00 2001 From: Olivier Halligon Date: Fri, 3 Apr 2020 21:56:55 +0200 Subject: [PATCH 12/20] Extract APIKey to Global constants Put it in Dependencies.swift, could have moved it to a files in `Globals/` folder instead, ultimate goal is to make it easily extractable to later find a way to not commit it at all --- UnsplashApiApp/Global/Dependencies.swift | 9 ++++----- UnsplashApiApp/Network Layer/APIRequest.swift | 15 +++------------ 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/UnsplashApiApp/Global/Dependencies.swift b/UnsplashApiApp/Global/Dependencies.swift index 6cc294b..8cfb014 100644 --- a/UnsplashApiApp/Global/Dependencies.swift +++ b/UnsplashApiApp/Global/Dependencies.swift @@ -9,10 +9,9 @@ import Foundation struct Dependencies { - var session: Session + var session: Session = NetworkSession() + // FIXME: Extract this in some local-only config file to avoid commiting this to GitHub + var apiKey: String = "40c9db0853526d8cf7d3338a9b6a14722de5ae8adb7efb83e5ea7954d4809dce" + static var enviroment = Dependencies() - - init(session: Session = NetworkSession()) { - self.session = session - } } diff --git a/UnsplashApiApp/Network Layer/APIRequest.swift b/UnsplashApiApp/Network Layer/APIRequest.swift index ff1e243..e455546 100644 --- a/UnsplashApiApp/Network Layer/APIRequest.swift +++ b/UnsplashApiApp/Network Layer/APIRequest.swift @@ -21,23 +21,14 @@ extension APIRequest { preconditionFailure("We should have a valid URL \(components.url?.absoluteString.removingPercentEncoding ?? "nil")") } var request = URLRequest(url: url) - request.setValue(accessKey, forHTTPHeaderField: "Authorization") + request.setValue("Client-ID \(Dependencies.enviroment.apiKey)", forHTTPHeaderField: "Authorization") return request } } -private extension APIRequest { - var accessKey: String { - return "Client-ID 40c9db0853526d8cf7d3338a9b6a14722de5ae8adb7efb83e5ea7954d4809dce" - } -} - final class ImageAPIRequest: APIRequest { let searchParameters: SearchParameters - var queryItems: [URLQueryItem] { - return setQueryItems() - } - + var components: URLComponents { var component = URLComponents() component.scheme = "https" @@ -51,7 +42,7 @@ final class ImageAPIRequest: APIRequest { self.searchParameters = search } - private func setQueryItems() -> [URLQueryItem] { + var queryItems: [URLQueryItem] { var queryItems: [URLQueryItem] = [] let page: String = searchParameters.page == 0 ? "1" : searchParameters.page.description queryItems.append(URLQueryItem(name: "page", value: page)) From 79dc9ee2a6bdacab315afc13e09c27969a0580fe Mon Sep 17 00:00:00 2001 From: Olivier Halligon Date: Fri, 3 Apr 2020 22:09:25 +0200 Subject: [PATCH 13/20] Simplify APIRequest code --- UnsplashApiApp/Network Layer/APIRequest.swift | 51 +++++++------------ 1 file changed, 19 insertions(+), 32 deletions(-) diff --git a/UnsplashApiApp/Network Layer/APIRequest.swift b/UnsplashApiApp/Network Layer/APIRequest.swift index e455546..b1bbd01 100644 --- a/UnsplashApiApp/Network Layer/APIRequest.swift +++ b/UnsplashApiApp/Network Layer/APIRequest.swift @@ -8,10 +8,18 @@ import Foundation +private func makeUnsplashComponent(path: String, queryItems: [URLQueryItem] = []) -> URLComponents { + var component = URLComponents() + component.scheme = "https" + component.host = "api.unsplash.com" + component.path = path + component.queryItems = queryItems + return component +} + + protocol APIRequest { var components: URLComponents { get } - var queryItems: [URLQueryItem] { get } - var urlRequest: URLRequest { get } } extension APIRequest { @@ -30,58 +38,37 @@ final class ImageAPIRequest: APIRequest { let searchParameters: SearchParameters var components: URLComponents { - var component = URLComponents() - component.scheme = "https" - component.host = "api.unsplash.com" - component.path = searchParameters.searchType.rawValue - component.queryItems = self.queryItems - return component - } - - init(search: SearchParameters) { - self.searchParameters = search - } - - var queryItems: [URLQueryItem] { var queryItems: [URLQueryItem] = [] let page: String = searchParameters.page == 0 ? "1" : searchParameters.page.description queryItems.append(URLQueryItem(name: "page", value: page)) if !searchParameters.query.isEmpty { queryItems.append(URLQueryItem(name: "query", value: searchParameters.query)) } - return queryItems + return makeUnsplashComponent(path: searchParameters.searchType.rawValue, queryItems: queryItems) + } + + init(search: SearchParameters) { + self.searchParameters = search } } //Unsplash API demands that we trigger a download count when downloading a picture, this request is created to handle that // https://unsplash.com/documentation#track-a-photo-download final class DownloadAPIRequest: APIRequest { - var components: URLComponents { - var component = URLComponents() - component.scheme = "https" - component.host = "api.unsplash.com" - component.path = "/photos/\(imageId)/download" - component.queryItems = self.queryItems - return component - } - - private let imageId: String - var queryItems: [URLQueryItem] = [] - + let components: URLComponents + init(imageID: String) { - self.imageId = imageID + self.components = makeUnsplashComponent(path: "/photos/\(imageID)/download") } } //Each Image parsed from the API comes with the urls for downloading the images, we use this request to get the proper URL for downloading for each image final class LoadAPIRequest: APIRequest { - let components: URLComponents - let queryItems: [URLQueryItem] = [] init(imageURL: String) { var components = URLComponents(string: imageURL) - components?.queryItems = self.queryItems + components?.queryItems = [] self.components = components ?? URLComponents() } } From 2c383d1bb099618f871198f3b7a3abe96d29058c Mon Sep 17 00:00:00 2001 From: Olivier Halligon Date: Fri, 3 Apr 2020 22:29:17 +0200 Subject: [PATCH 14/20] Improve ImageViewState structure --- UnsplashApiApp/Model/ImageViewState.swift | 41 ++++++++++--------- .../View Model/ImageListViewModel.swift | 2 +- .../Helpers/UIColorExtensionsTests.swift | 4 +- 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/UnsplashApiApp/Model/ImageViewState.swift b/UnsplashApiApp/Model/ImageViewState.swift index 2f69040..2435199 100644 --- a/UnsplashApiApp/Model/ImageViewState.swift +++ b/UnsplashApiApp/Model/ImageViewState.swift @@ -9,6 +9,12 @@ import UIKit struct ImageViewState { + struct Colors { + let imageColor: UIColor + let textColor: UIColor + let containerColor: UIColor + } + let id: String let colors: Colors let size: CGSize @@ -19,26 +25,23 @@ struct ImageViewState { let author: AuthorViewState } -extension Image { - func viewState() -> ImageViewState { - return ImageViewState(id: self.id, - colors: Colors(imageColor: UIColor(hexString: self.color)), - size: CGSize(width: self.width, height: self.height), - description: self.description, - imageSmall: self.urls.small, - imageRegular: self.urls.regular, - imageFull: self.urls.full, - author: self.user.viewModel()) +extension ImageViewState { + init(image: Image) { + self.init( + id: image.id, + colors: .init(imageColor: UIColor(hexString: image.color)), + size: CGSize(width: image.width, height: image.height), + description: image.description, + imageSmall: image.urls.small, + imageRegular: image.urls.regular, + imageFull: image.urls.full, + author: .init(author: image.user) + ) } } -struct Colors { - let imageColor: UIColor - let textColor: UIColor - let containerColor: UIColor -} -extension Colors { +extension ImageViewState.Colors { init(imageColor: UIColor?) { guard let imageColor = imageColor else { self.imageColor = .white @@ -56,8 +59,8 @@ struct AuthorViewState { let name: String } -extension Author { - func viewModel() -> AuthorViewState { - return AuthorViewState(name: self.name) +extension AuthorViewState { + init(author: Author) { + self.init(name: author.name) } } diff --git a/UnsplashApiApp/View Model/ImageListViewModel.swift b/UnsplashApiApp/View Model/ImageListViewModel.swift index 2f29d31..3ad82ff 100644 --- a/UnsplashApiApp/View Model/ImageListViewModel.swift +++ b/UnsplashApiApp/View Model/ImageListViewModel.swift @@ -27,7 +27,7 @@ final class ImageListViewModel { } func image(at index: Int) -> ImageViewState { - return response.results[index].viewState() + return ImageViewState(image: response.results[index]) } func fetchNextPage(_ searchParameters: SearchParameters) { diff --git a/UnsplashApiAppTests/Helpers/UIColorExtensionsTests.swift b/UnsplashApiAppTests/Helpers/UIColorExtensionsTests.swift index 9ed6667..c0798cd 100644 --- a/UnsplashApiAppTests/Helpers/UIColorExtensionsTests.swift +++ b/UnsplashApiAppTests/Helpers/UIColorExtensionsTests.swift @@ -13,14 +13,14 @@ class UIColorExtensionsTests: XCTestCase { func testIsLIghtReturnsTrueWhenLightColor() { let image = Image.testData(color: "#d68787") - let viewModel = image.viewState() + let viewModel = ImageViewState(image: image) XCTAssertTrue(UIColor(hexString: "#d68787")!.isLight()) XCTAssertTrue(viewModel.colors.textColor == UIColor.gray) } func testIsLIghtReturnsFalseWhenDarkColor() { let image = Image.testData(color: "#040124") - let viewModel = image.viewState() + let viewModel = ImageViewState(image: image) XCTAssertFalse(UIColor(hexString: "#040124")!.isLight()) XCTAssertTrue(viewModel.colors.textColor == UIColor.white) } From 7a427175dc1101f83815127bfe352a9fc8bcef3c Mon Sep 17 00:00:00 2001 From: Olivier Halligon Date: Fri, 3 Apr 2020 22:34:28 +0200 Subject: [PATCH 15/20] Using enum for static constants, and var -> let --- UnsplashApiApp/Global/Colors.swift | 6 +++--- UnsplashApiApp/Global/Fonts.swift | 4 ++-- UnsplashApiApp/Model/SearchCategory.swift | 10 +++++----- UnsplashApiApp/Views/SearchBarView.swift | 14 +++++++------- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/UnsplashApiApp/Global/Colors.swift b/UnsplashApiApp/Global/Colors.swift index 5a6f1d5..ea58af5 100644 --- a/UnsplashApiApp/Global/Colors.swift +++ b/UnsplashApiApp/Global/Colors.swift @@ -8,7 +8,7 @@ import UIKit -struct Color { - static var darkGray: UIColor = UIColor(hexString: "#999999") ?? .gray - static var lightGray: UIColor = UIColor(hexString: "#EEEEEE") ?? .gray +enum Colors { + static let darkGray: UIColor = UIColor(hexString: "#999999") ?? .gray + static let lightGray: UIColor = UIColor(hexString: "#EEEEEE") ?? .gray } diff --git a/UnsplashApiApp/Global/Fonts.swift b/UnsplashApiApp/Global/Fonts.swift index de419ff..83f7a4f 100644 --- a/UnsplashApiApp/Global/Fonts.swift +++ b/UnsplashApiApp/Global/Fonts.swift @@ -8,6 +8,6 @@ import UIKit -struct Fonts { - static var regular = UIFont(name: "HelveticaNeue", size: 16) ?? UIFont.systemFont(ofSize: 16) +enum Fonts { + static let regular = UIFont(name: "HelveticaNeue", size: 16) ?? UIFont.systemFont(ofSize: 16) } diff --git a/UnsplashApiApp/Model/SearchCategory.swift b/UnsplashApiApp/Model/SearchCategory.swift index d15e7f8..4e96a43 100644 --- a/UnsplashApiApp/Model/SearchCategory.swift +++ b/UnsplashApiApp/Model/SearchCategory.swift @@ -14,9 +14,9 @@ struct SearchCategory { } extension SearchCategory { - static var barcelona = SearchCategory(name: "Barcelona", query: "barcelona") - static var wallpaper = SearchCategory(name: "Wallpaper", query: "wallpaper") - static var architecture = SearchCategory(name: "Architecture", query: "architecture") - static var experimental = SearchCategory(name: "Experimental", query: "experimental") - static var textures = SearchCategory(name: "Textures & Patterns", query: "textures-patterns") + static let barcelona = SearchCategory(name: "Barcelona", query: "barcelona") + static let wallpaper = SearchCategory(name: "Wallpaper", query: "wallpaper") + static let architecture = SearchCategory(name: "Architecture", query: "architecture") + static let experimental = SearchCategory(name: "Experimental", query: "experimental") + static let textures = SearchCategory(name: "Textures & Patterns", query: "textures-patterns") } diff --git a/UnsplashApiApp/Views/SearchBarView.swift b/UnsplashApiApp/Views/SearchBarView.swift index 6e5c0e7..ea3c4f1 100644 --- a/UnsplashApiApp/Views/SearchBarView.swift +++ b/UnsplashApiApp/Views/SearchBarView.swift @@ -19,11 +19,11 @@ class SearchBarView: UIView { private var searchBar: UISearchBar = { let bar = UISearchBar() bar.barStyle = .default - bar.barTintColor = Color.darkGray - bar.tintColor = Color.darkGray + bar.barTintColor = Colors.darkGray + bar.tintColor = Colors.darkGray bar.backgroundImage = UIImage() - bar.textField?.backgroundColor = Color.lightGray - bar.textField?.textColor = Color.darkGray + bar.textField?.backgroundColor = Colors.lightGray + bar.textField?.textColor = Colors.darkGray return bar }() @@ -60,7 +60,7 @@ class SearchBarView: UIView { for category in categories { let button = UIButton() button.setTitle(category.name, for: .normal) - button.setTitleColor(Color.darkGray, for: .normal) + button.setTitleColor(Colors.darkGray, for: .normal) button.addTarget(self, action: #selector(categoryButtonTapped), for: .touchUpInside) stackView.addArrangedSubview(button) } @@ -113,7 +113,7 @@ extension SearchBarView: UISearchBarDelegate { private extension UIView { func setShadowForView() { - self.layer.shadowColor = Color.darkGray.cgColor + self.layer.shadowColor = Colors.darkGray.cgColor self.layer.shadowOpacity = 1 self.layer.shadowOffset = .zero self.layer.shadowRadius = 10 @@ -122,7 +122,7 @@ private extension UIView { } func setBorder() { - self.layer.borderColor = Color.lightGray.cgColor + self.layer.borderColor = Colors.lightGray.cgColor self.layer.borderWidth = 0.2 } } From 5991ec7ac10c3f993b23d5c52be87a6f3f2937d8 Mon Sep 17 00:00:00 2001 From: Olivier Halligon Date: Fri, 3 Apr 2020 23:21:05 +0200 Subject: [PATCH 16/20] Adding an indicator to UIImageView while loading Though this doesn't solve the problem that it shouldn't be the responsibility of the View layer to load an image and that it's gonna lead to cell recycling bugs --- .../Helpers/UIImageView+AsyncDownload.swift | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/UnsplashApiApp/Helpers/UIImageView+AsyncDownload.swift b/UnsplashApiApp/Helpers/UIImageView+AsyncDownload.swift index 20d91b8..1c5ce64 100644 --- a/UnsplashApiApp/Helpers/UIImageView+AsyncDownload.swift +++ b/UnsplashApiApp/Helpers/UIImageView+AsyncDownload.swift @@ -14,13 +14,37 @@ extension UIImageView { self.image = nil let request = LoadAPIRequest(imageURL: imageURL) let resource = Resource(get: request) + let indicator = addLoadingIndicator() Dependencies.enviroment.session.download(resource) { imageData, _ in let image = imageData.map(UIImage.init(data:)) DispatchQueue.main.async { self.image = image ?? placeHolder + indicator.removeFromSuperview() } } } + + private func addLoadingIndicator() -> UIView { + let roundedSquare = UIView() + roundedSquare.backgroundColor = Colors.darkGray.withAlphaComponent(0.3) + roundedSquare.layer.cornerRadius = 20.0 + roundedSquare.layer.masksToBounds = true + self.addSubview(roundedSquare) + roundedSquare.addWidthConstraint(with: 80) + roundedSquare.addHeightConstraint(with: 80) + roundedSquare.centerXToSuperview() + roundedSquare.centerYToSuperview() + + let indicator = UIActivityIndicatorView(style: .whiteLarge) + roundedSquare.addSubview(indicator) + indicator.sizeToFit() + indicator.centerXToSuperview() + indicator.centerYToSuperview() + + indicator.startAnimating() + + return roundedSquare + } } From b7c8d7425025f9637e29a7081f2e74402900b128 Mon Sep 17 00:00:00 2001 From: Olivier Halligon Date: Fri, 3 Apr 2020 23:37:03 +0200 Subject: [PATCH 17/20] Review Notes so far --- ReviewNotes.md | 166 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 ReviewNotes.md diff --git a/ReviewNotes.md b/ReviewNotes.md new file mode 100644 index 0000000..6ff22b3 --- /dev/null +++ b/ReviewNotes.md @@ -0,0 +1,166 @@ +# Review Notes + +## First impressions + + - Good outlook of project + - You have your files nicely grouped in a clear way View, ViewModels, etc. Makes it also clear that you're using an architecture that makes use of ViewModels, I like that too + - You seem to have tests, that's a good start too. The Unit Test target [does not compile though](https://github.com/bertadevant/UnsplashAPIApp/commit/b7b8e59f06ca91196afccf42cbe5eea0644b2b94), and once I fix it to make it compile, I have 3 tests failing + - [README](https://github.com/bertadevant/UnsplashAPIApp/commit/89ead7af925b4f87d8fbe419d6e557ff59231218): I know it's just a private project for now, but for demo projects intended for interviews I suggest you to add some notes in the future, like: + - What does this demo shows: That's already part of your README so, great + - What architecture choices did you make and why. There's no silver bullets in architecture, the most important thing, as least to my PoV, is that you are able to explain your choices and why you went with one solution rather than another. Is it to make it testable? To make it flexible? Easy to reason about? Be SOLID? etc + - You had (easy to fix) warnings when opening the project: not a great look for reviewer opening your code + - some warnings about code [commit](https://github.com/bertadevant/UnsplashAPIApp/commit/98eeded041080b085ff152032ca6470ad882a971) + - some warnings about assets [commit](https://github.com/bertadevant/UnsplashAPIApp/commit/7c95db452f68b8021b26a4ee9a5fe4ba42889b77) + - You don't have any dependencies in that project. That great. + - I mean, if that was a sign that you instead reinvented every complex thing yourself instead of using an existing lib (NIH syndrome) that wouldn't be a good sign + - Or if it was because you instead copy/pasted lib code into your project reather than using a dep manager, that wouldn't be good either + - But in your case at least I can see that since you didn't need any dependency, you didn't feel the urge to have a `Podfile` or `Cartfile` like some other + people that I see including well-known pods in their demo project "just because it's a pod I see everywhere and add no questions asked" like AFNetworks or similar, + while they actually don't need it. In that sense that's a good sign that your project is clean and simple without any useless deps! + +### UX + +When running the app in the simulator (usually the first thing I do on a interviewee project, also to see if it compiles and works out of the box), UI felt nice and + enjoyable. +But the time it took for the images to load felt quite long, and I only got a solid-fill rectangle in the ImageView while waiting for the actual image to load. + +Maybe at least add a spinner or something while loading the image to let the user know that it's loading instead of feeling like it's a bug. +[commit](https://github.com/bertadevant/UnsplashAPIApp/commit/5991ec7ac10c3f993b23d5c52be87a6f3f2937d8) – though that won't help with the recycling bug (see below) + +Ideally starting by loading lower resolutions of the image first, and only load full-res when you click to show the image full-screen would also probably improve the UX a lot (idk if the Unsplash API provides those lower-res images?). + +That's also probably a feature you just didn't have time to develop just yet, but in that case it would still be worth mentioning that in the README for the recruiter as "Future Improvements" to let them know that you thought about it. + +### Cell recycling bug + +Because you use `UIImageView` method that asynchronously sets its own image after an async network request, there is an issue with cell recycling. +Because if the user scrolls while the image is loading, your CollectionView will recycling the views that are going offscreen even if they were loading, and reuse them for a different image. + +So basically: + - if you have set an image `urlA` on an `UIImageView` in cell X by calling your method that set the image from URL + - then the user scrolls down in the `UICollectionView`, so cell X goes offscreen, and is recycled and reused for a later `IndexPath` down the road, this time corresponding to `urlB` + - so you call your method to set the image of that cell to `urlB` (same cell, since it's recycled from previous cell X you used for `urlA`) + - at that stage there are two network requests in the air, one for `urlA` and one for `urlB`, that will ultimately update the `self.image` of the same `UIImageView` instance + - so if `urlA` 's response arrives before `urlB`'s response, you'll see image of `urlA` in a cell that has since been recycled and is supposed to contain image of `urlB`… and only a bit later once `urlB`'s response arrives will you see that `UIImageView` be updated with the expected image (that is, if the user didn't continue scrolling yet another `IndexPath`that started to load `urlC`… and so on) + - if `urlB`'s response arrives before `urlA`'s response, then you'll see the expected image in your cell… but then later the old and unexpected one + +⚠️ So overall it's best to handle that loading logic at the level of your `ImageListViewModel` instead. Instead of holding a list of images (your `typealias ImageList` in your VM), your VM could for example hold a list of `[ImageState]` with `ImageState` could be an `enum ImageState { case loading(URL); case loaded(Image) }`. + +It's then the responsability of your ViewModel to decide if it needs to provide the cell with a loading view with placeholder, or with a loaded view with image. This responsability should not be owned by the view layer (your `UIImageView` extension in your case) + + +## Project Notes + + - Some files have names that don't match the class they containing an implementation for. This makes it hard to find back where each class is defined. + - For example `URLSessionExtension+Load` contains `protocol Session` and `class NetworkSession` (but no `extension URLSession`). + - I figure that's legacy from a former impl, but it's still nice to tidy things up + - Some classes are declared in places that seems unlikely or unrelated. For example you declare your color constants in `Global/Colors.swift` (👍) but you declare your Font constants in… `CellStyle.swift`? [commit](https://github.com/bertadevant/UnsplashAPIApp/commit/2b7c4f93e1886a67f16c929817e46b1997fa5653) + + +## Code Notes + +### `CellSize.swift` + +[commit](https://github.com/bertadevant/UnsplashAPIApp/commit/2b9250901187c510e70bfef1891df18da59df596) + +I don't really like the use of `UIApplication.shared.keyWindow` here for multiple reasons: + +1. the `keyWindow` can change during the lifecycle of the app, so depending on when those static var are (lazily) created, this will affect the default size +2. this relies on using a shared singleton instance, `UIApplication` even. Not good for testability + +But actually I didn't even see that `defaultSize` property used anywhere anyway, so ended up deleting it – not a good idea to keep dead code in a demo project 😅 – but still wanted to note those suggestions here. + +### Creating viewModels from Models + +I'm not sure if I can really justify why, as it's more like a feel and convention, but it feels strange to provide extensions on your models to build ViewModels from it, rather than provide an init to your ViewModels to create them from your Models. + +I think the intuition I get from this is that ViewModels should be build from models, like there's a sense of hierarchy in the architecture layers here. A ViewController has/is constructed from a ViewModel which is constructed from a Model. So you pass the ViewModel to the Controller to build it, so also makes sense that you pass the Model to the `ViewModel.init` to build it + + +You also seem to use `ViewModel` and `ViewState` interchangeably or at least confuse the two sometimes, e.g. `func viewModel() -> AuthorViewState` on `extension Author` in `ImageViewState.swift` + +Also, your type `struct Colors` has a name that is a little too close from your `struct Color` you use in … `Colors.swift` to declare your color constants. +And since it's only used as an inside type for your `ImageViewState`, best solution is to just declare it as a subtype of `ImageViewState`, both to scope it and avoid any confusion. + +[commit](https://github.com/bertadevant/UnsplashAPIApp/commit/2c383d1bb099618f871198f3b7a3abe96d29058c) + +### `UIButton+LoadingIndicator` + +It's quite bad practice to use `UIView.tag`. It's a hack in UIKit that should never have existed, and it's generally viewed poorly when seen in code. + +I highly suggest that you create a subclass `class LoadingButton: UIButton` which adds the loadingIndicator as subview on its `init`, store that in a private property of your `LoadingButton`, recenters it on `layoutSubviews`, and provide a public API to toggle the loadingIndicator instead. + +## NetworkLayer + +### `LoadAPIRequest` + +It's a bit confusing that you build a LoadAPIRequest from a full URL string, then delete the https://{host} from that String, only to later re-inject it via the components… and rebuild the URL on your Network Layer… + +Besides repeating the scheme and host twice (in `var components` and in the `init` when you remove it), this is not super testable either… + +[commit](https://github.com/bertadevant/UnsplashAPIApp/commit/05ab305eec99b72bb601776b8a96e1eaebaf29c1) + +### `APIRequest` + +Not a good look to have your API key hardcoded here, not only for security reasons but also because keys like that should not be defined deep inside the code as they would be hard to find later. I suggest you use your `Dependencies` object for that instead at least to inject it there. Or to create a dedicated file for constants like that in your `Globals/` folder and put it here. + +This is also because your `NetworkLayer` should be agnostic of who is using it. It should be a client that works for anyone willing to use the Unspalsh API. Hard-coding a Client-ID inside the NetworkLayer itself is not a good separation of concern there. + +As for the security part of things, that's less trivial to fix: ideally you should not commit your API keys to GitHub. You could for example have your keys in some `plist` file that you include in your project and read at runtime, but never commit that `plist` and document in the README that the user is supposed to create it with their own APIKey. + +It would still be ok to provide the plist with your own Key to a recruiter as part of a ZIP containing your project so that they are able to run the project immediately after unzipping, but at least you'd have shown that you didn't hardcode the APIKey. + +Other solutions exists (the best probably being CocoaPods-Keys, but since you don't use CocoaPods in this project, probably not worth the effort for a simple toy project like that) + +BTW this is typically the kind of things that you could document in your README for a recruiter btw (e.g. "I hardcoded the API Key in this config file that I provided here, to make it simple for reviewers to be able to run the project out of the box, but in a real project I'd have used X or Y instead") + +[commit](https://github.com/bertadevant/UnsplashAPIApp/commit/844c93bef1acbc10bd99c37e87f59d9197f44e5b) + +Another note: why the need for the `APIRequest` protocol to have both a `URLComponent` and a `queryItems`, while you always include the queryItems as part of the `URLComponents` anyway? Also, you repeat the `https` and `api.unsplash.com` multiple times… [commit](https://github.com/bertadevant/UnsplashAPIApp/commit/79dc9ee2a6bdacab315afc13e09c27969a0580fe) + +### `Resource.swift` + +I liked that very much! The concept of bundling `APIRequest` + `parse` method and making it monadic by providing a `map` on it is a very good choice. + +Only thing I would change is to not discard the potential error there. i.e. change `parse` to a `(Data) throws -> A` and throw the error instead of returning `nil` + +### `URLSessionExtension+Load.swift` (now `NetworkSession.swift`) + +I like the idea of having a `Session` protocol, makes things testable + +I'd not make `NetworkSession` inherit from `URLSession` though. There is no need for that, and it introduces the risk of allowing you to write methods taking `URLSession` (instead of `Sessions`) parameters and still compile when you pass a `NetworkSession` without warning you that you used the wrong parameter type (as expecting a `URLSession` parameter instead of using your `Session` abstraction won't make it testable). + +[commit](https://github.com/bertadevant/UnsplashAPIApp/commit/76607870a8de2f4dc2ac777af47d85d40c5362ab) + +## Other + +I liked that you use `struct SearchCategory` with and `extension SearchCategory` containing `static` constants. Those should be `let` not `var` though. + +But otherwise it's a nice solution to use rather than an `enum`. Some people would have used an `enum` instead but an `enum` is supposed to be closed (a finite set of values that have no intention to grow or change) and something for which using a `switch` on would make sense, which is not the case here. So using a `struct` + `extension with static let` was a good choice, because it makes it clear that those are some suggested values but that it's also valid to add more, and to also allow other devs using your code to create their own `SearchCategory` rather than being limited on using only a fixed/closed set of the ones provided. 👍 + +--- + +Speaking of `enum` vs `struct`, when declaring types that only serve as namespaces, like `Color` or `Fonts` (oh, inconsistent naming here, singular vs plural…), it's common practice to: + + - Either declare `private init(){}` on your struct serving as namespace, because that type is only containing `static` properties and is not intended to be instantiated + - Or more commonly, use `enum` (even if it's a `case`-less enum and kind of working around the original purpose of `enum`), which ultimately provides the same behavior (declaring a type just for the sake of being used as a namespace containing only `static` properties) but doesn't require you to declare a `private init(){}` explicitly, since an `enum` with no case (known in the jargon as an "inhabited type") already can't be instanciated. + - Use `let` instead of `var` for those `static` constants. They are constants, after all! + + A use case where you can use `struct` instead of `enum` is if you _do_ intend to (or that it _does_ makes sense to) let a developer using your code to create other things of that type. + - For `enum Fonts` and `enum Colors` those are namespaces returning objects of a different type (those enum are an inhabited type anyway so you couldn't create an instance of those), namely `UIColor` and `UIFont` here. You don't intend other devs to do `let f = Fonts()` + - But for `struct SearchCategory` you provide a type, then provide default common values for it via `static let` properties returning `SearchCategories` too, so that's a bit different. You don't want to forbid other devs to create theyr own if they need/want to (why would you prevent others to call `SearchCategory(…, …)` init after all) so for this one it makes sense to keep it as a `struct` + +[commit](https://github.com/bertadevant/UnsplashAPIApp/commit/7a427175dc1101f83815127bfe352a9fc8bcef3c) + +## TODO + +For me as a reviewer: + +- [ ] Review the code of the Tests, I haven't taken the time yet to go thru them +- [ ] Review the `ViewController`, I kinda skipped them as I focused on architecture and the Models/ViewModels/Network layers + +For you, things that I didn't provide a commit/fix for: + +- [ ] Image Loading: move loading logic (network request) to ViewModel layer, + see if we can't load low-res first +- [ ] UIButton subclass with loader instead of `extensions` + `view.tag` +- [ ] Fix your Unit Tests From e16714dbc36fb08c2b8eb8202212f03dd717562a Mon Sep 17 00:00:00 2001 From: Olivier Halligon Date: Sat, 4 Apr 2020 14:04:47 +0200 Subject: [PATCH 18/20] NetworkSession should be the one injecting the APIKey --- UnsplashApiApp/Global/Dependencies.swift | 7 ++++--- UnsplashApiApp/Network Layer/APIRequest.swift | 12 ----------- .../Network Layer/NetworkSession.swift | 21 ++++++++++++++++--- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/UnsplashApiApp/Global/Dependencies.swift b/UnsplashApiApp/Global/Dependencies.swift index 8cfb014..3744442 100644 --- a/UnsplashApiApp/Global/Dependencies.swift +++ b/UnsplashApiApp/Global/Dependencies.swift @@ -8,10 +8,11 @@ import Foundation +// FIXME: Extract this in some local-only config file to avoid commiting this to GitHub +private let apiKey = "40c9db0853526d8cf7d3338a9b6a14722de5ae8adb7efb83e5ea7954d4809dce" + struct Dependencies { - var session: Session = NetworkSession() - // FIXME: Extract this in some local-only config file to avoid commiting this to GitHub - var apiKey: String = "40c9db0853526d8cf7d3338a9b6a14722de5ae8adb7efb83e5ea7954d4809dce" + var session: Session = NetworkSession(apiKey: apiKey) static var enviroment = Dependencies() } diff --git a/UnsplashApiApp/Network Layer/APIRequest.swift b/UnsplashApiApp/Network Layer/APIRequest.swift index b1bbd01..6c3d633 100644 --- a/UnsplashApiApp/Network Layer/APIRequest.swift +++ b/UnsplashApiApp/Network Layer/APIRequest.swift @@ -22,18 +22,6 @@ protocol APIRequest { var components: URLComponents { get } } -extension APIRequest { - var urlRequest: URLRequest { - guard let urlString = components.url?.absoluteString.removingPercentEncoding, - let url = URL(string: urlString) else { - preconditionFailure("We should have a valid URL \(components.url?.absoluteString.removingPercentEncoding ?? "nil")") - } - var request = URLRequest(url: url) - request.setValue("Client-ID \(Dependencies.enviroment.apiKey)", forHTTPHeaderField: "Authorization") - return request - } -} - final class ImageAPIRequest: APIRequest { let searchParameters: SearchParameters diff --git a/UnsplashApiApp/Network Layer/NetworkSession.swift b/UnsplashApiApp/Network Layer/NetworkSession.swift index 0384a66..f1544eb 100644 --- a/UnsplashApiApp/Network Layer/NetworkSession.swift +++ b/UnsplashApiApp/Network Layer/NetworkSession.swift @@ -15,10 +15,25 @@ protocol Session { class NetworkSession: Session { private let urlSession: URLSession = .shared + private let apiKey: String + + init(apiKey: String) { + self.apiKey = apiKey + } + + func urlRequest(from apiRequest: APIRequest) -> URLRequest { + guard let url = apiRequest.components.url else { + preconditionFailure("We should have a valid URL \(apiRequest.components.url?.absoluteString ?? "nil")") + } + var request = URLRequest(url: url) + request.setValue("Client-ID \(self.apiKey)", forHTTPHeaderField: "Authorization") + return request + } func load(_ resource: Resource, completion: @escaping (A?) -> ()) { - print("👾 resource URL \(resource.apiRequest.urlRequest.url?.absoluteString ?? "nil")") - urlSession.dataTask(with: resource.apiRequest.urlRequest) { data, _, error in + let urlReq = urlRequest(from: resource.apiRequest) + print("👾 resource URL \(urlReq.url?.absoluteString ?? "nil")") + urlSession.dataTask(with: urlReq) { data, _, error in if let error = error { print("error while fetching data \(error)") completion(nil) @@ -28,7 +43,7 @@ class NetworkSession: Session { } func download(_ resource: Resource, completion: @escaping (Data?, Error?) -> ()) { - urlSession.dataTask(with: resource.apiRequest.urlRequest) { data, _, error in + urlSession.dataTask(with: urlRequest(from: resource.apiRequest)) { data, _, error in if let error = error { print("error while fetching data \(error)") completion(nil, error) From e8c7e2a3494a4d5f98e8a9c701ce67f4248fd535 Mon Sep 17 00:00:00 2001 From: Olivier Halligon Date: Sat, 4 Apr 2020 14:06:39 +0200 Subject: [PATCH 19/20] Tests should not rely on queryParameters order and SessionSpy doesn't need to inherit from URLSession --- UnsplashApiApp.xcodeproj/project.pbxproj | 8 ++++---- .../Helpers/UIColorExtensionsTests.swift | 4 ++-- .../ImageList/ImageListViewModelTests.swift | 9 ++++++--- .../Network Layer/APIRequestTests.swift | 18 +++++++++++++++--- ...ssionTestSession.swift => SessionSpy.swift} | 15 ++++++++------- UnsplashApiAppTests/TestDoubles/TestSpy.swift | 5 +++-- 6 files changed, 38 insertions(+), 21 deletions(-) rename UnsplashApiAppTests/TestDoubles/{URLSessionTestSession.swift => SessionSpy.swift} (58%) diff --git a/UnsplashApiApp.xcodeproj/project.pbxproj b/UnsplashApiApp.xcodeproj/project.pbxproj index a88774d..882d1ee 100644 --- a/UnsplashApiApp.xcodeproj/project.pbxproj +++ b/UnsplashApiApp.xcodeproj/project.pbxproj @@ -13,7 +13,7 @@ 0E134ED322FAFF2300810484 /* APIRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E134ED222FAFF2300810484 /* APIRequest.swift */; }; 0E134ED622FC5DAC00810484 /* APIRequestsTestDoubles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E134ED522FC5DAC00810484 /* APIRequestsTestDoubles.swift */; }; 0E134EDB22FC620300810484 /* Dependencies.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E134EDA22FC620300810484 /* Dependencies.swift */; }; - 0E134EDD22FC670000810484 /* URLSessionTestSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E134EDC22FC670000810484 /* URLSessionTestSession.swift */; }; + 0E134EDD22FC670000810484 /* SessionSpy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E134EDC22FC670000810484 /* SessionSpy.swift */; }; 0E134EDF22FC691E00810484 /* ResourceAndResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E134EDE22FC691E00810484 /* ResourceAndResponse.swift */; }; 0E134EE122FC6AFF00810484 /* Image+TestData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E134EE022FC6AFF00810484 /* Image+TestData.swift */; }; 0E134EE32300AA7A00810484 /* APIRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E134EE22300AA7A00810484 /* APIRequestTests.swift */; }; @@ -61,7 +61,7 @@ 0E134ED222FAFF2300810484 /* APIRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIRequest.swift; sourceTree = ""; }; 0E134ED522FC5DAC00810484 /* APIRequestsTestDoubles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIRequestsTestDoubles.swift; sourceTree = ""; }; 0E134EDA22FC620300810484 /* Dependencies.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Dependencies.swift; sourceTree = ""; }; - 0E134EDC22FC670000810484 /* URLSessionTestSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLSessionTestSession.swift; sourceTree = ""; }; + 0E134EDC22FC670000810484 /* SessionSpy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionSpy.swift; sourceTree = ""; }; 0E134EDE22FC691E00810484 /* ResourceAndResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResourceAndResponse.swift; sourceTree = ""; }; 0E134EE022FC6AFF00810484 /* Image+TestData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Image+TestData.swift"; sourceTree = ""; }; 0E134EE22300AA7A00810484 /* APIRequestTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIRequestTests.swift; sourceTree = ""; }; @@ -148,7 +148,7 @@ children = ( 0ED7463B243255A300E8E625 /* TestSpy.swift */, 0E134ED522FC5DAC00810484 /* APIRequestsTestDoubles.swift */, - 0E134EDC22FC670000810484 /* URLSessionTestSession.swift */, + 0E134EDC22FC670000810484 /* SessionSpy.swift */, 0ED746392432554F00E8E625 /* ImageListViewModelDelegateTestDouble.swift */, ); path = TestDoubles; @@ -422,7 +422,7 @@ 0E134EDF22FC691E00810484 /* ResourceAndResponse.swift in Sources */, 0E134ED622FC5DAC00810484 /* APIRequestsTestDoubles.swift in Sources */, 0E7435922305FC27007C1EA5 /* UIColorExtensionsTests.swift in Sources */, - 0E134EDD22FC670000810484 /* URLSessionTestSession.swift in Sources */, + 0E134EDD22FC670000810484 /* SessionSpy.swift in Sources */, 0ED7463A2432554F00E8E625 /* ImageListViewModelDelegateTestDouble.swift in Sources */, 0E134EE32300AA7A00810484 /* APIRequestTests.swift in Sources */, 0E134EE122FC6AFF00810484 /* Image+TestData.swift in Sources */, diff --git a/UnsplashApiAppTests/Helpers/UIColorExtensionsTests.swift b/UnsplashApiAppTests/Helpers/UIColorExtensionsTests.swift index c0798cd..a08e38f 100644 --- a/UnsplashApiAppTests/Helpers/UIColorExtensionsTests.swift +++ b/UnsplashApiAppTests/Helpers/UIColorExtensionsTests.swift @@ -11,14 +11,14 @@ import XCTest class UIColorExtensionsTests: XCTestCase { - func testIsLIghtReturnsTrueWhenLightColor() { + func testIsLightReturnsTrueWhenLightColor() { let image = Image.testData(color: "#d68787") let viewModel = ImageViewState(image: image) XCTAssertTrue(UIColor(hexString: "#d68787")!.isLight()) XCTAssertTrue(viewModel.colors.textColor == UIColor.gray) } - func testIsLIghtReturnsFalseWhenDarkColor() { + func testIsLightReturnsFalseWhenDarkColor() { let image = Image.testData(color: "#040124") let viewModel = ImageViewState(image: image) XCTAssertFalse(UIColor(hexString: "#040124")!.isLight()) diff --git a/UnsplashApiAppTests/ImageList/ImageListViewModelTests.swift b/UnsplashApiAppTests/ImageList/ImageListViewModelTests.swift index 6dffbad..9207957 100644 --- a/UnsplashApiAppTests/ImageList/ImageListViewModelTests.swift +++ b/UnsplashApiAppTests/ImageList/ImageListViewModelTests.swift @@ -18,16 +18,19 @@ class ImageListViewModelTests: XCTestCase { } private func fetchForSearch(search: SearchParameters, file: StaticString = #file, line: UInt = #line) { - let session = URLSessionSpy() + let session = SessionSpy() Dependencies.enviroment.session = session let delegate = ImageListViewModelDelegateSpy() let viewModel = ImageListViewModel() - let urlString = ImageAPIRequest(search: search).urlRequest.url?.absoluteString + let queryParams = ImageAPIRequest(search: search).components.queryItems viewModel.delegate = delegate viewModel.fetchNewQuery(search) session.assertEqual(.load) - session.assertParameterEqual(urlString!) + // order of queryParams should not matter, so let's convert them to Sets + session.assertParameterEqual(Set(queryParams!), transform: { + Set($0 as? [URLQueryItem] ?? []) + }) } } diff --git a/UnsplashApiAppTests/Network Layer/APIRequestTests.swift b/UnsplashApiAppTests/Network Layer/APIRequestTests.swift index 41b9d20..3011dae 100644 --- a/UnsplashApiAppTests/Network Layer/APIRequestTests.swift +++ b/UnsplashApiAppTests/Network Layer/APIRequestTests.swift @@ -11,22 +11,34 @@ import XCTest class APIRequestTests: XCTestCase { + // You can't base your unit test on comparing URLs because the order in query parameters order is generally irrelevant + // So both "api.foo.com?a=1&b=2" and "api.foo.com?a=2&b=1" are the same resource despite their URL not being equal + private func assertComponents(_ urlComps: URLComponents, path: String, queryItems: KeyValuePairs, + file: StaticString = #file, line: UInt = #line) { + XCTAssertEqual(urlComps.scheme, "https", file: file, line: line) + XCTAssertEqual(urlComps.host, "api.unsplash.com", file: file, line: line) + XCTAssertEqual(urlComps.path, path, file: file, line: line) + + let expectedItems: [URLQueryItem]? = queryItems.map(URLQueryItem.init) + XCTAssertEqual(urlComps.queryItems.map(Set.init), expectedItems.map(Set.init), file: file, line: line) + } + func testURLRequestIsCorrectForCuratedSearchType() { let searchParameters = SearchParameters.testData(searchType: .curated) let apiRequest = ImageAPIRequest(search: searchParameters) - XCTAssertEqual(apiRequest.urlRequest.url?.description, "https://api.unsplash.com/curated?page=0") + assertComponents(apiRequest.components, path: "/curated", queryItems: ["page": "0"]) } func testURLRequestIsCorrectForQuery() { let searchParameters = SearchParameters.testData(query: "office") let apiRequest = ImageAPIRequest(search: searchParameters) - XCTAssertEqual(apiRequest.urlRequest.url?.description, "https://api.unsplash.com/curated?query=office&page=0") + assertComponents(apiRequest.components, path: "/curated", queryItems: ["query": "office", "page": "0"]) } func testURLRquestIsCorrectForPage() { let searchParameters = SearchParameters.testData(page: 5) let apiRequest = ImageAPIRequest(search: searchParameters) - XCTAssertEqual(apiRequest.urlRequest.url?.description, "https://api.unsplash.com/curated?page=5") + assertComponents(apiRequest.components, path: "/curated", queryItems: ["page": "5"]) } func testURLRequestIsCorrectForLoading() { diff --git a/UnsplashApiAppTests/TestDoubles/URLSessionTestSession.swift b/UnsplashApiAppTests/TestDoubles/SessionSpy.swift similarity index 58% rename from UnsplashApiAppTests/TestDoubles/URLSessionTestSession.swift rename to UnsplashApiAppTests/TestDoubles/SessionSpy.swift index 5e6cec4..5cf9349 100644 --- a/UnsplashApiAppTests/TestDoubles/URLSessionTestSession.swift +++ b/UnsplashApiAppTests/TestDoubles/SessionSpy.swift @@ -9,26 +9,27 @@ import Foundation @testable import UnsplashApiApp -class URLSessionSpy: URLSession, Session, TestSpy { +class SessionSpy: Session, TestSpy { enum Method { case load case download } - - var recordedMethods: [URLSessionSpy.Method] = [] + + private var buildURLRequest: (APIRequest) -> URLRequest = NetworkSession(apiKey: "testkey").urlRequest(from:) + var recordedMethods: [SessionSpy.Method] = [] var recordedParameters: [AnyHashable] = [] func load(_ resource: Resource, completion: @escaping (A?) -> ()) { record(.load) - if let urlString = resource.apiRequest.urlRequest.url?.absoluteString { - recordParameters(urlString) + if let params = resource.apiRequest.components.queryItems { + recordParameters(params) } } func download(_ resource: Resource, completion: @escaping (Data?, Error?) -> ()) { record(.download) - if let urlString = resource.apiRequest.urlRequest.url?.absoluteString { - recordParameters(urlString) + if let params = resource.apiRequest.components.queryItems { + recordParameters(params) } } } diff --git a/UnsplashApiAppTests/TestDoubles/TestSpy.swift b/UnsplashApiAppTests/TestDoubles/TestSpy.swift index 7e52e35..72a9062 100644 --- a/UnsplashApiAppTests/TestDoubles/TestSpy.swift +++ b/UnsplashApiAppTests/TestDoubles/TestSpy.swift @@ -83,10 +83,11 @@ extension TestSpy { } } - func assertParameterEqual(_ parameter: AnyHashable, + func assertParameterEqual(_ parameter: T, + transform: (AnyHashable) -> T, file: StaticString = #file, line: UInt = #line) { - guard recordedParameters == [parameter] else { + guard recordedParameters.map(transform) == [parameter] else { XCTFail("Spy was expecting \(parameter) but found: \(recordedParameters) ", file: file, line: line) From 01a3ff45f7c80570959256be4b2e040877511f17 Mon Sep 17 00:00:00 2001 From: Olivier Halligon Date: Sat, 4 Apr 2020 14:29:58 +0200 Subject: [PATCH 20/20] update ReviewNotes.md --- .DS_Store | Bin 6148 -> 0 bytes ReviewNotes.md | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index fdd704c7b735d5f434c089d8246a4a42b8099a0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%SuBr5Iv(^6x?*#Wxhb@AH-6Zu8Mo56{}QxQ3RLy6o1h_@XSN$#k+DLrOZHb zCX<;-a^NO+0Lc7pJp(2H#%zkB%7CbOaOxzS6~%IFaf?@MaDi?h(IJ|2?^9gknfvar zzyAk2MTc{|V}%{oxTD7lwa4xKY`NM!`5EQv^DjBN&3=xLL*yp+lnf*T$v`r2oDA^I zRvDi;W}gfs1IfS-1A0FcHpLp)9PR30XC(k}M6(HXttB+31lGXj$Qg=wDA7YDN(}LE z+DrJ=z~<=T5L=mfV&(7RMQnB2i@8IpWA@2FGSFw>)Q1y&|1bH;3>NwQkQ^lg$-t2@ zAfv@{G3TM;ZT)pTeQOKb4V#MkHB~6odp`jj=shyENuMvO)2{|LN6n&k3n%7}fDw{i JGVl)!d;#7BC)fZ0 diff --git a/ReviewNotes.md b/ReviewNotes.md index 6ff22b3..d0f902b 100644 --- a/ReviewNotes.md +++ b/ReviewNotes.md @@ -102,9 +102,9 @@ Besides repeating the scheme and host twice (in `var components` and in the `ini ### `APIRequest` -Not a good look to have your API key hardcoded here, not only for security reasons but also because keys like that should not be defined deep inside the code as they would be hard to find later. I suggest you use your `Dependencies` object for that instead at least to inject it there. Or to create a dedicated file for constants like that in your `Globals/` folder and put it here. +Not a good look to have your API key hardcoded here, not only for security reasons but also because keys like that should not be defined deep inside the network layer code, as they would be hard to find later and don't make your layer independant. -This is also because your `NetworkLayer` should be agnostic of who is using it. It should be a client that works for anyone willing to use the Unspalsh API. Hard-coding a Client-ID inside the NetworkLayer itself is not a good separation of concern there. +This is also because your `NetworkLayer` should be agnostic of who is using it. It should be a client that works for anyone willing to use the Unspalsh API. Hard-coding a Client-ID inside the NetworkLayer itself is not a good separation of concern there. The best solution is to inject that key when instantiating your `NetworkSession` As for the security part of things, that's less trivial to fix: ideally you should not commit your API keys to GitHub. You could for example have your keys in some `plist` file that you include in your project and read at runtime, but never commit that `plist` and document in the README that the user is supposed to create it with their own APIKey.