Commit | Line | Data |
---|---|---|
6a488035 TO |
1 | <?php |
2 | ||
3 | require_once 'CiviTest/CiviUnitTestCase.php'; | |
4 | ||
5 | class 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 | |
260 | function _FILE__civicrm_install() { | |
261 | CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'install'); | |
262 | } | |
263 | ||
264 | function _FILE__civicrm_uninstall() { | |
265 | CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'uninstall'); | |
266 | } | |
267 | ||
268 | function _FILE__civicrm_enable() { | |
269 | CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'enable'); | |
270 | } | |
271 | ||
272 | function _FILE__civicrm_disable() { | |
273 | CRM_Extension_Manager_ModuleTest::incHookCount('_FILE_', 'disable'); | |
274 | } | |
275 | "; | |
276 | ||
277 | } |