diff --git a/packages/core/ios/Sources/DdFlagsImplementation.swift b/packages/core/ios/Sources/DdFlagsImplementation.swift index d5f638651..26b13727f 100644 --- a/packages/core/ios/Sources/DdFlagsImplementation.swift +++ b/packages/core/ios/Sources/DdFlagsImplementation.swift @@ -58,7 +58,7 @@ public class DdFlagsImplementation: NSObject { public func setEvaluationContext(_ clientName: String, targetingKey: String, attributes: NSDictionary, resolve: @escaping ((Any?) -> Void), reject: @escaping ((String?, String?, NSError?) -> Void)) { let client = getClient(name: clientName) guard let clientInternal = client as? FlagsClientInternal else { - reject(nil, "CLIENT_NOT_INITIALIZED", nil) + reject("CLIENT_NOT_INITIALIZED", "Flags client '\(clientName)' is not properly initialized. Make sure the Datadog SDK has been initialized and Flags.enable() has been called.", nil) return } @@ -68,7 +68,7 @@ public class DdFlagsImplementation: NSObject { switch result { case .success: guard let flagsSnapshot = clientInternal.getFlagAssignments() else { - reject(nil, "CLIENT_NOT_INITIALIZED", nil) + reject("CLIENT_NOT_INITIALIZED", "Failed to retrieve feature flags for client '\(clientName)'. Make sure the client has been properly initialized.", nil) return } @@ -81,17 +81,22 @@ public class DdFlagsImplementation: NSObject { resolve(serializedFlagsSnapshot) case .failure(let error): var errorCode: String + var errorMessage: String switch (error) { case .clientNotInitialized: errorCode = "CLIENT_NOT_INITIALIZED" + errorMessage = "Failed to retrieve feature flags for client '\(clientName)'. Make sure the client has been properly initialized." case .invalidConfiguration: errorCode = "INVALID_CONFIGURATION" + errorMessage = "The flags configuration for client '\(clientName)' is invalid. Check that all required parameters are provided." case .invalidResponse: errorCode = "INVALID_RESPONSE" + errorMessage = "The flags service returned an invalid response for client '\(clientName)'." case .networkError: errorCode = "NETWORK_ERROR" + errorMessage = "A network error occurred while fetching feature flags for client '\(clientName)'." } - reject(nil, errorCode, error as NSError) + reject(errorCode, errorMessage, error as NSError) } } } @@ -99,11 +104,11 @@ public class DdFlagsImplementation: NSObject { @objc public func trackEvaluation(_ clientName: String, key: String, rawFlag: NSDictionary, targetingKey: String, attributes: NSDictionary, resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) { guard let client = getClient(name: clientName) as? FlagsClientInternal else { - reject(nil, "CLIENT_NOT_INITIALIZED", nil) + reject("CLIENT_NOT_INITIALIZED", "Flags client '\(clientName)' is not properly initialized. Make sure the Datadog SDK has been initialized and Flags.enable() has been called.", nil) return } guard let flagAssignment = rawFlag.asFlagAssignment() else { - reject(nil, "INVALID_FLAG_ASSIGNMENT", nil) + reject("INVALID_FLAG_ASSIGNMENT", "Failed to parse correct flag assignment from the provided raw flag data.", nil) return } diff --git a/packages/core/ios/Tests/DdFlagsTests.swift b/packages/core/ios/Tests/DdFlagsTests.swift index 45849c8d8..3fca72ddc 100644 --- a/packages/core/ios/Tests/DdFlagsTests.swift +++ b/packages/core/ios/Tests/DdFlagsTests.swift @@ -98,7 +98,8 @@ class DdFlagsTests: XCTestCase { XCTFail("Should not resolve") expectation.fulfill() }, reject: { code, message, error in - XCTAssertEqual(message, "CLIENT_NOT_INITIALIZED") + XCTAssertEqual(code, "CLIENT_NOT_INITIALIZED") + XCTAssertNotNil(message) expectation.fulfill() }) @@ -117,7 +118,8 @@ class DdFlagsTests: XCTestCase { XCTFail("Should not resolve") expectation.fulfill() }, reject: { code, message, error in - XCTAssertEqual(message, "NETWORK_ERROR") + XCTAssertEqual(code, "NETWORK_ERROR") + XCTAssertNotNil(message) expectation.fulfill() }) @@ -164,7 +166,8 @@ class DdFlagsTests: XCTestCase { XCTFail("Should not resolve") expectation.fulfill() }, reject: { code, message, error in - XCTAssertEqual(message, "INVALID_FLAG_ASSIGNMENT") + XCTAssertEqual(code, "INVALID_FLAG_ASSIGNMENT") + XCTAssertNotNil(message) expectation.fulfill() }) diff --git a/packages/core/src/flags/FlagsClient.ts b/packages/core/src/flags/FlagsClient.ts index 1d1f87413..62284cc40 100644 --- a/packages/core/src/flags/FlagsClient.ts +++ b/packages/core/src/flags/FlagsClient.ts @@ -69,7 +69,7 @@ export class FlagsClient { if (error instanceof Error) { InternalLog.log( `Error setting flag evaluation context: ${error.message}`, - SdkVerbosity.ERROR + SdkVerbosity.WARN ); } diff --git a/packages/core/src/flags/__tests__/FlagsClient.test.ts b/packages/core/src/flags/__tests__/FlagsClient.test.ts index f84539327..06903099c 100644 --- a/packages/core/src/flags/__tests__/FlagsClient.test.ts +++ b/packages/core/src/flags/__tests__/FlagsClient.test.ts @@ -96,7 +96,9 @@ describe('FlagsClient', () => { it('should throw an error if there is an error setting the evaluation context', async () => { NativeModules.DdFlags.setEvaluationContext.mockRejectedValueOnce( - new Error('NETWORK_ERROR') + new Error( + "A network error occurred while fetching feature flags for client 'default'." + ) ); const flagsClient = DdFlags.getClient(); @@ -106,11 +108,13 @@ describe('FlagsClient', () => { targetingKey: 'test-user-1', attributes: { country: 'US' } }) - ).rejects.toThrow('NETWORK_ERROR'); + ).rejects.toThrow( + "A network error occurred while fetching feature flags for client 'default'." + ); expect(InternalLog.log).toHaveBeenCalledWith( - 'Error setting flag evaluation context: NETWORK_ERROR', - SdkVerbosity.ERROR + "Error setting flag evaluation context: A network error occurred while fetching feature flags for client 'default'.", + SdkVerbosity.WARN ); }); });