Skip to content
This repository was archived by the owner on Sep 15, 2025. It is now read-only.

Commit fcc0ed7

Browse files
authored
Fix incorrect error message implementation in WordPressAPIError (#662)
2 parents 1c710d8 + 44c6af2 commit fcc0ed7

File tree

4 files changed

+45
-7
lines changed

4 files changed

+45
-7
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ _None._
4646

4747
### Internal Changes
4848

49-
_None._
49+
- Fix `WordPressAPIError`'s localized error message. [#662]
5050

5151
## 9.0.0
5252

WordPressKit.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@
144144
4A11239E2B1926D1004690CF /* HTTPClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A11239D2B1926D1004690CF /* HTTPClient.swift */; };
145145
4A1DEF44293051BC00322608 /* LoggingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A1DEF43293051BC00322608 /* LoggingTests.swift */; };
146146
4A1DEF46293051C600322608 /* LoggingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A1DEF45293051C600322608 /* LoggingTests.m */; };
147+
4A40F6552B2A5A1A0015DA77 /* WordPressAPIErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A40F6542B2A5A1A0015DA77 /* WordPressAPIErrorTests.swift */; };
147148
4A68E3CD29404181004AC3DC /* RemoteBlog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A68E3CC29404181004AC3DC /* RemoteBlog.swift */; };
148149
4A68E3CF29404289004AC3DC /* RemoteBlogOptionsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A68E3CE29404289004AC3DC /* RemoteBlogOptionsHelper.swift */; };
149150
4A68E3D329406AA0004AC3DC /* RemoteMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A68E3D029406AA0004AC3DC /* RemoteMenu.swift */; };
@@ -840,6 +841,7 @@
840841
4A11239D2B1926D1004690CF /* HTTPClient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTTPClient.swift; sourceTree = "<group>"; };
841842
4A1DEF43293051BC00322608 /* LoggingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggingTests.swift; sourceTree = "<group>"; };
842843
4A1DEF45293051C600322608 /* LoggingTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LoggingTests.m; sourceTree = "<group>"; };
844+
4A40F6542B2A5A1A0015DA77 /* WordPressAPIErrorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WordPressAPIErrorTests.swift; sourceTree = "<group>"; };
843845
4A68E3CC29404181004AC3DC /* RemoteBlog.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RemoteBlog.swift; sourceTree = "<group>"; };
844846
4A68E3CE29404289004AC3DC /* RemoteBlogOptionsHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RemoteBlogOptionsHelper.swift; sourceTree = "<group>"; };
845847
4A68E3D029406AA0004AC3DC /* RemoteMenu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RemoteMenu.swift; sourceTree = "<group>"; };
@@ -2638,6 +2640,7 @@
26382640
4A1DEF45293051C600322608 /* LoggingTests.m */,
26392641
4A6B4A832B26974F00802316 /* HTTPRequestBuilderTests.swift */,
26402642
4A6B4A852B269D0C00802316 /* URLSessionHelperTests.swift */,
2643+
4A40F6542B2A5A1A0015DA77 /* WordPressAPIErrorTests.swift */,
26412644
);
26422645
path = Utilities;
26432646
sourceTree = "<group>";
@@ -3502,6 +3505,7 @@
35023505
740B23D61F17F7C100067A2A /* XMLRPCTestable.swift in Sources */,
35033506
FFE247A720C891D1002DF3A2 /* WordPressComOAuthClientTests.swift in Sources */,
35043507
93AB06041EE8838400EF8764 /* RemoteTestCase.swift in Sources */,
3508+
4A40F6552B2A5A1A0015DA77 /* WordPressAPIErrorTests.swift in Sources */,
35053509
BA2A78FA24A486D300BB6F53 /* SitePluginTests.swift in Sources */,
35063510
465F88A7263B371D00F4C950 /* BlockEditorSettingsServiceRemoteTests.swift in Sources */,
35073511
93BD27411EE73311002BB00B /* AccountServiceRemoteRESTTests.swift in Sources */,

WordPressKit/WordPressAPIError.swift

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,23 +21,30 @@ public enum WordPressAPIError<EndpointError>: Error where EndpointError: Localiz
2121
case unknown(underlyingError: Error)
2222
}
2323

24-
extension WordPressComOAuthError: LocalizedError {
24+
extension WordPressAPIError: LocalizedError {
2525

2626
public var errorDescription: String? {
27+
// Considering `WordPressAPIError` is the error that's surfaced from this library to the apps, its instanes
28+
// may be displayed on UI directly. To prevent Swift's default error message (i.e. "This operation can't be
29+
// completed. <SwiftTypeName> (code=...)") from being displayed, we need to make sure this implementation
30+
// always returns a non-nil value.
31+
let localizedErrorMessage: String
2732
switch self {
2833
case .requestEncodingFailure, .unparsableResponse:
2934
// These are usually programming errors.
30-
return Self.unknownErrorMessage
35+
localizedErrorMessage = Self.unknownErrorMessage
3136
case let .endpointError(error):
32-
return error.errorDescription
37+
localizedErrorMessage = error.errorDescription ?? Self.unknownErrorMessage
3338
case let .connection(error):
34-
return error.localizedDescription
39+
localizedErrorMessage = error.localizedDescription
3540
case let .unknown(underlyingError):
3641
if let msg = (underlyingError as? LocalizedError)?.errorDescription {
37-
return msg
42+
localizedErrorMessage = msg
43+
} else {
44+
localizedErrorMessage = Self.unknownErrorMessage
3845
}
39-
return Self.unknownErrorMessage
4046
}
47+
return localizedErrorMessage
4148
}
4249

4350
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import Foundation
2+
import XCTest
3+
@testable import WordPressKit
4+
5+
class WordPressAPIErrorTests: XCTestCase {
6+
7+
func testLocalizedMessage() {
8+
struct TestError: LocalizedError {
9+
var errorDescription: String? = "this is a test error"
10+
}
11+
12+
let error = WordPressAPIError.endpointError(TestError())
13+
XCTAssertEqual(error.errorDescription, "this is a test error")
14+
XCTAssertEqual((error as NSError).localizedDescription, "this is a test error")
15+
}
16+
17+
func testNilErrorDescription() {
18+
struct TestError: LocalizedError {
19+
var errorDescription: String? = nil
20+
}
21+
22+
let error = WordPressAPIError.endpointError(TestError())
23+
XCTAssertEqual(error.localizedDescription, WordPressAPIError<TestError>.unknownErrorMessage)
24+
XCTAssertEqual((error as NSError).localizedDescription, WordPressAPIError<TestError>.unknownErrorMessage)
25+
}
26+
27+
}

0 commit comments

Comments
 (0)