Skip to content

Commit de902e5

Browse files
committed
Update OrdersRemote.searchOrders to be async/await so that response handling is not on the main thread.
1 parent f7e16d5 commit de902e5

File tree

3 files changed

+26
-28
lines changed

3 files changed

+26
-28
lines changed

Modules/Sources/NetworkingCore/Remote/OrdersRemote.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,13 +138,13 @@ public class OrdersRemote: Remote {
138138
/// - keyword: Search string that should be matched by the orders.
139139
/// - pageNumber: Number of page that should be retrieved.
140140
/// - pageSize: Number of Orders to be retrieved per page.
141-
/// - completion: Closure to be executed upon completion.
141+
/// - Returns: Array of orders matching the search criteria.
142+
/// - Throws: Network or parsing errors.
142143
///
143144
public func searchOrders(for siteID: Int64,
144145
keyword: String,
145146
pageNumber: Int = Defaults.pageNumber,
146-
pageSize: Int = Defaults.pageSize,
147-
completion: @escaping ([Order]?, Error?) -> Void) {
147+
pageSize: Int = Defaults.pageSize) async throws -> [Order] {
148148
let parameters = [
149149
ParameterKeys.keyword: keyword,
150150
ParameterKeys.page: String(pageNumber),
@@ -162,7 +162,7 @@ public class OrdersRemote: Remote {
162162
availableAsRESTRequest: true)
163163
let mapper = OrderListMapper(siteID: siteID)
164164

165-
enqueue(request, mapper: mapper, completion: completion)
165+
return try await enqueue(request, mapper: mapper)
166166
}
167167

168168
/// Creates an order using the specified fields of a given order

Modules/Sources/Yosemite/Stores/OrderStore.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -113,14 +113,14 @@ private extension OrderStore {
113113
/// Searches all of the orders that contain a given Keyword.
114114
///
115115
func searchOrders(siteID: Int64, keyword: String, pageNumber: Int, pageSize: Int, onCompletion: @escaping (Error?) -> Void) {
116-
remote.searchOrders(for: siteID, keyword: keyword, pageNumber: pageNumber, pageSize: pageSize) { [weak self] (orders, error) in
117-
guard let orders = orders else {
116+
Task { @MainActor in
117+
do {
118+
let orders = try await remote.searchOrders(for: siteID, keyword: keyword, pageNumber: pageNumber, pageSize: pageSize)
119+
upsertSearchResultsInBackground(for: siteID, keyword: keyword, readOnlyOrders: orders) {
120+
onCompletion(nil)
121+
}
122+
} catch {
118123
onCompletion(error)
119-
return
120-
}
121-
122-
self?.upsertSearchResultsInBackground(for: siteID, keyword: keyword, readOnlyOrders: orders) {
123-
onCompletion(nil)
124124
}
125125
}
126126
}

Modules/Tests/NetworkingTests/Remote/OrdersRemoteTests.swift

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -220,35 +220,33 @@ final class OrdersRemoteTests: XCTestCase {
220220

221221
/// Verifies that searchOrders properly parses the `orders-load-all` sample response.
222222
///
223-
func testSearchOrdersProperlyReturnsParsedOrders() {
223+
func test_searchOrders_properly_returns_parsed_orders() async throws {
224+
// Given
224225
let remote = OrdersRemote(network: network)
225-
let expectation = self.expectation(description: "Load All Orders")
226226

227227
network.simulateResponse(requestUrlSuffix: "orders", filename: "orders-load-all")
228228

229-
remote.searchOrders(for: sampleSiteID, keyword: String()) { (orders, error) in
230-
XCTAssertNil(error)
231-
XCTAssertNotNil(orders)
232-
XCTAssert(orders!.count == 4)
233-
expectation.fulfill()
234-
}
229+
// When
230+
let orders = try await remote.searchOrders(for: sampleSiteID, keyword: String())
235231

236-
wait(for: [expectation], timeout: Constants.expectationTimeout)
232+
// Then
233+
XCTAssert(orders.count == 4)
237234
}
238235

239236
/// Verifies that searchOrders properly relays Networking Layer errors.
240237
///
241-
func testSearchOrdersProperlyRelaysNetworkingErrors() {
238+
func test_searchOrders_properly_relays_networking_error() async throws {
239+
// Given
242240
let remote = OrdersRemote(network: network)
243-
let expectation = self.expectation(description: "Load All Orders")
244241

245-
remote.searchOrders(for: sampleSiteID, keyword: String()) { (orders, error) in
246-
XCTAssertNil(orders)
247-
XCTAssertNotNil(error)
248-
expectation.fulfill()
242+
do {
243+
// When
244+
_ = try await remote.searchOrders(for: sampleSiteID, keyword: String())
245+
XCTFail("Expected error to be thrown")
246+
} catch {
247+
// Then
248+
XCTAssertEqual(error as? NetworkError, .notFound(response: nil))
249249
}
250-
251-
wait(for: [expectation], timeout: Constants.expectationTimeout)
252250
}
253251

254252

0 commit comments

Comments
 (0)