pictcode / lib / Cake / Test / Case / Console / ShellTest.php @ 0b1b8047
履歴 | 表示 | アノテート | ダウンロード (25.493 KB)
1 |
<?php
|
---|---|
2 |
/**
|
3 |
* ShellTest file
|
4 |
*
|
5 |
* Test Case for Shell
|
6 |
*
|
7 |
* CakePHP : Rapid Development Framework (http://cakephp.org)
|
8 |
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
9 |
*
|
10 |
* Licensed under The MIT License
|
11 |
* For full copyright and license information, please see the LICENSE.txt
|
12 |
* Redistributions of files must retain the above copyright notice.
|
13 |
*
|
14 |
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
15 |
* @link http://cakephp.org CakePHP Project
|
16 |
* @package Cake.Test.Case.Console.Command
|
17 |
* @since CakePHP v 1.2.0.7726
|
18 |
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
19 |
*/
|
20 |
|
21 |
App::uses('ShellDispatcher', 'Console'); |
22 |
App::uses('Shell', 'Console'); |
23 |
App::uses('Folder', 'Utility'); |
24 |
|
25 |
/**
|
26 |
* ShellTestShell class
|
27 |
*
|
28 |
* @package Cake.Test.Case.Console.Command
|
29 |
*/
|
30 |
class ShellTestShell extends Shell { |
31 |
|
32 |
/**
|
33 |
* name property
|
34 |
*
|
35 |
* @var name
|
36 |
*/
|
37 |
public $name = 'ShellTestShell'; |
38 |
|
39 |
/**
|
40 |
* stopped property
|
41 |
*
|
42 |
* @var int
|
43 |
*/
|
44 |
public $stopped; |
45 |
|
46 |
/**
|
47 |
* testMessage property
|
48 |
*
|
49 |
* @var string
|
50 |
*/
|
51 |
public $testMessage = 'all your base are belong to us'; |
52 |
|
53 |
/**
|
54 |
* stop method
|
55 |
*
|
56 |
* @param int $status
|
57 |
* @return void
|
58 |
*/
|
59 |
protected function _stop($status = 0) { |
60 |
$this->stopped = $status; |
61 |
} |
62 |
|
63 |
protected function _secret() { |
64 |
} |
65 |
|
66 |
//@codingStandardsIgnoreStart
|
67 |
public function do_something() { |
68 |
} |
69 |
|
70 |
protected function no_access() { |
71 |
} |
72 |
|
73 |
public function log_something() { |
74 |
$this->log($this->testMessage); |
75 |
} |
76 |
//@codingStandardsIgnoreEnd
|
77 |
|
78 |
public function mergeVars($properties, $class, $normalize = true) { |
79 |
return $this->_mergeVars($properties, $class, $normalize); |
80 |
} |
81 |
|
82 |
public function useLogger($enable = true) { |
83 |
$this->_useLogger($enable); |
84 |
} |
85 |
|
86 |
} |
87 |
|
88 |
/**
|
89 |
* Class for testing merging vars
|
90 |
*
|
91 |
* @package Cake.Test.Case.Console.Command
|
92 |
*/
|
93 |
class TestMergeShell extends Shell { |
94 |
|
95 |
public $tasks = array('DbConfig', 'Fixture'); |
96 |
|
97 |
public $uses = array('Comment'); |
98 |
|
99 |
} |
100 |
|
101 |
/**
|
102 |
* TestAppleTask class
|
103 |
*
|
104 |
* @package Cake.Test.Case.Console.Command
|
105 |
*/
|
106 |
class TestAppleTask extends Shell { |
107 |
} |
108 |
|
109 |
/**
|
110 |
* TestBananaTask class
|
111 |
*
|
112 |
* @package Cake.Test.Case.Console.Command
|
113 |
*/
|
114 |
class TestBananaTask extends Shell { |
115 |
} |
116 |
|
117 |
/**
|
118 |
* ShellTest class
|
119 |
*
|
120 |
* @package Cake.Test.Case.Console.Command
|
121 |
*/
|
122 |
class ShellTest extends CakeTestCase { |
123 |
|
124 |
/**
|
125 |
* Fixtures used in this test case
|
126 |
*
|
127 |
* @var array
|
128 |
*/
|
129 |
public $fixtures = array( |
130 |
'core.post', 'core.comment', 'core.article', 'core.user', |
131 |
'core.tag', 'core.articles_tag', 'core.attachment' |
132 |
); |
133 |
|
134 |
/**
|
135 |
* setUp method
|
136 |
*
|
137 |
* @return void
|
138 |
*/
|
139 |
public function setUp() { |
140 |
parent::setUp();
|
141 |
|
142 |
$output = $this->getMock('ConsoleOutput', array(), array(), '', false); |
143 |
$error = $this->getMock('ConsoleOutput', array(), array(), '', false); |
144 |
$in = $this->getMock('ConsoleInput', array(), array(), '', false); |
145 |
$this->Shell = new ShellTestShell($output, $error, $in); |
146 |
|
147 |
if (is_dir(TMP . 'shell_test')) { |
148 |
$Folder = new Folder(TMP . 'shell_test'); |
149 |
$Folder->delete(); |
150 |
} |
151 |
} |
152 |
|
153 |
/**
|
154 |
* testConstruct method
|
155 |
*
|
156 |
* @return void
|
157 |
*/
|
158 |
public function testConstruct() { |
159 |
$this->assertEquals('ShellTestShell', $this->Shell->name); |
160 |
$this->assertInstanceOf('ConsoleInput', $this->Shell->stdin); |
161 |
$this->assertInstanceOf('ConsoleOutput', $this->Shell->stdout); |
162 |
$this->assertInstanceOf('ConsoleOutput', $this->Shell->stderr); |
163 |
} |
164 |
|
165 |
/**
|
166 |
* test merging vars
|
167 |
*
|
168 |
* @return void
|
169 |
*/
|
170 |
public function testMergeVars() { |
171 |
$this->Shell->tasks = array('DbConfig' => array('one', 'two')); |
172 |
$this->Shell->uses = array('Posts'); |
173 |
$this->Shell->mergeVars(array('tasks'), 'TestMergeShell'); |
174 |
$this->Shell->mergeVars(array('uses'), 'TestMergeShell', false); |
175 |
|
176 |
$expected = array('DbConfig' => null, 'Fixture' => null, 'DbConfig' => array('one', 'two')); |
177 |
$this->assertEquals($expected, $this->Shell->tasks); |
178 |
|
179 |
$expected = array('Fixture' => null, 'DbConfig' => array('one', 'two')); |
180 |
$this->assertEquals($expected, Hash::normalize($this->Shell->tasks), 'Normalized results are wrong.'); |
181 |
$this->assertEquals(array('Comment', 'Posts'), $this->Shell->uses, 'Merged models are wrong.'); |
182 |
} |
183 |
|
184 |
/**
|
185 |
* testInitialize method
|
186 |
*
|
187 |
* @return void
|
188 |
*/
|
189 |
public function testInitialize() { |
190 |
App::build(array( |
191 |
'Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS), |
192 |
'Model' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Model' . DS) |
193 |
), App::RESET); |
194 |
|
195 |
CakePlugin::load('TestPlugin'); |
196 |
$this->Shell->tasks = array('DbConfig' => array('one', 'two')); |
197 |
$this->Shell->uses = array('TestPlugin.TestPluginPost'); |
198 |
$this->Shell->initialize(); |
199 |
|
200 |
$this->assertTrue(isset($this->Shell->TestPluginPost)); |
201 |
$this->assertInstanceOf('TestPluginPost', $this->Shell->TestPluginPost); |
202 |
$this->assertEquals('TestPluginPost', $this->Shell->modelClass); |
203 |
CakePlugin::unload('TestPlugin'); |
204 |
|
205 |
$this->Shell->uses = array('Comment'); |
206 |
$this->Shell->initialize(); |
207 |
$this->assertTrue(isset($this->Shell->Comment)); |
208 |
$this->assertInstanceOf('Comment', $this->Shell->Comment); |
209 |
$this->assertEquals('Comment', $this->Shell->modelClass); |
210 |
$this->assertInstanceOf('DbConfigTask', $this->Shell->DbConfig); |
211 |
|
212 |
App::build();
|
213 |
} |
214 |
|
215 |
/**
|
216 |
* testLoadModel method
|
217 |
*
|
218 |
* @return void
|
219 |
*/
|
220 |
public function testLoadModel() { |
221 |
App::build(array( |
222 |
'Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS), |
223 |
'Model' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Model' . DS) |
224 |
), App::RESET); |
225 |
|
226 |
$Shell = new TestMergeShell(); |
227 |
$this->assertEquals('Comment', $Shell->Comment->alias); |
228 |
$this->assertInstanceOf('Comment', $Shell->Comment); |
229 |
$this->assertEquals('Comment', $Shell->modelClass); |
230 |
|
231 |
CakePlugin::load('TestPlugin'); |
232 |
$this->Shell->loadModel('TestPlugin.TestPluginPost'); |
233 |
$this->assertTrue(isset($this->Shell->TestPluginPost)); |
234 |
$this->assertInstanceOf('TestPluginPost', $this->Shell->TestPluginPost); |
235 |
$this->assertEquals('TestPluginPost', $this->Shell->modelClass); |
236 |
CakePlugin::unload('TestPlugin'); |
237 |
|
238 |
App::build();
|
239 |
} |
240 |
|
241 |
/**
|
242 |
* testIn method
|
243 |
*
|
244 |
* @return void
|
245 |
*/
|
246 |
public function testIn() { |
247 |
$this->Shell->stdin->expects($this->at(0)) |
248 |
->method('read')
|
249 |
->will($this->returnValue('n')); |
250 |
|
251 |
$this->Shell->stdin->expects($this->at(1)) |
252 |
->method('read')
|
253 |
->will($this->returnValue('Y')); |
254 |
|
255 |
$this->Shell->stdin->expects($this->at(2)) |
256 |
->method('read')
|
257 |
->will($this->returnValue('y')); |
258 |
|
259 |
$this->Shell->stdin->expects($this->at(3)) |
260 |
->method('read')
|
261 |
->will($this->returnValue('y')); |
262 |
|
263 |
$this->Shell->stdin->expects($this->at(4)) |
264 |
->method('read')
|
265 |
->will($this->returnValue('y')); |
266 |
|
267 |
$this->Shell->stdin->expects($this->at(5)) |
268 |
->method('read')
|
269 |
->will($this->returnValue('0')); |
270 |
|
271 |
$result = $this->Shell->in('Just a test?', array('y', 'n'), 'n'); |
272 |
$this->assertEquals('n', $result); |
273 |
|
274 |
$result = $this->Shell->in('Just a test?', array('y', 'n'), 'n'); |
275 |
$this->assertEquals('Y', $result); |
276 |
|
277 |
$result = $this->Shell->in('Just a test?', 'y,n', 'n'); |
278 |
$this->assertEquals('y', $result); |
279 |
|
280 |
$result = $this->Shell->in('Just a test?', 'y/n', 'n'); |
281 |
$this->assertEquals('y', $result); |
282 |
|
283 |
$result = $this->Shell->in('Just a test?', 'y', 'y'); |
284 |
$this->assertEquals('y', $result); |
285 |
|
286 |
$result = $this->Shell->in('Just a test?', array(0, 1, 2), '0'); |
287 |
$this->assertEquals('0', $result); |
288 |
} |
289 |
|
290 |
/**
|
291 |
* Test in() when not interactive.
|
292 |
*
|
293 |
* @return void
|
294 |
*/
|
295 |
public function testInNonInteractive() { |
296 |
$this->Shell->interactive = false; |
297 |
|
298 |
$result = $this->Shell->in('Just a test?', 'y/n', 'n'); |
299 |
$this->assertEquals('n', $result); |
300 |
} |
301 |
|
302 |
/**
|
303 |
* testOut method
|
304 |
*
|
305 |
* @return void
|
306 |
*/
|
307 |
public function testOut() { |
308 |
$this->Shell->stdout->expects($this->at(0)) |
309 |
->method('write')
|
310 |
->with("Just a test", 1); |
311 |
|
312 |
$this->Shell->stdout->expects($this->at(1)) |
313 |
->method('write')
|
314 |
->with(array('Just', 'a', 'test'), 1); |
315 |
|
316 |
$this->Shell->stdout->expects($this->at(2)) |
317 |
->method('write')
|
318 |
->with(array('Just', 'a', 'test'), 2); |
319 |
|
320 |
$this->Shell->stdout->expects($this->at(3)) |
321 |
->method('write')
|
322 |
->with('', 1); |
323 |
|
324 |
$this->Shell->out('Just a test'); |
325 |
|
326 |
$this->Shell->out(array('Just', 'a', 'test')); |
327 |
|
328 |
$this->Shell->out(array('Just', 'a', 'test'), 2); |
329 |
|
330 |
$this->Shell->out(); |
331 |
} |
332 |
|
333 |
/**
|
334 |
* test that verbose and quiet output levels work
|
335 |
*
|
336 |
* @return void
|
337 |
*/
|
338 |
public function testVerboseOutput() { |
339 |
$this->Shell->stdout->expects($this->at(0))->method('write') |
340 |
->with('Verbose', 1); |
341 |
$this->Shell->stdout->expects($this->at(1))->method('write') |
342 |
->with('Normal', 1); |
343 |
$this->Shell->stdout->expects($this->at(2))->method('write') |
344 |
->with('Quiet', 1); |
345 |
|
346 |
$this->Shell->params['verbose'] = true; |
347 |
$this->Shell->params['quiet'] = false; |
348 |
|
349 |
$this->Shell->out('Verbose', 1, Shell::VERBOSE); |
350 |
$this->Shell->out('Normal', 1, Shell::NORMAL); |
351 |
$this->Shell->out('Quiet', 1, Shell::QUIET); |
352 |
} |
353 |
|
354 |
/**
|
355 |
* test that verbose and quiet output levels work
|
356 |
*
|
357 |
* @return void
|
358 |
*/
|
359 |
public function testQuietOutput() { |
360 |
$this->Shell->stdout->expects($this->once())->method('write') |
361 |
->with('Quiet', 1); |
362 |
|
363 |
$this->Shell->params['verbose'] = false; |
364 |
$this->Shell->params['quiet'] = true; |
365 |
|
366 |
$this->Shell->out('Verbose', 1, Shell::VERBOSE); |
367 |
$this->Shell->out('Normal', 1, Shell::NORMAL); |
368 |
$this->Shell->out('Quiet', 1, Shell::QUIET); |
369 |
} |
370 |
|
371 |
/**
|
372 |
* Test overwriting.
|
373 |
*
|
374 |
* @return void
|
375 |
*/
|
376 |
public function testOverwrite() { |
377 |
$number = strlen('Some text I want to overwrite'); |
378 |
|
379 |
$this->Shell->stdout->expects($this->at(0)) |
380 |
->method('write')
|
381 |
->with('Some <info>text</info> I want to overwrite', 0) |
382 |
->will($this->returnValue($number)); |
383 |
|
384 |
$this->Shell->stdout->expects($this->at(1)) |
385 |
->method('write')
|
386 |
->with(str_repeat("\x08", $number), 0); |
387 |
|
388 |
$this->Shell->stdout->expects($this->at(2)) |
389 |
->method('write')
|
390 |
->with('Less text', 0) |
391 |
->will($this->returnValue(9)); |
392 |
|
393 |
$this->Shell->stdout->expects($this->at(3)) |
394 |
->method('write')
|
395 |
->with(str_repeat(' ', $number - 9), 0); |
396 |
|
397 |
$this->Shell->out('Some <info>text</info> I want to overwrite', 0); |
398 |
$this->Shell->overwrite('Less text'); |
399 |
} |
400 |
|
401 |
/**
|
402 |
* testErr method
|
403 |
*
|
404 |
* @return void
|
405 |
*/
|
406 |
public function testErr() { |
407 |
$this->Shell->stderr->expects($this->at(0)) |
408 |
->method('write')
|
409 |
->with("Just a test", 1); |
410 |
|
411 |
$this->Shell->stderr->expects($this->at(1)) |
412 |
->method('write')
|
413 |
->with(array('Just', 'a', 'test'), 1); |
414 |
|
415 |
$this->Shell->stderr->expects($this->at(2)) |
416 |
->method('write')
|
417 |
->with(array('Just', 'a', 'test'), 2); |
418 |
|
419 |
$this->Shell->stderr->expects($this->at(3)) |
420 |
->method('write')
|
421 |
->with('', 1); |
422 |
|
423 |
$this->Shell->err('Just a test'); |
424 |
|
425 |
$this->Shell->err(array('Just', 'a', 'test')); |
426 |
|
427 |
$this->Shell->err(array('Just', 'a', 'test'), 2); |
428 |
|
429 |
$this->Shell->err(); |
430 |
} |
431 |
|
432 |
/**
|
433 |
* testNl
|
434 |
*
|
435 |
* @return void
|
436 |
*/
|
437 |
public function testNl() { |
438 |
$newLine = "\n"; |
439 |
if (DS === '\\') { |
440 |
$newLine = "\r\n"; |
441 |
} |
442 |
$this->assertEquals($this->Shell->nl(), $newLine); |
443 |
$this->assertEquals($this->Shell->nl(true), $newLine); |
444 |
$this->assertEquals("", $this->Shell->nl(false)); |
445 |
$this->assertEquals($this->Shell->nl(2), $newLine . $newLine); |
446 |
$this->assertEquals($this->Shell->nl(1), $newLine); |
447 |
} |
448 |
|
449 |
/**
|
450 |
* testHr
|
451 |
*
|
452 |
* @return void
|
453 |
*/
|
454 |
public function testHr() { |
455 |
$bar = '---------------------------------------------------------------'; |
456 |
|
457 |
$this->Shell->stdout->expects($this->at(0))->method('write')->with('', 0); |
458 |
$this->Shell->stdout->expects($this->at(1))->method('write')->with($bar, 1); |
459 |
$this->Shell->stdout->expects($this->at(2))->method('write')->with('', 0); |
460 |
|
461 |
$this->Shell->stdout->expects($this->at(3))->method('write')->with("", true); |
462 |
$this->Shell->stdout->expects($this->at(4))->method('write')->with($bar, 1); |
463 |
$this->Shell->stdout->expects($this->at(5))->method('write')->with("", true); |
464 |
|
465 |
$this->Shell->stdout->expects($this->at(6))->method('write')->with("", 2); |
466 |
$this->Shell->stdout->expects($this->at(7))->method('write')->with($bar, 1); |
467 |
$this->Shell->stdout->expects($this->at(8))->method('write')->with("", 2); |
468 |
|
469 |
$this->Shell->hr(); |
470 |
|
471 |
$this->Shell->hr(true); |
472 |
|
473 |
$this->Shell->hr(2); |
474 |
} |
475 |
|
476 |
/**
|
477 |
* testError
|
478 |
*
|
479 |
* @return void
|
480 |
*/
|
481 |
public function testError() { |
482 |
$this->Shell->stderr->expects($this->at(0)) |
483 |
->method('write')
|
484 |
->with("<error>Error:</error> Foo Not Found", 1); |
485 |
|
486 |
$this->Shell->stderr->expects($this->at(1)) |
487 |
->method('write')
|
488 |
->with("<error>Error:</error> Foo Not Found", 1); |
489 |
|
490 |
$this->Shell->stderr->expects($this->at(2)) |
491 |
->method('write')
|
492 |
->with("Searched all...", 1); |
493 |
|
494 |
$this->Shell->error('Foo Not Found'); |
495 |
$this->assertSame($this->Shell->stopped, 1); |
496 |
|
497 |
$this->Shell->stopped = null; |
498 |
|
499 |
$this->Shell->error('Foo Not Found', 'Searched all...'); |
500 |
$this->assertSame($this->Shell->stopped, 1); |
501 |
} |
502 |
|
503 |
/**
|
504 |
* testLoadTasks method
|
505 |
*
|
506 |
* @return void
|
507 |
*/
|
508 |
public function testLoadTasks() { |
509 |
$this->assertTrue($this->Shell->loadTasks()); |
510 |
|
511 |
$this->Shell->tasks = null; |
512 |
$this->assertTrue($this->Shell->loadTasks()); |
513 |
|
514 |
$this->Shell->tasks = false; |
515 |
$this->assertTrue($this->Shell->loadTasks()); |
516 |
|
517 |
$this->Shell->tasks = true; |
518 |
$this->assertTrue($this->Shell->loadTasks()); |
519 |
|
520 |
$this->Shell->tasks = array(); |
521 |
$this->assertTrue($this->Shell->loadTasks()); |
522 |
|
523 |
$this->Shell->tasks = array('TestApple'); |
524 |
$this->assertTrue($this->Shell->loadTasks()); |
525 |
$this->assertInstanceOf('TestAppleTask', $this->Shell->TestApple); |
526 |
|
527 |
$this->Shell->tasks = 'TestBanana'; |
528 |
$this->assertTrue($this->Shell->loadTasks()); |
529 |
$this->assertInstanceOf('TestAppleTask', $this->Shell->TestApple); |
530 |
$this->assertInstanceOf('TestBananaTask', $this->Shell->TestBanana); |
531 |
|
532 |
unset($this->Shell->ShellTestApple, $this->Shell->TestBanana); |
533 |
|
534 |
$this->Shell->tasks = array('TestApple', 'TestBanana'); |
535 |
$this->assertTrue($this->Shell->loadTasks()); |
536 |
$this->assertInstanceOf('TestAppleTask', $this->Shell->TestApple); |
537 |
$this->assertInstanceOf('TestBananaTask', $this->Shell->TestBanana); |
538 |
} |
539 |
|
540 |
/**
|
541 |
* test that __get() makes args and params references
|
542 |
*
|
543 |
* @return void
|
544 |
*/
|
545 |
public function testMagicGetArgAndParamReferences() { |
546 |
$this->Shell->tasks = array('TestApple'); |
547 |
$this->Shell->args = array('one'); |
548 |
$this->Shell->params = array('help' => false); |
549 |
$this->Shell->loadTasks(); |
550 |
$result = $this->Shell->TestApple; |
551 |
|
552 |
$this->Shell->args = array('one', 'two'); |
553 |
|
554 |
$this->assertSame($this->Shell->args, $result->args); |
555 |
$this->assertSame($this->Shell->params, $result->params); |
556 |
} |
557 |
|
558 |
/**
|
559 |
* testShortPath method
|
560 |
*
|
561 |
* @return void
|
562 |
*/
|
563 |
public function testShortPath() { |
564 |
$path = $expected = DS . 'tmp' . DS . 'ab' . DS . 'cd'; |
565 |
$this->assertEquals($expected, $this->Shell->shortPath($path)); |
566 |
|
567 |
$path = $expected = DS . 'tmp' . DS . 'ab' . DS . 'cd' . DS; |
568 |
$this->assertEquals($expected, $this->Shell->shortPath($path)); |
569 |
|
570 |
$path = $expected = DS . 'tmp' . DS . 'ab' . DS . 'index.php'; |
571 |
$this->assertEquals($expected, $this->Shell->shortPath($path)); |
572 |
|
573 |
$path = DS . 'tmp' . DS . 'ab' . DS . DS . 'cd'; |
574 |
$expected = DS . 'tmp' . DS . 'ab' . DS . 'cd'; |
575 |
$this->assertEquals($expected, $this->Shell->shortPath($path)); |
576 |
|
577 |
$path = 'tmp' . DS . 'ab'; |
578 |
$expected = 'tmp' . DS . 'ab'; |
579 |
$this->assertEquals($expected, $this->Shell->shortPath($path)); |
580 |
|
581 |
$path = 'tmp' . DS . 'ab'; |
582 |
$expected = 'tmp' . DS . 'ab'; |
583 |
$this->assertEquals($expected, $this->Shell->shortPath($path)); |
584 |
|
585 |
$path = APP; |
586 |
$expected = DS . basename(APP) . DS; |
587 |
$this->assertEquals($expected, $this->Shell->shortPath($path)); |
588 |
|
589 |
$path = APP . 'index.php'; |
590 |
$expected = DS . basename(APP) . DS . 'index.php'; |
591 |
$this->assertEquals($expected, $this->Shell->shortPath($path)); |
592 |
} |
593 |
|
594 |
/**
|
595 |
* testCreateFile method
|
596 |
*
|
597 |
* @return void
|
598 |
*/
|
599 |
public function testCreateFileNonInteractive() { |
600 |
$eol = PHP_EOL; |
601 |
|
602 |
$path = TMP . 'shell_test'; |
603 |
$file = $path . DS . 'file1.php'; |
604 |
|
605 |
new Folder($path, true); |
606 |
|
607 |
$this->Shell->interactive = false; |
608 |
|
609 |
$contents = "<?php{$eol}echo 'test';${eol}\$te = 'st';{$eol}"; |
610 |
$result = $this->Shell->createFile($file, $contents); |
611 |
$this->assertTrue($result); |
612 |
$this->assertTrue(file_exists($file)); |
613 |
$this->assertEquals(file_get_contents($file), $contents); |
614 |
|
615 |
$contents = "<?php\necho 'another test';\n\$te = 'st';\n"; |
616 |
$result = $this->Shell->createFile($file, $contents); |
617 |
$this->assertTrue($result); |
618 |
$this->assertTrue(file_exists($file)); |
619 |
$this->assertTextEquals(file_get_contents($file), $contents); |
620 |
} |
621 |
|
622 |
/**
|
623 |
* test createFile when the shell is interactive.
|
624 |
*
|
625 |
* @return void
|
626 |
*/
|
627 |
public function testCreateFileInteractive() { |
628 |
$eol = PHP_EOL; |
629 |
|
630 |
$path = TMP . 'shell_test'; |
631 |
$file = $path . DS . 'file1.php'; |
632 |
new Folder($path, true); |
633 |
|
634 |
$this->Shell->interactive = true; |
635 |
|
636 |
$this->Shell->stdin->expects($this->at(0)) |
637 |
->method('read')
|
638 |
->will($this->returnValue('n')); |
639 |
|
640 |
$this->Shell->stdin->expects($this->at(1)) |
641 |
->method('read')
|
642 |
->will($this->returnValue('y')); |
643 |
|
644 |
$contents = "<?php{$eol}echo 'yet another test';{$eol}\$te = 'st';{$eol}"; |
645 |
$result = $this->Shell->createFile($file, $contents); |
646 |
$this->assertTrue($result); |
647 |
$this->assertTrue(file_exists($file)); |
648 |
$this->assertEquals(file_get_contents($file), $contents); |
649 |
|
650 |
// no overwrite
|
651 |
$contents = 'new contents'; |
652 |
$result = $this->Shell->createFile($file, $contents); |
653 |
$this->assertFalse($result); |
654 |
$this->assertTrue(file_exists($file)); |
655 |
$this->assertNotEquals($contents, file_get_contents($file)); |
656 |
|
657 |
// overwrite
|
658 |
$contents = 'more new contents'; |
659 |
$result = $this->Shell->createFile($file, $contents); |
660 |
$this->assertTrue($result); |
661 |
$this->assertTrue(file_exists($file)); |
662 |
$this->assertEquals($contents, file_get_contents($file)); |
663 |
} |
664 |
|
665 |
/**
|
666 |
* Test that you can't create files that aren't writable.
|
667 |
*
|
668 |
* @return void
|
669 |
*/
|
670 |
public function testCreateFileNoPermissions() { |
671 |
$this->skipIf(DIRECTORY_SEPARATOR === '\\', 'Cant perform operations using permissions on Windows.'); |
672 |
|
673 |
$path = TMP . 'shell_test'; |
674 |
$file = $path . DS . 'no_perms'; |
675 |
|
676 |
if (!is_dir($path)) { |
677 |
mkdir($path); |
678 |
} |
679 |
chmod($path, 0444); |
680 |
|
681 |
$this->Shell->createFile($file, 'testing'); |
682 |
$this->assertFalse(file_exists($file)); |
683 |
|
684 |
chmod($path, 0744); |
685 |
rmdir($path); |
686 |
} |
687 |
|
688 |
/**
|
689 |
* test hasTask method
|
690 |
*
|
691 |
* @return void
|
692 |
*/
|
693 |
public function testHasTask() { |
694 |
$this->Shell->tasks = array('Extract', 'DbConfig'); |
695 |
$this->Shell->loadTasks(); |
696 |
|
697 |
$this->assertTrue($this->Shell->hasTask('extract')); |
698 |
$this->assertTrue($this->Shell->hasTask('Extract')); |
699 |
$this->assertFalse($this->Shell->hasTask('random')); |
700 |
|
701 |
$this->assertTrue($this->Shell->hasTask('db_config')); |
702 |
$this->assertTrue($this->Shell->hasTask('DbConfig')); |
703 |
} |
704 |
|
705 |
/**
|
706 |
* test the hasMethod
|
707 |
*
|
708 |
* @return void
|
709 |
*/
|
710 |
public function testHasMethod() { |
711 |
$this->assertTrue($this->Shell->hasMethod('do_something')); |
712 |
$this->assertFalse($this->Shell->hasMethod('hr'), 'hr is callable'); |
713 |
$this->assertFalse($this->Shell->hasMethod('_secret'), '_secret is callable'); |
714 |
$this->assertFalse($this->Shell->hasMethod('no_access'), 'no_access is callable'); |
715 |
} |
716 |
|
717 |
/**
|
718 |
* test run command calling main.
|
719 |
*
|
720 |
* @return void
|
721 |
*/
|
722 |
public function testRunCommandMain() { |
723 |
$Mock = $this->getMock('Shell', array('main', 'startup'), array(), '', false); |
724 |
|
725 |
$Mock->expects($this->once())->method('main')->will($this->returnValue(true)); |
726 |
$result = $Mock->runCommand(null, array()); |
727 |
$this->assertTrue($result); |
728 |
} |
729 |
|
730 |
/**
|
731 |
* test run command calling a legit method.
|
732 |
*
|
733 |
* @return void
|
734 |
*/
|
735 |
public function testRunCommandWithMethod() { |
736 |
$Mock = $this->getMock('Shell', array('hit_me', 'startup'), array(), '', false); |
737 |
|
738 |
$Mock->expects($this->once())->method('hit_me')->will($this->returnValue(true)); |
739 |
$result = $Mock->runCommand('hit_me', array()); |
740 |
$this->assertTrue($result); |
741 |
} |
742 |
|
743 |
/**
|
744 |
* test run command causing exception on Shell method.
|
745 |
*
|
746 |
* @return void
|
747 |
*/
|
748 |
public function testRunCommandBaseclassMethod() { |
749 |
$Mock = $this->getMock('Shell', array('startup', 'getOptionParser', 'out'), array(), '', false); |
750 |
$Parser = $this->getMock('ConsoleOptionParser', array(), array(), '', false); |
751 |
|
752 |
$Parser->expects($this->once())->method('help'); |
753 |
$Mock->expects($this->once())->method('getOptionParser') |
754 |
->will($this->returnValue($Parser)); |
755 |
$Mock->expects($this->never())->method('hr'); |
756 |
$Mock->expects($this->once())->method('out'); |
757 |
|
758 |
$Mock->runCommand('hr', array()); |
759 |
} |
760 |
|
761 |
/**
|
762 |
* test run command causing exception on Shell method.
|
763 |
*
|
764 |
* @return void
|
765 |
*/
|
766 |
public function testRunCommandMissingMethod() { |
767 |
$Mock = $this->getMock('Shell', array('startup', 'getOptionParser', 'out'), array(), '', false); |
768 |
$Parser = $this->getMock('ConsoleOptionParser', array(), array(), '', false); |
769 |
|
770 |
$Parser->expects($this->once())->method('help'); |
771 |
$Mock->expects($this->never())->method('idontexist'); |
772 |
$Mock->expects($this->once())->method('getOptionParser') |
773 |
->will($this->returnValue($Parser)); |
774 |
$Mock->expects($this->once())->method('out'); |
775 |
|
776 |
$result = $Mock->runCommand('idontexist', array()); |
777 |
$this->assertFalse($result); |
778 |
} |
779 |
|
780 |
/**
|
781 |
* test that a --help causes help to show.
|
782 |
*
|
783 |
* @return void
|
784 |
*/
|
785 |
public function testRunCommandTriggeringHelp() { |
786 |
$Parser = $this->getMock('ConsoleOptionParser', array(), array(), '', false); |
787 |
$Parser->expects($this->once())->method('parse') |
788 |
->with(array('--help')) |
789 |
->will($this->returnValue(array(array('help' => true), array()))); |
790 |
$Parser->expects($this->once())->method('help'); |
791 |
|
792 |
$Shell = $this->getMock('Shell', array('getOptionParser', 'out', 'startup', '_welcome'), array(), '', false); |
793 |
$Shell->expects($this->once())->method('getOptionParser') |
794 |
->will($this->returnValue($Parser)); |
795 |
$Shell->expects($this->once())->method('out'); |
796 |
|
797 |
$Shell->runCommand(null, array('--help')); |
798 |
} |
799 |
|
800 |
/**
|
801 |
* test that runCommand will call runCommand on the task.
|
802 |
*
|
803 |
* @return void
|
804 |
*/
|
805 |
public function testRunCommandHittingTask() { |
806 |
$Shell = $this->getMock('Shell', array('hasTask', 'startup'), array(), '', false); |
807 |
$task = $this->getMock('Shell', array('execute', 'runCommand'), array(), '', false); |
808 |
$task->expects($this->any()) |
809 |
->method('runCommand')
|
810 |
->with('execute', array('one', 'value')); |
811 |
|
812 |
$Shell->expects($this->once())->method('startup'); |
813 |
$Shell->expects($this->any()) |
814 |
->method('hasTask')
|
815 |
->will($this->returnValue(true)); |
816 |
|
817 |
$Shell->RunCommand = $task; |
818 |
|
819 |
$Shell->runCommand('run_command', array('run_command', 'one', 'value')); |
820 |
} |
821 |
|
822 |
/**
|
823 |
* test wrapBlock wrapping text.
|
824 |
*
|
825 |
* @return void
|
826 |
*/
|
827 |
public function testWrapText() { |
828 |
$text = 'This is the song that never ends. This is the song that never ends. This is the song that never ends.'; |
829 |
$result = $this->Shell->wrapText($text, 33); |
830 |
$expected = <<<TEXT |
831 |
This is the song that never ends.
|
832 |
This is the song that never ends.
|
833 |
This is the song that never ends.
|
834 |
TEXT;
|
835 |
$this->assertTextEquals($expected, $result, 'Text not wrapped.'); |
836 |
|
837 |
$result = $this->Shell->wrapText($text, array('indent' => ' ', 'width' => 33)); |
838 |
$expected = <<<TEXT |
839 |
This is the song that never ends.
|
840 |
This is the song that never ends.
|
841 |
This is the song that never ends.
|
842 |
TEXT;
|
843 |
$this->assertTextEquals($expected, $result, 'Text not wrapped.'); |
844 |
} |
845 |
|
846 |
/**
|
847 |
* Testing camel cased naming of tasks
|
848 |
*
|
849 |
* @return void
|
850 |
*/
|
851 |
public function testShellNaming() { |
852 |
$this->Shell->tasks = array('TestApple'); |
853 |
$this->Shell->loadTasks(); |
854 |
$expected = 'TestApple'; |
855 |
$this->assertEquals($expected, $this->Shell->TestApple->name); |
856 |
} |
857 |
|
858 |
/**
|
859 |
* Test reading params
|
860 |
*
|
861 |
* @dataProvider paramReadingDataProvider
|
862 |
*/
|
863 |
public function testParamReading($toRead, $expected) { |
864 |
$this->Shell->params = array( |
865 |
'key' => 'value', |
866 |
'help' => false, |
867 |
'emptykey' => '', |
868 |
'truthy' => true |
869 |
); |
870 |
$this->assertSame($expected, $this->Shell->param($toRead)); |
871 |
} |
872 |
|
873 |
/**
|
874 |
* Data provider for testing reading values with Shell::param()
|
875 |
*
|
876 |
* @return array
|
877 |
*/
|
878 |
public function paramReadingDataProvider() { |
879 |
return array( |
880 |
array(
|
881 |
'key',
|
882 |
'value',
|
883 |
), |
884 |
array(
|
885 |
'help',
|
886 |
false,
|
887 |
), |
888 |
array(
|
889 |
'emptykey',
|
890 |
'',
|
891 |
), |
892 |
array(
|
893 |
'truthy',
|
894 |
true,
|
895 |
), |
896 |
array(
|
897 |
'does_not_exist',
|
898 |
null,
|
899 |
) |
900 |
); |
901 |
} |
902 |
|
903 |
/**
|
904 |
* Test that option parsers are created with the correct name/command.
|
905 |
*
|
906 |
* @return void
|
907 |
*/
|
908 |
public function testGetOptionParser() { |
909 |
$this->Shell->name = 'test'; |
910 |
$this->Shell->plugin = 'plugin'; |
911 |
$parser = $this->Shell->getOptionParser(); |
912 |
|
913 |
$this->assertEquals('plugin.test', $parser->command()); |
914 |
} |
915 |
|
916 |
/**
|
917 |
* Test file and console and logging
|
918 |
*
|
919 |
* @return void
|
920 |
*/
|
921 |
public function testFileAndConsoleLogging() { |
922 |
// file logging
|
923 |
$this->Shell->log_something(); |
924 |
$this->assertTrue(file_exists(LOGS . 'error.log')); |
925 |
|
926 |
unlink(LOGS . 'error.log'); |
927 |
$this->assertFalse(file_exists(LOGS . 'error.log')); |
928 |
|
929 |
// both file and console logging
|
930 |
require_once CORE_TEST_CASES . DS . 'Log' . DS . 'Engine' . DS . 'ConsoleLogTest.php'; |
931 |
$mock = $this->getMock('ConsoleLog', array('write'), array( |
932 |
array('types' => 'error'), |
933 |
)); |
934 |
TestCakeLog::config('console', array( |
935 |
'engine' => 'Console', |
936 |
'stream' => 'php://stderr', |
937 |
)); |
938 |
TestCakeLog::replace('console', $mock); |
939 |
$mock->expects($this->once()) |
940 |
->method('write')
|
941 |
->with('error', $this->Shell->testMessage); |
942 |
$this->Shell->log_something(); |
943 |
$this->assertTrue(file_exists(LOGS . 'error.log')); |
944 |
$contents = file_get_contents(LOGS . 'error.log'); |
945 |
$this->assertContains($this->Shell->testMessage, $contents); |
946 |
} |
947 |
|
948 |
/**
|
949 |
* Tests that _useLogger works properly
|
950 |
*
|
951 |
* @return void
|
952 |
*/
|
953 |
public function testProtectedUseLogger() { |
954 |
CakeLog::drop('stdout'); |
955 |
CakeLog::drop('stderr'); |
956 |
$this->Shell->useLogger(true); |
957 |
$this->assertNotEmpty(CakeLog::stream('stdout')); |
958 |
$this->assertNotEmpty(CakeLog::stream('stderr')); |
959 |
$this->Shell->useLogger(false); |
960 |
$this->assertFalse(CakeLog::stream('stdout')); |
961 |
$this->assertFalse(CakeLog::stream('stderr')); |
962 |
} |
963 |
|
964 |
/**
|
965 |
* Test file and console and logging quiet output
|
966 |
*
|
967 |
* @return void
|
968 |
*/
|
969 |
public function testQuietLog() { |
970 |
$output = $this->getMock('ConsoleOutput', array(), array(), '', false); |
971 |
$error = $this->getMock('ConsoleOutput', array(), array(), '', false); |
972 |
$in = $this->getMock('ConsoleInput', array(), array(), '', false); |
973 |
$this->Shell = $this->getMock('ShellTestShell', array('_useLogger'), array($output, $error, $in)); |
974 |
$this->Shell->expects($this->once())->method('_useLogger')->with(false); |
975 |
$this->Shell->runCommand('foo', array('--quiet')); |
976 |
} |
977 |
|
978 |
} |