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;
14 public function 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/',
25 $this->setExtensionSystem($this->system
);
28 public function tearDown() {
34 * Install an extension with a valid type name.
36 public function testInstallDisableUninstall() {
37 $manager = $this->system
->getManager();
38 $this->assertModuleActiveByName(FALSE, 'moduletest');
40 $manager->install(array('test.extension.manager.moduletest'));
41 $this->assertHookCounts('moduletest', array(
48 $this->assertModuleActiveByName(TRUE, 'moduletest');
49 $this->assertModuleActiveByKey(TRUE, 'test.extension.manager.moduletest');
51 $manager->disable(array('test.extension.manager.moduletest'));
52 $this->assertHookCounts('moduletest', array(
59 $this->assertModuleActiveByName(FALSE, 'moduletest');
60 $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.moduletest');
62 $manager->uninstall(array('test.extension.manager.moduletest'));
63 $this->assertHookCounts('moduletest', array(
70 $this->assertModuleActiveByName(FALSE, 'moduletest');
71 $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.moduletest');
75 * Install an extension with a valid type name.
77 public function testInstallDisableEnable() {
78 $manager = $this->system
->getManager();
79 $this->assertModuleActiveByName(FALSE, 'moduletest');
80 $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.moduletest');
82 $manager->install(array('test.extension.manager.moduletest'));
83 $this->assertHookCounts('moduletest', array(
89 $this->assertModuleActiveByName(TRUE, 'moduletest');
90 $this->assertModuleActiveByKey(TRUE, 'test.extension.manager.moduletest');
92 $manager->disable(array('test.extension.manager.moduletest'));
93 $this->assertHookCounts('moduletest', array(
99 $this->assertModuleActiveByName(FALSE, 'moduletest');
100 $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.moduletest');
102 $manager->enable(array('test.extension.manager.moduletest'));
103 $this->assertHookCounts('moduletest', array(
109 $this->assertModuleActiveByName(TRUE, 'moduletest');
110 $this->assertModuleActiveByKey(TRUE, 'test.extension.manager.moduletest');
114 * Install an extension then forcibly remove the code and cleanup DB afterwards.
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');
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(
134 $this->assertModuleActiveByName(TRUE, 'test_extension_manager_module_auto1');
135 $this->assertModuleActiveByKey(TRUE, 'test.extension.manager.module.auto1');
138 CRM_Utils_File
::cleanDir($this->basedir
. '/test.extension.manager.module.auto1', TRUE, FALSE);
140 $this->assertEquals('installed-missing', $manager->getStatus('test.extension.manager.module.auto1'));
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(
148 'disable' => 0, // normally called -- but not for missing modules!
151 $this->assertModuleActiveByName(FALSE, 'test_extension_manager_module_auto1');
152 $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.moduletest');
154 $manager->uninstall(array('test.extension.manager.module.auto1'));
155 $this->assertHookCounts('test_extension_manager_module_auto1', array(
158 'disable' => 0, // normally called -- but not for missing modules!
159 'uninstall' => 0, // normally called -- but not for missing modules!
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');
167 * Install an extension then forcibly remove the code and cleanup DB afterwards.
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');
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(
187 $this->assertModuleActiveByName(TRUE, 'test_extension_manager_module_auto2');
188 $this->assertModuleActiveByKey(TRUE, 'test.extension.manager.module.auto2');
191 CRM_Utils_File
::cleanDir($this->basedir
. '/test.extension.manager.module.auto2', TRUE, FALSE);
193 $this->assertEquals('installed-missing', $manager->getStatus('test.extension.manager.module.auto2'));
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(
201 'disable' => 0, // normally called -- but not for missing modules!
204 $this->assertModuleActiveByName(FALSE, 'test_extension_manager_module_auto2');
205 $this->assertModuleActiveByKey(FALSE, 'test.extension.manager.moduletest');
208 $this->_createExtension('test.extension.manager.module.auto2', 'module', 'test_extension_manager_module_auto2');
210 $this->assertHookCounts('test_extension_manager_module_auto2', array(
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');
223 * @param array $counts
224 * Expected hook invocation counts ($hookName => $count).
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)
237 * @param $expectedIsActive
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);
248 $this->assertEquals($expectedIsActive, FALSE);
252 * @param $expectedIsActive
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
);
262 $this->assertEquals($expectedIsActive, FALSE);
269 * @param string $template
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();
282 * @param string $name
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];
289 const MODULE_TEMPLATE
= "
291 function _FILE__civicrm_install() {
292 CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'install');
295 function _FILE__civicrm_postInstall() {
296 CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'postInstall');
299 function _FILE__civicrm_uninstall() {
300 CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'uninstall');
303 function _FILE__civicrm_enable() {
304 CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'enable');
307 function _FILE__civicrm_disable() {
308 CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'disable');