Update Unit test styling to cover the future coder version
[civicrm-core.git] / tests / phpunit / CRM / Extension / Manager / ModuleTest.php
CommitLineData
6a488035
TO
1<?php
2
aba1cd8b
EM
3/**
4 * Class CRM_Extension_Manager_ModuleTest
acb109b7 5 * @group headless
aba1cd8b 6 */
6a488035 7class 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
293function _FILE__civicrm_install() {
294 CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'install');
295}
296
3d0e24ec 297function _FILE__civicrm_postInstall() {
298 CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'postInstall');
299}
300
6a488035
TO
301function _FILE__civicrm_uninstall() {
302 CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'uninstall');
303}
304
305function _FILE__civicrm_enable() {
306 CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'enable');
307}
308
309function _FILE__civicrm_disable() {
310 CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'disable');
311}
312";
313
314}