diff --git a/Modules/Sources/Fakes/NetworkingCore.generated.swift b/Modules/Sources/Fakes/NetworkingCore.generated.swift index 2c818bc440d..e3ecc1b4018 100644 --- a/Modules/Sources/Fakes/NetworkingCore.generated.swift +++ b/Modules/Sources/Fakes/NetworkingCore.generated.swift @@ -44,7 +44,7 @@ extension NetworkingCore.DotcomError { /// Returns a "ready to use" type filled with fake values. /// public static func fake() -> NetworkingCore.DotcomError { - .empty + .empty() } } extension NetworkingCore.MetaContainer { diff --git a/Modules/Sources/Networking/Remote/AccountRemote.swift b/Modules/Sources/Networking/Remote/AccountRemote.swift index bda44cba057..64882beb27d 100644 --- a/Modules/Sources/Networking/Remote/AccountRemote.swift +++ b/Modules/Sources/Networking/Remote/AccountRemote.swift @@ -253,7 +253,7 @@ public enum CreateAccountError: Error, Equatable { /// Decodable Initializer. /// init(dotcomError error: DotcomError) { - if case let .unknown(code, message) = error { + if case let .unknown(code, message, _) = error { switch code { case Constants.emailExists: self = .emailExists diff --git a/Modules/Sources/Networking/Remote/DevicesRemote.swift b/Modules/Sources/Networking/Remote/DevicesRemote.swift index 7376fa0684b..70755e9f1ad 100644 --- a/Modules/Sources/Networking/Remote/DevicesRemote.swift +++ b/Modules/Sources/Networking/Remote/DevicesRemote.swift @@ -56,7 +56,7 @@ public class DevicesRemote: Remote { enqueue(request, mapper: mapper) { (success, error) in guard success == true else { - completion(error ?? DotcomError.empty) + completion(error ?? DotcomError.empty()) return } diff --git a/Modules/Sources/Networking/Remote/WordPressThemeRemote.swift b/Modules/Sources/Networking/Remote/WordPressThemeRemote.swift index bde1e814fff..75e74da2e94 100644 --- a/Modules/Sources/Networking/Remote/WordPressThemeRemote.swift +++ b/Modules/Sources/Networking/Remote/WordPressThemeRemote.swift @@ -71,7 +71,7 @@ public enum InstallThemeError: Error { init?(_ error: Error) { guard let dotcomError = error as? DotcomError, - case let .unknown(code, _) = dotcomError else { + case let .unknown(code, _, _) = dotcomError else { return nil } diff --git a/Modules/Sources/NetworkingCore/Model/DotcomError.swift b/Modules/Sources/NetworkingCore/Model/DotcomError.swift index 198492f9f43..c1f87b214ad 100644 --- a/Modules/Sources/NetworkingCore/Model/DotcomError.swift +++ b/Modules/Sources/NetworkingCore/Model/DotcomError.swift @@ -7,47 +7,47 @@ public enum DotcomError: Error, Decodable, Equatable, GeneratedFakeable { /// Non explicit reason /// - case empty + case empty(data: [String: AnyDecodable]? = nil) /// Missing Token! /// - case unauthorized + case unauthorized(data: [String: AnyDecodable]? = nil) /// We're not properly authenticated /// - case invalidToken + case invalidToken(data: [String: AnyDecodable]? = nil) /// Remote Request Failed /// - case requestFailed + case requestFailed(data: [String: AnyDecodable]? = nil) /// No route was found matching the URL and request method /// - case noRestRoute + case noRestRoute(data: [String: AnyDecodable]? = nil) /// Jetpack is not connected /// /// This can be caused by an `unknown_token` error from Jetpack /// or an `invalid_blog` error from WordPress.com Stats. /// - case jetpackNotConnected + case jetpackNotConnected(data: [String: AnyDecodable]? = nil) /// Unknown: Represents an unmapped remote error. Capisce? /// - case unknown(code: String, message: String?) + case unknown(code: String, message: String?, data: [String: AnyDecodable]?) /// Stats error cases - API documentation of possible errors: /// https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/stats/ /// Note: when the cases get large, consider refactoring them into a separate error enum that conforms to a Dotcom error protocol /// No permission to view site stats - case noStatsPermission + case noStatsPermission(data: [String: AnyDecodable]? = nil) /// Jetpack site stats module disabled - case statsModuleDisabled + case statsModuleDisabled(data: [String: AnyDecodable]? = nil) /// The requested resourced does not exist remotely - case resourceDoesNotExist + case resourceDoesNotExist(data: [String: AnyDecodable]? = nil) /// Decodable Initializer. /// @@ -55,31 +55,31 @@ public enum DotcomError: Error, Decodable, Equatable, GeneratedFakeable { let container = try decoder.container(keyedBy: CodingKeys.self) let error = try container.decode(String.self, forKey: .error) let message = try container.decodeIfPresent(String.self, forKey: .message) + let data = try container.decodeIfPresent([String: AnyDecodable].self, forKey: .data) switch error { case Constants.invalidToken: - self = .invalidToken + self = .invalidToken(data: data) case Constants.requestFailed: - self = .requestFailed + self = .requestFailed(data: data) case Constants.unauthorized where message == ErrorMessages.noStatsPermission: - self = .noStatsPermission + self = .noStatsPermission(data: data) case Constants.unauthorized: - self = .unauthorized + self = .unauthorized(data: data) case Constants.noRestRoute: - self = .noRestRoute + self = .noRestRoute(data: data) case Constants.invalidBlog where message == ErrorMessages.statsModuleDisabled: - self = .statsModuleDisabled + self = .statsModuleDisabled(data: data) case Constants.restTermInvalid where message == ErrorMessages.resourceDoesNotExist: - self = .resourceDoesNotExist + self = .resourceDoesNotExist(data: data) case Constants.unknownToken, Constants.invalidBlog where message == ErrorMessages.jetpackNotConnected: - self = .jetpackNotConnected + self = .jetpackNotConnected(data: data) default: - self = .unknown(code: error, message: message) + self = .unknown(code: error, message: message, data: data) } } - /// Constants for Possible Error Identifiers /// private enum Constants { @@ -97,6 +97,7 @@ public enum DotcomError: Error, Decodable, Equatable, GeneratedFakeable { private enum CodingKeys: String, CodingKey { case error case message + case data } /// Possible Error Messages @@ -134,7 +135,7 @@ extension DotcomError: CustomStringConvertible { return NSLocalizedString("Dotcom Resource does not exist", comment: "WordPress.com error thrown when a requested resource does not exist remotely.") case .jetpackNotConnected: return NSLocalizedString("Jetpack Not Connected", comment: "WordPress.com error thrown when Jetpack is not connected.") - case .unknown(let code, let message): + case .unknown(let code, let message, _): let theMessage = message ?? String() let messageFormat = NSLocalizedString( "Dotcom Error: [%1$@] %2$@", @@ -150,14 +151,17 @@ extension DotcomError: CustomStringConvertible { // public func ==(lhs: DotcomError, rhs: DotcomError) -> Bool { switch (lhs, rhs) { - case (.requestFailed, .requestFailed), + case (.empty, .empty), (.unauthorized, .unauthorized), + (.invalidToken, .invalidToken), + (.requestFailed, .requestFailed), (.noRestRoute, .noRestRoute), + (.jetpackNotConnected, .jetpackNotConnected), (.noStatsPermission, .noStatsPermission), (.statsModuleDisabled, .statsModuleDisabled), - (.jetpackNotConnected, .jetpackNotConnected): + (.resourceDoesNotExist, .resourceDoesNotExist): return true - case let (.unknown(codeLHS, _), .unknown(codeRHS, _)): + case let (.unknown(codeLHS, _, _), .unknown(codeRHS, _, _)): return codeLHS == codeRHS default: return false diff --git a/Modules/Sources/NetworkingCore/Remote/NotificationsRemote.swift b/Modules/Sources/NetworkingCore/Remote/NotificationsRemote.swift index d58bd938f01..6e495c98449 100644 --- a/Modules/Sources/NetworkingCore/Remote/NotificationsRemote.swift +++ b/Modules/Sources/NetworkingCore/Remote/NotificationsRemote.swift @@ -74,7 +74,7 @@ public final class NotificationsRemote: Remote, NotificationsRemoteProtocol { enqueue(request, mapper: mapper) { (success, error) in guard success == true else { - completion(error ?? DotcomError.empty) + completion(error ?? DotcomError.empty()) return } @@ -99,7 +99,7 @@ public final class NotificationsRemote: Remote, NotificationsRemoteProtocol { enqueue(request, mapper: mapper) { (success, error) in guard success == true else { - completion(error ?? DotcomError.empty) + completion(error ?? DotcomError.empty()) return } diff --git a/Modules/Sources/Yosemite/Stores/CouponsError.swift b/Modules/Sources/Yosemite/Stores/CouponsError.swift index 19fdb92f106..067248322f4 100644 --- a/Modules/Sources/Yosemite/Stores/CouponsError.swift +++ b/Modules/Sources/Yosemite/Stores/CouponsError.swift @@ -8,7 +8,7 @@ public struct CouponsError: Error, LocalizedError { public init?(underlyingError error: Error) { switch error { - case DotcomError.unknown(Constants.invalidCouponCode, let message): + case DotcomError.unknown(Constants.invalidCouponCode, let message, _): self.message = message ?? Localizations.defaultCouponsError self.underlyingError = error case let NetworkError.unacceptableStatusCode(_, response): diff --git a/Modules/Sources/Yosemite/Stores/OrderStore.swift b/Modules/Sources/Yosemite/Stores/OrderStore.swift index a4093adbfaa..1b524d8dc63 100644 --- a/Modules/Sources/Yosemite/Stores/OrderStore.swift +++ b/Modules/Sources/Yosemite/Stores/OrderStore.swift @@ -663,7 +663,7 @@ private extension OrderStore { }) case .failure(let error): if let dotcomError = error as? DotcomError, - case let .unknown(code, message) = dotcomError { + case let .unknown(code, message, _) = dotcomError { switch code { case "woocommerce_rest_gift_card_cannot_apply": return onCompletion(.failure(GiftCardError.cannotApply(reason: message))) diff --git a/Modules/Sources/Yosemite/Stores/PaymentsError.swift b/Modules/Sources/Yosemite/Stores/PaymentsError.swift index 8d3fe9ed975..62e24a09d10 100644 --- a/Modules/Sources/Yosemite/Stores/PaymentsError.swift +++ b/Modules/Sources/Yosemite/Stores/PaymentsError.swift @@ -19,7 +19,7 @@ public enum PaymentsError: Error, LocalizedError { private static func unwrapError(error: Error) -> PaymentsErrorConvertible? { switch error { - case let DotcomError.unknown(code, message): + case let DotcomError.unknown(code, message, _): return PaymentsDotcomErrorDetails(code: code, message: message) case let NetworkError.unacceptableStatusCode(_, response): guard let response, diff --git a/Modules/Sources/Yosemite/Stores/ProductStore.swift b/Modules/Sources/Yosemite/Stores/ProductStore.swift index 27c8f47f9e5..a9437c5cc9a 100644 --- a/Modules/Sources/Yosemite/Stores/ProductStore.swift +++ b/Modules/Sources/Yosemite/Stores/ProductStore.swift @@ -317,8 +317,9 @@ private extension ProductStore { shouldDeleteExistingProducts: shouldDeleteExistingProducts) let hasNextPage = products.count == pageSize return hasNextPage - } catch let error as DotcomError where error == .unknown(code: "rest_invalid_param", message: "Invalid parameter(s): type") { - if let productType, + } catch let error as DotcomError { + if case .unknown(code: "rest_invalid_param", message: "Invalid parameter(s): type", data: _) = error, + let productType, ProductType.coreTypes.contains(productType) == false { return false } @@ -684,7 +685,7 @@ private extension ProductStore { feature: .productDetailsFromScannedTexts, responseFormat: .json) guard let jsonData = jsonString.data(using: .utf8) else { - return completion(.failure(DotcomError.resourceDoesNotExist)) + return completion(.failure(DotcomError.resourceDoesNotExist())) } let details = try JSONDecoder().decode(ProductDetailsFromScannedTexts.self, from: jsonData) completion(.success(.init(name: details.name, description: details.description))) @@ -1388,7 +1389,7 @@ public enum ProductUpdateError: Error, Equatable { return } switch dotcomError { - case let .unknown(code, message): + case let .unknown(code, message, _): guard let errorCode = ErrorCode(rawValue: code) else { self = .unknown(error: dotcomError.toAnyError) return @@ -1476,7 +1477,7 @@ public enum ProductLoadError: Error, Equatable { case unknown(error: AnyError) init(underlyingError error: Error) { - guard case let DotcomError.unknown(code, _) = error else { + guard case let DotcomError.unknown(code, _, _) = error else { self = .unknown(error: error.toAnyError) return } diff --git a/Modules/Sources/Yosemite/Stores/ShippingLabelStore.swift b/Modules/Sources/Yosemite/Stores/ShippingLabelStore.swift index 62b9de9f7dd..56197a2c563 100644 --- a/Modules/Sources/Yosemite/Stores/ShippingLabelStore.swift +++ b/Modules/Sources/Yosemite/Stores/ShippingLabelStore.swift @@ -161,7 +161,7 @@ private extension ShippingLabelStore { } onCompletion(eligibility.isEligible) case .failure(let error): - if error as? DotcomError == .noRestRoute { + if case .noRestRoute = error as? DotcomError { DDLogError("⚠️ Endpoint for shipping label creation eligibility is unreachable for order: \(orderID). WC Shipping plugin may be missing.") } else { DDLogError("⛔️ Error checking shipping label creation eligibility for order \(orderID): \(error)") @@ -492,7 +492,7 @@ public enum PackageCreationError: Error, Equatable { return } switch dotcomError { - case .unknown(let code, _): + case .unknown(let code, _, _): guard let errorCode = ErrorCode(rawValue: code) else { self = .unknown(error: dotcomError.toAnyError) return diff --git a/Modules/Sources/Yosemite/Stores/SiteStore.swift b/Modules/Sources/Yosemite/Stores/SiteStore.swift index 3cd68049900..1a8dbbc760a 100644 --- a/Modules/Sources/Yosemite/Stores/SiteStore.swift +++ b/Modules/Sources/Yosemite/Stores/SiteStore.swift @@ -210,7 +210,7 @@ public enum SiteCreationError: Error, Equatable { } case let remoteError as DotcomError: switch remoteError { - case let .unknown(code, _): + case let .unknown(code, _, _): switch code { case "blog_name_exists": self = .domainExists diff --git a/Modules/Sources/Yosemite/Stores/WooShippingStore.swift b/Modules/Sources/Yosemite/Stores/WooShippingStore.swift index bfef74b6df0..c07cbc1e706 100644 --- a/Modules/Sources/Yosemite/Stores/WooShippingStore.swift +++ b/Modules/Sources/Yosemite/Stores/WooShippingStore.swift @@ -120,7 +120,7 @@ private extension WooShippingStore { } onCompletion(eligibility.isEligible) case .failure(let error): - if error as? DotcomError == .noRestRoute { + if case .noRestRoute = error as? DotcomError { DDLogError("⚠️ Endpoint for shipping label creation eligibility is unreachable for order: \(orderID). WC Shipping plugin may be missing.") } else { DDLogError("⛔️ Error checking shipping label creation eligibility for order \(orderID): \(error)") diff --git a/Modules/Sources/Yosemite/Tools/CommonReaderConfigProvider.swift b/Modules/Sources/Yosemite/Tools/CommonReaderConfigProvider.swift index e65162b626a..156c528e373 100644 --- a/Modules/Sources/Yosemite/Tools/CommonReaderConfigProvider.swift +++ b/Modules/Sources/Yosemite/Tools/CommonReaderConfigProvider.swift @@ -66,9 +66,9 @@ final public class CommonReaderConfigProvider: CommonReaderConfigProviding { private extension CardReaderConfigError { init?(error: Error) { switch error { - case DotcomError.unknown(code: "store_address_is_incomplete", let message): + case DotcomError.unknown(code: "store_address_is_incomplete", let message, _): self = .incompleteStoreAddress(adminUrl: URL(string: message ?? "")) - case DotcomError.unknown(code: "postal_code_invalid", _): + case DotcomError.unknown(code: "postal_code_invalid", _, _): self = .invalidPostalCode case NetworkError.unacceptableStatusCode(_, let responseData): guard let responseData, diff --git a/Modules/Sources/Yosemite/Tools/POS/POSOrderService.swift b/Modules/Sources/Yosemite/Tools/POS/POSOrderService.swift index 8874e0caa24..5d3a43c7a6e 100644 --- a/Modules/Sources/Yosemite/Tools/POS/POSOrderService.swift +++ b/Modules/Sources/Yosemite/Tools/POS/POSOrderService.swift @@ -143,35 +143,34 @@ private extension POSOrderService { _ error: Error, cart: POSCart ) -> [CartOrderComparison.MissingCartItem]? { - // Check if this is an AFError wrapping a DotcomError or NetworkError - let underlyingError: Error? = { - if let afError = error as? AFError { - return afError.underlyingError + let (code, data) = errorCodeAndData(from: error) + guard let code, isProductValidationError(code: code) else { + return nil + } + + guard let variationID = extractVariationID(from: data) else { + return unknownMissingProductsInCart() + } + return createMissingProductInfo(forVariationID: variationID, cart: cart) + } + + func errorCodeAndData(from error: Error) -> (code: String?, data: [String: AnyDecodable]?) { + // Unwrap AFError if present + let underlyingError: Error = { + if let afError = error as? AFError, let underlying = afError.underlyingError { + return underlying } return error }() - // Check for DotcomError with product/variation validation error codes - if case .unknown(let code, _) = underlyingError as? DotcomError { - if isProductValidationError(code: code) { - // DotcomError doesn't include data field, fall back to generic error - return extractMissingProductsFromCart() - } + // Extract error code and data from either error type + if case .unknown(let code, _, let data) = underlyingError as? DotcomError { + return (code, data) } - - // Check for NetworkError with product/variation validation error codes - if let networkError = underlyingError as? NetworkError, - let errorCode = networkError.errorCode, - isProductValidationError(code: errorCode) { - // Try to extract variation_id from NetworkError data if available - if let variationID = extractVariationID(from: networkError.errorData) { - return createMissingProductInfo(forVariationID: variationID, cart: cart) - } - // Fall back to generic error if no variation_id in data - return extractMissingProductsFromCart() + if let networkError = underlyingError as? NetworkError { + return (networkError.errorCode, networkError.errorData) } - - return nil + return (nil, nil) } /// Extracts variation_id from error data dictionary @@ -237,7 +236,7 @@ private extension POSOrderService { /// Extracts missing products by trying to identify items in cart that might have caused the validation error /// Since server doesn't tell us which specific products failed, we return generic error info - func extractMissingProductsFromCart() -> [CartOrderComparison.MissingCartItem]? { + func unknownMissingProductsInCart() -> [CartOrderComparison.MissingCartItem] { // We can't determine which specific products are invalid from the server error // So we return a generic missing product message with 0 for both IDs (meaning unknown) // The user will need to remove all products and retry diff --git a/Modules/Tests/NetworkingTests/Remote/CommentRemoteTests.swift b/Modules/Tests/NetworkingTests/Remote/CommentRemoteTests.swift index c25430f5ccf..abf8eb0ad51 100644 --- a/Modules/Tests/NetworkingTests/Remote/CommentRemoteTests.swift +++ b/Modules/Tests/NetworkingTests/Remote/CommentRemoteTests.swift @@ -147,7 +147,7 @@ class CommentRemoteTests: XCTestCase { return } - XCTAssert(error == .unauthorized) + XCTAssert(error == .unauthorized()) XCTAssertNil(updatedStatus) expectation.fulfill() diff --git a/Modules/Tests/NetworkingTests/Remote/JetpackSettingsRemoteTests.swift b/Modules/Tests/NetworkingTests/Remote/JetpackSettingsRemoteTests.swift index 7df97e4e287..b350b39eeb9 100644 --- a/Modules/Tests/NetworkingTests/Remote/JetpackSettingsRemoteTests.swift +++ b/Modules/Tests/NetworkingTests/Remote/JetpackSettingsRemoteTests.swift @@ -31,7 +31,7 @@ final class JetpackSettingsRemoteTests: XCTestCase { // When try await remote.enableJetpackModule(for: sampleSiteID, moduleSlug: "invalidmodule") }, errorAssert: { error in - (error as? DotcomError) == .unknown(code: "some_updated", message: "Invalid option: invalidmodule.") + (error as? DotcomError) == .unknown(code: "some_updated", message: "Invalid option: invalidmodule.", data: nil) }) } diff --git a/Modules/Tests/NetworkingTests/Remote/NotificationsRemoteTests.swift b/Modules/Tests/NetworkingTests/Remote/NotificationsRemoteTests.swift index f727fdbe4ed..a27eec6fe8d 100644 --- a/Modules/Tests/NetworkingTests/Remote/NotificationsRemoteTests.swift +++ b/Modules/Tests/NetworkingTests/Remote/NotificationsRemoteTests.swift @@ -95,7 +95,7 @@ final class NotificationsRemoteTests: XCTestCase { return } - XCTAssert(error == .unauthorized) + XCTAssert(error == .unauthorized()) expectation.fulfill() } @@ -132,7 +132,7 @@ final class NotificationsRemoteTests: XCTestCase { return } - XCTAssert(error == .unauthorized) + XCTAssert(error == .unauthorized()) expectation.fulfill() } diff --git a/Modules/Tests/NetworkingTests/Remote/ProductsReportsRemoteTests.swift b/Modules/Tests/NetworkingTests/Remote/ProductsReportsRemoteTests.swift index fbdd4abf1db..aa031bad809 100644 --- a/Modules/Tests/NetworkingTests/Remote/ProductsReportsRemoteTests.swift +++ b/Modules/Tests/NetworkingTests/Remote/ProductsReportsRemoteTests.swift @@ -56,6 +56,6 @@ class ProductsReportsRemoteTests: XCTestCase { earliestDateToInclude: Date(), latestDateToInclude: Date(), quantity: 5) - }, errorAssert: { ($0 as? DotcomError) == .unauthorized }) + }, errorAssert: { ($0 as? DotcomError) == .unauthorized() }) } } diff --git a/Modules/Tests/NetworkingTests/Remote/RemoteTests.swift b/Modules/Tests/NetworkingTests/Remote/RemoteTests.swift index ba3bc97e821..9d12c91fb9e 100644 --- a/Modules/Tests/NetworkingTests/Remote/RemoteTests.swift +++ b/Modules/Tests/NetworkingTests/Remote/RemoteTests.swift @@ -181,7 +181,7 @@ final class RemoteTests: XCTestCase { let _: String = try await remote.enqueue(request) } catch { let error = try XCTUnwrap(error as? DotcomError) - XCTAssertEqual(error, .requestFailed) + XCTAssertEqual(error, .requestFailed()) } await fulfillment(of: [expectationForNotification], timeout: Constants.expectationTimeout) @@ -258,7 +258,7 @@ final class RemoteTests: XCTestCase { // Then XCTAssertTrue(result.isFailure) - XCTAssertEqual(result.failure as? DotcomError, DotcomError.requestFailed) + XCTAssertEqual(result.failure as? DotcomError, DotcomError.requestFailed()) } /// Verifies that dotcom v1.1 request parses DotcomError diff --git a/Modules/Tests/NetworkingTests/Remote/ReportRemoteTests.swift b/Modules/Tests/NetworkingTests/Remote/ReportRemoteTests.swift index c7e1020f756..11fd97a92ef 100644 --- a/Modules/Tests/NetworkingTests/Remote/ReportRemoteTests.swift +++ b/Modules/Tests/NetworkingTests/Remote/ReportRemoteTests.swift @@ -60,6 +60,6 @@ class ReportRemoteTests: XCTestCase { //Then XCTAssertTrue(result.isFailure) - XCTAssertEqual(result.failure as? DotcomError, .unauthorized) + XCTAssertEqual(result.failure as? DotcomError, .unauthorized()) } } diff --git a/Modules/Tests/NetworkingTests/Remote/ShipmentsRemoteTests.swift b/Modules/Tests/NetworkingTests/Remote/ShipmentsRemoteTests.swift index 60af54669fb..ba94d5f6738 100644 --- a/Modules/Tests/NetworkingTests/Remote/ShipmentsRemoteTests.swift +++ b/Modules/Tests/NetworkingTests/Remote/ShipmentsRemoteTests.swift @@ -94,7 +94,7 @@ final class ShipmentsRemoteTests: XCTestCase { XCTFail() return } - XCTAssertTrue(dotComError == .noRestRoute) + XCTAssertTrue(dotComError == .noRestRoute()) expectation.fulfill() }) @@ -188,7 +188,7 @@ final class ShipmentsRemoteTests: XCTestCase { XCTFail() return } - XCTAssertTrue(dotComError == .noRestRoute) + XCTAssertTrue(dotComError == .noRestRoute()) expectation.fulfill() } @@ -286,7 +286,7 @@ final class ShipmentsRemoteTests: XCTestCase { XCTFail() return } - XCTAssertTrue(dotComError == .noRestRoute) + XCTAssertTrue(dotComError == .noRestRoute()) expectation.fulfill() } @@ -366,7 +366,7 @@ final class ShipmentsRemoteTests: XCTestCase { XCTFail() return } - XCTAssertTrue(dotComError == .noRestRoute) + XCTAssertTrue(dotComError == .noRestRoute()) expectation.fulfill() } @@ -441,7 +441,7 @@ final class ShipmentsRemoteTests: XCTestCase { XCTFail() return } - XCTAssertTrue(dotComError == .noRestRoute) + XCTAssertTrue(dotComError == .noRestRoute()) expectation.fulfill() } diff --git a/Modules/Tests/NetworkingTests/Remote/ShippingLabelRemoteTests.swift b/Modules/Tests/NetworkingTests/Remote/ShippingLabelRemoteTests.swift index 75c9e82f8f9..3759b4a8182 100644 --- a/Modules/Tests/NetworkingTests/Remote/ShippingLabelRemoteTests.swift +++ b/Modules/Tests/NetworkingTests/Remote/ShippingLabelRemoteTests.swift @@ -102,7 +102,8 @@ final class ShippingLabelRemoteTests: XCTestCase { let expectedError = DotcomError .unknown(code: "wcc_server_error_response", message: "Error: The WooCommerce Shipping & Tax server returned: Bad Request Unable to request refund. " + - "The parcel has been shipped. ( 400 )") + "The parcel has been shipped. ( 400 )", + data: nil) XCTAssertEqual(result.failure as? DotcomError, expectedError) } @@ -278,7 +279,8 @@ final class ShippingLabelRemoteTests: XCTestCase { // Then let expectedError = DotcomError .unknown(code: "duplicate_custom_package_names_of_existing_packages", - message: "At least one of the new custom packages has the same name as existing packages.") + message: "At least one of the new custom packages has the same name as existing packages.", + data: nil) XCTAssertEqual(result.failure as? DotcomError, expectedError) } diff --git a/Modules/Tests/NetworkingTests/Remote/SiteRemoteTests.swift b/Modules/Tests/NetworkingTests/Remote/SiteRemoteTests.swift index 85587f799cd..c681b587594 100644 --- a/Modules/Tests/NetworkingTests/Remote/SiteRemoteTests.swift +++ b/Modules/Tests/NetworkingTests/Remote/SiteRemoteTests.swift @@ -50,8 +50,10 @@ final class SiteRemoteTests: XCTestCase { await assertThrowsError({ // When _ = try await remote.createSite(name: "Wapuu swags", flow: .onboarding(domain: "wapuu.store")) - }, errorAssert: { ($0 as? DotcomError) == .unknown(code: "blog_name_only_lowercase_letters_and_numbers", - message: "Site names can only contain lowercase letters (a-z) and numbers.") + }, errorAssert: { ($0 as? DotcomError) == .unknown( + code: "blog_name_only_lowercase_letters_and_numbers", + message: "Site names can only contain lowercase letters (a-z) and numbers.", + data: nil) }) } @@ -128,8 +130,10 @@ final class SiteRemoteTests: XCTestCase { // When try await remote.enableFreeTrial(siteID: 134) }, errorAssert: { error in - (error as? DotcomError) == .unknown(code: "no-upgrades-permitted", - message: "You cannot add WordPress.com eCommerce Trial when you already have paid upgrades") + (error as? DotcomError) == .unknown( + code: "no-upgrades-permitted", + message: "You cannot add WordPress.com eCommerce Trial when you already have paid upgrades", + data: nil) }) } @@ -290,7 +294,7 @@ final class SiteRemoteTests: XCTestCase { category: "clothing_and_accessories", countryCode: "US")) }, errorAssert: { error in - (error as? DotcomError) == .unauthorized + (error as? DotcomError) == .unauthorized() }) } @@ -320,7 +324,8 @@ final class SiteRemoteTests: XCTestCase { _ = try await remote.loadSite(domain: domain) }, errorAssert: { ($0 as? DotcomError) == .unknown( code: "parse_error", - message: "The Jetpack site is inaccessible or returned an error: parse error (local). not well formed [-32710]" + message: "The Jetpack site is inaccessible or returned an error: parse error (local). not well formed [-32710]", + data: nil )}) } diff --git a/Modules/Tests/NetworkingTests/Remote/WooShippingRemoteTests.swift b/Modules/Tests/NetworkingTests/Remote/WooShippingRemoteTests.swift index 0f2d1896301..94db84ba815 100644 --- a/Modules/Tests/NetworkingTests/Remote/WooShippingRemoteTests.swift +++ b/Modules/Tests/NetworkingTests/Remote/WooShippingRemoteTests.swift @@ -104,7 +104,8 @@ final class WooShippingRemoteTests: XCTestCase { // Then let expectedError = DotcomError .unknown(code: "duplicate_custom_package_names_of_existing_packages", - message: "At least one of the new custom packages has the same name as existing packages.") + message: "At least one of the new custom packages has the same name as existing packages.", + data: nil) XCTAssertEqual(result.failure as? DotcomError, expectedError) } @@ -163,7 +164,7 @@ final class WooShippingRemoteTests: XCTestCase { } // Then - let expectedError = DotcomError.unauthorized + let expectedError = DotcomError.unauthorized() XCTAssertEqual(result.failure as? DotcomError, expectedError) } diff --git a/Modules/Tests/NetworkingTests/Validators/DotcomValidatorTests.swift b/Modules/Tests/NetworkingTests/Validators/DotcomValidatorTests.swift index a5ff17d1ee3..f29972518f7 100644 --- a/Modules/Tests/NetworkingTests/Validators/DotcomValidatorTests.swift +++ b/Modules/Tests/NetworkingTests/Validators/DotcomValidatorTests.swift @@ -19,7 +19,7 @@ class DotcomValidatorTests: XCTestCase { guard let dotcomError = error as? DotcomError else { return XCTFail() } - XCTAssertEqual(dotcomError, .unauthorized) + XCTAssertEqual(dotcomError, .unauthorized()) } } @@ -35,7 +35,7 @@ class DotcomValidatorTests: XCTestCase { guard let dotcomError = error as? DotcomError else { return XCTFail() } - XCTAssertEqual(dotcomError, .noRestRoute) + XCTAssertEqual(dotcomError, .noRestRoute()) } } @@ -52,7 +52,7 @@ class DotcomValidatorTests: XCTestCase { guard let dotcomError = error as? DotcomError else { return XCTFail() } - XCTAssertEqual(dotcomError, .noStatsPermission) + XCTAssertEqual(dotcomError, .noStatsPermission()) } } @@ -69,7 +69,7 @@ class DotcomValidatorTests: XCTestCase { guard let dotcomError = error as? DotcomError else { return XCTFail() } - XCTAssertEqual(dotcomError, .statsModuleDisabled) + XCTAssertEqual(dotcomError, .statsModuleDisabled()) } } } diff --git a/Modules/Tests/PointOfSaleTests/Controllers/PointOfSaleOrderControllerTests.swift b/Modules/Tests/PointOfSaleTests/Controllers/PointOfSaleOrderControllerTests.swift index 561327144bb..b21f98bbd79 100644 --- a/Modules/Tests/PointOfSaleTests/Controllers/PointOfSaleOrderControllerTests.swift +++ b/Modules/Tests/PointOfSaleTests/Controllers/PointOfSaleOrderControllerTests.swift @@ -529,7 +529,7 @@ struct PointOfSaleOrderControllerTests { currencySettingsProvider: MockCurrencySettingsProvider(), analytics: MockPOSAnalytics()) let errorMessage = "Invalid coupon code" - mockOrderService.errorToReturn = DotcomError.unknown(code: "woocommerce_rest_invalid_coupon", message: errorMessage) + mockOrderService.errorToReturn = DotcomError.unknown(code: "woocommerce_rest_invalid_coupon", message: errorMessage, data: nil) var orderStates: [PointOfSaleInternalOrderState] = [sut.orderState] var orderStateAppendTask: Task? = nil diff --git a/Modules/Tests/PointOfSaleTests/Tools/POSReceiptSenderTests.swift b/Modules/Tests/PointOfSaleTests/Tools/POSReceiptSenderTests.swift index a98fa59c497..100f73da73b 100644 --- a/Modules/Tests/PointOfSaleTests/Tools/POSReceiptSenderTests.swift +++ b/Modules/Tests/PointOfSaleTests/Tools/POSReceiptSenderTests.swift @@ -43,7 +43,7 @@ struct POSReceiptSenderTests { systemPlugin: SystemPlugin.fake().copy(plugin: "woocommerce/woocommerce.php", version: "10.0.0-dev", active: true)) - mockReceiptService.sendReceiptResult = .failure(DotcomError.unknown(code: "test_error", message: "Test error")) + mockReceiptService.sendReceiptResult = .failure(DotcomError.unknown(code: "test_error", message: "Test error", data: nil)) let order = Order.fake() // When diff --git a/Modules/Tests/YosemiteTests/Mocks/Networking/Remote/MockAccountRemote.swift b/Modules/Tests/YosemiteTests/Mocks/Networking/Remote/MockAccountRemote.swift index 8bf44430cff..4fd0e26e00f 100644 --- a/Modules/Tests/YosemiteTests/Mocks/Networking/Remote/MockAccountRemote.swift +++ b/Modules/Tests/YosemiteTests/Mocks/Networking/Remote/MockAccountRemote.swift @@ -154,7 +154,7 @@ extension MockAccountRemote: AccountRemoteProtocol { clientSecret: String) async -> Result { guard let result = createAccountResult else { XCTFail("Could not find result for creating an account.") - return .failure(.unexpected(error: .empty)) + return .failure(.unexpected(error: .empty())) } return result } diff --git a/Modules/Tests/YosemiteTests/PointOfSale/POSProductOrVariationResolverTests.swift b/Modules/Tests/YosemiteTests/PointOfSale/POSProductOrVariationResolverTests.swift index aed727efa16..5b1102647aa 100644 --- a/Modules/Tests/YosemiteTests/PointOfSale/POSProductOrVariationResolverTests.swift +++ b/Modules/Tests/YosemiteTests/PointOfSale/POSProductOrVariationResolverTests.swift @@ -164,7 +164,7 @@ struct POSProductOrVariationResolverTests { ) let scannedCode = "test-barcode-loading" let someError = NSError(domain: "Test", code: 1, userInfo: nil) - let dotcomNotFoundError = DotcomError.unknown(code: "woocommerce_rest_product_invalid_id", message: "Not found") + let dotcomNotFoundError = DotcomError.unknown(code: "woocommerce_rest_product_invalid_id", message: "Not found", data: nil) // NotFound case (simulate DotcomError for not found) mockProductsRemote.whenLoadingProductForPointOfSale(siteID: variation.siteID, productID: variation.parentID, thenReturn: .failure(dotcomNotFoundError)) diff --git a/Modules/Tests/YosemiteTests/Stores/CardPresentPaymentStoreTests.swift b/Modules/Tests/YosemiteTests/Stores/CardPresentPaymentStoreTests.swift index ab3e112a0a3..e512e7fc812 100644 --- a/Modules/Tests/YosemiteTests/Stores/CardPresentPaymentStoreTests.swift +++ b/Modules/Tests/YosemiteTests/Stores/CardPresentPaymentStoreTests.swift @@ -582,7 +582,7 @@ final class CardPresentPaymentStoreTests: XCTestCase { XCTAssert(viewStorage.countObjects(ofType: Storage.WCPayCharge.self, matching: nil) == 2) network.simulateError(requestUrlSuffix: "payments/charges/\(sampleErrorChargeID)", - error: DotcomError.unknown(code: "beep", message: "boop")) + error: DotcomError.unknown(code: "beep", message: "boop", data: nil)) let _: Result = waitFor { [self] promise in let action = CardPresentPaymentAction.fetchWCPayCharge(siteID: self.sampleSiteID, chargeID: self.sampleErrorChargeID, onCompletion: { result in diff --git a/Modules/Tests/YosemiteTests/Stores/JustInTimeMessageStoreTests.swift b/Modules/Tests/YosemiteTests/Stores/JustInTimeMessageStoreTests.swift index b0f5c2ce357..1504bd6f765 100644 --- a/Modules/Tests/YosemiteTests/Stores/JustInTimeMessageStoreTests.swift +++ b/Modules/Tests/YosemiteTests/Stores/JustInTimeMessageStoreTests.swift @@ -84,7 +84,7 @@ final class JustInTimeMessageStoreTests: XCTestCase { func test_loadMessage_then_it_returns_error_upon_response_error() { // Given a stubbed generic-error network response - network.simulateError(requestUrlSuffix: "jetpack/v4/jitm", error: DotcomError.noRestRoute) + network.simulateError(requestUrlSuffix: "jetpack/v4/jitm", error: DotcomError.noRestRoute()) // When dispatching a `loadAllInboxNotes` action let result = waitFor { promise in @@ -103,6 +103,6 @@ final class JustInTimeMessageStoreTests: XCTestCase { let error = error as? DotcomError else { return XCTFail("Expected error not recieved") } - assertEqual(DotcomError.noRestRoute, error) + assertEqual(DotcomError.noRestRoute(), error) } } diff --git a/Modules/Tests/YosemiteTests/Stores/MediaStoreTests.swift b/Modules/Tests/YosemiteTests/Stores/MediaStoreTests.swift index 3f247db2b43..3fe88674bec 100644 --- a/Modules/Tests/YosemiteTests/Stores/MediaStoreTests.swift +++ b/Modules/Tests/YosemiteTests/Stores/MediaStoreTests.swift @@ -72,7 +72,7 @@ final class MediaStoreTests: XCTestCase { // Given let mediaID: Int64 = 22 let remote = MockMediaRemote() - remote.whenLoadingMedia(siteID: sampleSiteID, thenReturn: .failure(DotcomError.unauthorized)) + remote.whenLoadingMedia(siteID: sampleSiteID, thenReturn: .failure(DotcomError.unauthorized())) let mediaStore = MediaStore(dispatcher: dispatcher, storageManager: storageManager, network: network, @@ -93,7 +93,7 @@ final class MediaStoreTests: XCTestCase { XCTAssertEqual(remote.invocations, [.loadMedia(siteID: sampleSiteID, mediaID: mediaID)]) let error = try XCTUnwrap(result.failure as? DotcomError) - XCTAssertEqual(error, .unauthorized) + XCTAssertEqual(error, .unauthorized()) } // MARK: test cases for `MediaAction.retrieveMediaLibrary` @@ -310,7 +310,7 @@ final class MediaStoreTests: XCTestCase { func test_retrieveMediaLibrary_from_jcp_site_returns_error_upon_empty_response() throws { // Given let remote = MockMediaRemote() - remote.whenLoadingMediaLibrary(siteID: sampleSiteID, thenReturn: .failure(DotcomError.unauthorized)) + remote.whenLoadingMediaLibrary(siteID: sampleSiteID, thenReturn: .failure(DotcomError.unauthorized())) let mediaStore = MediaStore(dispatcher: dispatcher, storageManager: storageManager, network: network, @@ -333,7 +333,7 @@ final class MediaStoreTests: XCTestCase { XCTAssertEqual(remote.invocations, [.loadMediaLibrary(siteID: sampleSiteID)]) let error = try XCTUnwrap(result.failure as? DotcomError) - XCTAssertEqual(error, .unauthorized) + XCTAssertEqual(error, .unauthorized()) } // MARK: test cases for `MediaAction.uploadMedia` @@ -423,7 +423,7 @@ final class MediaStoreTests: XCTestCase { }() let remote = MockMediaRemote() - remote.whenUploadingMedia(siteID: sampleSiteID, thenReturn: .failure(DotcomError.unauthorized)) + remote.whenUploadingMedia(siteID: sampleSiteID, thenReturn: .failure(DotcomError.unauthorized())) let mediaStore = createMediaStoreAndExportableMedia(at: targetURL, fileManager: fileManager, remote: remote) @@ -543,7 +543,7 @@ final class MediaStoreTests: XCTestCase { }() let remote = MockMediaRemote() - remote.whenUploadingMedia(siteID: sampleSiteID, thenReturn: .failure(DotcomError.unauthorized)) + remote.whenUploadingMedia(siteID: sampleSiteID, thenReturn: .failure(DotcomError.unauthorized())) let mediaStore = createMediaStoreAndExportableMedia(at: targetURL, fileManager: fileManager, remote: remote) @@ -567,7 +567,7 @@ final class MediaStoreTests: XCTestCase { XCTAssertEqual(remote.invocations, [.uploadMedia(siteID: sampleSiteID)]) let error = try XCTUnwrap(result.failure as? DotcomError) - XCTAssertEqual(error, .unauthorized) + XCTAssertEqual(error, .unauthorized()) } // MARK: test cases for `MediaAction.uploadFile` @@ -666,7 +666,7 @@ final class MediaStoreTests: XCTestCase { func test_updateProductID_returns_error_upon_response_error() throws { // Given let remote = MockMediaRemote() - remote.whenUpdatingProductID(siteID: sampleSiteID, thenReturn: .failure(DotcomError.unauthorized)) + remote.whenUpdatingProductID(siteID: sampleSiteID, thenReturn: .failure(DotcomError.unauthorized())) let mediaStore = MediaStore(dispatcher: dispatcher, storageManager: storageManager, network: network, @@ -684,7 +684,7 @@ final class MediaStoreTests: XCTestCase { // Then let error = try XCTUnwrap(result.failure as? DotcomError) - XCTAssertEqual(error, .unauthorized) + XCTAssertEqual(error, .unauthorized()) } func test_toMedia_converts_rendered_title_to_file_name_if_media_detail_is_not_available() { diff --git a/Modules/Tests/YosemiteTests/Stores/ProductCategoryStoreTests.swift b/Modules/Tests/YosemiteTests/Stores/ProductCategoryStoreTests.swift index c909c19184b..2472d0dc313 100644 --- a/Modules/Tests/YosemiteTests/Stores/ProductCategoryStoreTests.swift +++ b/Modules/Tests/YosemiteTests/Stores/ProductCategoryStoreTests.swift @@ -349,7 +349,7 @@ final class ProductCategoryStoreTests: XCTestCase { func test_synchronizeProductCategory_fails_with_resourceDoesNotExist_then_it_provides_right_error() { let categoryID: Int64 = 123 - network.simulateError(requestUrlSuffix: "products/categories/\(categoryID)", error: DotcomError.resourceDoesNotExist) + network.simulateError(requestUrlSuffix: "products/categories/\(categoryID)", error: DotcomError.resourceDoesNotExist()) let retrievedError: Error? = waitFor { [weak self] promise in guard let self = self else { diff --git a/Modules/Tests/YosemiteTests/Stores/ProductStore+FilterProductsTests.swift b/Modules/Tests/YosemiteTests/Stores/ProductStore+FilterProductsTests.swift index 608007b038e..08117593081 100644 --- a/Modules/Tests/YosemiteTests/Stores/ProductStore+FilterProductsTests.swift +++ b/Modules/Tests/YosemiteTests/Stores/ProductStore+FilterProductsTests.swift @@ -203,7 +203,8 @@ final class ProductStore_FilterProductsTests: XCTestCase { let remote = MockProductsRemote() remote.whenLoadingAllProducts(siteID: sampleSiteID, thenReturn: .failure(DotcomError.unknown(code: "rest_invalid_param", - message: "Invalid parameter(s): type"))) + message: "Invalid parameter(s): type", + data: nil))) let productStore = ProductStore(dispatcher: dispatcher, storageManager: storageManager, network: network, @@ -238,7 +239,8 @@ final class ProductStore_FilterProductsTests: XCTestCase { let remote = MockProductsRemote() remote.whenLoadingAllProducts(siteID: sampleSiteID, thenReturn: .failure(DotcomError.unknown(code: "rest_invalid_param", - message: "Invalid parameter(s): type"))) + message: "Invalid parameter(s): type", + data: nil))) let productStore = ProductStore(dispatcher: dispatcher, storageManager: storageManager, network: network, @@ -265,7 +267,8 @@ final class ProductStore_FilterProductsTests: XCTestCase { XCTAssertTrue(result.isFailure) let error = try XCTUnwrap(result.failure) XCTAssertEqual(error as? DotcomError, .unknown(code: "rest_invalid_param", - message: "Invalid parameter(s): type")) + message: "Invalid parameter(s): type", + data: nil)) } } diff --git a/Modules/Tests/YosemiteTests/Stores/ProductStoreTests.swift b/Modules/Tests/YosemiteTests/Stores/ProductStoreTests.swift index 0e055fecf26..a953cc7824f 100644 --- a/Modules/Tests/YosemiteTests/Stores/ProductStoreTests.swift +++ b/Modules/Tests/YosemiteTests/Stores/ProductStoreTests.swift @@ -134,7 +134,7 @@ final class ProductStoreTests: XCTestCase { func test_addProduct_returns_error_upon_network_error() { // Arrange let remote = MockProductsRemote() - remote.whenAddingProduct(siteID: sampleSiteID, thenReturn: .failure(DotcomError.requestFailed)) + remote.whenAddingProduct(siteID: sampleSiteID, thenReturn: .failure(DotcomError.requestFailed())) let productStore = ProductStore(dispatcher: dispatcher, storageManager: storageManager, network: network, remote: remote) // Action @@ -236,7 +236,7 @@ final class ProductStoreTests: XCTestCase { func test_deleteProduct_returns_error_upon_network_error() { // Arrange let remote = MockProductsRemote() - remote.whenDeletingProduct(siteID: sampleSiteID, thenReturn: .failure(DotcomError.requestFailed)) + remote.whenDeletingProduct(siteID: sampleSiteID, thenReturn: .failure(DotcomError.requestFailed())) let productStore = ProductStore(dispatcher: dispatcher, storageManager: storageManager, network: network, remote: remote) // Action @@ -763,7 +763,7 @@ final class ProductStoreTests: XCTestCase { productStore.upsertStoredProduct(readOnlyProduct: sampleProduct(), in: viewStorage) XCTAssertEqual(viewStorage.countObjects(ofType: Storage.Product.self), 1) - let dotComError = DotcomError.unknown(code: ProductLoadError.ErrorCode.invalidID.rawValue, message: nil) + let dotComError = DotcomError.unknown(code: ProductLoadError.ErrorCode.invalidID.rawValue, message: nil, data: nil) // Action network.simulateError(requestUrlSuffix: "products/282", error: dotComError) diff --git a/Modules/Tests/YosemiteTests/Stores/SiteStoreTests.swift b/Modules/Tests/YosemiteTests/Stores/SiteStoreTests.swift index cdf0aecdf6d..7a06a9e86d3 100644 --- a/Modules/Tests/YosemiteTests/Stores/SiteStoreTests.swift +++ b/Modules/Tests/YosemiteTests/Stores/SiteStoreTests.swift @@ -126,7 +126,7 @@ final class SiteStoreTests: XCTestCase { func test_createSite_returns_domainExists_error_on_Dotcom_blog_name_exists_error() throws { // Given remote.whenCreatingSite(thenReturn: .failure( - DotcomError.unknown(code: "blog_name_exists", message: "Sorry, that site already exists!") + DotcomError.unknown(code: "blog_name_exists", message: "Sorry, that site already exists!", data: nil) )) // When @@ -147,7 +147,8 @@ final class SiteStoreTests: XCTestCase { // Given remote.whenCreatingSite(thenReturn: .failure( DotcomError.unknown(code: "blog_name_only_lowercase_letters_and_numbers", - message: "Site names can only contain lowercase letters (a-z) and numbers.") + message: "Site names can only contain lowercase letters (a-z) and numbers.", + data: nil) )) // When @@ -232,7 +233,7 @@ final class SiteStoreTests: XCTestCase { func test_enableFreeTrial_returns_error_on_failure() throws { // Given - remote.whenEnablingFreeTrial(thenReturn: .failure(DotcomError.unknown(code: "error", message: nil))) + remote.whenEnablingFreeTrial(thenReturn: .failure(DotcomError.unknown(code: "error", message: nil, data: nil))) // When let result = waitFor { promise in @@ -243,7 +244,7 @@ final class SiteStoreTests: XCTestCase { // Then let error = try XCTUnwrap(result.failure) - XCTAssertEqual(error as? DotcomError, .unknown(code: "error", message: nil)) + XCTAssertEqual(error as? DotcomError, .unknown(code: "error", message: nil, data: nil)) } // MARK: - `updateSiteTitle` @@ -270,7 +271,7 @@ final class SiteStoreTests: XCTestCase { func test_updateSiteTitle_returns_error_on_failure() throws { // Given let siteID: Int64 = 123 - remote.whenUpdatingSiteTitle(thenReturn: .failure(DotcomError.unknown(code: "error", message: nil))) + remote.whenUpdatingSiteTitle(thenReturn: .failure(DotcomError.unknown(code: "error", message: nil, data: nil))) // When let result = waitFor { promise in @@ -282,7 +283,7 @@ final class SiteStoreTests: XCTestCase { // Then XCTAssertFalse(result.isSuccess) let error = try XCTUnwrap(result.failure) - XCTAssertEqual(error as? DotcomError, .unknown(code: "error", message: nil)) + XCTAssertEqual(error as? DotcomError, .unknown(code: "error", message: nil, data: nil)) } // MARK: - `uploadStoreProfilerAnswers` @@ -307,7 +308,7 @@ final class SiteStoreTests: XCTestCase { func test_uploadStoreProfilerAnswers_returns_error_on_failure() throws { // Given - remote.whenUploadingStoreProfilerAnswers(thenReturn: .failure(DotcomError.unknown(code: "error", message: nil))) + remote.whenUploadingStoreProfilerAnswers(thenReturn: .failure(DotcomError.unknown(code: "error", message: nil, data: nil))) // When let result = waitFor { promise in @@ -321,7 +322,7 @@ final class SiteStoreTests: XCTestCase { // Then let error = try XCTUnwrap(result.failure) - XCTAssertEqual(error as? DotcomError, .unknown(code: "error", message: nil)) + XCTAssertEqual(error as? DotcomError, .unknown(code: "error", message: nil, data: nil)) } // MARK: - `syncSiteByDomain` @@ -350,7 +351,7 @@ final class SiteStoreTests: XCTestCase { // Given let siteID: Int64 = 123 let domain = "example.com" - remote.whenLoadingSite(thenReturn: .failure(DotcomError.unknown(code: "error", message: nil))) + remote.whenLoadingSite(thenReturn: .failure(DotcomError.unknown(code: "error", message: nil, data: nil))) // When let result = waitFor { promise in @@ -362,7 +363,7 @@ final class SiteStoreTests: XCTestCase { // Then XCTAssertFalse(result.isSuccess) let error = try XCTUnwrap(result.failure) - XCTAssertEqual(error as? DotcomError, .unknown(code: "error", message: nil)) + XCTAssertEqual(error as? DotcomError, .unknown(code: "error", message: nil, data: nil)) } } diff --git a/Modules/Tests/YosemiteTests/Stores/SiteVisitStatsStoreErrorTests.swift b/Modules/Tests/YosemiteTests/Stores/SiteVisitStatsStoreErrorTests.swift index 077bc50a692..8978ed17425 100644 --- a/Modules/Tests/YosemiteTests/Stores/SiteVisitStatsStoreErrorTests.swift +++ b/Modules/Tests/YosemiteTests/Stores/SiteVisitStatsStoreErrorTests.swift @@ -4,19 +4,19 @@ import XCTest class SiteStatsStoreErrorTests: XCTestCase { func testNoPermissionError() { - let remoteError = DotcomError.noStatsPermission + let remoteError = DotcomError.noStatsPermission() let error = SiteStatsStoreError(error: remoteError) XCTAssertEqual(error, .noPermission) } func testStatsModuleDisabledError() { - let remoteError = DotcomError.statsModuleDisabled + let remoteError = DotcomError.statsModuleDisabled() let error = SiteStatsStoreError(error: remoteError) XCTAssertEqual(error, .statsModuleDisabled) } func testOtherDotcomError() { - let remoteError = DotcomError.unknown(code: "invalid_blog", message: "This blog does not have Jetpack connected") + let remoteError = DotcomError.unknown(code: "invalid_blog", message: "This blog does not have Jetpack connected", data: nil) let error = SiteStatsStoreError(error: remoteError) XCTAssertEqual(error, .unknown) } diff --git a/Modules/Tests/YosemiteTests/Stores/WooShippingStoreTests.swift b/Modules/Tests/YosemiteTests/Stores/WooShippingStoreTests.swift index 7505e4ac2b7..889a918dcf8 100644 --- a/Modules/Tests/YosemiteTests/Stores/WooShippingStoreTests.swift +++ b/Modules/Tests/YosemiteTests/Stores/WooShippingStoreTests.swift @@ -193,7 +193,7 @@ final class WooShippingStoreTests: XCTestCase { func test_deletePackage_returns_error_on_failure() throws { // Given let remote = MockWooShippingRemote() - let error = DotcomError.requestFailed + let error = DotcomError.requestFailed() remote.whenDeletePackage(siteID: sampleSiteID, thenReturn: .failure(error)) let store = WooShippingStore(dispatcher: dispatcher, storageManager: storageManager, network: network, remote: remote) diff --git a/Modules/Tests/YosemiteTests/Tools/CommonReaderConfigProviderTests.swift b/Modules/Tests/YosemiteTests/Tools/CommonReaderConfigProviderTests.swift index 2b744d8e40a..33f7d0c3425 100644 --- a/Modules/Tests/YosemiteTests/Tools/CommonReaderConfigProviderTests.swift +++ b/Modules/Tests/YosemiteTests/Tools/CommonReaderConfigProviderTests.swift @@ -11,7 +11,8 @@ struct CommonReaderConfigProviderTests { let mockRemote = MockCardReaderCapableRemote( resultForDefaultReaderLocation: .failure( DotcomError.unknown(code: "store_address_is_incomplete", - message: adminURL))) + message: adminURL, + data: nil))) let sut = CommonReaderConfigProvider(siteID: 123, readerConfigRemote: mockRemote) @@ -30,7 +31,8 @@ struct CommonReaderConfigProviderTests { let mockRemote = MockCardReaderCapableRemote( resultForDefaultReaderLocation: .failure( DotcomError.unknown(code: "postal_code_invalid", - message: ""))) + message: "", + data: nil))) let sut = CommonReaderConfigProvider(siteID: 123, readerConfigRemote: mockRemote) diff --git a/Modules/Tests/YosemiteTests/Tools/POS/POSOrderServiceTests.swift b/Modules/Tests/YosemiteTests/Tools/POS/POSOrderServiceTests.swift index ee3fcfbfed2..3609113143f 100644 --- a/Modules/Tests/YosemiteTests/Tools/POS/POSOrderServiceTests.swift +++ b/Modules/Tests/YosemiteTests/Tools/POS/POSOrderServiceTests.swift @@ -351,7 +351,7 @@ struct POSOrderServiceTests { @Test func syncOrder_throws_missingProducts_error_for_DotcomError_with_invalid_variation_code() async throws { // Given let cart = POSCart(items: [makePOSCartItem(productID: 100, quantity: 1)]) - let dotcomError = DotcomError.unknown(code: "order_item_product_invalid_variation_id", message: "Invalid variation") + let dotcomError = DotcomError.unknown(code: "order_item_product_invalid_variation_id", message: "Invalid variation", data: nil) mockOrdersRemote.createPOSOrderResult = .failure(dotcomError) // When/Then @@ -444,7 +444,7 @@ struct POSOrderServiceTests { @Test func syncOrder_throws_missingProducts_error_for_AFError_wrapping_DotcomError() async throws { // Given let cart = POSCart(items: [makePOSCartItem(productID: 100, quantity: 1)]) - let dotcomError = DotcomError.unknown(code: "order_item_product_invalid_variation_id", message: "Invalid") + let dotcomError = DotcomError.unknown(code: "order_item_product_invalid_variation_id", message: "Invalid", data: nil) let afError = AFError.sessionTaskFailed(error: dotcomError) mockOrdersRemote.createPOSOrderResult = .failure(afError) @@ -463,7 +463,7 @@ struct POSOrderServiceTests { @Test func syncOrder_throws_original_error_for_unrecognized_DotcomError_code() async throws { // Given let cart = POSCart(items: [makePOSCartItem(productID: 100, quantity: 1)]) - let dotcomError = DotcomError.unknown(code: "some_other_error_code", message: "Different error") + let dotcomError = DotcomError.unknown(code: "some_other_error_code", message: "Different error", data: nil) mockOrdersRemote.createPOSOrderResult = .failure(dotcomError) // When/Then diff --git a/Modules/Tests/YosemiteTests/Tools/Payments/WooPaymentsPayoutServiceTests.swift b/Modules/Tests/YosemiteTests/Tools/Payments/WooPaymentsPayoutServiceTests.swift index ecbb0bba636..94411ffd46d 100644 --- a/Modules/Tests/YosemiteTests/Tools/Payments/WooPaymentsPayoutServiceTests.swift +++ b/Modules/Tests/YosemiteTests/Tools/Payments/WooPaymentsPayoutServiceTests.swift @@ -99,7 +99,7 @@ final class WooPaymentsPayoutServiceTests: XCTestCase { func testFetchPayoutsOverviewError() async { // Given - let mockError = DotcomError.noRestRoute + let mockError = DotcomError.noRestRoute() mockNetwork.simulateError(requestUrlSuffix: "payments/deposits/overview-all", error: mockError) do { diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index d16447dfa17..0f06ae3ed85 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -3,6 +3,7 @@ 23.9 ----- +- [*] Show specific error when a variation is missing at POS checkout via WPCom login [https://github.com/woocommerce/woocommerce-ios/pull/16430] - [Internal] Moved the request for push notification authorization after login [https://github.com/woocommerce/woocommerce-ios/pull/16428] - [*] Fixed possible sync issue in POS (https://github.com/woocommerce/woocommerce-ios/pull/16423) diff --git a/WooCommerce/Classes/ViewRelated/Orders/Order Creation/EditableOrderViewModel.swift b/WooCommerce/Classes/ViewRelated/Orders/Order Creation/EditableOrderViewModel.swift index eaed4782e45..cbc94496454 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/Order Creation/EditableOrderViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/Order Creation/EditableOrderViewModel.swift @@ -2519,7 +2519,7 @@ extension EditableOrderViewModel { /// private static func isEmailError(_ error: Error, order: Order) -> Bool { switch error as? DotcomError { - case .unknown(code: "rest_invalid_param", let message?): + case .unknown(code: "rest_invalid_param", let message?, _): return message.contains("billing") && order.billingAddress?.hasEmailAddress == false default: return false @@ -2527,7 +2527,7 @@ extension EditableOrderViewModel { } private static func isCouponsError(_ error: Error) -> Bool { - if case .unknown(code: "woocommerce_rest_invalid_coupon", _) = error as? DotcomError { + if case .unknown(code: "woocommerce_rest_invalid_coupon", _, _) = error as? DotcomError { return true } diff --git a/WooCommerce/Classes/ViewRelated/Orders/Order Details/Shipping Labels/WooShipping Create Shipping Labels/WooShippingCreateLabelsViewModel.swift b/WooCommerce/Classes/ViewRelated/Orders/Order Details/Shipping Labels/WooShipping Create Shipping Labels/WooShippingCreateLabelsViewModel.swift index b4ddef0f290..70046fb3e7e 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/Order Details/Shipping Labels/WooShipping Create Shipping Labels/WooShippingCreateLabelsViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/Order Details/Shipping Labels/WooShipping Create Shipping Labels/WooShippingCreateLabelsViewModel.swift @@ -377,7 +377,7 @@ final class WooShippingCreateLabelsViewModel: ObservableObject { } let markOrderComplete = isOrderCompleted ? nil : self.markOrderComplete try await currentShipmentDetailsViewModel.purchaseLabel(markOrderComplete: markOrderComplete) - } catch let DotcomError.unknown(code, _) where code == Constants.missingUPSDAPTermsOfServiceAcceptance { + } catch let DotcomError.unknown(code, _, _) where code == Constants.missingUPSDAPTermsOfServiceAcceptance { shouldShowUPSTermsAndConditions = true } catch { labelPurchaseErrorNotice = Notice(title: Localization.LabelPurchaseError.title, diff --git a/WooCommerce/Classes/ViewRelated/Products/Edit Product/Downloadable Files/File List/ProductDownloadListViewController.swift b/WooCommerce/Classes/ViewRelated/Products/Edit Product/Downloadable Files/File List/ProductDownloadListViewController.swift index 62162e4e304..fe4fa41c668 100644 --- a/WooCommerce/Classes/ViewRelated/Products/Edit Product/Downloadable Files/File List/ProductDownloadListViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Products/Edit Product/Downloadable Files/File List/ProductDownloadListViewController.swift @@ -348,7 +348,7 @@ private extension ProductDownloadListViewController { func showMediaUploadAlert(error: Error) { let errorMessage: String = { switch error { - case DotcomError.unknown(let code, _) where code == Constants.unsupportedMimeTypeCode: + case DotcomError.unknown(let code, _, _) where code == Constants.unsupportedMimeTypeCode: Localization.unsupportedFileType case MediaAssetExporter.AssetExportError.unsupportedPHAssetMediaType: Localization.unsupportedFileType diff --git a/WooCommerce/Classes/ViewRelated/Top Banner/ErrorTopBannerFactory.swift b/WooCommerce/Classes/ViewRelated/Top Banner/ErrorTopBannerFactory.swift index fa38c0de9a2..edd8cb62f3a 100644 --- a/WooCommerce/Classes/ViewRelated/Top Banner/ErrorTopBannerFactory.swift +++ b/WooCommerce/Classes/ViewRelated/Top Banner/ErrorTopBannerFactory.swift @@ -90,7 +90,7 @@ extension ErrorTopBannerFactory { if error is DecodingError { self = .decodingError - } else if error as? DotcomError == .jetpackNotConnected { + } else if case .jetpackNotConnected = error as? DotcomError { self = .jetpackConnectionError } else { self = .generalError diff --git a/WooCommerce/Classes/Yosemite/DefaultStoresManager.swift b/WooCommerce/Classes/Yosemite/DefaultStoresManager.swift index 78360ab2ff5..3de98c444c7 100644 --- a/WooCommerce/Classes/Yosemite/DefaultStoresManager.swift +++ b/WooCommerce/Classes/Yosemite/DefaultStoresManager.swift @@ -621,7 +621,7 @@ private extension DefaultStoresManager { func synchronizeAddOnsGroups(siteID: Int64) { let action = AddOnGroupAction.synchronizeAddOnGroups(siteID: siteID) { result in if let error = result.failure { - if error as? DotcomError == .noRestRoute { + if case .noRestRoute = error as? DotcomError { DDLogError("⚠️ Endpoint for add-on groups is unreachable for siteID: \(siteID). WC Product Add-Ons plugin may be missing.") } else { DDLogError("⛔️ Failed to sync add-on groups for siteID: \(siteID). Error: \(error)") diff --git a/WooCommerce/WooCommerceTests/ViewModels/Feature Announcement Cards/JustInTimeMessageViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewModels/Feature Announcement Cards/JustInTimeMessageViewModelTests.swift index 23fc0cbf809..a779b301650 100644 --- a/WooCommerce/WooCommerceTests/ViewModels/Feature Announcement Cards/JustInTimeMessageViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/ViewModels/Feature Announcement Cards/JustInTimeMessageViewModelTests.swift @@ -142,7 +142,7 @@ final class JustInTimeMessageViewModelTests: XCTestCase { // Given let message = Yosemite.JustInTimeMessage.fake().copy(messageID: "test-message-id", featureClass: "test-feature-class") setUp(with: message) - let expectedError = DotcomError.resourceDoesNotExist as NSError + let expectedError = DotcomError.resourceDoesNotExist() as NSError stores.whenReceivingAction(ofType: JustInTimeMessageAction.self) { action in switch action { diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Analytics Hub/AnalyticsHubViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Analytics Hub/AnalyticsHubViewModelTests.swift index 862c23cf9de..d045a84db59 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Analytics Hub/AnalyticsHubViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Analytics Hub/AnalyticsHubViewModelTests.swift @@ -325,7 +325,7 @@ final class AnalyticsHubViewModelTests: XCTestCase { completion(.success(.fake())) case let .retrieveSiteSummaryStats(_, _, _, _, _, _, completion): XCTFail("Request to retrieve site summary stats should not be dispatched when sessions card is hidden") - completion(.failure(DotcomError.unknown(code: "unknown_blog", message: "Unknown blog"))) + completion(.failure(DotcomError.unknown(code: "unknown_blog", message: "Unknown blog", data: nil))) default: break } @@ -356,7 +356,7 @@ final class AnalyticsHubViewModelTests: XCTestCase { completion(.success(.fake())) case let .retrieveTopEarnerStats(_, _, _, _, _, _, _, _, completion): XCTFail("Request to retrieve site summary stats should not be dispatched for sites without Jetpack") - completion(.failure(DotcomError.unknown(code: "unknown_blog", message: "Unknown blog"))) + completion(.failure(DotcomError.unknown(code: "unknown_blog", message: "Unknown blog", data: nil))) case let .retrieveSiteSummaryStats(_, _, _, _, _, _, completion): completion(.success(.fake())) default: diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Coupons/MostActiveCouponsCardViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Coupons/MostActiveCouponsCardViewModelTests.swift index 5e5aa62b180..49977c6c634 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Coupons/MostActiveCouponsCardViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Coupons/MostActiveCouponsCardViewModelTests.swift @@ -126,7 +126,7 @@ final class MostActiveCouponsCardViewModelTests: XCTestCase { func test_analyticsEnabled_is_updated_correctly_when_loading_most_active_coupons_fails_with_noRestRoute() async { // Given let viewModel = MostActiveCouponsCardViewModel(siteID: sampleSiteID, stores: stores) - let error = DotcomError.noRestRoute + let error = DotcomError.noRestRoute() XCTAssertTrue(viewModel.analyticsEnabled) // Initial value // When diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/DashboardViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/DashboardViewModelTests.swift index a17ee44143c..dd519217293 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/DashboardViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/DashboardViewModelTests.swift @@ -137,7 +137,7 @@ final class DashboardViewModelTests: XCTestCase { @MainActor func test_fetch_failure_analytics_logged_when_just_in_time_message_errors() async { // Given - let error = DotcomError.noRestRoute + let error = DotcomError.noRestRoute() mockReloadingData(jitmResult: .failure(error)) let viewModel = DashboardViewModel(siteID: 0, stores: stores, diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/ProductStockDashboardCardViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/ProductStockDashboardCardViewModelTests.swift index ca8637435ee..1ad4e59c650 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/ProductStockDashboardCardViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/ProductStockDashboardCardViewModelTests.swift @@ -151,7 +151,7 @@ final class ProductStockDashboardCardViewModelTests: XCTestCase { stores.whenReceivingAction(ofType: ProductAction.self) { action in switch action { case let .fetchStockReport(_, _, _, _, _, completion): - completion(.failure(DotcomError.noRestRoute)) + completion(.failure(DotcomError.noRestRoute())) default: break } diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsCashOnDeliveryToggleRowViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsCashOnDeliveryToggleRowViewModelTests.swift index 49b950d9f84..d986e6f15e9 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsCashOnDeliveryToggleRowViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsCashOnDeliveryToggleRowViewModelTests.swift @@ -102,7 +102,7 @@ final class InPersonPaymentsCashOnDeliveryToggleRowViewModelTests: XCTestCase { stores.whenReceivingAction(ofType: PaymentGatewayAction.self) { action in switch action { case let .updatePaymentGateway(_, onCompletion): - onCompletion(.failure(DotcomError.noRestRoute)) + onCompletion(.failure(DotcomError.noRestRoute())) default: break } @@ -148,7 +148,7 @@ final class InPersonPaymentsCashOnDeliveryToggleRowViewModelTests: XCTestCase { stores.whenReceivingAction(ofType: PaymentGatewayAction.self) { action in switch action { case let .updatePaymentGateway(_, onCompletion): - onCompletion(.failure(DotcomError.noRestRoute)) + onCompletion(.failure(DotcomError.noRestRoute())) default: break } diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/Onboarding Errors/InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/Onboarding Errors/InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModelTests.swift index 3443cf5a645..679b19c960c 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/Onboarding Errors/InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/Onboarding Errors/InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModelTests.swift @@ -113,7 +113,7 @@ final class InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModelTests: stores.whenReceivingAction(ofType: PaymentGatewayAction.self) { action in switch action { case let .updatePaymentGateway(_, onCompletion): - onCompletion(.failure(DotcomError.noRestRoute)) + onCompletion(.failure(DotcomError.noRestRoute())) default: break } @@ -198,7 +198,7 @@ final class InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModelTests: stores.whenReceivingAction(ofType: PaymentGatewayAction.self) { action in switch action { case let .updatePaymentGateway(_, onCompletion): - onCompletion(.failure(DotcomError.noRestRoute)) + onCompletion(.failure(DotcomError.noRestRoute())) default: break } diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/StoreStats/StorePerformanceViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/StoreStats/StorePerformanceViewModelTests.swift index 17f8a631117..04415a127e6 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/StoreStats/StorePerformanceViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/StoreStats/StorePerformanceViewModelTests.swift @@ -169,7 +169,7 @@ final class StorePerformanceViewModelTests: XCTestCase { // Given let stores = MockStoresManager(sessionManager: .makeForTesting()) let viewModel = StorePerformanceViewModel(siteID: 123, stores: stores, usageTracksEventEmitter: .init()) - mockSyncAllStats(with: stores, retrieveStatsError: DotcomError.noRestRoute) + mockSyncAllStats(with: stores, retrieveStatsError: DotcomError.noRestRoute()) XCTAssertTrue(viewModel.analyticsEnabled) // Initial value // When diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/TopPerformers/TopPerformersDashboardViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/TopPerformers/TopPerformersDashboardViewModelTests.swift index 22d23355391..a19ccfebf65 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/TopPerformers/TopPerformersDashboardViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/TopPerformers/TopPerformersDashboardViewModelTests.swift @@ -86,7 +86,7 @@ final class TopPerformersDashboardViewModelTests: XCTestCase { func test_analyticsEnabled_is_updated_correctly_when_sync_stats_failed_with_noRestRoute_error() async { // Given let stores = MockStoresManager(sessionManager: .makeForTesting()) - mockTopPerformersStats(with: stores, error: DotcomError.noRestRoute) + mockTopPerformersStats(with: stores, error: DotcomError.noRestRoute()) // When let viewModel = TopPerformersDashboardViewModel(siteID: 123, stores: stores, usageTracksEventEmitter: .init()) diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Orders/Order Creation/EditableOrderViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Orders/Order Creation/EditableOrderViewModelTests.swift index 0eaaa4a16e8..2ffa45a262f 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Orders/Order Creation/EditableOrderViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Orders/Order Creation/EditableOrderViewModelTests.swift @@ -215,7 +215,7 @@ final class EditableOrderViewModelTests: XCTestCase { self.stores.whenReceivingAction(ofType: OrderAction.self) { action in switch action { case let .createOrder(_, _, _, onCompletion): - onCompletion(.failure(DotcomError.unknown(code: "woocommerce_rest_invalid_coupon", message: ""))) + onCompletion(.failure(DotcomError.unknown(code: "woocommerce_rest_invalid_coupon", message: "", data: nil))) expectation.fulfill() default: XCTFail("Received unsupported action: \(action)") diff --git a/WooCommerce/WooCommerceTests/ViewRelated/TopBanner/ErrorTopBannerFactoryTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/TopBanner/ErrorTopBannerFactoryTests.swift index 3fccfb474b3..9f3dbb65092 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/TopBanner/ErrorTopBannerFactoryTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/TopBanner/ErrorTopBannerFactoryTests.swift @@ -62,7 +62,7 @@ class ErrorTopBannerFactoryTests: XCTestCase { func test_troubleshootUrl_for_jetpack_connection_error_returns_expected_Url() { // Given - let troubleshootUrl = ErrorTopBannerFactory.troubleshootUrl(for: DotcomError.jetpackNotConnected) + let troubleshootUrl = ErrorTopBannerFactory.troubleshootUrl(for: DotcomError.jetpackNotConnected()) // Then XCTAssertEqual(troubleshootUrl, WooConstants.URLs.troubleshootJetpackConnection.asURL())