1+ use flagsmith:: flagsmith:: offline_handler;
12use flagsmith:: { Flagsmith , FlagsmithOptions } ;
23use flagsmith_flag_engine:: identities:: Trait ;
34use flagsmith_flag_engine:: types:: { FlagsmithValue , FlagsmithValueType } ;
@@ -15,6 +16,43 @@ use fixtures::local_eval_flagsmith;
1516use fixtures:: mock_server;
1617use fixtures:: ENVIRONMENT_KEY ;
1718
19+ #[ rstest]
20+ #[ should_panic( expected = "default_flag_handler cannot be used with offline_handler" ) ]
21+ fn test_flagsmith_panics_if_both_default_handler_and_offline_hanlder_are_set (
22+ default_flag_handler : fn ( & str ) -> flagsmith:: Flag ,
23+ ) {
24+ let handler =
25+ offline_handler:: LocalFileHandler :: new ( "tests/fixtures/environment.json" ) . unwrap ( ) ;
26+ let flagsmith_options = FlagsmithOptions {
27+ default_flag_handler : Some ( default_flag_handler) ,
28+ offline_handler : Some ( Box :: new ( handler) ) ,
29+ ..Default :: default ( )
30+ } ;
31+ Flagsmith :: new ( ENVIRONMENT_KEY . to_string ( ) , flagsmith_options) ;
32+ }
33+
34+ #[ rstest]
35+ #[ should_panic( expected = "offline_handler must be set to use offline_mode" ) ]
36+ fn test_flagsmith_panics_if_offline_mode_is_used_without_offline_hanlder ( ) {
37+ let flagsmith_options = FlagsmithOptions {
38+ offline_mode : true ,
39+ ..Default :: default ( )
40+ } ;
41+ Flagsmith :: new ( ENVIRONMENT_KEY . to_string ( ) , flagsmith_options) ;
42+ }
43+
44+ #[ rstest]
45+ #[ should_panic( expected = "offline_handler cannot be used with local evaluation" ) ]
46+ fn test_flagsmith_should_panic_if_local_evaluation_mode_is_used_with_offline_handler ( ) {
47+ let handler =
48+ offline_handler:: LocalFileHandler :: new ( "tests/fixtures/environment.json" ) . unwrap ( ) ;
49+ let flagsmith_options = FlagsmithOptions {
50+ enable_local_evaluation : true ,
51+ offline_handler : Some ( Box :: new ( handler) ) ,
52+ ..Default :: default ( )
53+ } ;
54+ Flagsmith :: new ( ENVIRONMENT_KEY . to_string ( ) , flagsmith_options) ;
55+ }
1856#[ rstest]
1957fn test_get_environment_flags_uses_local_environment_when_available (
2058 mock_server : MockServer ,
@@ -82,6 +120,84 @@ fn test_get_environment_flags_calls_api_when_no_local_environment(
82120 ) ;
83121 api_mock. assert ( ) ;
84122}
123+
124+ #[ rstest]
125+ fn test_offline_mode ( ) {
126+ // Given
127+ let handler =
128+ offline_handler:: LocalFileHandler :: new ( "tests/fixtures/environment.json" ) . unwrap ( ) ;
129+ let flagsmith_options = FlagsmithOptions {
130+ offline_handler : Some ( Box :: new ( handler) ) ,
131+ ..Default :: default ( )
132+ } ;
133+
134+ let flagsmith = Flagsmith :: new ( ENVIRONMENT_KEY . to_string ( ) , flagsmith_options) ;
135+
136+ // When
137+ let env_flags = flagsmith. get_environment_flags ( ) . unwrap ( ) . all_flags ( ) ;
138+ let identity_flags = flagsmith
139+ . get_identity_flags ( "test_identity" , None )
140+ . unwrap ( )
141+ . all_flags ( ) ;
142+
143+ // Then
144+ assert_eq ! ( env_flags. len( ) , 1 ) ;
145+ assert_eq ! ( env_flags[ 0 ] . feature_name, fixtures:: FEATURE_1_NAME ) ;
146+ assert_eq ! ( env_flags[ 0 ] . feature_id, fixtures:: FEATURE_1_ID ) ;
147+ assert_eq ! (
148+ env_flags[ 0 ] . value_as_string( ) . unwrap( ) ,
149+ fixtures:: FEATURE_1_STR_VALUE
150+ ) ;
151+
152+ // And
153+ assert_eq ! ( identity_flags. len( ) , 1 ) ;
154+ assert_eq ! ( identity_flags[ 0 ] . feature_name, fixtures:: FEATURE_1_NAME ) ;
155+ assert_eq ! ( identity_flags[ 0 ] . feature_id, fixtures:: FEATURE_1_ID ) ;
156+ assert_eq ! (
157+ identity_flags[ 0 ] . value_as_string( ) . unwrap( ) ,
158+ fixtures:: FEATURE_1_STR_VALUE
159+ ) ;
160+ }
161+
162+ #[ rstest]
163+ fn test_offline_handler_is_used_if_request_fails ( mock_server : MockServer ) {
164+ let url = mock_server. url ( "/api/v1/" ) ;
165+ let handler =
166+ offline_handler:: LocalFileHandler :: new ( "tests/fixtures/environment.json" ) . unwrap ( ) ;
167+ let flagsmith_options = FlagsmithOptions {
168+ api_url : url,
169+ offline_handler : Some ( Box :: new ( handler) ) ,
170+ ..Default :: default ( )
171+ } ;
172+
173+ let flagsmith = Flagsmith :: new ( ENVIRONMENT_KEY . to_string ( ) , flagsmith_options) ;
174+
175+ // When
176+ let env_flags = flagsmith. get_environment_flags ( ) . unwrap ( ) . all_flags ( ) ;
177+ let identity_flags = flagsmith
178+ . get_identity_flags ( "test_identity" , None )
179+ . unwrap ( )
180+ . all_flags ( ) ;
181+
182+ // Then
183+ assert_eq ! ( env_flags. len( ) , 1 ) ;
184+ assert_eq ! ( env_flags[ 0 ] . feature_name, fixtures:: FEATURE_1_NAME ) ;
185+ assert_eq ! ( env_flags[ 0 ] . feature_id, fixtures:: FEATURE_1_ID ) ;
186+ assert_eq ! (
187+ env_flags[ 0 ] . value_as_string( ) . unwrap( ) ,
188+ fixtures:: FEATURE_1_STR_VALUE
189+ ) ;
190+
191+ // And
192+ assert_eq ! ( identity_flags. len( ) , 1 ) ;
193+ assert_eq ! ( identity_flags[ 0 ] . feature_name, fixtures:: FEATURE_1_NAME ) ;
194+ assert_eq ! ( identity_flags[ 0 ] . feature_id, fixtures:: FEATURE_1_ID ) ;
195+ assert_eq ! (
196+ identity_flags[ 0 ] . value_as_string( ) . unwrap( ) ,
197+ fixtures:: FEATURE_1_STR_VALUE
198+ ) ;
199+ }
200+
85201#[ rstest]
86202fn test_get_identity_flags_uses_local_environment_when_available (
87203 mock_server : MockServer ,
0 commit comments