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