diff --git a/Bucketeer/Sources/Internal/Model/ReasonType.swift b/Bucketeer/Sources/Internal/Model/ReasonType.swift index de271026..6bd290aa 100644 --- a/Bucketeer/Sources/Internal/Model/ReasonType.swift +++ b/Bucketeer/Sources/Internal/Model/ReasonType.swift @@ -4,7 +4,17 @@ enum ReasonType: String, Codable, Hashable { case target = "TARGET" case rule = "RULE" case `default` = "DEFAULT" + + @available(*, deprecated, message: "ReasonType `client` has been deprecated") case client = "CLIENT" + case offVariation = "OFF_VARIATION" case prerequisite = "PREREQUISITE" + + case errorNoEvaluations = "ERROR_NO_EVALUATIONS" + case errorFlagNotFound = "ERROR_FLAG_NOT_FOUND" + case errorWrongType = "ERROR_WRONG_TYPE" + case errorUserIdNotSpecified = "ERROR_USER_ID_NOT_SPECIFIED" + case errorFeatureFlagIdNotSpecified = "ERROR_FEATURE_FLAG_ID_NOT_SPECIFIED" + case errorException = "ERROR_EXCEPTION" } diff --git a/Bucketeer/Sources/Public/BKTEvaluationDetails.swift b/Bucketeer/Sources/Public/BKTEvaluationDetails.swift index 6d4ff14b..deb9661e 100644 --- a/Bucketeer/Sources/Public/BKTEvaluationDetails.swift +++ b/Bucketeer/Sources/Public/BKTEvaluationDetails.swift @@ -13,12 +13,21 @@ public struct BKTEvaluationDetails: Equatable { case target = "TARGET" case rule = "RULE" case `default` = "DEFAULT" + @available(*, deprecated, message: "ReasonType `client` has been deprecated") case client = "CLIENT" + case offVariation = "OFF_VARIATION" case prerequisite = "PREREQUISITE" + case errorNoEvaluations = "ERROR_NO_EVALUATIONS" + case errorFlagNotFound = "ERROR_FLAG_NOT_FOUND" + case errorWrongType = "ERROR_WRONG_TYPE" + case errorUserIdNotSpecified = "ERROR_USER_ID_NOT_SPECIFIED" + case errorFeatureFlagIdNotSpecified = "ERROR_FEATURE_FLAG_ID_NOT_SPECIFIED" + case errorException = "ERROR_EXCEPTION" + public static func fromString(value: String) -> Reason { - return Reason(rawValue: value) ?? .client + return Reason(rawValue: value) ?? .errorException } } @@ -32,7 +41,12 @@ public struct BKTEvaluationDetails: Equatable { lhs.variationValue == rhs.variationValue } - static func newDefaultInstance(featureId: String, userId: String, defaultValue: T) -> BKTEvaluationDetails { + static func newDefaultInstance( + featureId: String, + userId: String, + defaultValue: T, + reason: Reason? = nil + ) -> BKTEvaluationDetails { return BKTEvaluationDetails( featureId: featureId, featureVersion: 0, @@ -40,7 +54,7 @@ public struct BKTEvaluationDetails: Equatable { variationId: "", variationName: "", variationValue: defaultValue, - reason: .client + reason: reason ?? .client ) } diff --git a/BucketeerTests/ApiResponseTests.swift b/BucketeerTests/ApiResponseTests.swift new file mode 100644 index 00000000..fca8bcf3 --- /dev/null +++ b/BucketeerTests/ApiResponseTests.swift @@ -0,0 +1,27 @@ +import XCTest +@testable import Bucketeer + +class ReasonTypeDecodingTests: XCTestCase { + func testDecodeValidAndInvalidReasonType() throws { + let json = """ + [ + "TARGET", + "RULE", + "OFF_VARIATION", + "PREREQUISITE", + "INVALID_VALUE", + ] + """.data(using: .utf8)! + + let decoder = JSONDecoder() + let decoded = try decoder.decode([ReasonType].self, from: json) + + XCTAssertEqual(decoded, [ + .target, + .rule, + .default, // "INVALID_VALUE" + .offVariation, + .prerequisite + ]) + } +} diff --git a/BucketeerTests/BKTEvaluationDetailTests.swift b/BucketeerTests/BKTEvaluationDetailTests.swift index ddcaa400..7c62204c 100644 --- a/BucketeerTests/BKTEvaluationDetailTests.swift +++ b/BucketeerTests/BKTEvaluationDetailTests.swift @@ -12,14 +12,14 @@ final class BKTEvaluationDetailTests: XCTestCase { variationId: "", variationName: "", variationValue: 2, - reason: .client), BKTEvaluationDetails( + reason: .errorException), BKTEvaluationDetails( featureId: "1", featureVersion: 0, userId: "2", variationId: "", variationName: "", variationValue: 2, - reason: .client)) + reason: .errorException)) XCTAssertNotEqual(BKTEvaluationDetails( featureId: "1", featureVersion: 0, @@ -27,7 +27,7 @@ final class BKTEvaluationDetailTests: XCTestCase { variationId: "", variationName: "", variationValue: 2, - reason: .client), BKTEvaluationDetails( + reason: .errorException), BKTEvaluationDetails( featureId: "12", featureVersion: 0, userId: "2", @@ -43,14 +43,14 @@ final class BKTEvaluationDetailTests: XCTestCase { variationId: "", variationName: "", variationValue: "2", - reason: .client), BKTEvaluationDetails( + reason: .errorException), BKTEvaluationDetails( featureId: "2", featureVersion: 0, userId: "3", variationId: "", variationName: "", variationValue: "2", - reason: .client)) + reason: .errorException)) XCTAssertNotEqual(BKTEvaluationDetails( featureId: "2", featureVersion: 0, @@ -58,14 +58,14 @@ final class BKTEvaluationDetailTests: XCTestCase { variationId: "", variationName: "", variationValue: "2", - reason: .client), BKTEvaluationDetails( + reason: .errorException), BKTEvaluationDetails( featureId: "2", featureVersion: 0, userId: "3", variationId: "", variationName: "", variationValue: "22", - reason: .client)) + reason: .errorWrongType)) XCTAssertEqual(BKTEvaluationDetails( featureId: "3", @@ -74,14 +74,14 @@ final class BKTEvaluationDetailTests: XCTestCase { variationId: "", variationName: "", variationValue: 3.0, - reason: .client), BKTEvaluationDetails( + reason: .errorException), BKTEvaluationDetails( featureId: "3", featureVersion: 0, userId: "3", variationId: "", variationName: "", variationValue: 3.0, - reason: .client)) + reason: .errorException)) XCTAssertNotEqual(BKTEvaluationDetails( featureId: "3", @@ -90,14 +90,14 @@ final class BKTEvaluationDetailTests: XCTestCase { variationId: "", variationName: "", variationValue: 3.0, - reason: .client), BKTEvaluationDetails( + reason: .errorException), BKTEvaluationDetails( featureId: "3", featureVersion: 1, userId: "3", variationId: "", variationName: "", variationValue: 3.1, - reason: .client)) + reason: .errorUserIdNotSpecified)) XCTAssertEqual(BKTEvaluationDetails( featureId: "4", @@ -106,14 +106,14 @@ final class BKTEvaluationDetailTests: XCTestCase { variationId: "", variationName: "", variationValue: true, - reason: .client), BKTEvaluationDetails( + reason: .errorException), BKTEvaluationDetails( featureId: "4", featureVersion: 0, userId: "3", variationId: "", variationName: "", variationValue: true, - reason: .client)) + reason: .errorException)) XCTAssertNotEqual(BKTEvaluationDetails( featureId: "4", @@ -122,14 +122,14 @@ final class BKTEvaluationDetailTests: XCTestCase { variationId: "", variationName: "", variationValue: true, - reason: .client), BKTEvaluationDetails( + reason: .errorException), BKTEvaluationDetails( featureId: "4", featureVersion: 0, userId: "3", variationId: "", variationName: "", variationValue: false, - reason: .client)) + reason: .errorNoEvaluations)) XCTAssertEqual(BKTEvaluationDetails( featureId: "5", @@ -141,7 +141,7 @@ final class BKTEvaluationDetailTests: XCTestCase { "key1" : "value1", "key2" : "value2" ], - reason: .client), BKTEvaluationDetails( + reason: .errorException), BKTEvaluationDetails( featureId: "5", featureVersion: 0, userId: "3", @@ -151,7 +151,7 @@ final class BKTEvaluationDetailTests: XCTestCase { "key2" : "value2", "key1" : "value1" ], - reason: .client)) + reason: .errorException)) XCTAssertNotEqual(BKTEvaluationDetails( featureId: "5", @@ -163,7 +163,7 @@ final class BKTEvaluationDetailTests: XCTestCase { "key1" : "value1", "key2" : "value2" ], - reason: .client), BKTEvaluationDetails( + reason: .errorException), BKTEvaluationDetails( featureId: "5", featureVersion: 0, userId: "3", @@ -174,11 +174,11 @@ final class BKTEvaluationDetailTests: XCTestCase { "key1" : "value1", "key3" : "value3" ], - reason: .client)) + reason: .errorUserIdNotSpecified)) } func testCreateDefaultInstance() throws { - XCTAssertEqual(BKTEvaluationDetails.newDefaultInstance(featureId: "1", userId: "2", defaultValue: 2), + XCTAssertEqual(BKTEvaluationDetails.newDefaultInstance(featureId: "1", userId: "2", defaultValue: 2, reason: .default), BKTEvaluationDetails( featureId: "1", featureVersion: 0, @@ -186,9 +186,9 @@ final class BKTEvaluationDetailTests: XCTestCase { variationId: "", variationName: "", variationValue: 2, - reason: .client) + reason: .default) ) - XCTAssertEqual(BKTEvaluationDetails.newDefaultInstance(featureId: "2", userId: "3", defaultValue: "2"), + XCTAssertEqual(BKTEvaluationDetails.newDefaultInstance(featureId: "2", userId: "3", defaultValue: "2", reason: .default), BKTEvaluationDetails( featureId: "2", featureVersion: 0, @@ -196,9 +196,9 @@ final class BKTEvaluationDetailTests: XCTestCase { variationId: "", variationName: "", variationValue: "2", - reason: .client) + reason: .default) ) - XCTAssertEqual(BKTEvaluationDetails.newDefaultInstance(featureId: "1", userId: "2", defaultValue: 2.0), + XCTAssertEqual(BKTEvaluationDetails.newDefaultInstance(featureId: "1", userId: "2", defaultValue: 2.0, reason: .errorException), BKTEvaluationDetails( featureId: "1", featureVersion: 0, @@ -206,9 +206,9 @@ final class BKTEvaluationDetailTests: XCTestCase { variationId: "", variationName: "", variationValue: 2.0, - reason: .client) + reason: .errorException) ) - XCTAssertEqual(BKTEvaluationDetails.newDefaultInstance(featureId: "11", userId: "22", defaultValue: true), + XCTAssertEqual(BKTEvaluationDetails.newDefaultInstance(featureId: "11", userId: "22", defaultValue: true, reason: .errorFeatureFlagIdNotSpecified), BKTEvaluationDetails( featureId: "11", featureVersion: 0, @@ -216,9 +216,9 @@ final class BKTEvaluationDetailTests: XCTestCase { variationId: "", variationName: "", variationValue: true, - reason: .client) + reason: .errorFeatureFlagIdNotSpecified) ) - XCTAssertEqual(BKTEvaluationDetails<[String: AnyHashable]>.newDefaultInstance(featureId: "11", userId: "22", defaultValue: ["key":"value"]), + XCTAssertEqual(BKTEvaluationDetails<[String: AnyHashable]>.newDefaultInstance(featureId: "11", userId: "22", defaultValue: ["key":"value"], reason: .errorNoEvaluations), BKTEvaluationDetails( featureId: "11", featureVersion: 0, @@ -226,7 +226,7 @@ final class BKTEvaluationDetailTests: XCTestCase { variationId: "", variationName: "", variationValue: ["key":"value"], - reason: .client) + reason: .errorNoEvaluations) ) } @@ -237,10 +237,16 @@ final class BKTEvaluationDetailTests: XCTestCase { XCTAssertEqual(BKTEvaluationDetails.Reason.fromString(value: "CLIENT"), .client) XCTAssertEqual(BKTEvaluationDetails.Reason.fromString(value: "OFF_VARIATION"), .offVariation) XCTAssertEqual(BKTEvaluationDetails.Reason.fromString(value: "PREREQUISITE"), .prerequisite) + XCTAssertEqual(BKTEvaluationDetails.Reason.fromString(value: "ERROR_USER_ID_NOT_SPECIFIED"), .errorUserIdNotSpecified) + XCTAssertEqual(BKTEvaluationDetails.Reason.fromString(value: "ERROR_NO_EVALUATIONS"), .errorNoEvaluations) + XCTAssertEqual(BKTEvaluationDetails.Reason.fromString(value: "ERROR_FEATURE_FLAG_ID_NOT_SPECIFIED"), .errorFeatureFlagIdNotSpecified) + XCTAssertEqual(BKTEvaluationDetails.Reason.fromString(value: "ERROR_WRONG_TYPE"), .errorWrongType) + XCTAssertEqual(BKTEvaluationDetails.Reason.fromString(value: "ERROR_EXCEPTION"), .errorException) + XCTAssertEqual(BKTEvaluationDetails.Reason.fromString(value: "ERROR_FLAG_NOT_FOUND"), .errorFlagNotFound) } func testFromStringWithInvalidValue() { - XCTAssertEqual(BKTEvaluationDetails.Reason.fromString(value: "INVALID"), .client) + XCTAssertEqual(BKTEvaluationDetails.Reason.fromString(value: "INVALID"), .errorException) } } // swiftlint:enable function_body_length