統計
| ブランチ: | リビジョン:

pictcode / lib / Cake / Test / Case / Console / ShellTest.php @ 635eef61

履歴 | 表示 | アノテート | ダウンロード (25.493 KB)

1 635eef61 spyder1211
<?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
}