PageRenderTime 40ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/ZendTest/ModuleManager/Listener/ConfigListenerTest.php

https://bitbucket.org/gencer/zf2
PHP | 386 lines | 289 code | 70 blank | 27 comment | 2 complexity | c4f611e2309d1988d8eb076ef63b794f MD5 | raw file
  1. <?php
  2. /**
  3. * Zend Framework (http://framework.zend.com/)
  4. *
  5. * @link http://github.com/zendframework/zf2 for the canonical source repository
  6. * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
  7. * @license http://framework.zend.com/license/new-bsd New BSD License
  8. */
  9. namespace ZendTest\ModuleManager\Listener;
  10. use ArrayObject;
  11. use InvalidArgumentException;
  12. use PHPUnit_Framework_TestCase as TestCase;
  13. use Zend\Loader\AutoloaderFactory;
  14. use Zend\Loader\ModuleAutoloader;
  15. use Zend\ModuleManager\Listener\ConfigListener;
  16. use Zend\ModuleManager\Listener\ModuleResolverListener;
  17. use Zend\ModuleManager\Listener\ListenerOptions;
  18. use Zend\ModuleManager\ModuleManager;
  19. use Zend\ModuleManager\ModuleEvent;
  20. class ConfigListenerTest extends TestCase
  21. {
  22. public function setUp()
  23. {
  24. $this->tmpdir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'zend_module_cache_dir';
  25. @mkdir($this->tmpdir);
  26. $this->configCache = $this->tmpdir . DIRECTORY_SEPARATOR . 'config.cache.php';
  27. // Store original autoloaders
  28. $this->loaders = spl_autoload_functions();
  29. if (!is_array($this->loaders)) {
  30. // spl_autoload_functions does not return empty array when no
  31. // autoloaders registered...
  32. $this->loaders = array();
  33. }
  34. // Store original include_path
  35. $this->includePath = get_include_path();
  36. $autoloader = new ModuleAutoloader(array(
  37. dirname(__DIR__) . '/TestAsset',
  38. ));
  39. $autoloader->register();
  40. $this->moduleManager = new ModuleManager(array());
  41. $this->moduleManager->getEventManager()->attach(ModuleEvent::EVENT_LOAD_MODULE_RESOLVE, new ModuleResolverListener, 1000);
  42. }
  43. public function tearDown()
  44. {
  45. $file = glob($this->tmpdir . DIRECTORY_SEPARATOR . '*');
  46. @unlink($file[0]); // change this if there's ever > 1 file
  47. @rmdir($this->tmpdir);
  48. // Restore original autoloaders
  49. AutoloaderFactory::unregisterAutoloaders();
  50. $loaders = spl_autoload_functions();
  51. if (is_array($loaders)) {
  52. foreach ($loaders as $loader) {
  53. spl_autoload_unregister($loader);
  54. }
  55. }
  56. foreach ($this->loaders as $loader) {
  57. spl_autoload_register($loader);
  58. }
  59. // Restore original include_path
  60. set_include_path($this->includePath);
  61. }
  62. public function testMultipleConfigsAreMerged()
  63. {
  64. $configListener = new ConfigListener;
  65. $moduleManager = $this->moduleManager;
  66. $configListener->attach($moduleManager->getEventManager());
  67. $moduleManager->setModules(array('SomeModule', 'ListenerTestModule'));
  68. $moduleManager->loadModules();
  69. $config = $configListener->getMergedConfig(false);
  70. $this->assertSame(2, count($config));
  71. $this->assertSame('test', $config['listener']);
  72. $this->assertSame('thing', $config['some']);
  73. $configObject = $configListener->getMergedConfig();
  74. $this->assertInstanceOf('Zend\Config\Config', $configObject);
  75. }
  76. public function testCanCacheMergedConfig()
  77. {
  78. $options = new ListenerOptions(array(
  79. 'cache_dir' => $this->tmpdir,
  80. 'config_cache_enabled' => true,
  81. ));
  82. $configListener = new ConfigListener($options);
  83. $moduleManager = $this->moduleManager;
  84. $moduleManager->setModules(array('SomeModule', 'ListenerTestModule'));
  85. $configListener->attach($moduleManager->getEventManager());
  86. $moduleManager->loadModules(); // This should cache the config
  87. $modules = $moduleManager->getLoadedModules();
  88. $this->assertTrue($modules['ListenerTestModule']->getConfigCalled);
  89. // Now we check to make sure it uses the config and doesn't hit
  90. // the module objects getConfig() method(s)
  91. $moduleManager = new ModuleManager(array('SomeModule', 'ListenerTestModule'));
  92. $moduleManager->getEventManager()->attach(ModuleEvent::EVENT_LOAD_MODULE_RESOLVE, new ModuleResolverListener, 1000);
  93. $configListener = new ConfigListener($options);
  94. $configListener->attach($moduleManager->getEventManager());
  95. $moduleManager->loadModules();
  96. $modules = $moduleManager->getLoadedModules();
  97. $this->assertFalse($modules['ListenerTestModule']->getConfigCalled);
  98. }
  99. public function testBadConfigValueThrowsInvalidArgumentException()
  100. {
  101. $this->setExpectedException('InvalidArgumentException');
  102. $configListener = new ConfigListener;
  103. $moduleManager = $this->moduleManager;
  104. $moduleManager->setModules(array('BadConfigModule', 'SomeModule'));
  105. $configListener->attach($moduleManager->getEventManager());
  106. $moduleManager->loadModules();
  107. }
  108. public function testBadGlobPathTrowsInvalidArgumentException()
  109. {
  110. $this->setExpectedException('InvalidArgumentException');
  111. $configListener = new ConfigListener;
  112. $configListener->addConfigGlobPath(array('asd'));
  113. }
  114. public function testBadGlobPathArrayTrowsInvalidArgumentException()
  115. {
  116. $this->setExpectedException('InvalidArgumentException');
  117. $configListener = new ConfigListener;
  118. $configListener->addConfigGlobPaths('asd');
  119. }
  120. public function testBadStaticPathArrayTrowsInvalidArgumentException()
  121. {
  122. $this->setExpectedException('InvalidArgumentException');
  123. $configListener = new ConfigListener;
  124. $configListener->addConfigStaticPaths('asd');
  125. }
  126. public function testCanMergeConfigFromGlob()
  127. {
  128. $configListener = new ConfigListener;
  129. $configListener->addConfigGlobPath(__DIR__ . '/_files/good/*.{ini,php,xml}');
  130. $moduleManager = $this->moduleManager;
  131. $moduleManager->setModules(array('SomeModule'));
  132. $configListener->attach($moduleManager->getEventManager());
  133. $moduleManager->loadModules();
  134. $configObjectCheck = $configListener->getMergedConfig();
  135. // Test as object
  136. $configObject = $configListener->getMergedConfig();
  137. $this->assertSame(spl_object_hash($configObjectCheck), spl_object_hash($configObject));
  138. $this->assertSame('loaded', $configObject->ini);
  139. $this->assertSame('loaded', $configObject->php);
  140. $this->assertSame('loaded', $configObject->xml);
  141. // Test as array
  142. $config = $configListener->getMergedConfig(false);
  143. $this->assertSame('loaded', $config['ini']);
  144. $this->assertSame('loaded', $config['php']);
  145. $this->assertSame('loaded', $config['xml']);
  146. }
  147. public function testCanMergeConfigFromStaticPath()
  148. {
  149. $configListener = new ConfigListener;
  150. $configListener->addConfigStaticPath(__DIR__ . '/_files/good/config.ini');
  151. $configListener->addConfigStaticPath(__DIR__ . '/_files/good/config.php');
  152. $configListener->addConfigStaticPath(__DIR__ . '/_files/good/config.xml');
  153. $moduleManager = $this->moduleManager;
  154. $moduleManager->setModules(array('SomeModule'));
  155. $moduleManager->getEventManager()->attachAggregate($configListener);
  156. $moduleManager->loadModules();
  157. $configObjectCheck = $configListener->getMergedConfig();
  158. // Test as object
  159. $configObject = $configListener->getMergedConfig();
  160. $this->assertSame(spl_object_hash($configObjectCheck), spl_object_hash($configObject));
  161. $this->assertSame('loaded', $configObject->ini);
  162. $this->assertSame('loaded', $configObject->php);
  163. $this->assertSame('loaded', $configObject->xml);
  164. // Test as array
  165. $config = $configListener->getMergedConfig(false);
  166. $this->assertSame('loaded', $config['ini']);
  167. $this->assertSame('loaded', $config['php']);
  168. $this->assertSame('loaded', $config['xml']);
  169. }
  170. public function testCanMergeConfigFromStaticPaths()
  171. {
  172. $configListener = new ConfigListener;
  173. $configListener->addConfigStaticPaths(array(
  174. __DIR__ . '/_files/good/config.ini',
  175. __DIR__ . '/_files/good/config.php',
  176. __DIR__ . '/_files/good/config.xml')
  177. );
  178. $moduleManager = $this->moduleManager;
  179. $moduleManager->setModules(array('SomeModule'));
  180. $moduleManager->getEventManager()->attachAggregate($configListener);
  181. $moduleManager->loadModules();
  182. $configObjectCheck = $configListener->getMergedConfig();
  183. // Test as object
  184. $configObject = $configListener->getMergedConfig();
  185. $this->assertSame(spl_object_hash($configObjectCheck), spl_object_hash($configObject));
  186. $this->assertSame('loaded', $configObject->ini);
  187. $this->assertSame('loaded', $configObject->php);
  188. $this->assertSame('loaded', $configObject->xml);
  189. // Test as array
  190. $config = $configListener->getMergedConfig(false);
  191. $this->assertSame('loaded', $config['ini']);
  192. $this->assertSame('loaded', $config['php']);
  193. $this->assertSame('loaded', $config['xml']);
  194. }
  195. public function testCanCacheMergedConfigFromGlob()
  196. {
  197. $options = new ListenerOptions(array(
  198. 'cache_dir' => $this->tmpdir,
  199. 'config_cache_enabled' => true,
  200. ));
  201. $configListener = new ConfigListener($options);
  202. $configListener->addConfigGlobPath(__DIR__ . '/_files/good/*.{ini,php,xml}');
  203. $moduleManager = $this->moduleManager;
  204. $moduleManager->setModules(array('SomeModule'));
  205. $moduleManager->getEventManager()->attachAggregate($configListener);
  206. $moduleManager->loadModules();
  207. $configObjectFromGlob = $configListener->getMergedConfig();
  208. // This time, don't add the glob path
  209. $configListener = new ConfigListener($options);
  210. $moduleManager = new ModuleManager(array('SomeModule'));
  211. $moduleManager->getEventManager()->attach(ModuleEvent::EVENT_LOAD_MODULE_RESOLVE, new ModuleResolverListener, 1000);
  212. $moduleManager->getEventManager()->attachAggregate($configListener);
  213. $moduleManager->loadModules();
  214. // Check if values from glob object and cache object are the same
  215. $configObjectFromCache = $configListener->getMergedConfig();
  216. $this->assertNotNull($configObjectFromGlob->ini);
  217. $this->assertSame($configObjectFromGlob->ini, $configObjectFromCache->ini);
  218. $this->assertNotNull($configObjectFromGlob->php);
  219. $this->assertSame($configObjectFromGlob->php, $configObjectFromCache->php);
  220. $this->assertNotNull($configObjectFromGlob->xml);
  221. $this->assertSame($configObjectFromGlob->xml, $configObjectFromCache->xml);
  222. }
  223. public function testCanCacheMergedConfigFromStatic()
  224. {
  225. $options = new ListenerOptions(array(
  226. 'cache_dir' => $this->tmpdir,
  227. 'config_cache_enabled' => true,
  228. ));
  229. $configListener = new ConfigListener($options);
  230. $configListener->addConfigStaticPaths(array(
  231. __DIR__ . '/_files/good/config.ini',
  232. __DIR__ . '/_files/good/config.php',
  233. __DIR__ . '/_files/good/config.xml')
  234. );
  235. $moduleManager = $this->moduleManager;
  236. $moduleManager->setModules(array('SomeModule'));
  237. $moduleManager->getEventManager()->attachAggregate($configListener);
  238. $moduleManager->loadModules();
  239. $configObjectFromGlob = $configListener->getMergedConfig();
  240. // This time, don't add the glob path
  241. $configListener = new ConfigListener($options);
  242. $moduleManager = new ModuleManager(array('SomeModule'));
  243. $moduleManager->getEventManager()->attach(ModuleEvent::EVENT_LOAD_MODULE_RESOLVE, new ModuleResolverListener, 1000);
  244. $moduleManager->getEventManager()->attachAggregate($configListener);
  245. $moduleManager->loadModules();
  246. // Check if values from glob object and cache object are the same
  247. $configObjectFromCache = $configListener->getMergedConfig();
  248. $this->assertNotNull($configObjectFromGlob->ini);
  249. $this->assertSame($configObjectFromGlob->ini, $configObjectFromCache->ini);
  250. $this->assertNotNull($configObjectFromGlob->php);
  251. $this->assertSame($configObjectFromGlob->php, $configObjectFromCache->php);
  252. $this->assertNotNull($configObjectFromGlob->xml);
  253. $this->assertSame($configObjectFromGlob->xml, $configObjectFromCache->xml);
  254. }
  255. public function testCanMergeConfigFromArrayOfGlobs()
  256. {
  257. $configListener = new ConfigListener;
  258. $configListener->addConfigGlobPaths(new ArrayObject(array(
  259. __DIR__ . '/_files/good/*.ini',
  260. __DIR__ . '/_files/good/*.php',
  261. __DIR__ . '/_files/good/*.xml',
  262. )));
  263. $moduleManager = $this->moduleManager;
  264. $moduleManager->setModules(array('SomeModule'));
  265. $moduleManager->getEventManager()->attachAggregate($configListener);
  266. $moduleManager->loadModules();
  267. // Test as object
  268. $configObject = $configListener->getMergedConfig();
  269. $this->assertSame('loaded', $configObject->ini);
  270. $this->assertSame('loaded', $configObject->php);
  271. $this->assertSame('loaded', $configObject->xml);
  272. }
  273. public function testCanMergeConfigFromArrayOfStatic()
  274. {
  275. $configListener = new ConfigListener;
  276. $configListener->addConfigStaticPaths(new ArrayObject(array(
  277. __DIR__ . '/_files/good/config.ini',
  278. __DIR__ . '/_files/good/config.php',
  279. __DIR__ . '/_files/good/config.xml',
  280. )));
  281. $moduleManager = $this->moduleManager;
  282. $moduleManager->setModules(array('SomeModule'));
  283. $moduleManager->getEventManager()->attachAggregate($configListener);
  284. $moduleManager->loadModules();
  285. // Test as object
  286. $configObject = $configListener->getMergedConfig();
  287. $this->assertSame('loaded', $configObject->ini);
  288. $this->assertSame('loaded', $configObject->php);
  289. $this->assertSame('loaded', $configObject->xml);
  290. }
  291. public function testMergesWithMergeAndReplaceBehavior()
  292. {
  293. $configListener = new ConfigListener();
  294. $moduleManager = $this->moduleManager;
  295. $moduleManager->setModules(array('SomeModule'));
  296. $configListener->addConfigStaticPaths(array(
  297. __DIR__ . '/_files/good/merge1.php',
  298. __DIR__ . '/_files/good/merge2.php',
  299. ));
  300. $moduleManager->getEventManager()->attachAggregate($configListener);
  301. $moduleManager->loadModules();
  302. $mergedConfig = $configListener->getMergedConfig(false);
  303. $this->assertSame(array('foo', 'bar'), $mergedConfig['indexed']);
  304. $this->assertSame('bar', $mergedConfig['keyed']);
  305. }
  306. public function testConfigListenerFunctionsAsAggregateListener()
  307. {
  308. $configListener = new ConfigListener;
  309. $moduleManager = $this->moduleManager;
  310. $this->assertEquals(2, count($moduleManager->getEventManager()->getEvents()));
  311. $configListener->attach($moduleManager->getEventManager());
  312. $this->assertEquals(4, count($moduleManager->getEventManager()->getEvents()));
  313. $configListener->detach($moduleManager->getEventManager());
  314. $this->assertEquals(2, count($moduleManager->getEventManager()->getEvents()));
  315. }
  316. }