@@ -125,7 +125,7 @@ func TestTrack(t *testing.T) {
125125
126126}
127127
128- func TestTrackFail (t * testing.T ) {
128+ func TestTrackFailEventNotFound (t * testing.T ) {
129129 mockProcessor := & MockProcessor {}
130130 mockDecisionService := new (MockDecisionService )
131131
@@ -137,7 +137,7 @@ func TestTrackFail(t *testing.T) {
137137
138138 err := client .Track ("bob" , entities.UserContext {ID : "1212121" , Attributes : map [string ]interface {}{}}, map [string ]interface {}{})
139139
140- assert .Error (t , err )
140+ assert .NoError (t , err )
141141 assert .True (t , len (mockProcessor .Events ) == 0 )
142142
143143}
@@ -158,24 +158,6 @@ func TestTrackPanics(t *testing.T) {
158158 assert .True (t , len (mockProcessor .Events ) == 0 )
159159
160160}
161- func TestGetEnabledFeaturesErrorCases (t * testing.T ) {
162- testUserContext := entities.UserContext {ID : "test_user_1" }
163-
164- // Test instance invalid
165- mockConfigManager := new (MockProjectConfigManager )
166- mockConfigManager .On ("GetConfig" ).Return (nil , errors .New ("no project config available" ))
167- mockDecisionService := new (MockDecisionService )
168-
169- client := OptimizelyClient {
170- ConfigManager : mockConfigManager ,
171- DecisionService : mockDecisionService ,
172- }
173- result , err := client .GetEnabledFeatures (testUserContext )
174- assert .Error (t , err )
175- assert .Empty (t , result )
176- mockConfigManager .AssertNotCalled (t , "GetFeatureByKey" )
177- mockDecisionService .AssertNotCalled (t , "GetFeatureDecision" )
178- }
179161
180162func TestGetEnabledFeaturesPanic (t * testing.T ) {
181163 testUserContext := entities.UserContext {ID : "test_user_1" }
@@ -1367,15 +1349,16 @@ func TestGetFeatureDecisionErrFeatureDecision(t *testing.T) {
13671349
13681350 expectedFeatureDecision := getTestFeatureDecision (testExperiment , testVariation , true )
13691351 mockDecisionService := new (MockDecisionService )
1370- mockDecisionService .On ("GetFeatureDecision" , testDecisionContext , testUserContext ).Return (expectedFeatureDecision , errors .New ("error feaure " ))
1352+ mockDecisionService .On ("GetFeatureDecision" , testDecisionContext , testUserContext ).Return (expectedFeatureDecision , errors .New ("error feature " ))
13711353
13721354 client := OptimizelyClient {
13731355 ConfigManager : mockConfigManager ,
13741356 DecisionService : mockDecisionService ,
13751357 }
13761358
1377- _ , _ , err := client .getFeatureDecision (testFeatureKey , testUserContext )
1378- assert .Error (t , err )
1359+ _ , decision , err := client .getFeatureDecision (testFeatureKey , testUserContext )
1360+ assert .Equal (t , expectedFeatureDecision , decision )
1361+ assert .NoError (t , err )
13791362}
13801363
13811364func TestGetAllFeatureVariables (t * testing.T ) {
@@ -1466,9 +1449,11 @@ func TestGetAllFeatureVariablesWithError(t *testing.T) {
14661449 }
14671450
14681451 enabled , variationMap , err := client .GetAllFeatureVariables (testFeatureKey , testUserContext )
1469- assert .False (t , enabled )
1470- assert .Equal (t , "" , variationMap [testVariableKey ])
1471- assert .NotNil (t , err )
1452+
1453+ // if we have a decision, but also a non-fatal error, we should return the decision
1454+ assert .True (t , enabled )
1455+ assert .Equal (t , testVariableValue , variationMap [testVariableKey ])
1456+ assert .NoError (t , err )
14721457}
14731458
14741459// Helper Methods
@@ -1523,7 +1508,7 @@ func (s *ClientTestSuiteAB) TestActivate() {
15231508 testUserContext := entities.UserContext {ID : "test_user_1" }
15241509 testExperiment := makeTestExperiment ("test_exp_1" )
15251510 s .mockConfig .On ("GetExperimentByKey" , "test_exp_1" ).Return (testExperiment , nil )
1526- s .mockConfig .On ("GetExperimentByKey" , "test_exp_2" ).Return (testExperiment , errors .New ("" ))
1511+ s .mockConfig .On ("GetExperimentByKey" , "test_exp_2" ).Return (testExperiment , errors .New ("Experiment not found " ))
15271512
15281513 testDecisionContext := decision.ExperimentDecisionContext {
15291514 Experiment : & testExperiment ,
@@ -1547,8 +1532,9 @@ func (s *ClientTestSuiteAB) TestActivate() {
15471532 s .NoError (err1 )
15481533 s .Equal (expectedVariation .Key , variationKey1 )
15491534
1535+ // should not return error for experiment not found.
15501536 variationKey2 , err2 := testClient .Activate ("test_exp_2" , testUserContext )
1551- s .Error (err2 )
1537+ s .NoError (err2 )
15521538 s .Equal ("" , variationKey2 )
15531539
15541540 s .mockConfig .AssertExpectations (s .T ())
@@ -1569,6 +1555,22 @@ func (s *ClientTestSuiteAB) TestActivatePanics() {
15691555 s .EqualError (err , "I'm panicking" )
15701556}
15711557
1558+ func (s * ClientTestSuiteAB ) TestActivateInvalidConfig () {
1559+ testUserContext := entities.UserContext {}
1560+
1561+ mockConfigManager := new (MockProjectConfigManager )
1562+ expectedError := errors .New ("no project config available" )
1563+ mockConfigManager .On ("GetConfig" ).Return (s .mockConfig , expectedError )
1564+ testClient := OptimizelyClient {
1565+ ConfigManager : mockConfigManager ,
1566+ }
1567+
1568+ variationKey , err := testClient .Activate ("test_exp_1" , testUserContext )
1569+ s .Equal ("" , variationKey )
1570+ s .Error (err )
1571+ s .Equal (expectedError , err )
1572+ }
1573+
15721574func (s * ClientTestSuiteAB ) TestGetVariation () {
15731575 testUserContext := entities.UserContext {ID : "test_user_1" }
15741576 testExperiment := makeTestExperiment ("test_exp_1" )
@@ -1598,7 +1600,7 @@ func (s *ClientTestSuiteAB) TestGetVariation() {
15981600 s .mockEventProcessor .AssertNotCalled (s .T (), "ProcessEvent" , mock .AnythingOfType ("event.UserEvent" ))
15991601}
16001602
1601- func (s * ClientTestSuiteAB ) TestGetVariationWithError () {
1603+ func (s * ClientTestSuiteAB ) TestGetVariationWithDecisionError () {
16021604 testUserContext := entities.UserContext {ID : "test_user_1" }
16031605 testExperiment := makeTestExperiment ("test_exp_1" )
16041606 s .mockConfig .On ("GetExperimentByKey" , "test_exp_1" ).Return (testExperiment , nil )
@@ -1620,7 +1622,7 @@ func (s *ClientTestSuiteAB) TestGetVariationWithError() {
16201622 }
16211623
16221624 variationKey , err := testClient .GetVariation ("test_exp_1" , testUserContext )
1623- s .Error (err )
1625+ s .NoError (err )
16241626 s .Equal (expectedVariation .Key , variationKey )
16251627 s .mockConfig .AssertExpectations (s .T ())
16261628 s .mockDecisionService .AssertExpectations (s .T ())
@@ -1714,14 +1716,18 @@ func (s *ClientTestSuiteFM) TestIsFeatureEnabledWithDecisionError() {
17141716 }
17151717
17161718 s .mockDecisionService .On ("GetFeatureDecision" , testDecisionContext , testUserContext ).Return (expectedFeatureDecision , errors .New ("" ))
1719+ s .mockEventProcessor .On ("ProcessEvent" , mock .AnythingOfType ("event.UserEvent" ))
17171720
17181721 client := OptimizelyClient {
17191722 ConfigManager : s .mockConfigManager ,
17201723 DecisionService : s .mockDecisionService ,
1724+ EventProcessor : s .mockEventProcessor ,
17211725 }
1726+
1727+ // should still return the decision because the error is non-fatal
17221728 result , err := client .IsFeatureEnabled (testFeature .Key , testUserContext )
1723- s .False (result )
1724- s .NotNil (err )
1729+ s .True (result )
1730+ s .NoError (err )
17251731 s .mockConfig .AssertExpectations (s .T ())
17261732 s .mockConfigManager .AssertExpectations (s .T ())
17271733 s .mockDecisionService .AssertExpectations (s .T ())
@@ -1752,9 +1758,7 @@ func (s *ClientTestSuiteFM) TestIsFeatureEnabledErrorCases() {
17521758 DecisionService : s .mockDecisionService ,
17531759 }
17541760 result , err := client .IsFeatureEnabled (testFeatureKey , testUserContext )
1755- if s .Error (err ) {
1756- s .Equal (expectedError , err )
1757- }
1761+ s .NoError (err )
17581762 s .False (result )
17591763 s .mockConfigManager .AssertExpectations (s .T ())
17601764 s .mockDecisionService .AssertNotCalled (s .T (), "GetDecision" )
@@ -1822,6 +1826,26 @@ func (s *ClientTestSuiteFM) TestGetEnabledFeatures() {
18221826 s .mockDecisionService .AssertExpectations (s .T ())
18231827}
18241828
1829+ func (s * ClientTestSuiteFM ) TestGetEnabledFeaturesErrorCases () {
1830+ testUserContext := entities.UserContext {ID : "test_user_1" }
1831+
1832+ // Test instance invalid
1833+ expectedError := errors .New ("no project config available" )
1834+ mockConfigManager := new (MockProjectConfigManager )
1835+ mockConfigManager .On ("GetConfig" ).Return (s .mockConfig , expectedError )
1836+
1837+ client := OptimizelyClient {
1838+ ConfigManager : mockConfigManager ,
1839+ DecisionService : s .mockDecisionService ,
1840+ }
1841+ result , err := client .GetEnabledFeatures (testUserContext )
1842+ s .Error (err )
1843+ s .Equal (expectedError , err )
1844+ s .Empty (result )
1845+ mockConfigManager .AssertNotCalled (s .T (), "GetFeatureByKey" )
1846+ s .mockDecisionService .AssertNotCalled (s .T (), "GetFeatureDecision" )
1847+ }
1848+
18251849func TestClose (t * testing.T ) {
18261850 mockProcessor := & MockProcessor {}
18271851 mockDecisionService := new (MockDecisionService )
0 commit comments