Skip to content

Commit 36beb11

Browse files
fix: improve UserBuilder validation and add error for isAnonymous=false with no userId (#228)
* fix: improve UserBuilder validation and add error for isAnonymous=false with no userId * fix: remove trim whitespace * fix: add 15 min timeout to all the tests
1 parent 37cc3ea commit 36beb11

File tree

6 files changed

+46
-20
lines changed

6 files changed

+46
-20
lines changed

.github/workflows/ios.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,4 @@ jobs:
2727

2828
- name: Fastlane iOS Tests
2929
run: fastlane ios tests
30+
timeout-minutes: 15

.github/workflows/macos.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ jobs:
3030

3131
- name: Fastlane macOS Tests
3232
run: fastlane mac tests
33+
timeout-minutes: 15
3334
env:
3435
MATCH_GIT_BASIC_AUTHORIZATION: "${{ env.FASTLANE_GIT_BASIC_AUTHORIZATION }}"
3536
DEVELOPER_APP_ID: "${{ secrets.DEVELOPER_APP_ID }}"

.github/workflows/tvos.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,4 @@ jobs:
2727

2828
- name: Fastlane tvOS Tests
2929
run: fastlane tvos tests
30+
timeout-minutes: 15

.github/workflows/watchos.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,4 @@ jobs:
2727

2828
- name: Fastlane watchOS Tests
2929
run: fastlane watchos tests
30+
timeout-minutes: 15

DevCycle/DevCycleUser.swift

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,11 @@ public class UserBuilder {
3030

3131
public func userId(_ userId: String) -> UserBuilder {
3232
self.user.userId = userId
33-
self.user.isAnonymous = false
3433
return self
3534
}
3635

3736
public func isAnonymous(_ isAnonymous: Bool) -> UserBuilder {
38-
if self.user.isAnonymous != nil { return self }
3937
self.user.isAnonymous = isAnonymous
40-
if isAnonymous {
41-
self.user.userId = self.cacheService.getOrCreateAnonUserId()
42-
}
4338
return self
4439
}
4540

@@ -74,12 +69,18 @@ public class UserBuilder {
7469
}
7570

7671
public func build() throws -> DevCycleUser {
77-
guard self.user.userId?.trimmingCharacters(in: .whitespacesAndNewlines) != ""
78-
else {
79-
throw UserError.InvalidUser
72+
// Validate the userId
73+
let hasValidUserId = self.user.userId != nil && !self.user.userId!.isEmpty
74+
75+
// Handle the different cases based on isAnonymous and userId
76+
if self.user.isAnonymous == false && !hasValidUserId {
77+
throw UserError.MissingUserIdAndIsAnonymousFalse
8078
}
8179

82-
if self.user.userId == nil {
80+
if self.user.isAnonymous == true && !hasValidUserId {
81+
self.user.userId = self.cacheService.getOrCreateAnonUserId()
82+
} else if !hasValidUserId {
83+
// Default case: no userId and isAnonymous not explicitly set to false, make anonymous
8384
self.user.userId = self.cacheService.getOrCreateAnonUserId()
8485
self.user.isAnonymous = true
8586
}

DevCycleTests/Models/DevCycleUserTest.swift

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,20 +51,31 @@ class DevCycleUserTest: XCTestCase {
5151
XCTAssertTrue(user.isAnonymous!)
5252
}
5353

54-
func testBuilderReturnsAnonUserIfNoUserIdAndIsAnonymousIsFalse() {
55-
let user = try! DevCycleUser.builder()
56-
.isAnonymous(false)
57-
.build()
54+
func testBuilderReturnsAnonUserIfEmptyStringUserId() {
55+
let user = try! DevCycleUser.builder().userId("").build()
5856
XCTAssertNotNil(user)
5957
XCTAssert(UUID(uuidString: user.userId!) != nil)
6058
XCTAssertTrue(user.isAnonymous!)
6159
}
6260

61+
func testBuilderThrowsErrorIfNoUserIdAndIsAnonymousIsFalse() {
62+
XCTAssertThrowsError(
63+
try DevCycleUser.builder()
64+
.isAnonymous(false)
65+
.build()
66+
) { error in
67+
XCTAssertTrue(error is UserError)
68+
if let userError = error as? UserError {
69+
XCTAssertEqual(userError, UserError.MissingUserIdAndIsAnonymousFalse)
70+
}
71+
}
72+
}
73+
6374
func testBuilderReturnsUserIfUserIdSet() {
6475
let user = try! DevCycleUser.builder().userId("my_user").build()
6576
XCTAssertNotNil(user)
6677
XCTAssert(user.userId == "my_user")
67-
XCTAssert(!user.isAnonymous!)
78+
XCTAssertNil(user.isAnonymous)
6879
}
6980

7081
func testBuilderReturnsUserIfIsAnonymousSet() {
@@ -74,14 +85,24 @@ class DevCycleUserTest: XCTestCase {
7485
XCTAssert(UUID(uuidString: user.userId!) != nil)
7586
}
7687

77-
func testBuilderReturnsNilIfUserIdIsEmptyString() {
78-
let user = try? DevCycleUser.builder().userId("").build()
79-
XCTAssertNil(user)
88+
func testBuilderWithUserIdAndIsAnonymousTrue() {
89+
let user = try! DevCycleUser.builder()
90+
.userId("my_user")
91+
.isAnonymous(true)
92+
.build()
93+
XCTAssertNotNil(user)
94+
XCTAssert(user.userId == "my_user")
95+
XCTAssertTrue(user.isAnonymous!)
8096
}
8197

82-
func testBuilderReturnsNilIfUserIdOnlyContainsWhitespaces() {
83-
let user = try? DevCycleUser.builder().userId(" ").build()
84-
XCTAssertNil(user)
98+
func testBuilderWithUserIdAndIsAnonymousFalse() {
99+
let user = try! DevCycleUser.builder()
100+
.userId("my_user")
101+
.isAnonymous(false)
102+
.build()
103+
XCTAssertNotNil(user)
104+
XCTAssert(user.userId == "my_user")
105+
XCTAssertFalse(user.isAnonymous!)
85106
}
86107

87108
func testToStringOnlyOutputsNonNilProperties() {

0 commit comments

Comments
 (0)