Commit | Line | Data |
---|---|---|
6a488035 TO |
1 | <?php |
2 | ||
aba1cd8b EM |
3 | /** |
4 | * Class CRM_Extension_Manager_ModuleTest | |
acb109b7 | 5 | * @group headless |
aba1cd8b | 6 | */ |
6a488035 | 7 | class CRM_Extension_Manager_ModuleTest extends CiviUnitTestCase { |
92915c55 | 8 | |
00be9182 | 9 | public function setUp() { |
6a488035 TO |
10 | parent::setUp(); |
11 | // $query = "INSERT INTO civicrm_domain ( name, version ) VALUES ( 'domain', 3 )"; | |
12 | // $result = CRM_Core_DAO::executeQuery($query); | |
13 | global $_test_extension_manager_moduletest_counts; | |
14 | $_test_extension_manager_moduletest_counts = array(); | |
15 | $this->basedir = $this->createTempDir('ext-'); | |
16 | $this->system = new CRM_Extension_System(array( | |
17 | 'extensionsDir' => $this->basedir, | |
18 | 'extensionsURL' => 'http://testbase/', | |
19 | )); | |
20 | $this->setExtensionSystem($this->system); | |
21 | } | |
22 | ||
00be9182 | 23 | public function tearDown() { |
6a488035 TO |
24 | parent::tearDown(); |
25 | $this->system = NULL; | |
26 | } | |
27 | ||
28 | /** | |
eceb18cc | 29 | * Install an extension with a valid type name. |
6a488035 | 30 | */ |
00be9182 | 31 | public function testInstallDisableUninstall() { |
6a488035 TO |
32 | $manager = $this->system->getManager(); |
33 | $this->assertModuleActiveByName(FALSE, 'moduletest'); | |
34 | ||
35 | $manager->install(array('test.extension.manager.moduletest')); | |
36 | $this->assertHookCounts('moduletest', array( | |
37 | 'install' => 1, | |
3d0e24ec | 38 | 'postInstall' => 1, |
6a488035 TO |
39 | 'enable' => 1, |
40 | 'disable' => 0, | |
41 | 'uninstall' => 0, | |
42 | )); | |
43 | $this->assertModuleActiveByName(TRUE, 'moduletest'); | |
44 | $this->assertModuleActiveByKey(TRUE, 'test.extension.manager.moduletest'); | |
45 | ||
46 | $manager->disable(array('test.extension.manager.moduletest')); | |
47 | $this->assertHookCounts('moduletest', array( | |
48 | 'install' => 1, | |
3d0e24ec | 49 | 'postInstall' => 1, |
6a488035 TO |
50 | 'enable' => 1, |
51 | 'disable' => 1, | |
52 | 'uninstall' => 0, | |
53 | )); | |
54 | $this->assertModuleActiveByName(FALSE, 'moduletest'); | |
55 | $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.moduletest'); | |
56 | ||
57 | $manager->uninstall(array('test.extension.manager.moduletest')); | |
58 | $this->assertHookCounts('moduletest', array( | |
59 | 'install' => 1, | |
3d0e24ec | 60 | 'postInstall' => 1, |
6a488035 TO |
61 | 'enable' => 1, |
62 | 'disable' => 1, | |
63 | 'uninstall' => 1, | |
64 | )); | |
65 | $this->assertModuleActiveByName(FALSE, 'moduletest'); | |
66 | $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.moduletest'); | |
67 | } | |
68 | ||
69 | /** | |
eceb18cc | 70 | * Install an extension with a valid type name. |
6a488035 | 71 | */ |
00be9182 | 72 | public function testInstallDisableEnable() { |
6a488035 TO |
73 | $manager = $this->system->getManager(); |
74 | $this->assertModuleActiveByName(FALSE, 'moduletest'); | |
75 | $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.moduletest'); | |
76 | ||
77 | $manager->install(array('test.extension.manager.moduletest')); | |
78 | $this->assertHookCounts('moduletest', array( | |
79 | 'install' => 1, | |
80 | 'enable' => 1, | |
81 | 'disable' => 0, | |
82 | 'uninstall' => 0, | |
83 | )); | |
84 | $this->assertModuleActiveByName(TRUE, 'moduletest'); | |
85 | $this->assertModuleActiveByKey(TRUE, 'test.extension.manager.moduletest'); | |
86 | ||
87 | $manager->disable(array('test.extension.manager.moduletest')); | |
88 | $this->assertHookCounts('moduletest', array( | |
89 | 'install' => 1, | |
90 | 'enable' => 1, | |
91 | 'disable' => 1, | |
92 | 'uninstall' => 0, | |
93 | )); | |
94 | $this->assertModuleActiveByName(FALSE, 'moduletest'); | |
95 | $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.moduletest'); | |
96 | ||
97 | $manager->enable(array('test.extension.manager.moduletest')); | |
98 | $this->assertHookCounts('moduletest', array( | |
99 | 'install' => 1, | |
100 | 'enable' => 2, | |
101 | 'disable' => 1, | |
102 | 'uninstall' => 0, | |
103 | )); | |
104 | $this->assertModuleActiveByName(TRUE, 'moduletest'); | |
105 | $this->assertModuleActiveByKey(TRUE, 'test.extension.manager.moduletest'); | |
106 | } | |
107 | ||
108 | /** | |
109 | * Install an extension then forcibly remove the code and cleanup DB afterwards. | |
110 | */ | |
00be9182 | 111 | public function testInstall_DirtyRemove_Disable_Uninstall() { |
6a488035 TO |
112 | // create temporary extension (which can dirtily remove later) |
113 | $this->_createExtension('test.extension.manager.module.auto1', 'module', 'test_extension_manager_module_auto1'); | |
114 | $mainfile = $this->basedir . '/test.extension.manager.module.auto1/test_extension_manager_module_auto1.php'; | |
115 | $this->assertTrue(file_exists($mainfile)); | |
116 | $manager = $this->system->getManager(); | |
117 | $this->assertModuleActiveByName(FALSE, 'test_extension_manager_module_auto1'); | |
118 | $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.module.auto1'); | |
119 | ||
120 | // install it | |
121 | $manager->install(array('test.extension.manager.module.auto1')); | |
122 | $this->assertEquals('installed', $manager->getStatus('test.extension.manager.module.auto1')); | |
123 | $this->assertHookCounts('test_extension_manager_module_auto1', array( | |
124 | 'install' => 1, | |
125 | 'enable' => 1, | |
126 | 'disable' => 0, | |
127 | 'uninstall' => 0, | |
128 | )); | |
129 | $this->assertModuleActiveByName(TRUE, 'test_extension_manager_module_auto1'); | |
130 | $this->assertModuleActiveByKey(TRUE, 'test.extension.manager.module.auto1'); | |
131 | ||
132 | // dirty removal | |
133 | CRM_Utils_File::cleanDir($this->basedir . '/test.extension.manager.module.auto1', TRUE, FALSE); | |
134 | $manager->refresh(); | |
135 | $this->assertEquals('installed-missing', $manager->getStatus('test.extension.manager.module.auto1')); | |
136 | ||
137 | // disable while missing | |
138 | $manager->disable(array('test.extension.manager.module.auto1')); | |
139 | $this->assertEquals('disabled-missing', $manager->getStatus('test.extension.manager.module.auto1')); | |
140 | $this->assertHookCounts('test_extension_manager_module_auto1', array( | |
141 | 'install' => 1, | |
142 | 'enable' => 1, | |
39b959db SL |
143 | // normally called -- but not for missing modules! |
144 | 'disable' => 0, | |
6a488035 TO |
145 | 'uninstall' => 0, |
146 | )); | |
147 | $this->assertModuleActiveByName(FALSE, 'test_extension_manager_module_auto1'); | |
148 | $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.moduletest'); | |
149 | ||
150 | $manager->uninstall(array('test.extension.manager.module.auto1')); | |
151 | $this->assertHookCounts('test_extension_manager_module_auto1', array( | |
152 | 'install' => 1, | |
153 | 'enable' => 1, | |
39b959db SL |
154 | // normally called -- but not for missing modules! |
155 | 'disable' => 0, | |
156 | // normally called -- but not for missing modules! | |
157 | 'uninstall' => 0, | |
6a488035 TO |
158 | )); |
159 | $this->assertEquals('unknown', $manager->getStatus('test.extension.manager.module.auto1')); | |
160 | $this->assertModuleActiveByName(FALSE, 'test_extension_manager_module_auto1'); | |
161 | $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.module.auto1'); | |
162 | } | |
163 | ||
164 | /** | |
165 | * Install an extension then forcibly remove the code and cleanup DB afterwards. | |
166 | */ | |
00be9182 | 167 | public function testInstall_DirtyRemove_Disable_Restore() { |
6a488035 TO |
168 | // create temporary extension (which can dirtily remove later) |
169 | $this->_createExtension('test.extension.manager.module.auto2', 'module', 'test_extension_manager_module_auto2'); | |
170 | $mainfile = $this->basedir . '/test.extension.manager.module.auto2/test_extension_manager_module_auto2.php'; | |
171 | $this->assertTrue(file_exists($mainfile)); | |
172 | $manager = $this->system->getManager(); | |
173 | $this->assertModuleActiveByName(FALSE, 'test_extension_manager_module_auto2'); | |
174 | $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.module.auto2'); | |
175 | ||
176 | // install it | |
177 | $manager->install(array('test.extension.manager.module.auto2')); | |
178 | $this->assertEquals('installed', $manager->getStatus('test.extension.manager.module.auto2')); | |
179 | $this->assertHookCounts('test_extension_manager_module_auto2', array( | |
180 | 'install' => 1, | |
181 | 'enable' => 1, | |
182 | 'disable' => 0, | |
183 | 'uninstall' => 0, | |
184 | )); | |
185 | $this->assertModuleActiveByName(TRUE, 'test_extension_manager_module_auto2'); | |
186 | $this->assertModuleActiveByKey(TRUE, 'test.extension.manager.module.auto2'); | |
187 | ||
188 | // dirty removal | |
189 | CRM_Utils_File::cleanDir($this->basedir . '/test.extension.manager.module.auto2', TRUE, FALSE); | |
190 | $manager->refresh(); | |
191 | $this->assertEquals('installed-missing', $manager->getStatus('test.extension.manager.module.auto2')); | |
192 | ||
193 | // disable while missing | |
194 | $manager->disable(array('test.extension.manager.module.auto2')); | |
195 | $this->assertEquals('disabled-missing', $manager->getStatus('test.extension.manager.module.auto2')); | |
196 | $this->assertHookCounts('test_extension_manager_module_auto2', array( | |
197 | 'install' => 1, | |
198 | 'enable' => 1, | |
39b959db SL |
199 | // normally called -- but not for missing modules! |
200 | 'disable' => 0, | |
6a488035 TO |
201 | 'uninstall' => 0, |
202 | )); | |
203 | $this->assertModuleActiveByName(FALSE, 'test_extension_manager_module_auto2'); | |
204 | $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.moduletest'); | |
205 | ||
206 | // restore the code | |
207 | $this->_createExtension('test.extension.manager.module.auto2', 'module', 'test_extension_manager_module_auto2'); | |
208 | $manager->refresh(); | |
209 | $this->assertHookCounts('test_extension_manager_module_auto2', array( | |
210 | 'install' => 1, | |
211 | 'enable' => 1, | |
212 | 'disable' => 0, | |
213 | 'uninstall' => 0, | |
214 | )); | |
215 | $this->assertEquals('disabled', $manager->getStatus('test.extension.manager.module.auto2')); | |
216 | $this->assertModuleActiveByName(FALSE, 'test_extension_manager_module_auto2'); | |
217 | $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.module.auto2'); | |
218 | } | |
219 | ||
220 | /** | |
2a6da8d7 | 221 | * @param $module |
e16033b4 TO |
222 | * @param array $counts |
223 | * Expected hook invocation counts ($hookName => $count). | |
6a488035 | 224 | */ |
00be9182 | 225 | public function assertHookCounts($module, $counts) { |
6a488035 TO |
226 | global $_test_extension_manager_moduletest_counts; |
227 | foreach ($counts as $key => $expected) { | |
228 | $actual = @$_test_extension_manager_moduletest_counts[$module][$key]; | |
229 | $this->assertEquals($expected, $actual, | |
92915c55 | 230 | sprintf('Expected %d call(s) to hook_civicrm_%s -- found %d', $expected, $key, $actual) |
6a488035 TO |
231 | ); |
232 | } | |
233 | } | |
234 | ||
4cbe18b8 EM |
235 | /** |
236 | * @param $expectedIsActive | |
237 | * @param $prefix | |
238 | */ | |
00be9182 | 239 | public function assertModuleActiveByName($expectedIsActive, $prefix) { |
39b959db SL |
240 | // FIXME |
241 | $activeModules = CRM_Core_PseudoConstant::getModuleExtensions(TRUE); | |
6a488035 TO |
242 | foreach ($activeModules as $activeModule) { |
243 | if ($activeModule['prefix'] == $prefix) { | |
244 | $this->assertEquals($expectedIsActive, TRUE); | |
245 | return; | |
246 | } | |
247 | } | |
248 | $this->assertEquals($expectedIsActive, FALSE); | |
249 | } | |
250 | ||
4cbe18b8 EM |
251 | /** |
252 | * @param $expectedIsActive | |
253 | * @param $key | |
254 | */ | |
00be9182 | 255 | public function assertModuleActiveByKey($expectedIsActive, $key) { |
6a488035 TO |
256 | foreach (CRM_Core_Module::getAll() as $module) { |
257 | if ($module->name == $key) { | |
6c6e6187 | 258 | $this->assertEquals((bool) $expectedIsActive, (bool) $module->is_active); |
6a488035 TO |
259 | return; |
260 | } | |
261 | } | |
262 | $this->assertEquals($expectedIsActive, FALSE); | |
263 | } | |
264 | ||
4cbe18b8 EM |
265 | /** |
266 | * @param $key | |
267 | * @param $type | |
268 | * @param $file | |
269 | * @param string $template | |
270 | */ | |
00be9182 | 271 | public function _createExtension($key, $type, $file, $template = self::MODULE_TEMPLATE) { |
6a488035 TO |
272 | $basedir = $this->basedir; |
273 | mkdir("$basedir/$key"); | |
274 | file_put_contents("$basedir/$key/info.xml", "<extension key='$key' type='$type'><file>$file</file></extension>"); | |
275 | file_put_contents("$basedir/$key/$file.php", strtr($template, array('_FILE_' => $file))); | |
276 | $this->system->getCache()->flush(); | |
277 | $this->system->getManager()->refresh(); | |
278 | } | |
b6708aeb | 279 | |
4cbe18b8 EM |
280 | /** |
281 | * @param $module | |
100fef9d | 282 | * @param string $name |
4cbe18b8 | 283 | */ |
6a488035 TO |
284 | public static function incHookCount($module, $name) { |
285 | global $_test_extension_manager_moduletest_counts; | |
c3d574fc EM |
286 | if (!isset($_test_extension_manager_moduletest_counts[$module][$name])) { |
287 | $_test_extension_manager_moduletest_counts[$module][$name] = 0; | |
288 | } | |
6a488035 TO |
289 | $_test_extension_manager_moduletest_counts[$module][$name] = 1 + (int) $_test_extension_manager_moduletest_counts[$module][$name]; |
290 | } | |
b6708aeb | 291 | |
c20af6a3 | 292 | const MODULE_TEMPLATE = "<?php |
6a488035 TO |
293 | function _FILE__civicrm_install() { |
294 | CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'install'); | |
295 | } | |
296 | ||
3d0e24ec | 297 | function _FILE__civicrm_postInstall() { |
298 | CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'postInstall'); | |
299 | } | |
300 | ||
6a488035 TO |
301 | function _FILE__civicrm_uninstall() { |
302 | CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'uninstall'); | |
303 | } | |
304 | ||
305 | function _FILE__civicrm_enable() { | |
306 | CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'enable'); | |
307 | } | |
308 | ||
309 | function _FILE__civicrm_disable() { | |
310 | CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'disable'); | |
311 | } | |
312 | "; | |
313 | ||
314 | } |