ModuleContainerTest.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. <?php
  2. namespace Codeception\Lib;
  3. use Codeception\Lib\Interfaces\ConflictsWithModule;
  4. use Codeception\Lib\Interfaces\DependsOnModule;
  5. use Codeception\Test\Unit;
  6. use Codeception\Util\Stub;
  7. // @codingStandardsIgnoreFile
  8. class ModuleContainerTest extends Unit
  9. {
  10. use \Codeception\Specify;
  11. /**
  12. * @var ModuleContainer
  13. */
  14. protected $moduleContainer;
  15. protected function setUp()
  16. {
  17. $this->moduleContainer = new ModuleContainer(Stub::make('Codeception\Lib\Di'), []);
  18. }
  19. protected function tearDown()
  20. {
  21. \Codeception\Module\UniversalFramework::$includeInheritedActions = true;
  22. \Codeception\Module\UniversalFramework::$onlyActions = [];
  23. \Codeception\Module\UniversalFramework::$excludeActions = [];
  24. \Codeception\Module\UniversalFramework::$aliases = [];
  25. }
  26. /**
  27. * @group core
  28. * @throws \Codeception\Exception\ConfigurationException
  29. */
  30. public function testCreateModule()
  31. {
  32. $module = $this->moduleContainer->create('EmulateModuleHelper');
  33. $this->assertInstanceOf('Codeception\Module\EmulateModuleHelper', $module);
  34. $module = $this->moduleContainer->create('Codeception\Module\EmulateModuleHelper');
  35. $this->assertInstanceOf('Codeception\Module\EmulateModuleHelper', $module);
  36. $this->assertTrue($this->moduleContainer->hasModule('EmulateModuleHelper'));
  37. $this->assertInstanceOf(
  38. 'Codeception\Module\EmulateModuleHelper',
  39. $this->moduleContainer->getModule('EmulateModuleHelper')
  40. );
  41. }
  42. /**
  43. * @group core
  44. */
  45. public function testActions()
  46. {
  47. $this->moduleContainer->create('EmulateModuleHelper');
  48. $actions = $this->moduleContainer->getActions();
  49. $this->assertArrayHasKey('seeEquals', $actions);
  50. $this->assertEquals('EmulateModuleHelper', $actions['seeEquals']);
  51. }
  52. /**
  53. * @group core
  54. */
  55. public function testActionsInExtendedModule()
  56. {
  57. $this->moduleContainer->create('\Codeception\Module\UniversalFramework');
  58. $actions = $this->moduleContainer->getActions();
  59. $this->assertArrayHasKey('amOnPage', $actions);
  60. $this->assertArrayHasKey('see', $actions);
  61. $this->assertArrayHasKey('click', $actions);
  62. }
  63. /**
  64. * @group core
  65. */
  66. public function testActionsInExtendedButNotInheritedModule()
  67. {
  68. \Codeception\Module\UniversalFramework::$includeInheritedActions = false;
  69. $this->moduleContainer->create('\Codeception\Module\UniversalFramework');
  70. $actions = $this->moduleContainer->getActions();
  71. $this->assertArrayNotHasKey('amOnPage', $actions);
  72. $this->assertArrayNotHasKey('see', $actions);
  73. $this->assertArrayNotHasKey('click', $actions);
  74. $this->assertArrayHasKey('useUniversalFramework', $actions);
  75. }
  76. /**
  77. * @group core
  78. */
  79. public function testExplicitlySetActionsOnNotInherited()
  80. {
  81. \Codeception\Module\UniversalFramework::$includeInheritedActions = false;
  82. \Codeception\Module\UniversalFramework::$onlyActions = ['see'];
  83. $this->moduleContainer->create('\Codeception\Module\UniversalFramework');
  84. $actions = $this->moduleContainer->getActions();
  85. $this->assertArrayNotHasKey('amOnPage', $actions);
  86. $this->assertArrayHasKey('see', $actions);
  87. $this->assertArrayNotHasKey('click', $actions);
  88. }
  89. /**
  90. * @group core
  91. */
  92. public function testActionsExplicitlySetForNotInheritedModule()
  93. {
  94. \Codeception\Module\UniversalFramework::$onlyActions = ['see'];
  95. $this->moduleContainer->create('\Codeception\Module\UniversalFramework');
  96. $actions = $this->moduleContainer->getActions();
  97. $this->assertArrayNotHasKey('amOnPage', $actions);
  98. $this->assertArrayHasKey('see', $actions);
  99. }
  100. /**
  101. * @group core
  102. */
  103. public function testCreateModuleWithoutRequiredFields()
  104. {
  105. $this->setExpectedException('\Codeception\Exception\ModuleConfigException');
  106. $this->moduleContainer->create('Codeception\Lib\StubModule');
  107. }
  108. /**
  109. * @group core
  110. */
  111. public function testCreateModuleWithCorrectConfig()
  112. {
  113. $config = [
  114. 'modules' => [
  115. 'config' => [
  116. 'Codeception\Lib\StubModule' => [
  117. 'firstField' => 'firstValue',
  118. 'secondField' => 'secondValue',
  119. ]
  120. ]
  121. ]
  122. ];
  123. $this->moduleContainer = new ModuleContainer(Stub::make('Codeception\Lib\Di'), $config);
  124. $module = $this->moduleContainer->create('Codeception\Lib\StubModule');
  125. $this->assertEquals('firstValue', $module->_getFirstField());
  126. $this->assertEquals('secondValue', $module->_getSecondField());
  127. }
  128. /**
  129. * @group core
  130. */
  131. public function testReconfigureModule()
  132. {
  133. $config = [
  134. 'modules' => [
  135. 'config' => [
  136. 'Codeception\Lib\StubModule' => [
  137. 'firstField' => 'firstValue',
  138. 'secondField' => 'secondValue',
  139. ]
  140. ]
  141. ]
  142. ];
  143. $this->moduleContainer = new ModuleContainer(Stub::make('Codeception\Lib\Di'), $config);
  144. $module = $this->moduleContainer->create('Codeception\Lib\StubModule');
  145. $module->_reconfigure(['firstField' => '1st', 'secondField' => '2nd']);
  146. $this->assertEquals('1st', $module->_getFirstField());
  147. $this->assertEquals('2nd', $module->_getSecondField());
  148. $module->_resetConfig();
  149. $this->assertEquals('firstValue', $module->_getFirstField());
  150. $this->assertEquals('secondValue', $module->_getSecondField());
  151. }
  152. public function testConflictsByModuleName()
  153. {
  154. $this->setExpectedException('Codeception\Exception\ModuleConflictException');
  155. $this->moduleContainer->create('Codeception\Lib\ConflictedModule');
  156. $this->moduleContainer->create('Cli');
  157. $this->moduleContainer->validateConflicts();
  158. }
  159. public function testConflictsByClass()
  160. {
  161. $this->setExpectedException('Codeception\Exception\ModuleConflictException');
  162. $this->moduleContainer->create('Codeception\Lib\ConflictedModule2');
  163. $this->moduleContainer->create('Cli');
  164. $this->moduleContainer->validateConflicts();
  165. }
  166. public function testConflictsByInterface()
  167. {
  168. $this->setExpectedException('Codeception\Exception\ModuleConflictException');
  169. $this->moduleContainer->create('Codeception\Lib\ConflictedModule3');
  170. $this->moduleContainer->create('Symfony2');
  171. $this->moduleContainer->validateConflicts();
  172. }
  173. public function testConflictsByWebInterface()
  174. {
  175. $this->setExpectedException('Codeception\Exception\ModuleConflictException');
  176. $this->moduleContainer->create('Laravel5');
  177. $this->moduleContainer->create('Symfony2');
  178. $this->moduleContainer->validateConflicts();
  179. }
  180. public function testConflictsForREST()
  181. {
  182. $config = ['modules' =>
  183. ['config' => [
  184. 'REST' => [
  185. 'depends' => 'ZF1',
  186. ]
  187. ]
  188. ]
  189. ];
  190. $this->moduleContainer = new ModuleContainer(Stub::make('Codeception\Lib\Di'), $config);
  191. $this->moduleContainer->create('ZF1');
  192. $this->moduleContainer->create('REST');
  193. $this->moduleContainer->validateConflicts();
  194. }
  195. public function testConflictsOnDependentModules()
  196. {
  197. $config = ['modules' =>
  198. ['config' => [
  199. 'WebDriver' => ['url' => 'localhost', 'browser' => 'firefox'],
  200. 'REST' => [
  201. 'depends' => 'PhpBrowser',
  202. ]
  203. ]
  204. ]
  205. ];
  206. $this->moduleContainer = new ModuleContainer(Stub::make('Codeception\Lib\Di'), $config);
  207. $this->moduleContainer->create('WebDriver');
  208. $this->moduleContainer->create('REST');
  209. $this->moduleContainer->validateConflicts();
  210. }
  211. public function testNoConflictsForPartedModules()
  212. {
  213. $config = ['modules' =>
  214. ['config' => [
  215. 'Laravel5' => [
  216. 'part' => 'ORM',
  217. ]
  218. ]
  219. ]
  220. ];
  221. $this->moduleContainer = new ModuleContainer(Stub::make('Codeception\Lib\Di'), $config);
  222. $this->moduleContainer->create('Laravel5');
  223. $this->moduleContainer->create('Symfony2');
  224. $this->moduleContainer->validateConflicts();
  225. }
  226. public function testModuleDependenciesFail()
  227. {
  228. $this->setExpectedException('Codeception\Exception\ModuleRequireException');
  229. $this->moduleContainer->create('Codeception\Lib\DependencyModule');
  230. }
  231. public function testModuleDependencies()
  232. {
  233. $config = ['modules' => [
  234. 'enabled' => ['Codeception\Lib\DependencyModule'],
  235. 'config' => [
  236. 'Codeception\Lib\DependencyModule' => [
  237. 'depends' => 'Codeception\Lib\ConflictedModule'
  238. ]
  239. ]
  240. ]];
  241. $this->moduleContainer = new ModuleContainer(Stub::make('Codeception\Lib\Di'), $config);
  242. $this->moduleContainer->create('Codeception\Lib\DependencyModule');
  243. $this->moduleContainer->hasModule('\Codeception\Lib\DependencyModule');
  244. }
  245. public function testModuleParts1()
  246. {
  247. $config = ['modules' => [
  248. 'enabled' => ['\Codeception\Lib\PartedModule'],
  249. 'config' => [
  250. '\Codeception\Lib\PartedModule' => [
  251. 'part' => 'one'
  252. ]
  253. ]
  254. ]
  255. ];
  256. $this->moduleContainer = new ModuleContainer(Stub::make('Codeception\Lib\Di'), $config);
  257. $this->moduleContainer->create('\Codeception\Lib\PartedModule');
  258. $actions = $this->moduleContainer->getActions();
  259. $this->assertArrayHasKey('partOne', $actions);
  260. $this->assertArrayNotHasKey('partTwo', $actions);
  261. }
  262. public function testModuleParts2()
  263. {
  264. $config = ['modules' => [
  265. 'enabled' => ['\Codeception\Lib\PartedModule'],
  266. 'config' => ['\Codeception\Lib\PartedModule' => [
  267. 'part' => ['Two']
  268. ]
  269. ]
  270. ]
  271. ];
  272. $this->moduleContainer = new ModuleContainer(Stub::make('Codeception\Lib\Di'), $config);
  273. $this->moduleContainer->create('\Codeception\Lib\PartedModule');
  274. $actions = $this->moduleContainer->getActions();
  275. $this->assertArrayHasKey('partTwo', $actions);
  276. $this->assertArrayNotHasKey('partOne', $actions);
  277. }
  278. public function testShortConfigParts()
  279. {
  280. $config = [
  281. 'modules' => [
  282. 'enabled' => [
  283. ['\Codeception\Lib\PartedModule' => [
  284. 'part' => 'one'
  285. ]
  286. ]
  287. ],
  288. ]
  289. ];
  290. $this->moduleContainer = new ModuleContainer(Stub::make('Codeception\Lib\Di'), $config);
  291. $this->moduleContainer->create('\Codeception\Lib\PartedModule');
  292. $actions = $this->moduleContainer->getActions();
  293. $this->assertArrayHasKey('partOne', $actions);
  294. $this->assertArrayNotHasKey('partTwo', $actions);
  295. }
  296. public function testShortConfigFormat()
  297. {
  298. $config = [
  299. 'modules' =>
  300. ['enabled' => [
  301. ['Codeception\Lib\StubModule' => [
  302. 'firstField' => 'firstValue',
  303. 'secondField' => 'secondValue',
  304. ]
  305. ]
  306. ]
  307. ]
  308. ];
  309. $this->moduleContainer = new ModuleContainer(Stub::make('Codeception\Lib\Di'), $config);
  310. $module = $this->moduleContainer->create('Codeception\Lib\StubModule');
  311. $this->assertEquals('firstValue', $module->_getFirstField());
  312. $this->assertEquals('secondValue', $module->_getSecondField());
  313. }
  314. public function testShortConfigDependencies()
  315. {
  316. $config = ['modules' => [
  317. 'enabled' => [['Codeception\Lib\DependencyModule' => [
  318. 'depends' => 'Codeception\Lib\ConflictedModule'
  319. ]]],
  320. ]];
  321. $this->moduleContainer = new ModuleContainer(Stub::make('Codeception\Lib\Di'), $config);
  322. $this->moduleContainer->create('Codeception\Lib\DependencyModule');
  323. $this->moduleContainer->hasModule('\Codeception\Lib\DependencyModule');
  324. }
  325. public function testInjectModuleIntoHelper()
  326. {
  327. $config = ['modules' => [
  328. 'enabled' => ['Codeception\Lib\HelperModule'],
  329. ]];
  330. $this->moduleContainer = new ModuleContainer(Stub::make('Codeception\Lib\Di'), $config);
  331. $this->moduleContainer->create('Codeception\Lib\HelperModule');
  332. $this->moduleContainer->hasModule('Codeception\Lib\HelperModule');
  333. }
  334. }
  335. class StubModule extends \Codeception\Module
  336. {
  337. protected $requiredFields = [
  338. 'firstField',
  339. 'secondField',
  340. ];
  341. public function _getFirstField()
  342. {
  343. return $this->config['firstField'];
  344. }
  345. public function _getSecondField()
  346. {
  347. return $this->config['secondField'];
  348. }
  349. }
  350. class HelperModule extends \Codeception\Module
  351. {
  352. public function _inject(ConflictedModule $module)
  353. {
  354. $this->module = $module;
  355. }
  356. }
  357. class ConflictedModule extends \Codeception\Module implements ConflictsWithModule
  358. {
  359. public function _conflicts()
  360. {
  361. return 'Cli';
  362. }
  363. }
  364. class ConflictedModule2 extends \Codeception\Module implements ConflictsWithModule
  365. {
  366. public function _conflicts()
  367. {
  368. return '\Codeception\Module\Cli';
  369. }
  370. }
  371. class ConflictedModule3 extends \Codeception\Module implements ConflictsWithModule
  372. {
  373. public function _conflicts()
  374. {
  375. return 'Codeception\Lib\Interfaces\Web';
  376. }
  377. }
  378. class DependencyModule extends \Codeception\Module implements DependsOnModule
  379. {
  380. public function _depends()
  381. {
  382. return ['Codeception\Lib\ConflictedModule' => 'Error message'];
  383. }
  384. public function _inject()
  385. {
  386. }
  387. }
  388. class PartedModule extends \Codeception\Module implements \Codeception\Lib\Interfaces\PartedModule
  389. {
  390. public function _parts()
  391. {
  392. return ['one'];
  393. }
  394. /**
  395. * @part one
  396. */
  397. public function partOne()
  398. {
  399. }
  400. /**
  401. * @part two
  402. */
  403. public function partTwo()
  404. {
  405. }
  406. }