Skip to content

Commit ff83786

Browse files
authored
Merge pull request #8176 from woocommerce/issue/8104-convert-result-error-to-throws
Convert async -> Result signature functions to async throws
2 parents fe33de1 + b00cd6a commit ff83786

File tree

29 files changed

+268
-288
lines changed

29 files changed

+268
-288
lines changed

Networking/Networking/Remote/AccountRemote.swift

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public protocol AccountRemoteProtocol {
1313
func checkIfWooCommerceIsActive(for siteID: Int64) -> AnyPublisher<Result<Bool, Error>, Never>
1414
func fetchWordPressSiteSettings(for siteID: Int64) -> AnyPublisher<Result<WordPressSiteSettings, Error>, Never>
1515
func loadSitePlan(for siteID: Int64, completion: @escaping (Result<SitePlan, Error>) -> Void)
16-
func loadUsernameSuggestions(from text: String) async -> Result<[String], Error>
16+
func loadUsernameSuggestions(from text: String) async throws -> [String]
1717

1818
/// Creates a WPCOM account with the given email and password.
1919
/// - Parameters:
@@ -131,17 +131,15 @@ public class AccountRemote: Remote, AccountRemoteProtocol {
131131
enqueue(request, mapper: mapper, completion: completion)
132132
}
133133

134-
public func loadUsernameSuggestions(from text: String) async -> Result<[String], Error> {
134+
public func loadUsernameSuggestions(from text: String) async throws -> [String] {
135135
let path = Path.usernameSuggestions
136136
let parameters = [ParameterKey.name: text]
137137
let request = DotcomRequest(wordpressApiVersion: .wpcomMark2, method: .get, path: path, parameters: parameters)
138-
do {
139-
let result: [String: [String]] = try await enqueue(request)
140-
let suggestions = result["suggestions"] ?? []
141-
return .success(suggestions)
142-
} catch {
143-
return .failure(error)
144-
}
138+
139+
let result: [String: [String]] = try await enqueue(request)
140+
let suggestions = result["suggestions"] ?? []
141+
142+
return suggestions
145143
}
146144

147145
public func createAccount(email: String,

Networking/Networking/Remote/DomainRemote.swift

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,21 @@ public protocol DomainRemoteProtocol {
55
/// Loads domain suggestions that are free (`*.wordpress.com` only) based on the query.
66
/// - Parameter query: What the domain suggestions are based on.
77
/// - Returns: The result of free domain suggestions.
8-
func loadFreeDomainSuggestions(query: String) async -> Result<[FreeDomainSuggestion], Error>
8+
func loadFreeDomainSuggestions(query: String) async throws -> [FreeDomainSuggestion]
99
}
1010

1111
/// Domain: Remote Endpoints
1212
///
1313
public class DomainRemote: Remote, DomainRemoteProtocol {
14-
public func loadFreeDomainSuggestions(query: String) async -> Result<[FreeDomainSuggestion], Error> {
14+
public func loadFreeDomainSuggestions(query: String) async throws -> [FreeDomainSuggestion] {
1515
let path = Path.domainSuggestions
1616
let parameters: [String: Any] = [
1717
ParameterKey.query: query,
1818
ParameterKey.quantity: Defaults.domainSuggestionsQuantity,
1919
ParameterKey.wordPressDotComSubdomainsOnly: true
2020
]
2121
let request = DotcomRequest(wordpressApiVersion: .mark1_1, method: .get, path: path, parameters: parameters)
22-
do {
23-
let suggestions: [FreeDomainSuggestion] = try await enqueue(request)
24-
return .success(suggestions)
25-
} catch {
26-
return .failure(error)
27-
}
22+
return try await enqueue(request)
2823
}
2924
}
3025

Networking/Networking/Remote/JustInTimeMessagesRemote.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ public protocol JustInTimeMessagesRemoteProtocol {
44
func loadAllJustInTimeMessages(for siteID: Int64,
55
messagePath: JustInTimeMessagesRemote.MessagePath,
66
query: [String: String?]?,
7-
locale: String?) async -> Result<[JustInTimeMessage], Error>
7+
locale: String?) async throws -> [JustInTimeMessage]
88
func dismissJustInTimeMessage(for siteID: Int64,
99
messageID: String,
10-
featureClass: String) async -> Result<Bool, Error>
10+
featureClass: String) async throws -> Bool
1111
}
1212

1313
/// Just In Time Messages: Remote endpoints
@@ -28,7 +28,7 @@ public final class JustInTimeMessagesRemote: Remote, JustInTimeMessagesRemotePro
2828
public func loadAllJustInTimeMessages(for siteID: Int64,
2929
messagePath: JustInTimeMessagesRemote.MessagePath,
3030
query: [String: String?]?,
31-
locale: String?) async -> Result<[JustInTimeMessage], Error> {
31+
locale: String?) async throws -> [JustInTimeMessage] {
3232
let request = JetpackRequest(wooApiVersion: .none,
3333
method: .get,
3434
siteID: siteID,
@@ -39,7 +39,7 @@ public final class JustInTimeMessagesRemote: Remote, JustInTimeMessagesRemotePro
3939

4040
let mapper = JustInTimeMessageListMapper(siteID: siteID)
4141

42-
return await enqueue(request, mapper: mapper)
42+
return try await enqueue(request, mapper: mapper)
4343
}
4444

4545
private func getParameters(messagePath: JustInTimeMessagesRemote.MessagePath,
@@ -88,7 +88,7 @@ public final class JustInTimeMessagesRemote: Remote, JustInTimeMessagesRemotePro
8888
///
8989
public func dismissJustInTimeMessage(for siteID: Int64,
9090
messageID: String,
91-
featureClass: String) async -> Result<Bool, Error> {
91+
featureClass: String) async throws -> Bool {
9292

9393
let parameters = [ParameterKey.featureClass: featureClass,
9494
ParameterKey.messageID: messageID]
@@ -99,7 +99,7 @@ public final class JustInTimeMessagesRemote: Remote, JustInTimeMessagesRemotePro
9999
path: Path.jitm,
100100
parameters: parameters)
101101

102-
return await enqueue(request, mapper: DataBoolMapper())
102+
return try await enqueue(request, mapper: DataBoolMapper())
103103
}
104104
}
105105

Networking/Networking/Remote/Remote.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -201,9 +201,9 @@ public class Remote: NSObject {
201201
///
202202
/// - Parameter request: Request that should be performed.
203203
/// - Returns: The result from the JSON parsed response for the expected type.
204-
func enqueue<M: Mapper>(_ request: Request, mapper: M) async -> Result<M.Output, Error> {
205-
await withCheckedContinuation { continuation in
206-
network.responseData(for: request) { [weak self] result in
204+
func enqueue<M: Mapper>(_ request: Request, mapper: M) async throws -> M.Output {
205+
try await withCheckedThrowingContinuation { continuation in
206+
network.responseData(for: request) { [weak self] (result: Swift.Result<Data, Error>) in
207207
guard let self else { return }
208208

209209
switch result {
@@ -212,14 +212,14 @@ public class Remote: NSObject {
212212
let validator = request.responseDataValidator()
213213
try validator.validate(data: data)
214214
let parsed = try mapper.map(response: data)
215-
continuation.resume(returning: .success(parsed))
215+
continuation.resume(returning: parsed)
216216
} catch {
217217
DDLogError("<> Mapping Error: \(error)")
218218
self.handleResponseError(error: error, for: request)
219-
continuation.resume(returning: .failure(error))
219+
continuation.resume(throwing: error)
220220
}
221221
case .failure(let error):
222-
continuation.resume(returning: .failure(error))
222+
continuation.resume(throwing: error)
223223
}
224224
}
225225
}

Networking/Networking/Remote/SiteRemote.swift

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@ public protocol SiteRemoteProtocol {
66
/// - Parameters:
77
/// - name: The name of the site.
88
/// - domain: The domain selected for the site.
9-
/// - Returns: The result of site creation.
10-
func createSite(name: String,
11-
domain: String) async -> Result<SiteCreationResponse, Error>
9+
/// - Returns: The response with the site creation.
10+
func createSite(name: String, domain: String) async throws -> SiteCreationResponse
1211
}
1312

1413
/// Site: Remote Endpoints
@@ -24,12 +23,12 @@ public class SiteRemote: Remote, SiteRemoteProtocol {
2423
}
2524

2625
public func createSite(name: String,
27-
domain: String) async -> Result<SiteCreationResponse, Error> {
26+
domain: String) async throws -> SiteCreationResponse {
2827
let path = Path.siteCreation
2928

3029
// Domain input should be a `wordpress.com` subdomain.
3130
guard let subdomainName = domain.split(separator: ".").first else {
32-
return .failure(SiteCreationError.invalidDomain)
31+
throw SiteCreationError.invalidDomain
3332
}
3433
let parameters: [String: Any] = [
3534
"blog_name": subdomainName,
@@ -52,12 +51,7 @@ public class SiteRemote: Remote, SiteRemoteProtocol {
5251
]
5352
let request = DotcomRequest(wordpressApiVersion: .mark1_1, method: .post, path: path, parameters: parameters)
5453

55-
do {
56-
let response: SiteCreationResponse = try await enqueue(request)
57-
return .success(response)
58-
} catch {
59-
return .failure(error)
60-
}
54+
return try await enqueue(request)
6155
}
6256
}
6357

Networking/NetworkingTests/Remote/AccountRemoteTests.swift

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import Combine
22
import XCTest
3+
import TestKit
34
@testable import Networking
45

56

@@ -151,23 +152,17 @@ final class AccountRemoteTests: XCTestCase {
151152
network.simulateResponse(requestUrlSuffix: "username/suggestions", filename: "account-username-suggestions")
152153

153154
// When
154-
let result = await remote.loadUsernameSuggestions(from: "woo")
155+
let suggestions = try await remote.loadUsernameSuggestions(from: "woo")
155156

156157
// Then
157-
let suggestions = try XCTUnwrap(result.get())
158158
XCTAssertEqual(suggestions, ["woowriter", "woowoowoo", "woodaily"])
159159
}
160160

161161
func test_loadUsernameSuggestions_returns_empty_suggestions_on_empty_response() async throws {
162162
// Given
163163
let remote = AccountRemote(network: network)
164164

165-
// When
166-
let result = await remote.loadUsernameSuggestions(from: "woo")
167-
168-
// Then
169-
let error = try XCTUnwrap(result.failure as? NetworkError)
170-
XCTAssertEqual(error, .notFound)
165+
await assertThrowsError({ _ = try await remote.loadUsernameSuggestions(from: "woo")}, errorAssert: { ($0 as? NetworkError) == .notFound })
171166
}
172167

173168
// MARK: - `createAccount`

Networking/NetworkingTests/Remote/DomainRemoteTests.swift

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import XCTest
2+
import TestKit
23
@testable import Networking
34

45
final class DomainRemoteTests: XCTestCase {
@@ -21,11 +22,9 @@ final class DomainRemoteTests: XCTestCase {
2122
network.simulateResponse(requestUrlSuffix: "domains/suggestions", filename: "domain-suggestions")
2223

2324
// When
24-
let result = await remote.loadFreeDomainSuggestions(query: "domain")
25+
let suggestions = try await remote.loadFreeDomainSuggestions(query: "domain")
2526

2627
// Then
27-
XCTAssertTrue(result.isSuccess)
28-
let suggestions = try XCTUnwrap(result.get())
2928
XCTAssertEqual(suggestions, [
3029
.init(name: "domaintestingtips.wordpress.com", isFree: true),
3130
.init(name: "domaintestingtoday.wordpress.com", isFree: true),
@@ -36,12 +35,6 @@ final class DomainRemoteTests: XCTestCase {
3635
// Given
3736
let remote = DomainRemote(network: network)
3837

39-
// When
40-
let result = await remote.loadFreeDomainSuggestions(query: "domain")
41-
42-
// Then
43-
XCTAssertTrue(result.isFailure)
44-
let error = try XCTUnwrap(result.failure as? NetworkError)
45-
XCTAssertEqual(error, .notFound)
38+
await assertThrowsError({_ = try await remote.loadFreeDomainSuggestions(query: "domain")}, errorAssert: { ($0 as? NetworkError) == .notFound })
4639
}
4740
}

Networking/NetworkingTests/Remote/JustInTimeMessagesRemoteTests.swift

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ final class JustInTimeMessagesRemoteTests: XCTestCase {
2727
network.simulateResponse(requestUrlSuffix: "jetpack/v4/jitm", filename: "just-in-time-message-list")
2828

2929
// When
30-
let result = await remote.loadAllJustInTimeMessages(
30+
let justInTimeMessages = try await remote.loadAllJustInTimeMessages(
3131
for: self.sampleSiteID,
3232
messagePath: JustInTimeMessagesRemote.MessagePath(
3333
app: .wooMobile,
@@ -37,8 +37,6 @@ final class JustInTimeMessagesRemoteTests: XCTestCase {
3737
locale: "en_US")
3838

3939
// Then
40-
XCTAssert(result.isSuccess)
41-
let justInTimeMessages = try XCTUnwrap(result.get())
4240
assertEqual(1, justInTimeMessages.count)
4341
}
4442

@@ -49,7 +47,7 @@ final class JustInTimeMessagesRemoteTests: XCTestCase {
4947
let remote = JustInTimeMessagesRemote(network: network)
5048

5149
// When
52-
_ = await remote.loadAllJustInTimeMessages(
50+
_ = try? await remote.loadAllJustInTimeMessages(
5351
for: self.sampleSiteID,
5452
messagePath: JustInTimeMessagesRemote.MessagePath(
5553
app: .wooMobile,
@@ -72,7 +70,7 @@ final class JustInTimeMessagesRemoteTests: XCTestCase {
7270
network.simulateResponse(requestUrlSuffix: "jetpack/v4/jitm", filename: "just-in-time-message-list")
7371

7472
// When
75-
let result = await remote.loadAllJustInTimeMessages(
73+
let justInTimeMessages = try await remote.loadAllJustInTimeMessages(
7674
for: self.sampleSiteID,
7775
messagePath: JustInTimeMessagesRemote.MessagePath(
7876
app: .wooMobile,
@@ -82,7 +80,6 @@ final class JustInTimeMessagesRemoteTests: XCTestCase {
8280
locale: "en_US")
8381

8482
// Then
85-
let justInTimeMessages = try result.get()
8683
assertEqual(sampleSiteID, justInTimeMessages.first?.siteID)
8784
}
8885

@@ -93,7 +90,7 @@ final class JustInTimeMessagesRemoteTests: XCTestCase {
9390
let remote = JustInTimeMessagesRemote(network: network)
9491

9592
// When
96-
_ = await remote.loadAllJustInTimeMessages(
93+
_ = try? await remote.loadAllJustInTimeMessages(
9794
for: self.sampleSiteID,
9895
messagePath: JustInTimeMessagesRemote.MessagePath(
9996
app: .wooMobile,
@@ -116,31 +113,28 @@ final class JustInTimeMessagesRemoteTests: XCTestCase {
116113
// Given
117114
let remote = JustInTimeMessagesRemote(network: network)
118115

119-
let error = NetworkError.unacceptableStatusCode(statusCode: 403)
120-
network.simulateError(requestUrlSuffix: "jetpack/v4/jitm", error: error)
116+
let expectedError = NetworkError.unacceptableStatusCode(statusCode: 403)
117+
network.simulateError(requestUrlSuffix: "jetpack/v4/jitm", error: expectedError)
121118

122119
// When
123-
let result = await remote.loadAllJustInTimeMessages(
124-
for: self.sampleSiteID,
125-
messagePath: JustInTimeMessagesRemote.MessagePath(
126-
app: .wooMobile,
127-
screen: "my_store",
128-
hook: .adminNotices),
129-
query: nil,
130-
locale: "en_US")
131-
132-
// Then
133-
XCTAssertTrue(result.isFailure)
134-
let resultError = try XCTUnwrap(result.failure as? NetworkError)
135-
assertEqual(error, resultError)
120+
await assertThrowsError({
121+
_ = try await remote.loadAllJustInTimeMessages(
122+
for: self.sampleSiteID,
123+
messagePath: JustInTimeMessagesRemote.MessagePath(
124+
app: .wooMobile,
125+
screen: "my_store",
126+
hook: .adminNotices),
127+
query: nil,
128+
locale: "en_US")
129+
}, errorAssert: { ($0 as? NetworkError) == expectedError })
136130
}
137131

138132
func test_test_loadAllJustInTimeMessages_uses_passed_locale_for_request() async throws {
139133
// Given
140134
let remote = JustInTimeMessagesRemote(network: network)
141135

142136
// When
143-
_ = await remote.loadAllJustInTimeMessages(
137+
_ = try? await remote.loadAllJustInTimeMessages(
144138
for: self.sampleSiteID,
145139
messagePath: JustInTimeMessagesRemote.MessagePath(
146140
app: .wooMobile,
@@ -162,7 +156,7 @@ final class JustInTimeMessagesRemoteTests: XCTestCase {
162156
let remote = JustInTimeMessagesRemote(network: network)
163157

164158
// When
165-
_ = await remote.loadAllJustInTimeMessages(
159+
_ = try? await remote.loadAllJustInTimeMessages(
166160
for: self.sampleSiteID,
167161
messagePath: JustInTimeMessagesRemote.MessagePath(
168162
app: .wooMobile,
@@ -180,7 +174,6 @@ final class JustInTimeMessagesRemoteTests: XCTestCase {
180174
let queryItems = try XCTUnwrap(URLComponents(url: url, resolvingAgainstBaseURL: false)?.queryItems)
181175
let queryJson = try XCTUnwrap(queryItems.first { $0.name == "query" }?.value)
182176
assertThat(queryJson, contains: "\"query\":")
183-
let parameters = request.parameters
184177
let jitmQuery = try XCTUnwrap(request.parameters["query"] as? String)
185178
// Individually check query items because dictionaries aren't ordered
186179
assertThat(jitmQuery, contains: "platform=ios") // platform=ios

0 commit comments

Comments
 (0)