From 953f9241780c3a83d02bf9e4bf4b70a554065984 Mon Sep 17 00:00:00 2001 From: Javier Cicchelli Date: Sun, 17 Mar 2024 23:45:55 +0100 Subject: [PATCH] Implemented the "getReviews(_: )" function for the iTunesService service in the iTunes library. --- .../iTunes/Kit/Services/iTunesService.swift | 43 +++++++ .../Helpers/Extensions/Array+Reviews.swift | 58 ++++++++++ .../GetReviewsAPIEndpointTests.swift | 53 --------- .../Tests/Services/iTunesServiceTests.swift | 108 ++++++++++++++++++ 4 files changed, 209 insertions(+), 53 deletions(-) create mode 100644 Libraries/iTunes/Kit/Services/iTunesService.swift create mode 100644 Libraries/iTunes/Test/Helpers/Extensions/Array+Reviews.swift create mode 100644 Libraries/iTunes/Test/Tests/Services/iTunesServiceTests.swift diff --git a/Libraries/iTunes/Kit/Services/iTunesService.swift b/Libraries/iTunes/Kit/Services/iTunesService.swift new file mode 100644 index 0000000..09f5c66 --- /dev/null +++ b/Libraries/iTunes/Kit/Services/iTunesService.swift @@ -0,0 +1,43 @@ +// +// iTunesService.swift +// ReviewsiTunes +// +// Created by Javier Cicchelli on 17/03/2024. +// Copyright © 2024 Röck+Cöde VoF. All rights reserved. +// + +import Foundation +import ReviewsFeedKit + +public actor iTunesService: Service { + + // MARK: Constants + public let configuration: ServiceConfiguration + public let decoder: JSONDecoder + public let session: URLSession + + // MARK: Properties + private lazy var getReviewsEndpoint: GetReviewsAPIEndpoint = { + .init( + host: configuration.host, + decoder: decoder, + session: session + ) + }() + + // MARK: Initialisers + public init(configuration: ServiceConfiguration) { + self.configuration = configuration + self.decoder = configuration.decoder + self.session = .init(configuration: configuration.session) + } + + // MARK: Functions + @discardableResult public func getReviews( + _ input: GetReviewsInput + ) async throws -> GetReviewsOutput { + try await getReviewsEndpoint(input) + } + +} + diff --git a/Libraries/iTunes/Test/Helpers/Extensions/Array+Reviews.swift b/Libraries/iTunes/Test/Helpers/Extensions/Array+Reviews.swift new file mode 100644 index 0000000..5a0a419 --- /dev/null +++ b/Libraries/iTunes/Test/Helpers/Extensions/Array+Reviews.swift @@ -0,0 +1,58 @@ +// +// Array+Reviews.swift +// ReviewsiTunesTest +// +// Created by Javier Cicchelli on 17/03/2024. +// Copyright © 2024 Röck+Cöde VoF. All rights reserved. +// + +import ReviewsFeedKit + +extension Array where Element == Review { + + // MARK: Constants + static let empty: [Review] = [] + + static let many: [Review] = [ + .init( + id: 1, + author: "Some author name #1 goes here...", + title: "Some title #1 goes here...", + content: "Some content #1 goes here...", + rating: 1, + version: "Some version #1 goes here...", + updated: .init() + ), + .init( + id: 2, + author: "Some author name #2 goes here...", + title: "Some title #2 goes here...", + content: "Some content #2 goes here...", + rating: 5, + version: "Some version #2 goes here...", + updated: .init() + ), + .init( + id: 3, + author: "Some author name #3 goes here...", + title: "Some title #3 goes here...", + content: "Some content #3 goes here...", + rating: 3, + version: "Some version #3 goes here...", + updated: .init() + ) + ] + + static let one: [Review] = [ + .init( + id: 1, + author: "Some author name goes here...", + title: "Some title goes here...", + content: "Some content goes here...", + rating: 3, + version: "Some version goes here...", + updated: .init() + ) + ] + +} diff --git a/Libraries/iTunes/Test/Tests/Endpoints/GetReviewsAPIEndpointTests.swift b/Libraries/iTunes/Test/Tests/Endpoints/GetReviewsAPIEndpointTests.swift index 8090436..a34ab03 100644 --- a/Libraries/iTunes/Test/Tests/Endpoints/GetReviewsAPIEndpointTests.swift +++ b/Libraries/iTunes/Test/Tests/Endpoints/GetReviewsAPIEndpointTests.swift @@ -47,7 +47,6 @@ final class GetReviewsAPIEndpointTests: XCTestCase { // THEN XCTAssertFalse(output.reviews.isEmpty) - XCTAssertEqual(output.reviews.count, reviews.count) XCTAssertEqual(output.reviews, reviews) } @@ -70,7 +69,6 @@ final class GetReviewsAPIEndpointTests: XCTestCase { // THEN XCTAssertFalse(output.reviews.isEmpty) - XCTAssertEqual(output.reviews.count, reviews.count) XCTAssertEqual(output.reviews, reviews) } @@ -93,7 +91,6 @@ final class GetReviewsAPIEndpointTests: XCTestCase { // THEN XCTAssertTrue(output.reviews.isEmpty) - XCTAssertEqual(output.reviews.count, reviews.count) XCTAssertEqual(output.reviews, reviews) } @@ -162,53 +159,3 @@ final class GetReviewsAPIEndpointTests: XCTestCase { } } - -// MARK: - Array+Constants -private extension Array where Element == Review { - - // MARK: Constants - static let empty: [Review] = [] - - static let many: [Review] = [ - .init( - id: 1, - author: "Some author name #1 goes here...", - title: "Some title #1 goes here...", - content: "Some content #1 goes here...", - rating: 1, - version: "Some version #1 goes here...", - updated: .init() - ), - .init( - id: 2, - author: "Some author name #2 goes here...", - title: "Some title #2 goes here...", - content: "Some content #2 goes here...", - rating: 5, - version: "Some version #2 goes here...", - updated: .init() - ), - .init( - id: 3, - author: "Some author name #3 goes here...", - title: "Some title #3 goes here...", - content: "Some content #3 goes here...", - rating: 3, - version: "Some version #3 goes here...", - updated: .init() - ) - ] - - static let one: [Review] = [ - .init( - id: 1, - author: "Some author name goes here...", - title: "Some title goes here...", - content: "Some content goes here...", - rating: 3, - version: "Some version goes here...", - updated: .init() - ) - ] - -} diff --git a/Libraries/iTunes/Test/Tests/Services/iTunesServiceTests.swift b/Libraries/iTunes/Test/Tests/Services/iTunesServiceTests.swift new file mode 100644 index 0000000..c52ec9b --- /dev/null +++ b/Libraries/iTunes/Test/Tests/Services/iTunesServiceTests.swift @@ -0,0 +1,108 @@ +// +// iTunesServiceTests.swift +// ReviewsiTunesTest +// +// Created by Javier Cicchelli on 17/03/2024. +// Copyright © 2024 Röck+Cöde VoF. All rights reserved. +// + +import ReviewsFeedKit +import ReviewsFoundationKit +import XCTest + +@testable import ReviewsiTunesKit + +final class iTunesServiceTests: XCTestCase { + + // MARK: Properties + private var sut: iTunesService! + + // MARK: Setup + override func setUp() async throws { + sut = .init(configuration: .init(session: .mock)) + } + + // MARK: Functions + func testGetReviews_whenResponseOK_withOneReview() async throws { + // GIVEN + let reviews: [Review] = .one + + MockURLProtocol.response = .init( + statusCode: 200, + object: Feed(entries: reviews) + ) + + // WHEN + let output = try await sut.getReviews(.init( + appID: "1234567890", + countryCode: "abc" + )) + + // THEN + XCTAssertFalse(output.reviews.isEmpty) + XCTAssertEqual(output.reviews.count, reviews.count) + XCTAssertEqual(output.reviews, reviews) + } + + func testGetReviews_whenResponseOK_withManyReview() async throws { + // GIVEN + let reviews: [Review] = .many + + MockURLProtocol.response = .init( + statusCode: 200, + object: Feed(entries: reviews) + ) + + // WHEN + let output = try await sut.getReviews(.init( + appID: "1234567890", + countryCode: "abc" + )) + + // THEN + XCTAssertFalse(output.reviews.isEmpty) + XCTAssertEqual(output.reviews.count, reviews.count) + XCTAssertEqual(output.reviews, reviews) + } + + func testGetReviews_whenResponseOK_withEmptyReview() async throws { + // GIVEN + let reviews: [Review] = .empty + + MockURLProtocol.response = .init( + statusCode: 200, + object: Feed(entries: reviews) + ) + + // WHEN + let output = try await sut.getReviews(.init( + appID: "1234567890", + countryCode: "abc" + )) + + // THEN + XCTAssertTrue(output.reviews.isEmpty) + XCTAssertEqual(output.reviews, reviews) + } + + func testGetReviews_whenResponseNotOK() async throws { + // GIVEN + let statusCode = 404 + + MockURLProtocol.response = .init(statusCode: statusCode) + + // WHEN + // THEN + do { + try await sut.getReviews(.init( + appID: "1234567890", + countryCode: "abc" + )) + } catch EndpointError.requestFailed(statusCode: statusCode) { + XCTAssertTrue(true) + } catch { + XCTAssertTrue(false) + } + } + +}