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