160 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace nur\config;
 | |
| 
 | |
| use PHPUnit\Framework\TestCase;
 | |
| 
 | |
| class ConfigManagerTest extends TestCase {
 | |
|   private static $static;
 | |
|   static function inc_static() { self::$static++; }
 | |
|   private $member;
 | |
|   function incMember() { $this->member++; }
 | |
|   function reset() {
 | |
|     self::$static = 0;
 | |
|     $this->member = 0;
 | |
|   }
 | |
| 
 | |
|   function testConfigurators() {
 | |
|     $cm = new ConfigManager();
 | |
|     $cm->addConfigurator(new class($this) {
 | |
|       private static $self;
 | |
|       function __construct($self) {
 | |
|         self::$self = $self;
 | |
|       }
 | |
|       static function configure_static() {
 | |
|         self::$self::inc_static();
 | |
|       }
 | |
|       function configureMember() {
 | |
|         self::$self->incMember();
 | |
|       }
 | |
|     });
 | |
| 
 | |
|     $this->reset();
 | |
|     $cm->resetConfiguration();
 | |
|     $cm->configure();
 | |
|     self::assertSame(1, self::$static);
 | |
|     self::assertSame(1, $this->member);
 | |
|     $cm->configure();
 | |
|     self::assertSame(1, self::$static);
 | |
|     self::assertSame(1, $this->member);
 | |
| 
 | |
|     $this->reset();
 | |
|     $cm->resetConfiguration();
 | |
|     $cm->configure(["exclude" => "static"]);
 | |
|     self::assertSame(0, self::$static);
 | |
|     self::assertSame(1, $this->member);
 | |
|     $cm->configure();
 | |
|     self::assertSame(1, self::$static);
 | |
|     self::assertSame(1, $this->member);
 | |
|   }
 | |
| 
 | |
|   function testIsObject() {
 | |
|     $cm = new class extends ConfigManager {
 | |
|       const OBJECT_PKEY_PREFIXES = [
 | |
|         "x.y" => null,
 | |
|       ];
 | |
|     };
 | |
| 
 | |
|     self::assertFalse($cm->isObject(false, ""));
 | |
|     self::assertFalse($cm->isObject(false, "x"));
 | |
|     self::assertFalse($cm->isObject(false, "x.y"));
 | |
|     self::assertTrue($cm->isObject(false, "x.y.z"));
 | |
|     self::assertFalse($cm->isObject(false, "x.y.z.t"));
 | |
|     self::assertFalse($cm->isObject(false, "x.y.z.t.w"));
 | |
|   }
 | |
| 
 | |
|   function testNewObject() {
 | |
|     $cm = new ConfigManager();
 | |
| 
 | |
|     $def0 = [[MyClass0::class]];
 | |
|     $obj0 = $cm->newObject($def0);
 | |
|     self::assertInstanceOf(MyClass0::class, $obj0);
 | |
| 
 | |
|     $def1 = [[MyClass1::class], "first", "second"];
 | |
|     $obj1 = $cm->newObject($def1);
 | |
|     self::assertInstanceOf(MyClass1::class, $obj1);
 | |
|     self::assertSame("first", $obj1->first);
 | |
|     self::assertSame("second", $obj1->second);
 | |
| 
 | |
|     $def2 = [[MyClass2::class], "first" => "a", "second" => "b"];
 | |
|     $obj2 = $cm->newObject($def2);
 | |
|     self::assertInstanceOf(MyClass2::class, $obj2);
 | |
|     self::assertSame(["first" => "a", "second" => "b"], $obj2->options);
 | |
|   }
 | |
| 
 | |
|   function testGetValue() {
 | |
|     $cm = new ConfigManager();
 | |
| 
 | |
|     $cm->addConfig(DynConfigTest::class);
 | |
|     $cm->addConfig(new DynConfigTest());
 | |
|     self::assertSame("dyn", $cm->getValue("app.ov"));
 | |
| 
 | |
|     $cm->addConfig(StaticConfigTest::class);
 | |
|     self::assertSame(1, $cm->getValue("app.dc.first"));
 | |
|     self::assertSame(2, $cm->getValue("app.dc.second"));
 | |
|     self::assertSame("a", $cm->getValue("app.sc.first"));
 | |
|     self::assertSame("b", $cm->getValue("app.sc.second"));
 | |
|     self::assertSame("static", $cm->getValue("app.ov"));
 | |
|     self::assertSame(1, $cm->getValue("app.dfirst_abs"));
 | |
|     self::assertSame(1, $cm->getValue("app.dfirst_rel"));
 | |
|     self::assertSame(2, $cm->getValue("app.dsecond"));
 | |
|     self::assertSame([5, 6, 7], $cm->getValue("app.darr567"));
 | |
|     self::assertSame([3, 4, 5], $cm->getValue("app.darr345"));
 | |
|     self::assertSame([1, 2], $cm->getValue("app.d12"));
 | |
| 
 | |
|     putenv('CONFIG_ALL_app__ec__first=Z');
 | |
|     putenv('JSON_CONFIG_ALL_app__ec__array={"a":1,"b":"2"}');
 | |
|     $cm->addConfig(EnvConfig::class);
 | |
|     self::assertSame("Z", $cm->getValue("app.ec.first"));
 | |
|     self::assertSame(["a" => 1, "b" => "2"], $cm->getValue("app.ec.array"));
 | |
|   }
 | |
| }
 | |
| 
 | |
| class MyClass0 {
 | |
|   function __construct() {
 | |
|   }
 | |
| }
 | |
| class MyClass1 {
 | |
|   public $first;
 | |
|   public $second;
 | |
| 
 | |
|   function __construct($first, $second) {
 | |
|     $this->first = $first;
 | |
|     $this->second = $second;
 | |
|   }
 | |
| }
 | |
| class MyClass2 {
 | |
|   public $options;
 | |
| 
 | |
|   function __construct(array $options) {
 | |
|     $this->options = $options;
 | |
|   }
 | |
| }
 | |
| 
 | |
| class DynConfigTest extends ArrayConfig {
 | |
|   function APP(): array {
 | |
|     return [
 | |
|       "dc" => [
 | |
|         "first" => 1,
 | |
|         "second" => 2,
 | |
|       ],
 | |
|       "ov" => "dyn",
 | |
|       "arr" => [5],
 | |
|       "dfirst_abs" => [["ref"], "app.dc.first"],
 | |
|       "dfirst_rel" => [["ref"], ".dc.first"],
 | |
|       "darr567" => [["aref"], ".arr", [6, 7]],
 | |
|     ];
 | |
|   }
 | |
| }
 | |
| class StaticConfigTest {
 | |
|   const APP = [
 | |
|     "sc" => [
 | |
|       "first" => "a",
 | |
|       "second" => "b",
 | |
|     ],
 | |
|     "ov" => "static",
 | |
|     "dsecond" => [["ref"], ".dc.second"],
 | |
|     "darr345" => [["pref"], ".arr", [3, 4]],
 | |
|     "d12" => [["refs"], ".dc", "first", "second"],
 | |
|   ];
 | |
| }
 |