Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

new: allow for custom error codes from Parse Cloud #165

Merged
merged 11 commits into from
Jun 17, 2021
10 changes: 9 additions & 1 deletion ParseSwift.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,9 @@
91678710259BC5D600BB5B4E /* ParseCloudTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 916786EF259BC59600BB5B4E /* ParseCloudTests.swift */; };
9167871A259BC5D600BB5B4E /* ParseCloudTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 916786EF259BC59600BB5B4E /* ParseCloudTests.swift */; };
9194657824F16E330070296B /* ParseACLTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9194657724F16E330070296B /* ParseACLTests.swift */; };
91B40651267A66ED00B129CD /* ParseErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B40650267A66ED00B129CD /* ParseErrorTests.swift */; };
91B40652267A66ED00B129CD /* ParseErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B40650267A66ED00B129CD /* ParseErrorTests.swift */; };
91B40653267A66ED00B129CD /* ParseErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B40650267A66ED00B129CD /* ParseErrorTests.swift */; };
91CB9537265966DF0043E5D6 /* ParseAnanlyticsCombineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91CB9536265966DF0043E5D6 /* ParseAnanlyticsCombineTests.swift */; };
91CB9538265966DF0043E5D6 /* ParseAnanlyticsCombineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91CB9536265966DF0043E5D6 /* ParseAnanlyticsCombineTests.swift */; };
91CB9539265966DF0043E5D6 /* ParseAnanlyticsCombineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91CB9536265966DF0043E5D6 /* ParseAnanlyticsCombineTests.swift */; };
Expand Down Expand Up @@ -705,6 +708,7 @@
916786E1259B7DDA00BB5B4E /* ParseCloud.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParseCloud.swift; sourceTree = "<group>"; };
916786EF259BC59600BB5B4E /* ParseCloudTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParseCloudTests.swift; sourceTree = "<group>"; };
9194657724F16E330070296B /* ParseACLTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParseACLTests.swift; sourceTree = "<group>"; };
91B40650267A66ED00B129CD /* ParseErrorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParseErrorTests.swift; sourceTree = "<group>"; };
91CB9536265966DF0043E5D6 /* ParseAnanlyticsCombineTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParseAnanlyticsCombineTests.swift; sourceTree = "<group>"; };
F971F4F524DE381A006CB79B /* ParseEncoderExtraTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParseEncoderExtraTests.swift; sourceTree = "<group>"; };
F97B45B424D9C6F200F4A88B /* ParseCoding.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParseCoding.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -860,9 +864,9 @@
70DFEA892618E77800F8EB4B /* InitializeSDKTests.swift */,
4AA8076E1F794C1C008CD551 /* KeychainStoreTests.swift */,
9194657724F16E330070296B /* ParseACLTests.swift */,
7044C22C25C5E4E90011F6E7 /* ParseAnonymousCombineTests.swift */,
70170A4D2656EBA50070C905 /* ParseAnalyticsTests.swift */,
91CB9536265966DF0043E5D6 /* ParseAnanlyticsCombineTests.swift */,
7044C22C25C5E4E90011F6E7 /* ParseAnonymousCombineTests.swift */,
70A2D86A25B3ADB6001BEB7D /* ParseAnonymousTests.swift */,
7044C24225C5EA360011F6E7 /* ParseAppleCombineTests.swift */,
70C5502125B3D8F700B5DBC2 /* ParseAppleTests.swift */,
Expand All @@ -871,6 +875,7 @@
916786EF259BC59600BB5B4E /* ParseCloudTests.swift */,
7044C21F25C5E0160011F6E7 /* ParseConfigCombineTests.swift */,
70D1BE0625BB2BF400A42E7C /* ParseConfigTests.swift */,
91B40650267A66ED00B129CD /* ParseErrorTests.swift */,
89899DB426045DC4002E2043 /* ParseFacebookCombineTests.swift */,
89899CF32603CE9D002E2043 /* ParseFacebookTests.swift */,
7044C1F825C5CFAB0011F6E7 /* ParseFileCombineTests.swift */,
Expand Down Expand Up @@ -1749,6 +1754,7 @@
70C5504625B40D5200B5DBC2 /* ParseSessionTests.swift in Sources */,
70110D5C2506ED0E0091CC1D /* ParseInstallationTests.swift in Sources */,
7016ED4025C4A25A00038648 /* ParseUserCombineTests.swift in Sources */,
91B40651267A66ED00B129CD /* ParseErrorTests.swift in Sources */,
705727B12593FF8800F0ADD5 /* ParseFileTests.swift in Sources */,
70BC0B33251903D1001556DB /* ParseGeoPointTests.swift in Sources */,
7003957625A0EE770052CB31 /* BatchUtilsTests.swift in Sources */,
Expand Down Expand Up @@ -1911,6 +1917,7 @@
70C5504825B40D5200B5DBC2 /* ParseSessionTests.swift in Sources */,
709B98572556ECAA00507778 /* ParseACLTests.swift in Sources */,
7016ED4225C4A25A00038648 /* ParseUserCombineTests.swift in Sources */,
91B40653267A66ED00B129CD /* ParseErrorTests.swift in Sources */,
705727BC2593FF8C00F0ADD5 /* ParseFileTests.swift in Sources */,
709B984F2556ECAA00507778 /* AnyCodableTests.swift in Sources */,
7003957825A0EE770052CB31 /* BatchUtilsTests.swift in Sources */,
Expand Down Expand Up @@ -1972,6 +1979,7 @@
70C5504725B40D5200B5DBC2 /* ParseSessionTests.swift in Sources */,
70F2E2BC254F283000B2EA5C /* ParseObjectTests.swift in Sources */,
7016ED4125C4A25A00038648 /* ParseUserCombineTests.swift in Sources */,
91B40652267A66ED00B129CD /* ParseErrorTests.swift in Sources */,
705727BB2593FF8B00F0ADD5 /* ParseFileTests.swift in Sources */,
70F2E2BD254F283000B2EA5C /* AnyDecodableTests.swift in Sources */,
7003957725A0EE770052CB31 /* BatchUtilsTests.swift in Sources */,
Expand Down
28 changes: 26 additions & 2 deletions Sources/ParseSwift/Types/ParseError.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,25 @@ import Foundation
An object with a Parse code and message.
*/
public struct ParseError: ParseType, Decodable, Swift.Error {
/// The value representing the error from the Parse Server.
public let code: Code
/// The text representing the error from the Parse Server.
public let message: String
/// An error value representing a custom error from the Parse Server.
public let otherCode: Int?
init(code: Code, message: String) {
self.code = code
self.message = message
self.otherCode = code.rawValue
}

/// A textual representation of this error.
public var localizedDescription: String {
return "ParseError code=\(code.rawValue) error=\(message)"
if let otherCode = otherCode {
return "ParseError code=\(code.rawValue) error=\(message) otherCode=\(otherCode)"
} else {
return "ParseError code=\(code.rawValue) error=\(message)"
}
}

enum CodingKeys: String, CodingKey {
Expand Down Expand Up @@ -347,14 +360,25 @@ public struct ParseError: ParseType, Decodable, Swift.Error {
a non-2XX status code.
*/
case xDomainRequest = 602

/**
Error code indicating any other custom error sent from the Parse Server.
*/
case other
}
}

extension ParseError {

public init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
code = try values.decode(Code.self, forKey: .code)
do {
code = try values.decode(Code.self, forKey: .code)
otherCode = nil
} catch {
code = .other
otherCode = try values.decode(Int.self, forKey: .code)
}
message = try values.decode(String.self, forKey: .message)
}

Expand Down
2 changes: 1 addition & 1 deletion Tests/ParseSwiftTests/APICommandTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ class APICommandTests: XCTestCase {
let errorKey = "error"
let errorValue = "yarr"
let codeKey = "code"
let codeValue = 100500
let codeValue = 100
let responseDictionary: [String: Any] = [
errorKey: errorValue,
codeKey: codeValue
Expand Down
25 changes: 25 additions & 0 deletions Tests/ParseSwiftTests/ParseCloudTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,31 @@ class ParseCloudTests: XCTestCase { // swiftlint:disable:this type_body_length
}
}

func testCustomError() {

guard let encoded: Data = "{\"error\":\"Error: Custom Error\",\"code\":2000}".data(using: .utf8) else {
XCTFail("Could not unwrap encoded data")
return
}

MockURLProtocol.mockRequests { _ in
return MockURLResponse(data: encoded, statusCode: 200, delay: 0.0)
}
do {
let cloud = Cloud(functionJobName: "test")
_ = try cloud.runFunction()
XCTFail("Should have thrown ParseError")
} catch {
if let error = error as? ParseError {
XCTAssertEqual(error.code, .other)
XCTAssertEqual(error.message, "Error: Custom Error")
XCTAssertEqual(error.otherCode, 2000)
} else {
XCTFail("Should have thrown ParseError")
}
}
}

func jobAsync(serverResponse: [String: String], callbackQueue: DispatchQueue) {

let expectation1 = XCTestExpectation(description: "Logout user1")
Expand Down
64 changes: 64 additions & 0 deletions Tests/ParseSwiftTests/ParseErrorTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
//
// ParseErrorTests.swift
// ParseSwift
//
// Created by Corey Baker on 6/16/21.
// Copyright © 2021 Parse Community. All rights reserved.
//

import Foundation
import XCTest
@testable import ParseSwift

class ParseErrorTests: XCTestCase {

override func setUpWithError() throws {
try super.setUpWithError()
guard let url = URL(string: "http://localhost:1337/1") else {
XCTFail("Should create valid URL")
return
}
ParseSwift.initialize(applicationId: "applicationId",
clientKey: "clientKey",
masterKey: "masterKey",
serverURL: url,
testing: true)
}

override func tearDownWithError() throws {
try super.tearDownWithError()
MockURLProtocol.removeAll()
#if !os(Linux) && !os(Android)
try KeychainStore.shared.deleteAll()
#endif
try ParseStorage.shared.deleteAll()
}

func testEncode() throws {
let code = -1
let message = "testing ParseError"
guard let encoded: Data = "{\"error\":\"\(message)\",\"code\":\(code)}".data(using: .utf8) else {
XCTFail("Should have unwrapped")
return
}
let decoded = try ParseCoding.jsonDecoder().decode(ParseError.self, from: encoded)
XCTAssertEqual(decoded.code.rawValue, code)
XCTAssertEqual(decoded.message, message)
XCTAssertEqual(decoded.localizedDescription, "ParseError code=\(code) error=\(message)")
}

func testEncodeOther() throws {
let code = 2000
let message = "testing ParseError"
guard let encoded: Data = "{\"error\":\"\(message)\",\"code\":\(code)}".data(using: .utf8) else {
XCTFail("Should have unwrapped")
return
}
let decoded = try ParseCoding.jsonDecoder().decode(ParseError.self, from: encoded)
XCTAssertEqual(decoded.code, .other)
XCTAssertEqual(decoded.message, message)
XCTAssertEqual(decoded.localizedDescription,
"ParseError code=\(ParseError.Code.other.rawValue) error=\(message) otherCode=\(code)")
XCTAssertEqual(decoded.otherCode, code)
}
}