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

pictcode / lib / Cake / Test / Case / Console / ShellTest.php @ master

履歴 | 表示 | アノテート | ダウンロード (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
}