Odyssey
CreditUnionGateTest.php
1 <?php
2 
3 use PHPUnit\Framework\TestCase;
4 require_once('FeatureGateConfig.i');
5 require_once('CreditUnionGate.i');
6 
7 class CreditUnionGateTest extends TestCase {
8  private $featureGateConfig;
9  public $dbData;
10 
11  protected function setUp() {
12  parent::setUp();
13 
14  // By using disableOriginalConstructor, we are getting around the "singleton-ness" of the class
15  $this->featureGateConfig = $this
16  ->getMockBuilder(FeatureGateConfig::class)
17  ->setMethods(['GetConfig'])
18  ->disableOriginalConstructor()
19  ->getMock();
20 
21  $this->featureGateConfig
22  ->expects(static::once())
23  ->method('GetConfig')
24  ->will(static::returnCallback(
25  function() {
26  return $this->dbData;
27  }
28  ));
29 
30  $this->dbData = [
31  [
32  'feature' => 'FEATURE_A',
33  'enabled_all' => 'Y',
34  'enabled_cu' => null
35  ],
36  [
37  'feature' => 'FEATURE_B',
38  'enabled_all' => 'O',
39  'enabled_cu' => null
40  ],
41  [
42  'feature' => 'FEATURE_C',
43  'enabled_all' => 'N',
44  'enabled_cu' => '["MYCU","CUL8TR"]',
45  'params' => '{"MYCU":{"usernames":["smith","jones"]}, "SCRUBCU":{"usernames":["bongobob", "4188"]},"CUL8TR":{"usernames":["mike"], "ip":["1.2.3.4","3.4.5.6"]}}',
46  ],
47  [
48  'feature' => 'FEATURE_E',
49  'enabled_all' => 'N',
50  'enabled_cu' => '["SCRUBCU","CUL8TR"]',
51  'params' => '{"MYCU":{"usernames":["smith","jones"]}, "SCRUBCU":{"usernames":["bongobob", "4188"]},"CUL8TR":{"usernames":["mike"], "ip":["1.2.3.4","3.4.5.6"]}}',
52  ]
53  ];
54  }
55 
56  public function testWillPass() {
57  $class = new ReflectionClass(FeatureGateConfig::class);
58  $loadConfig = $class->getMethod('LoadConfig');
59  $loadConfig->setAccessible(true);
60  $loadConfig->invoke($this->featureGateConfig);
61 
62  // FEATURE_A
63  $featureAGate = new CreditUnionGate('FEATURE_A', $this->featureGateConfig);
64  static::assertTrue($featureAGate->WillPass('SCRUBCU'));
65  static::assertTrue($featureAGate->WillPass('CRUISECU'));
66 
67  // FEATURE B
68  $featureBGate = new CreditUnionGate('FEATURE_B', $this->featureGateConfig);
69  static::assertFalse($featureBGate->WillPass('SCRUBCU'));
70  static::assertFalse($featureBGate->WillPass('CRUISECU'));
71 
72  // FEATURE C
73  $featureCGate = new CreditUnionGate('FEATURE_C', $this->featureGateConfig);
74  static::assertFalse($featureCGate->WillPass('SCRUBCU'));
75  static::assertFalse($featureCGate->WillPass('CRUISECU'));
76  static::assertTrue($featureCGate->WillPass('MYCU'));
77  static::assertTrue($featureCGate->WillPass('CUL8TR'));
78  static::assertFalse($featureCGate->WillPass('NOCU'));
79 
80  // FEATURE C with params
81  static::assertTrue($featureCGate->WillPass("MYCU", ['username'=>'jones']));
82  static::assertFalse($featureCGate->WillPass("SCRUBCU", ['username'=>'BongoBob']));
83  static::assertTrue($featureCGate->WillPass("CUL8TR", ['username'=>'mike', 'ip'=>'1.2.3.4']));
84  static::assertFalse($featureCGate->WillPass("CUL8TR", ['username'=>'mike1']));
85  static::assertTrue($featureCGate->WillPass("CUL8TR", ['username'=>'mike']));
86 
87  // FEATURE E with case changed params
88  $featureEGate = new CreditUnionGate('FEATURE_E', $this->featureGateConfig);
89  static::assertTrue($featureEGate->WillPass("SCRUBCU", ['username'=>'BongoBob']));
90  static::assertTrue($featureEGate->WillPass("CUL8TR", ['username'=>'MiKe']));
91  }
92 
93  public function testInvalidFeature() {
94  $class = new ReflectionClass(FeatureGateConfig::class);
95  $loadConfig = $class->getMethod('LoadConfig');
96  $loadConfig->setAccessible(true);
97  $loadConfig->invoke($this->featureGateConfig);
98 
99  $featureDGate = new CreditUnionGate('FEATURE_D', $this->featureGateConfig);
100  static::assertFalse($featureDGate->WillPass('SCRUBCU'));
101  }
102 
103  public function testNoEnabledCU() {
104  $this->dbData = [
105  [
106  'feature' => 'FEATURE_A',
107  'enabled_all' => 'N',
108  'enabled_cu' => '[]',
109  ],
110  ];
111 
112  $class = new ReflectionClass(FeatureGateConfig::class);
113  $loadConfig = $class->getMethod('LoadConfig');
114  $loadConfig->setAccessible(true);
115  $loadConfig->invoke($this->featureGateConfig);
116 
117  $featureAGate = new CreditUnionGate('FEATURE_A', $this->featureGateConfig);
118  static::assertFalse($featureAGate->WillPass('SCRUBCU'));
119  }
120 
121  public function testMissingFeature() {
122  $class = new ReflectionClass(FeatureGateConfig::class);
123  $loadConfig = $class->getMethod('LoadConfig');
124  $loadConfig->setAccessible(true);
125  $loadConfig->invoke($this->featureGateConfig);
126 
127  static::expectException(Exception::class);
128  static::expectExceptionMessage('Must supply a non-empty feature');
129  new CreditUnionGate('', $this->featureGateConfig);
130  }
131 }