@@ -2227,7 +2227,7 @@ public function testIsFeatureEnabledGivenInvalidFeatureFlag()
22272227 $ this ->assertSame ($ optimizelyObj ->isFeatureEnabled ('mutex_group_feature ' , "user_id " ), false );
22282228 }
22292229
2230- public function testIsFeatureEnabledGivenFeatureFlagIsNotEnabledForUser ()
2230+ public function testIsFeatureEnabledGivenGetVariationForFeatureReturnsNull ()
22312231 {
22322232 // should return false when no variation is returned for user
22332233 $ optimizelyMock = $ this ->getMockBuilder (Optimizely::class)
@@ -2263,13 +2263,10 @@ public function testIsFeatureEnabledGivenFeatureFlagIsNotEnabledForUser()
22632263 ->method ('log ' )
22642264 ->with (Logger::INFO , "Feature Flag 'double_single_variable_feature' is not enabled for user 'user_id'. " );
22652265
2266- $ this ->assertSame (
2267- $ optimizelyMock ->isFeatureEnabled ('double_single_variable_feature ' , 'user_id ' ),
2268- false
2269- );
2266+ $ this ->assertFalse ($ optimizelyMock ->isFeatureEnabled ('double_single_variable_feature ' , 'user_id ' ));
22702267 }
22712268
2272- public function testIsFeatureEnabledGivenFeatureFlagIsEnabledAndUserIsBeingExperimented ()
2269+ public function testIsFeatureEnabledGivenFeatureExperimentAndFeatureEnabledIsTrue ()
22732270 {
22742271 $ optimizelyMock = $ this ->getMockBuilder (Optimizely::class)
22752272 ->setConstructorArgs (array ($ this ->datafile , null , $ this ->loggerMock ))
@@ -2289,6 +2286,9 @@ public function testIsFeatureEnabledGivenFeatureFlagIsEnabledAndUserIsBeingExper
22892286 $ experiment = $ this ->projectConfig ->getExperimentFromKey ('test_experiment_double_feature ' );
22902287 $ variation = $ this ->projectConfig ->getVariationFromKey ('test_experiment_double_feature ' , 'control ' );
22912288
2289+ // assert that featureEnabled for $variation is true
2290+ $ this ->assertTrue ($ variation ->getFeatureEnabled ());
2291+
22922292 $ expected_decision = new FeatureDecision (
22932293 $ experiment ,
22942294 $ variation ,
@@ -2308,13 +2308,53 @@ public function testIsFeatureEnabledGivenFeatureFlagIsEnabledAndUserIsBeingExper
23082308 ->method ('log ' )
23092309 ->with (Logger::INFO , "Feature Flag 'double_single_variable_feature' is enabled for user 'user_id'. " );
23102310
2311- $ this ->assertSame (
2312- $ optimizelyMock ->isFeatureEnabled ('double_single_variable_feature ' , 'user_id ' , []),
2313- true
2311+ $ this ->assertTrue ($ optimizelyMock ->isFeatureEnabled ('double_single_variable_feature ' , 'user_id ' , []));
2312+ }
2313+
2314+ public function testIsFeatureEnabledGivenFeatureExperimentAndFeatureEnabledIsFalse ()
2315+ {
2316+ $ optimizelyMock = $ this ->getMockBuilder (Optimizely::class)
2317+ ->setConstructorArgs (array ($ this ->datafile , null , $ this ->loggerMock ))
2318+ ->setMethods (array ('sendImpressionEvent ' ))
2319+ ->getMock ();
2320+
2321+ $ decisionServiceMock = $ this ->getMockBuilder (DecisionService::class)
2322+ ->setConstructorArgs (array ($ this ->loggerMock , $ this ->projectConfig ))
2323+ ->setMethods (array ('getVariationForFeature ' ))
2324+ ->getMock ();
2325+
2326+ $ decisionService = new \ReflectionProperty (Optimizely::class, '_decisionService ' );
2327+ $ decisionService ->setAccessible (true );
2328+ $ decisionService ->setValue ($ optimizelyMock , $ decisionServiceMock );
2329+
2330+ // Mock getVariationForFeature to return a valid decision with experiment and variation keys
2331+ $ experiment = $ this ->projectConfig ->getExperimentFromKey ('test_experiment_double_feature ' );
2332+ $ variation = $ this ->projectConfig ->getVariationFromKey ('test_experiment_double_feature ' , 'variation ' );
2333+
2334+ // assert that featureEnabled for $variation is false
2335+ $ this ->assertFalse ($ variation ->getFeatureEnabled ());
2336+
2337+ $ expected_decision = new FeatureDecision (
2338+ $ experiment ,
2339+ $ variation ,
2340+ FeatureDecision::DECISION_SOURCE_EXPERIMENT
23142341 );
2342+
2343+ $ decisionServiceMock ->expects ($ this ->exactly (1 ))
2344+ ->method ('getVariationForFeature ' )
2345+ ->will ($ this ->returnValue ($ expected_decision ));
2346+
2347+ $ optimizelyMock ->expects ($ this ->never ())
2348+ ->method ('sendImpressionEvent ' );
2349+
2350+ $ this ->loggerMock ->expects ($ this ->at (0 ))
2351+ ->method ('log ' )
2352+ ->with (Logger::INFO , "Feature Flag 'double_single_variable_feature' is not enabled for user 'user_id'. " );
2353+
2354+ $ this ->assertFalse ($ optimizelyMock ->isFeatureEnabled ('double_single_variable_feature ' , 'user_id ' , []));
23152355 }
23162356
2317- public function testIsFeatureEnabledGivenFeatureFlagIsEnabledAndUserIsNotBeingExperimented ()
2357+ public function testIsFeatureEnabledGivenFeatureRolloutAndFeatureEnabledIsTrue ()
23182358 {
23192359 $ optimizelyMock = $ this ->getMockBuilder (Optimizely::class)
23202360 ->setConstructorArgs (array ($ this ->datafile , null , $ this ->loggerMock ))
@@ -2334,6 +2374,10 @@ public function testIsFeatureEnabledGivenFeatureFlagIsEnabledAndUserIsNotBeingEx
23342374 $ rollout = $ this ->projectConfig ->getRolloutFromId ('166660 ' );
23352375 $ experiment = $ rollout ->getExperiments ()[0 ];
23362376 $ variation = $ experiment ->getVariations ()[0 ];
2377+
2378+ // assert variation's 'featureEnabled' is set to true
2379+ $ this ->assertTrue ($ variation ->getFeatureEnabled ());
2380+
23372381 $ expected_decision = new FeatureDecision (
23382382 $ experiment ,
23392383 $ variation ,
@@ -2359,10 +2403,53 @@ public function testIsFeatureEnabledGivenFeatureFlagIsEnabledAndUserIsNotBeingEx
23592403 ->method ('log ' )
23602404 ->with (Logger::INFO , "Feature Flag 'boolean_single_variable_feature' is enabled for user 'user_id'. " );
23612405
2362- $ this ->assertSame (
2363- $ optimizelyMock ->isFeatureEnabled ('boolean_single_variable_feature ' , 'user_id ' , []),
2364- true
2406+ $ this ->assertTrue ($ optimizelyMock ->isFeatureEnabled ('boolean_single_variable_feature ' , 'user_id ' , []));
2407+ }
2408+
2409+ public function testIsFeatureEnabledGivenFeatureRolloutAndFeatureEnabledIsFalse ()
2410+ {
2411+ $ optimizelyMock = $ this ->getMockBuilder (Optimizely::class)
2412+ ->setConstructorArgs (array ($ this ->datafile , null , $ this ->loggerMock ))
2413+ ->setMethods (array ('sendImpressionEvent ' ))
2414+ ->getMock ();
2415+
2416+ $ decisionServiceMock = $ this ->getMockBuilder (DecisionService::class)
2417+ ->setConstructorArgs (array ($ this ->loggerMock , $ this ->projectConfig ))
2418+ ->setMethods (array ('getVariationForFeature ' ))
2419+ ->getMock ();
2420+
2421+ $ decisionService = new \ReflectionProperty (Optimizely::class, '_decisionService ' );
2422+ $ decisionService ->setAccessible (true );
2423+ $ decisionService ->setValue ($ optimizelyMock , $ decisionServiceMock );
2424+
2425+ // Mock getVariationForFeature to return a valid decision with experiment and variation keys
2426+ $ rollout = $ this ->projectConfig ->getRolloutFromId ('166660 ' );
2427+ $ experiment = $ rollout ->getExperiments ()[0 ];
2428+ $ variation = $ experiment ->getVariations ()[0 ];
2429+ $ variation ->setFeatureEnabled (false );
2430+
2431+ // assert variation's 'featureEnabled' is set to false
2432+ $ this ->assertFalse ($ variation ->getFeatureEnabled ());
2433+
2434+ $ expected_decision = new FeatureDecision (
2435+ $ experiment ,
2436+ $ variation ,
2437+ FeatureDecision::DECISION_SOURCE_ROLLOUT
23652438 );
2439+
2440+ $ decisionServiceMock ->expects ($ this ->exactly (1 ))
2441+ ->method ('getVariationForFeature ' )
2442+ ->will ($ this ->returnValue ($ expected_decision ));
2443+
2444+ // assert that sendImpressionEvent is not called
2445+ $ optimizelyMock ->expects ($ this ->never ())
2446+ ->method ('sendImpressionEvent ' );
2447+
2448+ $ this ->loggerMock ->expects ($ this ->at (0 ))
2449+ ->method ('log ' )
2450+ ->with (Logger::INFO , "Feature Flag 'boolean_single_variable_feature' is not enabled for user 'user_id'. " );
2451+
2452+ $ this ->assertFalse ($ optimizelyMock ->isFeatureEnabled ('boolean_single_variable_feature ' , 'user_id ' , []));
23662453 }
23672454
23682455 public function testGetEnabledFeaturesGivenInvalidDataFile ()
0 commit comments