1+ use flagsmith:: flagsmith:: models:: SDKTrait ;
12use flagsmith:: flagsmith:: offline_handler;
23use flagsmith:: { Flagsmith , FlagsmithOptions } ;
34use flagsmith_flag_engine:: identities:: Trait ;
@@ -136,7 +137,7 @@ fn test_offline_mode() {
136137 // When
137138 let env_flags = flagsmith. get_environment_flags ( ) . unwrap ( ) . all_flags ( ) ;
138139 let identity_flags = flagsmith
139- . get_identity_flags ( "test_identity" , None )
140+ . get_identity_flags ( "test_identity" , None , None )
140141 . unwrap ( )
141142 . all_flags ( ) ;
142143
@@ -175,7 +176,7 @@ fn test_offline_handler_is_used_if_request_fails(mock_server: MockServer) {
175176 // When
176177 let env_flags = flagsmith. get_environment_flags ( ) . unwrap ( ) . all_flags ( ) ;
177178 let identity_flags = flagsmith
178- . get_identity_flags ( "test_identity" , None )
179+ . get_identity_flags ( "test_identity" , None , None )
179180 . unwrap ( )
180181 . all_flags ( ) ;
181182
@@ -223,7 +224,7 @@ fn test_get_identity_flags_uses_local_environment_when_available(
223224
224225 // Then
225226 let all_flags = flagsmith
226- . get_identity_flags ( "test_identity" , None )
227+ . get_identity_flags ( "test_identity" , None , None )
227228 . unwrap ( )
228229 . all_flags ( ) ;
229230 assert_eq ! ( all_flags. len( ) , 1 ) ;
@@ -249,7 +250,8 @@ fn test_get_identity_flags_calls_api_when_no_local_environment_no_traits(
249250 . header ( "X-Environment-Key" , ENVIRONMENT_KEY )
250251 . json_body ( serde_json:: json!( {
251252 "identifier" : identifier,
252- "traits" : [ ]
253+ "traits" : [ ] ,
254+ "transient" : false ,
253255 } ) ) ;
254256 then. status ( 200 ) . json_body ( identities_json) ;
255257 } ) ;
@@ -263,7 +265,7 @@ fn test_get_identity_flags_calls_api_when_no_local_environment_no_traits(
263265 // When
264266
265267 let all_flags = flagsmith
266- . get_identity_flags ( identifier, None )
268+ . get_identity_flags ( identifier, None , None )
267269 . unwrap ( )
268270 . all_flags ( ) ;
269271
@@ -296,7 +298,8 @@ fn test_get_identity_flags_calls_api_when_no_local_environment_with_traits(
296298 . header ( "content-type" , "application/json" )
297299 . json_body ( serde_json:: json!( {
298300 "identifier" : identifier,
299- "traits" : [ { "trait_key" : trait_key, "trait_value" : trait_value} ]
301+ "traits" : [ { "trait_key" : trait_key, "trait_value" : trait_value, "transient" : false } ] ,
302+ "transient" : false ,
300303 } ) ) ;
301304 then. status ( 200 ) . json_body ( identities_json) ;
302305 } ) ;
@@ -308,15 +311,15 @@ fn test_get_identity_flags_calls_api_when_no_local_environment_with_traits(
308311 let flagsmith = Flagsmith :: new ( ENVIRONMENT_KEY . to_string ( ) , flagsmith_options) ;
309312
310313 // When
311- let traits = vec ! [ Trait {
312- trait_key: trait_key . to_string( ) ,
313- trait_value : FlagsmithValue {
314+ let traits = vec ! [ SDKTrait :: new (
315+ trait_key. to_string( ) ,
316+ FlagsmithValue {
314317 value: trait_value. to_string( ) ,
315318 value_type: FlagsmithValueType :: String ,
316319 } ,
317- } ] ;
320+ ) ] ;
318321 let all_flags = flagsmith
319- . get_identity_flags ( identifier, Some ( traits) )
322+ . get_identity_flags ( identifier, Some ( traits) , None )
320323 . unwrap ( )
321324 . all_flags ( ) ;
322325
@@ -332,6 +335,113 @@ fn test_get_identity_flags_calls_api_when_no_local_environment_with_traits(
332335 api_mock. assert ( ) ;
333336}
334337
338+ #[ rstest]
339+ fn test_get_identity_flags_calls_api_when_no_local_environment_with_transient_traits (
340+ mock_server : MockServer ,
341+ identities_json : serde_json:: Value ,
342+ ) {
343+ // Given
344+ let identifier = "test_identity" ;
345+ let trait_key = "trait_key1" ;
346+ let trait_value = "trait_value1" ;
347+ let transient_trait_key = "trait_key2" ;
348+
349+ let api_mock = mock_server. mock ( |when, then| {
350+ when. method ( POST )
351+ . path ( "/api/v1/identities/" )
352+ . header ( "X-Environment-Key" , ENVIRONMENT_KEY )
353+ . header ( "content-type" , "application/json" )
354+ . json_body ( serde_json:: json!( {
355+ "identifier" : identifier,
356+ "traits" : [
357+ { "trait_key" : trait_key, "trait_value" : trait_value, "transient" : false } ,
358+ { "trait_key" : transient_trait_key, "trait_value" : trait_value, "transient" : true } ,
359+ ] ,
360+ "transient" : false ,
361+ } ) ) ;
362+ then. status ( 200 ) . json_body ( identities_json) ;
363+ } ) ;
364+ let url = mock_server. url ( "/api/v1/" ) ;
365+ let flagsmith_options = FlagsmithOptions {
366+ api_url : url,
367+ ..Default :: default ( )
368+ } ;
369+ let flagsmith = Flagsmith :: new ( ENVIRONMENT_KEY . to_string ( ) , flagsmith_options) ;
370+
371+ // When
372+ let traits = vec ! [
373+ SDKTrait :: new(
374+ trait_key. to_string( ) ,
375+ FlagsmithValue {
376+ value: trait_value. to_string( ) ,
377+ value_type: FlagsmithValueType :: String ,
378+ } ,
379+ ) ,
380+ SDKTrait :: new_with_transient(
381+ transient_trait_key. to_string( ) ,
382+ FlagsmithValue {
383+ value: trait_value. to_string( ) ,
384+ value_type: FlagsmithValueType :: String ,
385+ } ,
386+ true ,
387+ ) ,
388+ ] ;
389+ flagsmith
390+ . get_identity_flags ( identifier, Some ( traits) , None )
391+ . unwrap ( )
392+ . all_flags ( ) ;
393+
394+ // Then
395+ api_mock. assert ( ) ;
396+ }
397+
398+ #[ rstest]
399+ fn test_get_identity_flags_calls_api_when_no_local_environment_with_transient_identity (
400+ mock_server : MockServer ,
401+ identities_json : serde_json:: Value ,
402+ ) {
403+ // Given
404+ let identifier = "test_identity" ;
405+ let trait_key = "trait_key1" ;
406+ let trait_value = "trai_value1" ;
407+
408+ let api_mock = mock_server. mock ( |when, then| {
409+ when. method ( POST )
410+ . path ( "/api/v1/identities/" )
411+ . header ( "X-Environment-Key" , ENVIRONMENT_KEY )
412+ . header ( "content-type" , "application/json" )
413+ . json_body ( serde_json:: json!( {
414+ "identifier" : identifier,
415+ "traits" : [ { "trait_key" : trait_key, "trait_value" : trait_value, "transient" : false } ] ,
416+ "transient" : true ,
417+ } ) ) ;
418+ then. status ( 200 ) . json_body ( identities_json) ;
419+ } ) ;
420+ let url = mock_server. url ( "/api/v1/" ) ;
421+ let flagsmith_options = FlagsmithOptions {
422+ api_url : url,
423+ ..Default :: default ( )
424+ } ;
425+ let flagsmith = Flagsmith :: new ( ENVIRONMENT_KEY . to_string ( ) , flagsmith_options) ;
426+
427+ // When
428+ let traits = vec ! [ SDKTrait :: new(
429+ trait_key. to_string( ) ,
430+ FlagsmithValue {
431+ value: trait_value. to_string( ) ,
432+ value_type: FlagsmithValueType :: String ,
433+ } ,
434+ ) ] ;
435+ flagsmith
436+ . get_identity_flags ( identifier, Some ( traits) , Some ( true ) )
437+ . unwrap ( )
438+ . all_flags ( ) ;
439+
440+ // Then
441+ api_mock. assert ( ) ;
442+ }
443+
444+
335445#[ rstest]
336446fn test_default_flag_is_not_used_when_environment_flags_returned (
337447 mock_server : MockServer ,
@@ -414,7 +524,8 @@ fn test_default_flag_is_not_used_when_identity_flags_returned(
414524 . header ( "X-Environment-Key" , ENVIRONMENT_KEY )
415525 . json_body ( serde_json:: json!( {
416526 "identifier" : identifier,
417- "traits" : [ ]
527+ "traits" : [ ] ,
528+ "transient" : false ,
418529 } ) ) ;
419530 then. status ( 200 ) . json_body ( identities_json) ;
420531 } ) ;
@@ -427,7 +538,9 @@ fn test_default_flag_is_not_used_when_identity_flags_returned(
427538 let flagsmith = Flagsmith :: new ( ENVIRONMENT_KEY . to_string ( ) , flagsmith_options) ;
428539
429540 // When
430- let flags = flagsmith. get_identity_flags ( identifier, None ) . unwrap ( ) ;
541+ let flags = flagsmith
542+ . get_identity_flags ( identifier, None , None )
543+ . unwrap ( ) ;
431544 let flag = flags. get_flag ( fixtures:: FEATURE_1_NAME ) . unwrap ( ) ;
432545 // Then
433546 assert_eq ! ( flag. feature_name, fixtures:: FEATURE_1_NAME ) ;
@@ -455,7 +568,8 @@ fn test_default_flag_is_used_when_no_matching_identity_flags_returned(
455568 . header ( "X-Environment-Key" , ENVIRONMENT_KEY )
456569 . json_body ( serde_json:: json!( {
457570 "identifier" : identifier,
458- "traits" : [ ]
571+ "traits" : [ ] ,
572+ "transient" : false ,
459573 } ) ) ;
460574 then. status ( 200 ) . json_body ( identities_json) ;
461575 } ) ;
@@ -468,7 +582,9 @@ fn test_default_flag_is_used_when_no_matching_identity_flags_returned(
468582 let flagsmith = Flagsmith :: new ( ENVIRONMENT_KEY . to_string ( ) , flagsmith_options) ;
469583
470584 // When
471- let flags = flagsmith. get_identity_flags ( identifier, None ) . unwrap ( ) ;
585+ let flags = flagsmith
586+ . get_identity_flags ( identifier, None , None )
587+ . unwrap ( ) ;
472588 let flag = flags. get_flag ( "feature_that_does_not_exists" ) . unwrap ( ) ;
473589 // Then
474590 assert_eq ! ( flag. is_default, true ) ;
@@ -526,7 +642,8 @@ fn test_default_flags_are_used_if_api_error_and_default_flag_handler_given_for_i
526642 . header ( "X-Environment-Key" , ENVIRONMENT_KEY )
527643 . json_body ( serde_json:: json!( {
528644 "identifier" : identifier,
529- "traits" : [ ]
645+ "traits" : [ ] ,
646+ "transient" : false ,
530647 } ) ) ;
531648 then. status ( 200 ) . json_body ( { } ) ;
532649 } ) ;
@@ -539,7 +656,9 @@ fn test_default_flags_are_used_if_api_error_and_default_flag_handler_given_for_i
539656 let flagsmith = Flagsmith :: new ( ENVIRONMENT_KEY . to_string ( ) , flagsmith_options) ;
540657
541658 // When
542- let flags = flagsmith. get_identity_flags ( identifier, None ) . unwrap ( ) ;
659+ let flags = flagsmith
660+ . get_identity_flags ( identifier, None , None )
661+ . unwrap ( ) ;
543662 let flag = flags. get_flag ( "feature_that_does_not_exists" ) . unwrap ( ) ;
544663 // Then
545664 assert_eq ! ( flag. is_default, true ) ;
0 commit comments