3 require_once 'CiviTest/CiviUnitTestCase.php';
6 * Class CRM_Extension_Manager_ModuleTest
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;
15 // $query = "INSERT INTO civicrm_domain ( name, version ) VALUES ( 'domain', 3 )";
16 // $result = CRM_Core_DAO::executeQuery($query);
17 global $_test_extension_manager_moduletest_counts;
18 $_test_extension_manager_moduletest_counts = array();
19 $this->basedir
= $this->createTempDir('ext-');
20 $this->system
= new CRM_Extension_System(array(
21 'extensionsDir' => $this->basedir
,
22 'extensionsURL' => 'http://testbase/',
24 $this->setExtensionSystem($this->system
);
33 * Install an extension with a valid type name
35 function testInstallDisableUninstall() {
36 $manager = $this->system
->getManager();
37 $this->assertModuleActiveByName(FALSE, 'moduletest');
39 $manager->install(array('test.extension.manager.moduletest'));
40 $this->assertHookCounts('moduletest', array(
47 $this->assertModuleActiveByName(TRUE, 'moduletest');
48 $this->assertModuleActiveByKey(TRUE, 'test.extension.manager.moduletest');
50 $manager->disable(array('test.extension.manager.moduletest'));
51 $this->assertHookCounts('moduletest', array(
58 $this->assertModuleActiveByName(FALSE, 'moduletest');
59 $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.moduletest');
61 $manager->uninstall(array('test.extension.manager.moduletest'));
62 $this->assertHookCounts('moduletest', array(
69 $this->assertModuleActiveByName(FALSE, 'moduletest');
70 $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.moduletest');
74 * Install an extension with a valid type name
76 function testInstallDisableEnable() {
77 $manager = $this->system
->getManager();
78 $this->assertModuleActiveByName(FALSE, 'moduletest');
79 $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.moduletest');
81 $manager->install(array('test.extension.manager.moduletest'));
82 $this->assertHookCounts('moduletest', array(
88 $this->assertModuleActiveByName(TRUE, 'moduletest');
89 $this->assertModuleActiveByKey(TRUE, 'test.extension.manager.moduletest');
91 $manager->disable(array('test.extension.manager.moduletest'));
92 $this->assertHookCounts('moduletest', array(
98 $this->assertModuleActiveByName(FALSE, 'moduletest');
99 $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.moduletest');
101 $manager->enable(array('test.extension.manager.moduletest'));
102 $this->assertHookCounts('moduletest', array(
108 $this->assertModuleActiveByName(TRUE, 'moduletest');
109 $this->assertModuleActiveByKey(TRUE, 'test.extension.manager.moduletest');
113 * Install an extension then forcibly remove the code and cleanup DB afterwards.
115 function testInstall_DirtyRemove_Disable_Uninstall() {
116 // create temporary extension (which can dirtily remove later)
117 $this->_createExtension('test.extension.manager.module.auto1', 'module', 'test_extension_manager_module_auto1');
118 $mainfile = $this->basedir
. '/test.extension.manager.module.auto1/test_extension_manager_module_auto1.php';
119 $this->assertTrue(file_exists($mainfile));
120 $manager = $this->system
->getManager();
121 $this->assertModuleActiveByName(FALSE, 'test_extension_manager_module_auto1');
122 $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.module.auto1');
125 $manager->install(array('test.extension.manager.module.auto1'));
126 $this->assertEquals('installed', $manager->getStatus('test.extension.manager.module.auto1'));
127 $this->assertHookCounts('test_extension_manager_module_auto1', array(
133 $this->assertModuleActiveByName(TRUE, 'test_extension_manager_module_auto1');
134 $this->assertModuleActiveByKey(TRUE, 'test.extension.manager.module.auto1');
137 CRM_Utils_File
::cleanDir($this->basedir
. '/test.extension.manager.module.auto1', TRUE, FALSE);
139 $this->assertEquals('installed-missing', $manager->getStatus('test.extension.manager.module.auto1'));
141 // disable while missing
142 $manager->disable(array('test.extension.manager.module.auto1'));
143 $this->assertEquals('disabled-missing', $manager->getStatus('test.extension.manager.module.auto1'));
144 $this->assertHookCounts('test_extension_manager_module_auto1', array(
147 'disable' => 0, // normally called -- but not for missing modules!
150 $this->assertModuleActiveByName(FALSE, 'test_extension_manager_module_auto1');
151 $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.moduletest');
153 $manager->uninstall(array('test.extension.manager.module.auto1'));
154 $this->assertHookCounts('test_extension_manager_module_auto1', array(
157 'disable' => 0, // normally called -- but not for missing modules!
158 'uninstall' => 0, // normally called -- but not for missing modules!
160 $this->assertEquals('unknown', $manager->getStatus('test.extension.manager.module.auto1'));
161 $this->assertModuleActiveByName(FALSE, 'test_extension_manager_module_auto1');
162 $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.module.auto1');
166 * Install an extension then forcibly remove the code and cleanup DB afterwards.
168 function testInstall_DirtyRemove_Disable_Restore() {
169 // create temporary extension (which can dirtily remove later)
170 $this->_createExtension('test.extension.manager.module.auto2', 'module', 'test_extension_manager_module_auto2');
171 $mainfile = $this->basedir
. '/test.extension.manager.module.auto2/test_extension_manager_module_auto2.php';
172 $this->assertTrue(file_exists($mainfile));
173 $manager = $this->system
->getManager();
174 $this->assertModuleActiveByName(FALSE, 'test_extension_manager_module_auto2');
175 $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.module.auto2');
178 $manager->install(array('test.extension.manager.module.auto2'));
179 $this->assertEquals('installed', $manager->getStatus('test.extension.manager.module.auto2'));
180 $this->assertHookCounts('test_extension_manager_module_auto2', array(
186 $this->assertModuleActiveByName(TRUE, 'test_extension_manager_module_auto2');
187 $this->assertModuleActiveByKey(TRUE, 'test.extension.manager.module.auto2');
190 CRM_Utils_File
::cleanDir($this->basedir
. '/test.extension.manager.module.auto2', TRUE, FALSE);
192 $this->assertEquals('installed-missing', $manager->getStatus('test.extension.manager.module.auto2'));
194 // disable while missing
195 $manager->disable(array('test.extension.manager.module.auto2'));
196 $this->assertEquals('disabled-missing', $manager->getStatus('test.extension.manager.module.auto2'));
197 $this->assertHookCounts('test_extension_manager_module_auto2', array(
200 'disable' => 0, // normally called -- but not for missing modules!
203 $this->assertModuleActiveByName(FALSE, 'test_extension_manager_module_auto2');
204 $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.moduletest');
207 $this->_createExtension('test.extension.manager.module.auto2', 'module', 'test_extension_manager_module_auto2');
209 $this->assertHookCounts('test_extension_manager_module_auto2', array(
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');
222 * @param array $counts expected hook invocation counts ($hookName => $count)
224 function assertHookCounts($module, $counts) {
225 global $_test_extension_manager_moduletest_counts;
226 foreach ($counts as $key => $expected) {
227 $actual = @$_test_extension_manager_moduletest_counts[$module][$key];
228 $this->assertEquals($expected, $actual,
229 sprintf('Expected %d call(s) to hook_civicrm_%s -- found %d', $expected, $key, $actual)
235 * @param $expectedIsActive
238 function assertModuleActiveByName($expectedIsActive, $prefix) {
239 $activeModules = CRM_Core_PseudoConstant
::getModuleExtensions(TRUE); // FIXME
240 foreach ($activeModules as $activeModule) {
241 if ($activeModule['prefix'] == $prefix) {
242 $this->assertEquals($expectedIsActive, TRUE);
246 $this->assertEquals($expectedIsActive, FALSE);
250 * @param $expectedIsActive
253 function assertModuleActiveByKey($expectedIsActive, $key) {
254 foreach (CRM_Core_Module
::getAll() as $module) {
255 if ($module->name
== $key) {
256 $this->assertEquals((bool)$expectedIsActive, (bool)$module->is_active
);
260 $this->assertEquals($expectedIsActive, FALSE);
267 * @param string $template
269 function _createExtension($key, $type, $file, $template = self
::MODULE_TEMPLATE
) {
270 $basedir = $this->basedir
;
271 mkdir("$basedir/$key");
272 file_put_contents("$basedir/$key/info.xml", "<extension key='$key' type='$type'><file>$file</file></extension>");
273 file_put_contents("$basedir/$key/$file.php", strtr($template, array('_FILE_' => $file)));
274 $this->system
->getCache()->flush();
275 $this->system
->getManager()->refresh();
282 public static function incHookCount($module, $name) {
283 global $_test_extension_manager_moduletest_counts;
284 $_test_extension_manager_moduletest_counts[$module][$name] = 1 +
(int) $_test_extension_manager_moduletest_counts[$module][$name];
287 const MODULE_TEMPLATE
= "
289 function _FILE__civicrm_install() {
290 CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'install');
293 function _FILE__civicrm_postInstall() {
294 CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'postInstall');
297 function _FILE__civicrm_uninstall() {
298 CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'uninstall');
301 function _FILE__civicrm_enable() {
302 CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'enable');
305 function _FILE__civicrm_disable() {
306 CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'disable');