From f596d98f18a5c6924220bb4f4fe32b7dad5edc2d Mon Sep 17 00:00:00 2001 From: Mikko Kuivanen Date: Sun, 27 Aug 2023 13:40:28 +0300 Subject: [PATCH 1/8] FEATURE: Add tv show tagline --- Sources/TMDb/Models/TVShow.swift | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Sources/TMDb/Models/TVShow.swift b/Sources/TMDb/Models/TVShow.swift index e554032e..0da85b5f 100644 --- a/Sources/TMDb/Models/TVShow.swift +++ b/Sources/TMDb/Models/TVShow.swift @@ -14,6 +14,11 @@ public struct TVShow: Identifiable, Codable, Equatable, Hashable { /// TV show name. /// public let name: String + + /// + /// TV show tagline. + /// + public let tagline: String? /// /// Original TV show name. @@ -145,6 +150,7 @@ public struct TVShow: Identifiable, Codable, Equatable, Hashable { /// - Parameters: /// - id: TV show identifier. /// - name: TV show name. + /// - tagline: TV show tagline. /// - originalName: Original TV show name. /// - originalLanguage: Original language of the TV show. /// - overview: TV show overview. @@ -172,6 +178,7 @@ public struct TVShow: Identifiable, Codable, Equatable, Hashable { public init( id: Int, name: String, + tagline: String? = nil, originalName: String? = nil, originalLanguage: String? = nil, overview: String? = nil, @@ -199,6 +206,7 @@ public struct TVShow: Identifiable, Codable, Equatable, Hashable { ) { self.id = id self.name = name + self.tagline = tagline self.originalName = originalName self.originalLanguage = originalLanguage self.overview = overview @@ -232,6 +240,7 @@ extension TVShow { private enum CodingKeys: String, CodingKey { case id case name + case tagline case originalName case originalLanguage case overview @@ -264,6 +273,7 @@ extension TVShow { self.id = try container.decode(Int.self, forKey: .id) self.name = try container.decode(String.self, forKey: .name) + self.tagline = try container.decodeIfPresent(String.self, forKey: .tagline) self.originalName = try container.decodeIfPresent(String.self, forKey: .originalName) self.originalLanguage = try container.decodeIfPresent(String.self, forKey: .originalLanguage) self.overview = try container.decodeIfPresent(String.self, forKey: .overview) From ca5f5a309e421996c057b592645e94cda74992b2 Mon Sep 17 00:00:00 2001 From: Mikko Kuivanen Date: Sun, 27 Aug 2023 15:26:03 +0300 Subject: [PATCH 2/8] FIX: linting --- Sources/TMDb/Models/TVShow.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/TMDb/Models/TVShow.swift b/Sources/TMDb/Models/TVShow.swift index 0da85b5f..2eed4118 100644 --- a/Sources/TMDb/Models/TVShow.swift +++ b/Sources/TMDb/Models/TVShow.swift @@ -14,7 +14,7 @@ public struct TVShow: Identifiable, Codable, Equatable, Hashable { /// TV show name. /// public let name: String - + /// /// TV show tagline. /// From 6ff110be9fc52c9602133bb691ac5dbcc7d57ab8 Mon Sep 17 00:00:00 2001 From: Mikko Kuivanen Date: Thu, 23 Nov 2023 10:34:02 +0200 Subject: [PATCH 3/8] FEATURE: Add fetching watch providers to movie and tv show services --- .../TMDb/Models/ShowWatchProviderResult.swift | 21 +++++++++++++++++ .../Movies/Endpoints/MoviesEndpoint.swift | 6 +++++ Sources/TMDb/Movies/MovieService.swift | 23 +++++++++++++++++++ .../TVSeries/Endpoints/TVSeriesEndpoint.swift | 6 +++++ Sources/TMDb/TVSeries/TVSeriesService.swift | 23 +++++++++++++++++++ 5 files changed, 79 insertions(+) create mode 100644 Sources/TMDb/Models/ShowWatchProviderResult.swift diff --git a/Sources/TMDb/Models/ShowWatchProviderResult.swift b/Sources/TMDb/Models/ShowWatchProviderResult.swift new file mode 100644 index 00000000..9eb28d45 --- /dev/null +++ b/Sources/TMDb/Models/ShowWatchProviderResult.swift @@ -0,0 +1,21 @@ +// +// ShowWatchProviderResult.swift +// +// +// Created by Mikko Kuivanen on 5.9.2023. +// + +import Foundation + +struct ShowWatchProviderResult: Equatable, Decodable { + let id: Int + let results: [String: ShowWatchProvider] +} + +public struct ShowWatchProvider: Equatable, Decodable { + public let link: String + public let free: [WatchProvider]? + public let flatrate: [WatchProvider]? + public let buy: [WatchProvider]? + public let rent: [WatchProvider]? +} diff --git a/Sources/TMDb/Movies/Endpoints/MoviesEndpoint.swift b/Sources/TMDb/Movies/Endpoints/MoviesEndpoint.swift index 9a170407..b718642e 100644 --- a/Sources/TMDb/Movies/Endpoints/MoviesEndpoint.swift +++ b/Sources/TMDb/Movies/Endpoints/MoviesEndpoint.swift @@ -13,6 +13,7 @@ enum MoviesEndpoint { case popular(page: Int? = nil) case topRated(page: Int? = nil) case upcoming(page: Int? = nil) + case watch(movieID: Movie.ID) } @@ -80,6 +81,11 @@ extension MoviesEndpoint: Endpoint { return Self.basePath .appendingPathComponent("upcoming") .appendingPage(page) + + case .watch(let movieID): + return Self.basePath + .appendingPathComponent(movieID) + .appendingPathComponent("watch/providers") } } diff --git a/Sources/TMDb/Movies/MovieService.swift b/Sources/TMDb/Movies/MovieService.swift index b8fb160f..946cd000 100644 --- a/Sources/TMDb/Movies/MovieService.swift +++ b/Sources/TMDb/Movies/MovieService.swift @@ -302,4 +302,27 @@ public final class MovieService { return movieList } + /// + /// Returns watch providers for a movie + /// + /// [TMDb API - Movie: Watch providers](https://developers.themoviedb.org/3/movies/get-movie-watch-providers) + /// - Parameters: + /// - id: The identifier of the movie. + /// + /// - Throws: TMDb data error ``TMDbError``. + /// + /// - Returns: Watch providers for movie in current region. + /// + public func watchProviders(forMovie id: Movie.ID) async throws -> ShowWatchProvider? { + guard let regionCode = localeProvider().regionCode?.uppercased() else { return nil } + let result: ShowWatchProviderResult + do { + result = try await apiClient.get(endpoint: MoviesEndpoint.watch(movieID: id)) + } catch let error { + throw TMDbError(error: error) + } + + return result.results[regionCode] + } + } diff --git a/Sources/TMDb/TVSeries/Endpoints/TVSeriesEndpoint.swift b/Sources/TMDb/TVSeries/Endpoints/TVSeriesEndpoint.swift index a6c4fc47..20efa862 100644 --- a/Sources/TMDb/TVSeries/Endpoints/TVSeriesEndpoint.swift +++ b/Sources/TMDb/TVSeries/Endpoints/TVSeriesEndpoint.swift @@ -10,6 +10,7 @@ enum TVSeriesEndpoint { case recommendations(tvSeriesID: TVSeries.ID, page: Int? = nil) case similar(tvSeriesID: TVSeries.ID, page: Int? = nil) case popular(page: Int? = nil) + case watch(tvSeriesID: TVSeries.ID) } @@ -62,6 +63,11 @@ extension TVSeriesEndpoint: Endpoint { return Self.basePath .appendingPathComponent("popular") .appendingPage(page) + + case .watch(let tvSeriesID): + return Self.basePath + .appendingPathComponent(tvSeriesID) + .appendingPathComponent("watch/providers") } } diff --git a/Sources/TMDb/TVSeries/TVSeriesService.swift b/Sources/TMDb/TVSeries/TVSeriesService.swift index f3cb6360..278383d3 100644 --- a/Sources/TMDb/TVSeries/TVSeriesService.swift +++ b/Sources/TMDb/TVSeries/TVSeriesService.swift @@ -232,4 +232,27 @@ public final class TVSeriesService { return tvSeriesList } + /// + /// Returns watch providers for a TV series + /// + /// [TMDb API - TVSeries: Watch providers](https://developers.themoviedb.org/3/tv/get-tv-watch-providers) + /// - Parameters: + /// - id: The identifier of the TV series. + /// + /// - Throws: TMDb data error ``TMDbError``. + /// + /// - Returns: Watch providers for TV series in current region. + /// + public func watchProviders(forTVSeries tvSeriesID: TVSeries.ID) async throws -> ShowWatchProvider? { + guard let regionCode = localeProvider().regionCode?.uppercased() else { return nil } + let result: ShowWatchProviderResult + do { + result = try await apiClient.get(endpoint: TVSeriesEndpoint.watch(tvSeriesID: tvSeriesID)) + } catch let error { + throw TMDbError(error: error) + } + + return result.results[regionCode] + } + } From ba150bc8177c3824c9ee742173986cdc0d063194 Mon Sep 17 00:00:00 2001 From: Mikko Kuivanen Date: Thu, 23 Nov 2023 10:43:14 +0200 Subject: [PATCH 4/8] FIX: linting --- Sources/TMDb/Movies/MovieService.swift | 4 +++- Sources/TMDb/TVSeries/TVSeriesService.swift | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Sources/TMDb/Movies/MovieService.swift b/Sources/TMDb/Movies/MovieService.swift index 946cd000..afa7777b 100644 --- a/Sources/TMDb/Movies/MovieService.swift +++ b/Sources/TMDb/Movies/MovieService.swift @@ -314,7 +314,9 @@ public final class MovieService { /// - Returns: Watch providers for movie in current region. /// public func watchProviders(forMovie id: Movie.ID) async throws -> ShowWatchProvider? { - guard let regionCode = localeProvider().regionCode?.uppercased() else { return nil } + guard let regionCode = localeProvider().regionCode?.uppercased() else { + return nil + } let result: ShowWatchProviderResult do { result = try await apiClient.get(endpoint: MoviesEndpoint.watch(movieID: id)) diff --git a/Sources/TMDb/TVSeries/TVSeriesService.swift b/Sources/TMDb/TVSeries/TVSeriesService.swift index 278383d3..94ef43dd 100644 --- a/Sources/TMDb/TVSeries/TVSeriesService.swift +++ b/Sources/TMDb/TVSeries/TVSeriesService.swift @@ -244,7 +244,9 @@ public final class TVSeriesService { /// - Returns: Watch providers for TV series in current region. /// public func watchProviders(forTVSeries tvSeriesID: TVSeries.ID) async throws -> ShowWatchProvider? { - guard let regionCode = localeProvider().regionCode?.uppercased() else { return nil } + guard let regionCode = localeProvider().regionCode?.uppercased() else { + return nil + } let result: ShowWatchProviderResult do { result = try await apiClient.get(endpoint: TVSeriesEndpoint.watch(tvSeriesID: tvSeriesID)) From 1d1afc4b5f7b6ea62f1ab89ecc8c3d1ec1c5b45d Mon Sep 17 00:00:00 2001 From: Mikko Kuivanen Date: Fri, 24 Nov 2023 00:26:57 +0200 Subject: [PATCH 5/8] TEST: add tests for movie and tvseries watch providers --- Sources/TMDb/Movies/MovieService.swift | 2 +- Sources/TMDb/TVSeries/TVSeriesService.swift | 2 +- .../Models/ShowWatchProvider+Mocks.swift | 20 ++++++++++++ .../ShowWatchProviderResult+Mocks.swift | 15 +++++++++ .../Endpoints/MoviesEndpointTests.swift | 8 +++++ .../TMDbTests/Movies/MovieServiceTests.swift | 12 +++++++ .../json/show-watch-provider-result.json | 32 +++++++++++++++++++ .../Endpoints/TVSeriesEndpointTests.swift | 8 +++++ .../TVSeries/TVSeriesServiceTests.swift | 12 +++++++ 9 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 Tests/TMDbTests/Mocks/Models/ShowWatchProvider+Mocks.swift create mode 100644 Tests/TMDbTests/Mocks/Models/ShowWatchProviderResult+Mocks.swift create mode 100644 Tests/TMDbTests/Resources/json/show-watch-provider-result.json diff --git a/Sources/TMDb/Movies/MovieService.swift b/Sources/TMDb/Movies/MovieService.swift index afa7777b..ecd865e9 100644 --- a/Sources/TMDb/Movies/MovieService.swift +++ b/Sources/TMDb/Movies/MovieService.swift @@ -314,7 +314,7 @@ public final class MovieService { /// - Returns: Watch providers for movie in current region. /// public func watchProviders(forMovie id: Movie.ID) async throws -> ShowWatchProvider? { - guard let regionCode = localeProvider().regionCode?.uppercased() else { + guard let regionCode = localeProvider().regionCode else { return nil } let result: ShowWatchProviderResult diff --git a/Sources/TMDb/TVSeries/TVSeriesService.swift b/Sources/TMDb/TVSeries/TVSeriesService.swift index 94ef43dd..d93ea0c0 100644 --- a/Sources/TMDb/TVSeries/TVSeriesService.swift +++ b/Sources/TMDb/TVSeries/TVSeriesService.swift @@ -244,7 +244,7 @@ public final class TVSeriesService { /// - Returns: Watch providers for TV series in current region. /// public func watchProviders(forTVSeries tvSeriesID: TVSeries.ID) async throws -> ShowWatchProvider? { - guard let regionCode = localeProvider().regionCode?.uppercased() else { + guard let regionCode = localeProvider().regionCode else { return nil } let result: ShowWatchProviderResult diff --git a/Tests/TMDbTests/Mocks/Models/ShowWatchProvider+Mocks.swift b/Tests/TMDbTests/Mocks/Models/ShowWatchProvider+Mocks.swift new file mode 100644 index 00000000..17ab2afd --- /dev/null +++ b/Tests/TMDbTests/Mocks/Models/ShowWatchProvider+Mocks.swift @@ -0,0 +1,20 @@ +import Foundation +@testable import TMDb + +extension ShowWatchProvider { + static func mock( + link: String = "", + free: [WatchProvider]? = [.netflix], + flatrate: [WatchProvider]? = [.netflix], + buy: [WatchProvider]? = [.netflix], + rent: [WatchProvider]? = [.netflix] + ) -> Self { + .init( + link: link, + free: free, + flatrate: flatrate, + buy: buy, + rent: rent + ) + } +} diff --git a/Tests/TMDbTests/Mocks/Models/ShowWatchProviderResult+Mocks.swift b/Tests/TMDbTests/Mocks/Models/ShowWatchProviderResult+Mocks.swift new file mode 100644 index 00000000..2639a516 --- /dev/null +++ b/Tests/TMDbTests/Mocks/Models/ShowWatchProviderResult+Mocks.swift @@ -0,0 +1,15 @@ +import Foundation +@testable import TMDb + +extension ShowWatchProviderResult { + + static func mock( + id: Int = .randomID, + regionCode: String = "GB" + ) -> Self { + .init( + id: id, + results: [regionCode: .mock()] + ) + } +} diff --git a/Tests/TMDbTests/Movies/Endpoints/MoviesEndpointTests.swift b/Tests/TMDbTests/Movies/Endpoints/MoviesEndpointTests.swift index 08ec6a09..a22240c9 100644 --- a/Tests/TMDbTests/Movies/Endpoints/MoviesEndpointTests.swift +++ b/Tests/TMDbTests/Movies/Endpoints/MoviesEndpointTests.swift @@ -148,5 +148,13 @@ final class MoviesEndpointTests: XCTestCase { XCTAssertEqual(url, expectedURL) } + + func testMovieWatchEndpointReturnsURL() throws { + let expectedURL = try XCTUnwrap(URL(string: "/movie/1/watch/providers")) + + let url = MoviesEndpoint.watch(movieID: 1).path + + XCTAssertEqual(url, expectedURL) + } } diff --git a/Tests/TMDbTests/Movies/MovieServiceTests.swift b/Tests/TMDbTests/Movies/MovieServiceTests.swift index dd605261..10dd3f88 100644 --- a/Tests/TMDbTests/Movies/MovieServiceTests.swift +++ b/Tests/TMDbTests/Movies/MovieServiceTests.swift @@ -296,5 +296,17 @@ final class MovieServiceTests: XCTestCase { XCTAssertEqual(result, expectedResult) XCTAssertEqual(apiClient.lastPath, MoviesEndpoint.upcoming(page: page).path) } + + func testWatchReturnsWatchProviders() async throws { + let expectedResult = ShowWatchProviderResult.mock() + let movieID = 1 + apiClient.result = .success(expectedResult) + + let result = try await service.watchProviders(forMovie: movieID) + + let regionCode = try XCTUnwrap(locale.regionCode) + XCTAssertEqual(result, expectedResult.results[regionCode]) + XCTAssertEqual(apiClient.lastPath, MoviesEndpoint.watch(movieID: movieID).path) + } } diff --git a/Tests/TMDbTests/Resources/json/show-watch-provider-result.json b/Tests/TMDbTests/Resources/json/show-watch-provider-result.json new file mode 100644 index 00000000..02bf4d13 --- /dev/null +++ b/Tests/TMDbTests/Resources/json/show-watch-provider-result.json @@ -0,0 +1,32 @@ +{ + "id": "1", + "results": [ + ["GB": { + "link": "", + "free": { + "display_priority": 0, + "logo_path": "/t2yyOv40HZeVlLjYsCsPHnWLk4W.jpg", + "provider_name": "Netflix", + "provider_id": 8 + }, + "flatrate": { + "display_priority": 0, + "logo_path": "/t2yyOv40HZeVlLjYsCsPHnWLk4W.jpg", + "provider_name": "Netflix", + "provider_id": 8 + }, + "rent": { + "display_priority": 0, + "logo_path": "/t2yyOv40HZeVlLjYsCsPHnWLk4W.jpg", + "provider_name": "Netflix", + "provider_id": 8 + }, + "buy": { + "display_priority": 0, + "logo_path": "/t2yyOv40HZeVlLjYsCsPHnWLk4W.jpg", + "provider_name": "Netflix", + "provider_id": 8 + }, + }] + ] +} diff --git a/Tests/TMDbTests/TVSeries/Endpoints/TVSeriesEndpointTests.swift b/Tests/TMDbTests/TVSeries/Endpoints/TVSeriesEndpointTests.swift index 22f549f5..704b2ed0 100644 --- a/Tests/TMDbTests/TVSeries/Endpoints/TVSeriesEndpointTests.swift +++ b/Tests/TMDbTests/TVSeries/Endpoints/TVSeriesEndpointTests.swift @@ -102,5 +102,13 @@ final class TVSeriesEndpointTests: XCTestCase { XCTAssertEqual(url, expectedURL) } + + func testTVSeriesWatchEndpointReturnsURL() throws { + let expectedURL = try XCTUnwrap(URL(string: "/tv/1/watch/providers")) + + let url = TVSeriesEndpoint.watch(tvSeriesID: 1).path + + XCTAssertEqual(url, expectedURL) + } } diff --git a/Tests/TMDbTests/TVSeries/TVSeriesServiceTests.swift b/Tests/TMDbTests/TVSeries/TVSeriesServiceTests.swift index 1c4508d9..09019b5d 100644 --- a/Tests/TMDbTests/TVSeries/TVSeriesServiceTests.swift +++ b/Tests/TMDbTests/TVSeries/TVSeriesServiceTests.swift @@ -203,5 +203,17 @@ final class TVSeriesServiceTests: XCTestCase { XCTAssertEqual(result, expectedResult) XCTAssertEqual(apiClient.lastPath, TVSeriesEndpoint.popular(page: page).path) } + + func testWatchReturnsWatchProviders() async throws { + let expectedResult = ShowWatchProviderResult.mock() + let tvSeriesID = 1 + apiClient.result = .success(expectedResult) + + let result = try await service.watchProviders(forTVSeries: tvSeriesID) + + let regionCode = try XCTUnwrap(locale.regionCode) + XCTAssertEqual(result, expectedResult.results[regionCode]) + XCTAssertEqual(apiClient.lastPath, TVSeriesEndpoint.watch(tvSeriesID: tvSeriesID).path) + } } From 6dfb505dfb86fe37ff471bff50b61a735a477081 Mon Sep 17 00:00:00 2001 From: Mikko Kuivanen Date: Fri, 24 Nov 2023 00:31:44 +0200 Subject: [PATCH 6/8] FIX: linting --- Tests/TMDbTests/Mocks/Models/ShowWatchProvider+Mocks.swift | 1 + .../Mocks/Models/ShowWatchProviderResult+Mocks.swift | 2 +- Tests/TMDbTests/Movies/Endpoints/MoviesEndpointTests.swift | 6 +++--- Tests/TMDbTests/Movies/MovieServiceTests.swift | 6 +++--- .../TVSeries/Endpoints/TVSeriesEndpointTests.swift | 6 +++--- Tests/TMDbTests/TVSeries/TVSeriesServiceTests.swift | 6 +++--- 6 files changed, 14 insertions(+), 13 deletions(-) diff --git a/Tests/TMDbTests/Mocks/Models/ShowWatchProvider+Mocks.swift b/Tests/TMDbTests/Mocks/Models/ShowWatchProvider+Mocks.swift index 17ab2afd..189228f0 100644 --- a/Tests/TMDbTests/Mocks/Models/ShowWatchProvider+Mocks.swift +++ b/Tests/TMDbTests/Mocks/Models/ShowWatchProvider+Mocks.swift @@ -2,6 +2,7 @@ import Foundation @testable import TMDb extension ShowWatchProvider { + static func mock( link: String = "", free: [WatchProvider]? = [.netflix], diff --git a/Tests/TMDbTests/Mocks/Models/ShowWatchProviderResult+Mocks.swift b/Tests/TMDbTests/Mocks/Models/ShowWatchProviderResult+Mocks.swift index 2639a516..57fc2478 100644 --- a/Tests/TMDbTests/Mocks/Models/ShowWatchProviderResult+Mocks.swift +++ b/Tests/TMDbTests/Mocks/Models/ShowWatchProviderResult+Mocks.swift @@ -2,7 +2,7 @@ import Foundation @testable import TMDb extension ShowWatchProviderResult { - + static func mock( id: Int = .randomID, regionCode: String = "GB" diff --git a/Tests/TMDbTests/Movies/Endpoints/MoviesEndpointTests.swift b/Tests/TMDbTests/Movies/Endpoints/MoviesEndpointTests.swift index a22240c9..78a5bde0 100644 --- a/Tests/TMDbTests/Movies/Endpoints/MoviesEndpointTests.swift +++ b/Tests/TMDbTests/Movies/Endpoints/MoviesEndpointTests.swift @@ -148,12 +148,12 @@ final class MoviesEndpointTests: XCTestCase { XCTAssertEqual(url, expectedURL) } - + func testMovieWatchEndpointReturnsURL() throws { let expectedURL = try XCTUnwrap(URL(string: "/movie/1/watch/providers")) - + let url = MoviesEndpoint.watch(movieID: 1).path - + XCTAssertEqual(url, expectedURL) } diff --git a/Tests/TMDbTests/Movies/MovieServiceTests.swift b/Tests/TMDbTests/Movies/MovieServiceTests.swift index 10dd3f88..156bfa9a 100644 --- a/Tests/TMDbTests/Movies/MovieServiceTests.swift +++ b/Tests/TMDbTests/Movies/MovieServiceTests.swift @@ -296,14 +296,14 @@ final class MovieServiceTests: XCTestCase { XCTAssertEqual(result, expectedResult) XCTAssertEqual(apiClient.lastPath, MoviesEndpoint.upcoming(page: page).path) } - + func testWatchReturnsWatchProviders() async throws { let expectedResult = ShowWatchProviderResult.mock() let movieID = 1 apiClient.result = .success(expectedResult) - + let result = try await service.watchProviders(forMovie: movieID) - + let regionCode = try XCTUnwrap(locale.regionCode) XCTAssertEqual(result, expectedResult.results[regionCode]) XCTAssertEqual(apiClient.lastPath, MoviesEndpoint.watch(movieID: movieID).path) diff --git a/Tests/TMDbTests/TVSeries/Endpoints/TVSeriesEndpointTests.swift b/Tests/TMDbTests/TVSeries/Endpoints/TVSeriesEndpointTests.swift index 704b2ed0..c4ae28a7 100644 --- a/Tests/TMDbTests/TVSeries/Endpoints/TVSeriesEndpointTests.swift +++ b/Tests/TMDbTests/TVSeries/Endpoints/TVSeriesEndpointTests.swift @@ -102,12 +102,12 @@ final class TVSeriesEndpointTests: XCTestCase { XCTAssertEqual(url, expectedURL) } - + func testTVSeriesWatchEndpointReturnsURL() throws { let expectedURL = try XCTUnwrap(URL(string: "/tv/1/watch/providers")) - + let url = TVSeriesEndpoint.watch(tvSeriesID: 1).path - + XCTAssertEqual(url, expectedURL) } diff --git a/Tests/TMDbTests/TVSeries/TVSeriesServiceTests.swift b/Tests/TMDbTests/TVSeries/TVSeriesServiceTests.swift index 09019b5d..6eca0af8 100644 --- a/Tests/TMDbTests/TVSeries/TVSeriesServiceTests.swift +++ b/Tests/TMDbTests/TVSeries/TVSeriesServiceTests.swift @@ -203,14 +203,14 @@ final class TVSeriesServiceTests: XCTestCase { XCTAssertEqual(result, expectedResult) XCTAssertEqual(apiClient.lastPath, TVSeriesEndpoint.popular(page: page).path) } - + func testWatchReturnsWatchProviders() async throws { let expectedResult = ShowWatchProviderResult.mock() let tvSeriesID = 1 apiClient.result = .success(expectedResult) - + let result = try await service.watchProviders(forTVSeries: tvSeriesID) - + let regionCode = try XCTUnwrap(locale.regionCode) XCTAssertEqual(result, expectedResult.results[regionCode]) XCTAssertEqual(apiClient.lastPath, TVSeriesEndpoint.watch(tvSeriesID: tvSeriesID).path) From bc2049e41a420f7aba1e0a95ddddc37204b85a6d Mon Sep 17 00:00:00 2001 From: Mikko Kuivanen Date: Sun, 7 Jan 2024 16:24:54 +0200 Subject: [PATCH 7/8] FEATURE: add encodable conformance to Show --- Sources/TMDb/Models/Show.swift | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/Sources/TMDb/Models/Show.swift b/Sources/TMDb/Models/Show.swift index a899f82e..cb760bb2 100644 --- a/Sources/TMDb/Models/Show.swift +++ b/Sources/TMDb/Models/Show.swift @@ -3,7 +3,7 @@ import Foundation /// /// A model representing a show - movie or TV series. /// -public enum Show: Identifiable, Equatable, Hashable { +public enum Show: Identifiable, Codable, Equatable, Hashable { /// /// Show identifier. @@ -56,7 +56,7 @@ public enum Show: Identifiable, Equatable, Hashable { } -extension Show: Decodable { +extension Show { private enum CodingKeys: String, CodingKey { case mediaType @@ -80,4 +80,15 @@ extension Show: Decodable { } } + public func encode(to encoder: Encoder) throws { + var singleContainer = encoder.singleValueContainer() + + switch self { + case .movie(let movie): + try singleContainer.encode(movie) + + case .tvSeries(let tvSeries): + try singleContainer.encode(tvSeries) + } + } } From 65fc66f17c0ab262162ae334daa453ecb2725bb0 Mon Sep 17 00:00:00 2001 From: Mikko Kuivanen Date: Sun, 7 Jan 2024 16:48:16 +0200 Subject: [PATCH 8/8] fix linting --- Sources/TMDb/Models/Show.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/TMDb/Models/Show.swift b/Sources/TMDb/Models/Show.swift index cb760bb2..45edfeac 100644 --- a/Sources/TMDb/Models/Show.swift +++ b/Sources/TMDb/Models/Show.swift @@ -82,11 +82,11 @@ extension Show { public func encode(to encoder: Encoder) throws { var singleContainer = encoder.singleValueContainer() - + switch self { case .movie(let movie): try singleContainer.encode(movie) - + case .tvSeries(let tvSeries): try singleContainer.encode(tvSeries) }