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