@@ -53,6 +53,107 @@ def test_create_user_from_context_only_user_id(self):
5353 self .assertIsNotNone (user )
5454 self .assertEqual (user .user_id , test_user_id )
5555
56+ def test_create_user_from_context_with_userId (self ):
57+ test_user_id = "userId-12345"
58+
59+ # Test userId as the only user ID source
60+ context = EvaluationContext (
61+ targeting_key = None , attributes = {"userId" : test_user_id }
62+ )
63+ user = DevCycleUser .create_user_from_context (context )
64+ self .assertIsNotNone (user )
65+ self .assertEqual (user .user_id , test_user_id )
66+
67+ # Test that userId is excluded from custom data when used as user ID
68+ self .assertIsNone (user .customData )
69+
70+ def test_create_user_from_context_user_id_priority (self ):
71+ targeting_key_id = "targeting-12345"
72+ user_id = "user_id-12345"
73+ userId = "userId-12345"
74+
75+ # Test targeting_key takes precedence over user_id and userId
76+ context = EvaluationContext (
77+ targeting_key = targeting_key_id ,
78+ attributes = {"user_id" : user_id , "userId" : userId }
79+ )
80+ user = DevCycleUser .create_user_from_context (context )
81+ self .assertEqual (user .user_id , targeting_key_id )
82+
83+ # Test user_id takes precedence over userId
84+ context = EvaluationContext (
85+ targeting_key = None ,
86+ attributes = {"user_id" : user_id , "userId" : userId }
87+ )
88+ user = DevCycleUser .create_user_from_context (context )
89+ self .assertEqual (user .user_id , user_id )
90+
91+ # Test userId is used when targeting_key and user_id are not available
92+ context = EvaluationContext (
93+ targeting_key = None ,
94+ attributes = {"userId" : userId }
95+ )
96+ user = DevCycleUser .create_user_from_context (context )
97+ self .assertEqual (user .user_id , userId )
98+
99+ def test_create_user_from_context_userId_in_custom_data_when_not_used (self ):
100+ targeting_key_id = "targeting-12345"
101+ userId = "userId-12345"
102+
103+ # When targeting_key is used, userId should be in custom data
104+ context = EvaluationContext (
105+ targeting_key = targeting_key_id ,
106+ attributes = {"userId" : userId , "other_field" : "value" }
107+ )
108+ user = DevCycleUser .create_user_from_context (context )
109+ self .assertEqual (user .user_id , targeting_key_id )
110+ self .assertIsNotNone (user .customData )
111+ self .assertEqual (user .customData ["userId" ], userId )
112+ self .assertEqual (user .customData ["other_field" ], "value" )
113+
114+ # When user_id is used, userId should be in custom data
115+ user_id = "user_id-12345"
116+ context = EvaluationContext (
117+ targeting_key = None ,
118+ attributes = {"user_id" : user_id , "userId" : userId , "other_field" : "value" }
119+ )
120+ user = DevCycleUser .create_user_from_context (context )
121+ self .assertEqual (user .user_id , user_id )
122+ self .assertIsNotNone (user .customData )
123+ self .assertEqual (user .customData ["userId" ], userId )
124+ self .assertEqual (user .customData ["other_field" ], "value" )
125+
126+ def test_create_user_from_context_userId_excluded_when_used (self ):
127+ userId = "userId-12345"
128+
129+ # When userId is used as user ID, it should be excluded from custom data
130+ context = EvaluationContext (
131+ targeting_key = None ,
132+ attributes = {"userId" : userId , "other_field" : "value" }
133+ )
134+ user = DevCycleUser .create_user_from_context (context )
135+ self .assertEqual (user .user_id , userId )
136+ self .assertIsNotNone (user .customData )
137+ self .assertNotIn ("userId" , user .customData )
138+ self .assertEqual (user .customData ["other_field" ], "value" )
139+
140+ def test_create_user_from_context_invalid_userId_types (self ):
141+ # Test non-string userId values are ignored and cause error
142+ with self .assertRaises (TargetingKeyMissingError ):
143+ DevCycleUser .create_user_from_context (
144+ EvaluationContext (targeting_key = None , attributes = {"userId" : 12345 })
145+ )
146+
147+ with self .assertRaises (TargetingKeyMissingError ):
148+ DevCycleUser .create_user_from_context (
149+ EvaluationContext (targeting_key = None , attributes = {"userId" : None })
150+ )
151+
152+ with self .assertRaises (TargetingKeyMissingError ):
153+ DevCycleUser .create_user_from_context (
154+ EvaluationContext (targeting_key = None , attributes = {"userId" : True })
155+ )
156+
56157 def test_create_user_from_context_with_attributes (self ):
57158 test_user_id = "12345"
58159 context = EvaluationContext (
0 commit comments