Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 13 additions & 14 deletions DevCycle/DevCycleClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -423,13 +423,16 @@ public class DevCycleClient {
}
}

public func identifyUser(user: DevCycleUser, callback: IdentifyCompletedHandler? = nil) throws {
public func identifyUser(user: DevCycleUser, callback: IdentifyCompletedHandler? = nil) {
guard let currentUser = self.user, !currentUser.userId.isEmpty,
!user.userId.isEmpty
else {
throw ClientError.InvalidUser
callback?(ClientError.InvalidUser, nil)
return
}

self.flushEvents()

var updateUser: DevCycleUser = currentUser
if currentUser.userId == user.userId {
updateUser.update(with: user)
Expand Down Expand Up @@ -484,19 +487,15 @@ public class DevCycleClient {
@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)
public func identifyUser(user: DevCycleUser) async throws -> [String: Variable]? {
return try await withCheckedThrowingContinuation { continuation in
do {
try self.identifyUser(user: user) { error, variables in
if let error = error {
continuation.resume(throwing: error)
} else {
continuation.resume(returning: variables)
}
self.identifyUser(user: user) { error, variables in
if let error = error {
Log.error(
"Error calling identifyUser for user_id \(String(describing: user.userId))",
tags: ["identify"])
continuation.resume(throwing: error)
} else {
continuation.resume(returning: variables)
}
} catch {
Log.error(
"Error calling identifyUser for user_id \(String(describing: user.userId))",
tags: ["identify"])
continuation.resume(throwing: error)
}
}
}
Expand Down
60 changes: 60 additions & 0 deletions DevCycleTests/Models/DevCycleClientTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -768,6 +768,66 @@ class DevCycleClientTest: XCTestCase {
wait(for: [expectation], timeout: 100.0)
client.close(callback: nil)
}

func testIdentifyUserWithInvalidUserCallsCallbackWithError() {
let expectation = XCTestExpectation(
description: "identifyUser with invalid user should call callback with error")

let client = try! self.builder.user(self.user).sdkKey("my_sdk_key").build(
onInitialized: nil)
client.config?.userConfig = self.userConfig

// Test with empty user ID
let emptyUser = DevCycleUser(userId: "", isAnonymous: false)

client.identifyUser(
user: emptyUser,
callback: { error, variables in
XCTAssertNotNil(error, "identifyUser should return error for empty user ID")
XCTAssertNil(variables, "identifyUser should return nil variables for invalid user")

if let clientError = error as? ClientError {
XCTAssertEqual(
clientError, ClientError.InvalidUser, "Error should be InvalidUser")
} else {
XCTFail("Error should be of type ClientError.InvalidUser")
}

expectation.fulfill()
})

wait(for: [expectation], timeout: 1.0)
client.close(callback: nil)
}

@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)
func testAsyncIdentifyUserWithInvalidUserCallsCallbackWithError() async throws {
let expectation = XCTestExpectation(
description: "identifyUser with invalid user should call callback with error")

let client = try! self.builder.user(self.user).sdkKey("my_sdk_key").build(
onInitialized: nil)
client.config?.userConfig = self.userConfig

// Test with empty user ID
let emptyUser = DevCycleUser(userId: "", isAnonymous: false)

do {
let _ = try await client.identifyUser(user: emptyUser)
XCTFail("identifyUser should throw error for empty user ID")
} catch {
XCTAssertNotNil(error, "identifyUser should return error for empty user ID")
if let clientError = error as? ClientError {
XCTAssertEqual(
clientError, ClientError.InvalidUser, "Error should be InvalidUser")
} else {
XCTFail("Error should be of type ClientError.InvalidUser")
}

expectation.fulfill()
client.close(callback: nil)
}
}
}

extension DevCycleClientTest {
Expand Down
Loading