3 require_once 'CiviTest/CiviUnitTestCase.php';
6 * Class CRM_Extension_Manager_ModuleTest
8 class CRM_Extension_Manager_ModuleTest
extends CiviUnitTestCase
{
10 public function setUp() {
12 // $query = "INSERT INTO civicrm_domain ( name, version ) VALUES ( 'domain', 3 )";
13 // $result = CRM_Core_DAO::executeQuery($query);
14 global $_test_extension_manager_moduletest_counts;
15 $_test_extension_manager_moduletest_counts = array();
16 $this->basedir
= $this->createTempDir('ext-');
17 $this->system
= new CRM_Extension_System(array(
18 'extensionsDir' => $this->basedir
,
19 'extensionsURL' => 'http://testbase/',
21 $this->setExtensionSystem($this->system
);
24 public function tearDown() {
30 * Install an extension with a valid type name.
32 public function testInstallDisableUninstall() {
33 $manager = $this->system
->getManager();
34 $this->assertModuleActiveByName(FALSE, 'moduletest');
36 $manager->install(array('test.extension.manager.moduletest'));
37 $this->assertHookCounts('moduletest', array(
44 $this->assertModuleActiveByName(TRUE, 'moduletest');
45 $this->assertModuleActiveByKey(TRUE, 'test.extension.manager.moduletest');
47 $manager->disable(array('test.extension.manager.moduletest'));
48 $this->assertHookCounts('moduletest', array(
55 $this->assertModuleActiveByName(FALSE, 'moduletest');
56 $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.moduletest');
58 $manager->uninstall(array('test.extension.manager.moduletest'));
59 $this->assertHookCounts('moduletest', array(
66 $this->assertModuleActiveByName(FALSE, 'moduletest');
67 $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.moduletest');
71 * Install an extension with a valid type name.
73 public function testInstallDisableEnable() {
74 $manager = $this->system
->getManager();
75 $this->assertModuleActiveByName(FALSE, 'moduletest');
76 $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.moduletest');
78 $manager->install(array('test.extension.manager.moduletest'));
79 $this->assertHookCounts('moduletest', array(
85 $this->assertModuleActiveByName(TRUE, 'moduletest');
86 $this->assertModuleActiveByKey(TRUE, 'test.extension.manager.moduletest');
88 $manager->disable(array('test.extension.manager.moduletest'));
89 $this->assertHookCounts('moduletest', array(
95 $this->assertModuleActiveByName(FALSE, 'moduletest');
96 $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.moduletest');
98 $manager->enable(array('test.extension.manager.moduletest'));
99 $this->assertHookCounts('moduletest', array(
105 $this->assertModuleActiveByName(TRUE, 'moduletest');
106 $this->assertModuleActiveByKey(TRUE, 'test.extension.manager.moduletest');
110 * Install an extension then forcibly remove the code and cleanup DB afterwards.
112 public function testInstall_DirtyRemove_Disable_Uninstall() {
113 // create temporary extension (which can dirtily remove later)
114 $this->_createExtension('test.extension.manager.module.auto1', 'module', 'test_extension_manager_module_auto1');
115 $mainfile = $this->basedir
. '/test.extension.manager.module.auto1/test_extension_manager_module_auto1.php';
116 $this->assertTrue(file_exists($mainfile));
117 $manager = $this->system
->getManager();
118 $this->assertModuleActiveByName(FALSE, 'test_extension_manager_module_auto1');
119 $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.module.auto1');
122 $manager->install(array('test.extension.manager.module.auto1'));
123 $this->assertEquals('installed', $manager->getStatus('test.extension.manager.module.auto1'));
124 $this->assertHookCounts('test_extension_manager_module_auto1', array(
130 $this->assertModuleActiveByName(TRUE, 'test_extension_manager_module_auto1');
131 $this->assertModuleActiveByKey(TRUE, 'test.extension.manager.module.auto1');
134 CRM_Utils_File
::cleanDir($this->basedir
. '/test.extension.manager.module.auto1', TRUE, FALSE);
136 $this->assertEquals('installed-missing', $manager->getStatus('test.extension.manager.module.auto1'));
138 // disable while missing
139 $manager->disable(array('test.extension.manager.module.auto1'));
140 $this->assertEquals('disabled-missing', $manager->getStatus('test.extension.manager.module.auto1'));
141 $this->assertHookCounts('test_extension_manager_module_auto1', array(
144 'disable' => 0, // normally called -- but not for missing modules!
147 $this->assertModuleActiveByName(FALSE, 'test_extension_manager_module_auto1');
148 $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.moduletest');
150 $manager->uninstall(array('test.extension.manager.module.auto1'));
151 $this->assertHookCounts('test_extension_manager_module_auto1', array(
154 'disable' => 0, // normally called -- but not for missing modules!
155 'uninstall' => 0, // normally called -- but not for missing modules!
157 $this->assertEquals('unknown', $manager->getStatus('test.extension.manager.module.auto1'));
158 $this->assertModuleActiveByName(FALSE, 'test_extension_manager_module_auto1');
159 $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.module.auto1');
163 * Install an extension then forcibly remove the code and cleanup DB afterwards.
165 public function testInstall_DirtyRemove_Disable_Restore() {
166 // create temporary extension (which can dirtily remove later)
167 $this->_createExtension('test.extension.manager.module.auto2', 'module', 'test_extension_manager_module_auto2');
168 $mainfile = $this->basedir
. '/test.extension.manager.module.auto2/test_extension_manager_module_auto2.php';
169 $this->assertTrue(file_exists($mainfile));
170 $manager = $this->system
->getManager();
171 $this->assertModuleActiveByName(FALSE, 'test_extension_manager_module_auto2');
172 $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.module.auto2');
175 $manager->install(array('test.extension.manager.module.auto2'));
176 $this->assertEquals('installed', $manager->getStatus('test.extension.manager.module.auto2'));
177 $this->assertHookCounts('test_extension_manager_module_auto2', array(
183 $this->assertModuleActiveByName(TRUE, 'test_extension_manager_module_auto2');
184 $this->assertModuleActiveByKey(TRUE, 'test.extension.manager.module.auto2');
187 CRM_Utils_File
::cleanDir($this->basedir
. '/test.extension.manager.module.auto2', TRUE, FALSE);
189 $this->assertEquals('installed-missing', $manager->getStatus('test.extension.manager.module.auto2'));
191 // disable while missing
192 $manager->disable(array('test.extension.manager.module.auto2'));
193 $this->assertEquals('disabled-missing', $manager->getStatus('test.extension.manager.module.auto2'));
194 $this->assertHookCounts('test_extension_manager_module_auto2', array(
197 'disable' => 0, // normally called -- but not for missing modules!
200 $this->assertModuleActiveByName(FALSE, 'test_extension_manager_module_auto2');
201 $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.moduletest');
204 $this->_createExtension('test.extension.manager.module.auto2', 'module', 'test_extension_manager_module_auto2');
206 $this->assertHookCounts('test_extension_manager_module_auto2', array(
212 $this->assertEquals('disabled', $manager->getStatus('test.extension.manager.module.auto2'));
213 $this->assertModuleActiveByName(FALSE, 'test_extension_manager_module_auto2');
214 $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.module.auto2');
219 * @param array $counts
220 * Expected hook invocation counts ($hookName => $count).
222 public function assertHookCounts($module, $counts) {
223 global $_test_extension_manager_moduletest_counts;
224 foreach ($counts as $key => $expected) {
225 $actual = @$_test_extension_manager_moduletest_counts[$module][$key];
226 $this->assertEquals($expected, $actual,
227 sprintf('Expected %d call(s) to hook_civicrm_%s -- found %d', $expected, $key, $actual)
233 * @param $expectedIsActive
236 public function assertModuleActiveByName($expectedIsActive, $prefix) {
237 $activeModules = CRM_Core_PseudoConstant
::getModuleExtensions(TRUE); // FIXME
238 foreach ($activeModules as $activeModule) {
239 if ($activeModule['prefix'] == $prefix) {
240 $this->assertEquals($expectedIsActive, TRUE);
244 $this->assertEquals($expectedIsActive, FALSE);
248 * @param $expectedIsActive
251 public function assertModuleActiveByKey($expectedIsActive, $key) {
252 foreach (CRM_Core_Module
::getAll() as $module) {
253 if ($module->name
== $key) {
254 $this->assertEquals((bool) $expectedIsActive, (bool) $module->is_active
);
258 $this->assertEquals($expectedIsActive, FALSE);
265 * @param string $template
267 public function _createExtension($key, $type, $file, $template = self
::MODULE_TEMPLATE
) {
268 $basedir = $this->basedir
;
269 mkdir("$basedir/$key");
270 file_put_contents("$basedir/$key/info.xml", "<extension key='$key' type='$type'><file>$file</file></extension>");
271 file_put_contents("$basedir/$key/$file.php", strtr($template, array('_FILE_' => $file)));
272 $this->system
->getCache()->flush();
273 $this->system
->getManager()->refresh();
278 * @param string $name
280 public static function incHookCount($module, $name) {
281 global $_test_extension_manager_moduletest_counts;
282 if (!isset($_test_extension_manager_moduletest_counts[$module][$name])) {
283 $_test_extension_manager_moduletest_counts[$module][$name] = 0;
285 $_test_extension_manager_moduletest_counts[$module][$name] = 1 +
(int) $_test_extension_manager_moduletest_counts[$module][$name];
288 const MODULE_TEMPLATE
= "
290 function _FILE__civicrm_install() {
291 CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'install');
294 function _FILE__civicrm_postInstall() {
295 CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'postInstall');
298 function _FILE__civicrm_uninstall() {
299 CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'uninstall');
302 function _FILE__civicrm_enable() {
303 CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'enable');
306 function _FILE__civicrm_disable() {
307 CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'disable');