diff --git a/Package.swift b/Package.swift index f4fb341..8a730fb 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.3 +// swift-tools-version:5.5 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription diff --git a/README.md b/README.md index 4dd61c3..92fe1e4 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,8 @@ func consumerPrices(startDate: Date, endDate: Date, geo: GEO, completion: @escap func consumerPrices(date: Date, geo: GEO, completion: @escaping (Result<[PrecioLuzValue], Error>) -> Void) func consumerPrices(startDate: Date, endDate: Date, geo: GEO) -> AnyPublisher<[PrecioLuzValue], Error> func consumerPrices(date: Date, geo: GEO) -> AnyPublisher<[PrecioLuzValue], Error> +func consumerPrices(startDate: Date, endDate: Date, geo: GEO) async throws -> [PrecioLuzValue] +func consumerPrices(date: Date, geo: GEO) async throws -> [PrecioLuzValue] ``` ### Obtener precios mercado spot @@ -42,6 +44,8 @@ func spotPrices(startDate: Date, endDate: Date, geo: GEO, completion: @escaping func spotPrices(date: Date, geo: GEO, completion: @escaping (Result<[PrecioLuzValue], Error>) -> Void) func spotPrices(startDate: Date, endDate: Date, geo: GEO) -> AnyPublisher<[PrecioLuzValue], Error> func spotPrices(date: Date, geo: GEO) -> AnyPublisher<[PrecioLuzValue], Error> +func spotPrices(startDate: Date, endDate: Date) async throws -> [PrecioLuzValue] +func spotPrices(date: Date) async throws -> [PrecioLuzValue] ``` ## Licencia de uso y contribuciĆ³n con el proyecto diff --git a/Sources/REESwift/Network.swift b/Sources/REESwift/Network.swift index 31c5305..4a6287b 100644 --- a/Sources/REESwift/Network.swift +++ b/Sources/REESwift/Network.swift @@ -17,6 +17,17 @@ class Network { } } + @available(iOS 15.0, *) + @available(tvOS 15.0, *) + @available(watchOS 8.0, *) + @available(macOS 12, *) + func request(_ endpoint: Endpoint) async throws -> T { + let (data, response) = try await URLSession.shared.data(from: endpoint.url) + guard (response as? HTTPURLResponse)?.statusCode == 200 else { throw URLError(.badServerResponse) } + let decodedData = try decoder.decode(T.self, from: data) + return decodedData + } + func request(_ endpoint: Endpoint) -> AnyPublisher { URLSession.shared .dataTaskPublisher(for: endpoint.url) diff --git a/Sources/REESwift/REESwift.swift b/Sources/REESwift/REESwift.swift index b98d328..8077b64 100644 --- a/Sources/REESwift/REESwift.swift +++ b/Sources/REESwift/REESwift.swift @@ -67,3 +67,35 @@ public extension REESwift { } } + +@available(iOS 15.0, *) +@available(tvOS 15.0, *) +@available(watchOS 8.0, *) +@available(macOS 12, *) +public extension REESwift { + + func consumerPrices(startDate: Date, endDate: Date, geo: GEO) async throws -> [PrecioLuzValue] { + return try await prices(id: "1001", startDate: startDate, endDate: endDate, geo: geo) + } + + func consumerPrices(date: Date, geo: GEO) async throws -> [PrecioLuzValue] { + return try await prices(id: "1001", startDate: date.start, endDate: date.end, geo: geo) + } + + func spotPrices(startDate: Date, endDate: Date) async throws -> [PrecioLuzValue] { + return try await prices(id: "600", startDate: startDate, endDate: endDate, geo: nil) + } + + func spotPrices(date: Date) async throws -> [PrecioLuzValue] { + return try await prices(id: "600", startDate: date.start, endDate: date.end, geo: nil) + } + + private func prices(id: String, startDate: Date, endDate: Date, geo: GEO?) async throws -> [PrecioLuzValue] { + let endpoint = Endpoint.prices(startDate: startDate, endDate: endDate, geo: geo) + let apiResponse: APIResponse = try await Network.shared.request(endpoint) + let prices = apiResponse.included.first { $0.id == id } + guard let values = prices?.attributes?.values, !values.isEmpty else { throw URLError(.badServerResponse) } + return values + } + +} diff --git a/Tests/REESwiftTests/REESwiftTests.swift b/Tests/REESwiftTests/REESwiftTests.swift index 6517906..31b1e64 100644 --- a/Tests/REESwiftTests/REESwiftTests.swift +++ b/Tests/REESwiftTests/REESwiftTests.swift @@ -8,6 +8,53 @@ final class REESwiftTests: XCTestCase { // MARK: - Test consumer prices + @available(iOS 15.0, *) + @available(tvOS 15.0, *) + @available(watchOS 8.0, *) + @available(macOS 12, *) + func testConsumerPricesAsync() async { + + let now = Date.now + + let todayPrices = try? await ree.consumerPrices(date: now, geo: .peninsula) + XCTAssertNotNil(todayPrices) + XCTAssert(todayPrices?.count == 24) + + let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: now)! + let otherPrices = try? await ree.consumerPrices(startDate: yesterday.start, endDate: now.end, geo: .peninsula) + XCTAssertNotNil(otherPrices) + XCTAssert(otherPrices?.count == 48) + + let futureDate = Calendar.current.date(byAdding: .month, value: 1, to: now)! + let futurePrices = try? await ree.consumerPrices(date: futureDate, geo: .peninsula) + XCTAssertNil(futurePrices) + + } + + @available(iOS 15.0, *) + @available(tvOS 15.0, *) + @available(watchOS 8.0, *) + @available(macOS 12, *) + func testConsumerPricesAsyncOtherGEOs() async { + + let now = Date.now + + let peninsulaPrices = try? await ree.consumerPrices(date: now, geo: .peninsula) + let ceutaPrices = try? await ree.consumerPrices(date: now, geo: .ceuta) + XCTAssertNotNil(peninsulaPrices) + XCTAssertNotNil(ceutaPrices) + XCTAssert(peninsulaPrices?.count == ceutaPrices?.count) + var priceEquals = true + for i in 0..