wiki.techinc.nl/tests/phpunit/includes/config/ConfigFactoryTest.php

47 lines
1.2 KiB
PHP
Raw Normal View History

Make abstract Config class truly implementation-agnostic Follow up to I13baec0b6 ("Config: Add Config and GlobalConfig classes"): Config: * Rather than returning Status objects, Config::set will now throw an exception if an error is encountered * Config::factory was moved into it's own ConfigFactory class. * Since there are no more functions in it, Config was turned into an interface. GlobalConfig: * Remove $prefix args from Config::set and ::get. The idea of having an abstract Config class is to abstract some notion of configuration data from the particular way in which it is currently implemented (global variables). So the abstract base class has no business dealing with variable name prefixes. ** Instead GlobalVarConfig's implementations of get and set call getWithPrefix and setWithPrefix internally, which are now protected * Rename GlobalConfig to GlobalVarConfig, which makes it clearer that it isn't referring to the scope of the configuration value, but to the scope of the variable name which provides it. ConfigFactory: * ConfigFactory is where Config objects are registered, and later constructed. * Config objects are registered with a given name, and a callback factory function. This allows for implementations to construct the object with the parameters they want, and avoids the overhead of needing an entire class. ** The name 'main' is the default object returned by RequestContext::getConfig(), and is intended to be used by core. * This is a singleton class, the main instance can be obtained with: ConfigFactory::getDefaultInstance() In addition to the above: * $wgConfigClass was removed, and $wgConfigRegistry was introduced, which stores a name => callback. The name is to be what the Config instance is registered with, and the callback should return an implementation of Config. * Tests were written for the new ConfigFactory, and GlobalVarConfig's tests were improved. Co-Authored-By: Ori Livneh <ori@wikimedia.org> Co-Authored-By: Chad Horohoe <chadh@wikimedia.org> Co-Authored-By: Mattflaschen <mflaschen@wikimedia.org> Co-Authored-By: Parent5446 <tylerromeo@gmail.com> Co-Authored-By: Reedy <reedy@wikimedia.org> Co-Authored-By: Daniel Kinzler <daniel.kinzler@wikimedia.de> Change-Id: I5a5857fcfa07598ba4ce9ae5bbb4ce54a567d31e
2014-05-10 08:19:00 +00:00
<?php
class ConfigFactoryTest extends MediaWikiTestCase {
/**
* @covers ConfigFactory::register
*/
public function testRegister() {
$factory = new ConfigFactory();
$factory->register( 'unittest', 'GlobalVarConfig::newInstance' );
$this->assertTrue( true ); // No exception thrown
Make abstract Config class truly implementation-agnostic Follow up to I13baec0b6 ("Config: Add Config and GlobalConfig classes"): Config: * Rather than returning Status objects, Config::set will now throw an exception if an error is encountered * Config::factory was moved into it's own ConfigFactory class. * Since there are no more functions in it, Config was turned into an interface. GlobalConfig: * Remove $prefix args from Config::set and ::get. The idea of having an abstract Config class is to abstract some notion of configuration data from the particular way in which it is currently implemented (global variables). So the abstract base class has no business dealing with variable name prefixes. ** Instead GlobalVarConfig's implementations of get and set call getWithPrefix and setWithPrefix internally, which are now protected * Rename GlobalConfig to GlobalVarConfig, which makes it clearer that it isn't referring to the scope of the configuration value, but to the scope of the variable name which provides it. ConfigFactory: * ConfigFactory is where Config objects are registered, and later constructed. * Config objects are registered with a given name, and a callback factory function. This allows for implementations to construct the object with the parameters they want, and avoids the overhead of needing an entire class. ** The name 'main' is the default object returned by RequestContext::getConfig(), and is intended to be used by core. * This is a singleton class, the main instance can be obtained with: ConfigFactory::getDefaultInstance() In addition to the above: * $wgConfigClass was removed, and $wgConfigRegistry was introduced, which stores a name => callback. The name is to be what the Config instance is registered with, and the callback should return an implementation of Config. * Tests were written for the new ConfigFactory, and GlobalVarConfig's tests were improved. Co-Authored-By: Ori Livneh <ori@wikimedia.org> Co-Authored-By: Chad Horohoe <chadh@wikimedia.org> Co-Authored-By: Mattflaschen <mflaschen@wikimedia.org> Co-Authored-By: Parent5446 <tylerromeo@gmail.com> Co-Authored-By: Reedy <reedy@wikimedia.org> Co-Authored-By: Daniel Kinzler <daniel.kinzler@wikimedia.de> Change-Id: I5a5857fcfa07598ba4ce9ae5bbb4ce54a567d31e
2014-05-10 08:19:00 +00:00
$this->setExpectedException( 'InvalidArgumentException' );
$factory->register( 'invalid', 'Invalid callback' );
}
/**
* @covers ConfigFactory::makeConfig
*/
public function testMakeConfig() {
$factory = new ConfigFactory();
$factory->register( 'unittest', 'GlobalVarConfig::newInstance' );
$conf = $factory->makeConfig( 'unittest' );
$this->assertInstanceOf( 'Config', $conf );
}
/**
* @covers ConfigFactory::makeConfig
*/
public function testMakeConfigWithNoBuilders() {
$factory = new ConfigFactory();
$this->setExpectedException( 'ConfigException' );
$factory->makeConfig( 'nobuilderregistered' );
}
/**
* @covers ConfigFactory::makeConfig
*/
public function testMakeConfigWithInvalidCallback() {
$factory = new ConfigFactory();
$factory->register( 'unittest', function () {
Make abstract Config class truly implementation-agnostic Follow up to I13baec0b6 ("Config: Add Config and GlobalConfig classes"): Config: * Rather than returning Status objects, Config::set will now throw an exception if an error is encountered * Config::factory was moved into it's own ConfigFactory class. * Since there are no more functions in it, Config was turned into an interface. GlobalConfig: * Remove $prefix args from Config::set and ::get. The idea of having an abstract Config class is to abstract some notion of configuration data from the particular way in which it is currently implemented (global variables). So the abstract base class has no business dealing with variable name prefixes. ** Instead GlobalVarConfig's implementations of get and set call getWithPrefix and setWithPrefix internally, which are now protected * Rename GlobalConfig to GlobalVarConfig, which makes it clearer that it isn't referring to the scope of the configuration value, but to the scope of the variable name which provides it. ConfigFactory: * ConfigFactory is where Config objects are registered, and later constructed. * Config objects are registered with a given name, and a callback factory function. This allows for implementations to construct the object with the parameters they want, and avoids the overhead of needing an entire class. ** The name 'main' is the default object returned by RequestContext::getConfig(), and is intended to be used by core. * This is a singleton class, the main instance can be obtained with: ConfigFactory::getDefaultInstance() In addition to the above: * $wgConfigClass was removed, and $wgConfigRegistry was introduced, which stores a name => callback. The name is to be what the Config instance is registered with, and the callback should return an implementation of Config. * Tests were written for the new ConfigFactory, and GlobalVarConfig's tests were improved. Co-Authored-By: Ori Livneh <ori@wikimedia.org> Co-Authored-By: Chad Horohoe <chadh@wikimedia.org> Co-Authored-By: Mattflaschen <mflaschen@wikimedia.org> Co-Authored-By: Parent5446 <tylerromeo@gmail.com> Co-Authored-By: Reedy <reedy@wikimedia.org> Co-Authored-By: Daniel Kinzler <daniel.kinzler@wikimedia.de> Change-Id: I5a5857fcfa07598ba4ce9ae5bbb4ce54a567d31e
2014-05-10 08:19:00 +00:00
return true; // Not a Config object
} );
Make abstract Config class truly implementation-agnostic Follow up to I13baec0b6 ("Config: Add Config and GlobalConfig classes"): Config: * Rather than returning Status objects, Config::set will now throw an exception if an error is encountered * Config::factory was moved into it's own ConfigFactory class. * Since there are no more functions in it, Config was turned into an interface. GlobalConfig: * Remove $prefix args from Config::set and ::get. The idea of having an abstract Config class is to abstract some notion of configuration data from the particular way in which it is currently implemented (global variables). So the abstract base class has no business dealing with variable name prefixes. ** Instead GlobalVarConfig's implementations of get and set call getWithPrefix and setWithPrefix internally, which are now protected * Rename GlobalConfig to GlobalVarConfig, which makes it clearer that it isn't referring to the scope of the configuration value, but to the scope of the variable name which provides it. ConfigFactory: * ConfigFactory is where Config objects are registered, and later constructed. * Config objects are registered with a given name, and a callback factory function. This allows for implementations to construct the object with the parameters they want, and avoids the overhead of needing an entire class. ** The name 'main' is the default object returned by RequestContext::getConfig(), and is intended to be used by core. * This is a singleton class, the main instance can be obtained with: ConfigFactory::getDefaultInstance() In addition to the above: * $wgConfigClass was removed, and $wgConfigRegistry was introduced, which stores a name => callback. The name is to be what the Config instance is registered with, and the callback should return an implementation of Config. * Tests were written for the new ConfigFactory, and GlobalVarConfig's tests were improved. Co-Authored-By: Ori Livneh <ori@wikimedia.org> Co-Authored-By: Chad Horohoe <chadh@wikimedia.org> Co-Authored-By: Mattflaschen <mflaschen@wikimedia.org> Co-Authored-By: Parent5446 <tylerromeo@gmail.com> Co-Authored-By: Reedy <reedy@wikimedia.org> Co-Authored-By: Daniel Kinzler <daniel.kinzler@wikimedia.de> Change-Id: I5a5857fcfa07598ba4ce9ae5bbb4ce54a567d31e
2014-05-10 08:19:00 +00:00
$this->setExpectedException( 'UnexpectedValueException' );
$factory->makeConfig( 'unittest' );
}
}