@@ -23,6 +23,66 @@ func TestClientErrorsIfLocalEvaluationWithNonServerSideKey(t *testing.T) {
2323 })
2424}
2525
26+ func TestClientErrorsIfOfflineModeWithoutOfflineHandler (t * testing.T ) {
27+ // When
28+ defer func () {
29+ if r := recover (); r != nil {
30+ // Then
31+ errMsg := fmt .Sprintf ("%v" , r )
32+ expectedErrMsg := "offline handler must be provided to use offline mode."
33+ assert .Equal (t , expectedErrMsg , errMsg , "Unexpected error message" )
34+ }
35+ }()
36+
37+ // Trigger panic
38+ _ = flagsmith .NewClient ("key" , flagsmith .WithOfflineMode ())
39+ }
40+
41+ func TestClientErrorsIfDefaultHandlerAndOfflineHandlerAreBothSet (t * testing.T ) {
42+ // Given
43+ envJsonPath := "./fixtures/environment.json"
44+ offlineHandler , err := flagsmith .NewLocalFileHandler (envJsonPath )
45+ assert .NoError (t , err )
46+
47+ // When
48+ defer func () {
49+ if r := recover (); r != nil {
50+ // Then
51+ errMsg := fmt .Sprintf ("%v" , r )
52+ expectedErrMsg := "default flag handler and offline handler cannot be used together."
53+ assert .Equal (t , expectedErrMsg , errMsg , "Unexpected error message" )
54+ }
55+ }()
56+
57+ // Trigger panic
58+ _ = flagsmith .NewClient ("key" ,
59+ flagsmith .WithOfflineHandler (offlineHandler ),
60+ flagsmith .WithDefaultHandler (func (featureName string ) (flagsmith.Flag , error ) {
61+ return flagsmith.Flag {IsDefault : true }, nil
62+ }))
63+ }
64+ func TestClientErrorsIfLocalEvaluationModeAndOfflineHandlerAreBothSet (t * testing.T ) {
65+ // Given
66+ envJsonPath := "./fixtures/environment.json"
67+ offlineHandler , err := flagsmith .NewLocalFileHandler (envJsonPath )
68+ assert .NoError (t , err )
69+
70+ // When
71+ defer func () {
72+ if r := recover (); r != nil {
73+ // Then
74+ errMsg := fmt .Sprintf ("%v" , r )
75+ expectedErrMsg := "local evaluation and offline handler cannot be used together."
76+ assert .Equal (t , expectedErrMsg , errMsg , "Unexpected error message" )
77+ }
78+ }()
79+
80+ // Trigger panic
81+ _ = flagsmith .NewClient ("key" ,
82+ flagsmith .WithOfflineHandler (offlineHandler ),
83+ flagsmith .WithLocalEvaluation (context .Background ()))
84+ }
85+
2686func TestClientUpdatesEnvironmentOnStartForLocalEvaluation (t * testing.T ) {
2787 // Given
2888 ctx := context .Background ()
@@ -498,3 +558,80 @@ func TestWithProxyClientOption(t *testing.T) {
498558 assert .Equal (t , fixtures .Feature1ID , allFlags [0 ].FeatureID )
499559 assert .Equal (t , fixtures .Feature1Value , allFlags [0 ].Value )
500560}
561+
562+ func TestOfflineMode (t * testing.T ) {
563+ // Given
564+ ctx := context .Background ()
565+
566+ envJsonPath := "./fixtures/environment.json"
567+ offlineHandler , err := flagsmith .NewLocalFileHandler (envJsonPath )
568+ assert .NoError (t , err )
569+
570+ client := flagsmith .NewClient (fixtures .EnvironmentAPIKey , flagsmith .WithOfflineMode (), flagsmith .WithOfflineHandler (offlineHandler ))
571+
572+ // Then
573+ flags , err := client .GetEnvironmentFlags (ctx )
574+ assert .NoError (t , err )
575+
576+ allFlags := flags .AllFlags ()
577+
578+ assert .Equal (t , 1 , len (allFlags ))
579+
580+ assert .Equal (t , fixtures .Feature1Name , allFlags [0 ].FeatureName )
581+ assert .Equal (t , fixtures .Feature1ID , allFlags [0 ].FeatureID )
582+ assert .Equal (t , fixtures .Feature1Value , allFlags [0 ].Value )
583+
584+ // And GetIdentityFlags works as well
585+ flags , err = client .GetIdentityFlags (ctx , "test_identity" , nil )
586+ assert .NoError (t , err )
587+
588+ allFlags = flags .AllFlags ()
589+
590+ assert .Equal (t , 1 , len (allFlags ))
591+
592+ assert .Equal (t , fixtures .Feature1Name , allFlags [0 ].FeatureName )
593+ assert .Equal (t , fixtures .Feature1ID , allFlags [0 ].FeatureID )
594+ assert .Equal (t , fixtures .Feature1Value , allFlags [0 ].Value )
595+ }
596+
597+ func TestOfflineHandlerIsUsedWhenRequestFails (t * testing.T ) {
598+ // Given
599+ ctx := context .Background ()
600+
601+ envJsonPath := "./fixtures/environment.json"
602+ offlineHandler , err := flagsmith .NewLocalFileHandler (envJsonPath )
603+ assert .NoError (t , err )
604+
605+ server := httptest .NewServer (http .HandlerFunc (func (rw http.ResponseWriter , req * http.Request ) {
606+ rw .WriteHeader (http .StatusInternalServerError )
607+ }))
608+ defer server .Close ()
609+
610+ // When
611+ client := flagsmith .NewClient (fixtures .EnvironmentAPIKey , flagsmith .WithOfflineHandler (offlineHandler ),
612+ flagsmith .WithBaseURL (server .URL + "/api/v1/" ))
613+
614+ // Then
615+ flags , err := client .GetEnvironmentFlags (ctx )
616+ assert .NoError (t , err )
617+
618+ allFlags := flags .AllFlags ()
619+
620+ assert .Equal (t , 1 , len (allFlags ))
621+
622+ assert .Equal (t , fixtures .Feature1Name , allFlags [0 ].FeatureName )
623+ assert .Equal (t , fixtures .Feature1ID , allFlags [0 ].FeatureID )
624+ assert .Equal (t , fixtures .Feature1Value , allFlags [0 ].Value )
625+
626+ // And GetIdentityFlags works as well
627+ flags , err = client .GetIdentityFlags (ctx , "test_identity" , nil )
628+ assert .NoError (t , err )
629+
630+ allFlags = flags .AllFlags ()
631+
632+ assert .Equal (t , 1 , len (allFlags ))
633+
634+ assert .Equal (t , fixtures .Feature1Name , allFlags [0 ].FeatureName )
635+ assert .Equal (t , fixtures .Feature1ID , allFlags [0 ].FeatureID )
636+ assert .Equal (t , fixtures .Feature1Value , allFlags [0 ].Value )
637+ }
0 commit comments