From 18a0d379136681bae443917206dacc6616147995 Mon Sep 17 00:00:00 2001 From: Francesco Paolo Severino Date: Sun, 29 Dec 2024 16:15:58 +0100 Subject: [PATCH] Fix `ErrorResponse` --- Sources/AppleMapsKit/AppleMapsClient.swift | 11 ++++++---- Sources/AppleMapsKit/AppleMapsKitError.swift | 2 +- Sources/AppleMapsKit/Auth/AuthClient.swift | 2 +- Sources/AppleMapsKit/DTOs/ErrorResponse.swift | 10 ++++++++-- .../AppleMapsKitTests/AppleMapsKitTests.swift | 20 +++++++++++++------ 5 files changed, 31 insertions(+), 14 deletions(-) diff --git a/Sources/AppleMapsKit/AppleMapsClient.swift b/Sources/AppleMapsKit/AppleMapsClient.swift index 4f6de2a..8d80e40 100644 --- a/Sources/AppleMapsKit/AppleMapsClient.swift +++ b/Sources/AppleMapsKit/AppleMapsClient.swift @@ -12,7 +12,7 @@ public struct AppleMapsClient: Sendable { private let decoder = JSONDecoder() - /// Initializes a new `AppleMapsClient` instance. + /// Initializes a new ``AppleMapsClient`` instance. /// /// > Note: The Maps access token is valid for 30 minutes. /// @@ -119,7 +119,7 @@ public struct AppleMapsClient: Sendable { /// /// - Returns: Returns a ``MapRegion`` that describes a region that encloses the results, and an array of ``SearchResponse`` objects that describes the results of the search. public func search( - for place: String, + for place: String?, excludePoiCategories: [PoiCategory]? = nil, includePoiCategories: [PoiCategory]? = nil, limitToCountries: [String]? = nil, @@ -136,7 +136,10 @@ public struct AppleMapsClient: Sendable { ) async throws -> SearchResponse { var url = URL(string: "\(Self.apiServer)/v1/search")! - var queries: [URLQueryItem] = [URLQueryItem(name: "q", value: place)] + var queries: [URLQueryItem] = [] + if let place { + queries.append(URLQueryItem(name: "q", value: place)) + } if let excludePoiCategories { queries.append( URLQueryItem(name: "excludePoiCategories", value: excludePoiCategories.map { $0.rawValue }.joined(separator: ",")) @@ -573,7 +576,7 @@ extension AppleMapsClient { if response.status == .ok { return try await response.body.collect(upTo: 1024 * 1024) } else { - throw try await self.decoder.decode(ErrorResponse.self, from: response.body.collect(upTo: 1024 * 1024)) + throw try await self.decoder.decode(ErrorResponseJSON.self, from: response.body.collect(upTo: 1024 * 1024)).error } } } diff --git a/Sources/AppleMapsKit/AppleMapsKitError.swift b/Sources/AppleMapsKit/AppleMapsKitError.swift index c92ac61..1e26bd9 100644 --- a/Sources/AppleMapsKit/AppleMapsKitError.swift +++ b/Sources/AppleMapsKit/AppleMapsKitError.swift @@ -12,7 +12,7 @@ public struct AppleMapsKitError: Error, Sendable, Equatable { private init(_ base: Base) { self.base = base } - + /// No places were found for the given query. public static let noPlacesFound = Self(.noPlacesFound) /// The search result type is invalid. diff --git a/Sources/AppleMapsKit/Auth/AuthClient.swift b/Sources/AppleMapsKit/Auth/AuthClient.swift index a64d12c..646fc39 100644 --- a/Sources/AppleMapsKit/Auth/AuthClient.swift +++ b/Sources/AppleMapsKit/Auth/AuthClient.swift @@ -75,7 +75,7 @@ extension AuthClient { if response.status == .ok { return try await JSONDecoder().decode(TokenResponse.self, from: response.body.collect(upTo: 1024 * 1024)) } else { - throw try await JSONDecoder().decode(ErrorResponse.self, from: response.body.collect(upTo: 1024 * 1024)) + throw try await JSONDecoder().decode(ErrorResponseJSON.self, from: response.body.collect(upTo: 1024 * 1024)).error } } } diff --git a/Sources/AppleMapsKit/DTOs/ErrorResponse.swift b/Sources/AppleMapsKit/DTOs/ErrorResponse.swift index e72f6f3..bfd08e9 100644 --- a/Sources/AppleMapsKit/DTOs/ErrorResponse.swift +++ b/Sources/AppleMapsKit/DTOs/ErrorResponse.swift @@ -11,8 +11,10 @@ extension ErrorResponse: CustomStringConvertible { public var description: String { var result = #"AppleMapsError(message: \#(self.message ?? "nil")"# - if let details { - result.append(", details: \(details)") + if let details, !details.isEmpty { + result.append(", details: [") + result.append(details.joined(separator: ", ")) + result.append("]") } result.append(")") @@ -20,3 +22,7 @@ extension ErrorResponse: CustomStringConvertible { return result } } + +struct ErrorResponseJSON: Codable { + let error: ErrorResponse +} diff --git a/Tests/AppleMapsKitTests/AppleMapsKitTests.swift b/Tests/AppleMapsKitTests/AppleMapsKitTests.swift index bb3ab79..5d0d19e 100644 --- a/Tests/AppleMapsKitTests/AppleMapsKitTests.swift +++ b/Tests/AppleMapsKitTests/AppleMapsKitTests.swift @@ -8,7 +8,7 @@ import Testing struct AppleMapsKitTests { var client: AppleMapsClient // TODO: Replace with `false` when you have valid credentials. - var credentialsAreInvalid = true + let credentialsAreInvalid = true init() async throws { // TODO: Replace the following values with valid ones. @@ -100,16 +100,24 @@ struct AppleMapsKitTests { } @Test("Search with Page Token") func searchWithPageToken() async throws { - await withKnownIssue { + try await withKnownIssue { let searchResponse = try await client.search( for: "eiffel tower", - resultTypeFilter: [.pointOfInterest, .physicalFeature, .poi, .address], - lang: "en-US", - enablePagination: true, - pageToken: "test" + enablePagination: true ) let results = try #require(searchResponse.results) #expect(!results.isEmpty) + + let nextPageToken = try #require(searchResponse.paginationInfo?.nextPageToken) + + let nextSearchResponse = try await client.search( + for: nil, + pageToken: nextPageToken + ) + let nextResults = try #require(nextSearchResponse.results) + #expect(!nextResults.isEmpty) + } when: { + credentialsAreInvalid } }