MDL-34762 course Hide system archetypes from mod chooser
[moodle.git] / mdeploytest.php
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
18 /**
19  * PHPUnit tests for the mdeploy.php utility
20  *
21  * Because the mdeploy.php can't be part of the Moodle code itself, this tests must be
22  * executed using something like:
23  *
24  *  $ phpunit --no-configuration mdeploytest
25  *
26  * @package     core
27  * @copyright   2012 David Mudrak <david@moodle.com>
28  * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
29  */
31 require(__DIR__.'/mdeploy.php');
33 /**
34  * Provides testable input options.
35  *
36  * @copyright 2012 David Mudrak <david@moodle.com>
37  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
38  */
39 class input_fake_provider extends input_provider {
41     /** @var array */
42     protected $fakeoptions = array();
44     /**
45      * Sets fake raw options.
46      *
47      * @param array $options
48      */
49     public function set_fake_options(array $options) {
50         $this->fakeoptions = $options;
51         $this->populate_options();
52     }
54     /**
55      * Returns the explicitly set fake options.
56      *
57      * @return array
58      */
59     protected function parse_raw_options() {
60         return $this->fakeoptions;
61     }
62 }
64 /**
65  * Testable subclass.
66  *
67  * @copyright 2012 David Mudrak <david@moodle.com>
68  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
69  */
70 class testable_input_manager extends input_manager {
72     /**
73      * Provides access to the protected method so we can test it explicitly.
74      */
75     public function cast_value($raw, $type) {
76         return parent::cast_value($raw, $type);
77     }
79     /**
80      * Sets the fake input provider.
81      */
82     protected function initialize() {
83         $this->inputprovider = input_fake_provider::instance();
84     }
85 }
88 /**
89  * Test cases for the mdeploy utility
90  *
91  * @copyright 2012 David Mudrak <david@moodle.com>
92  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
93  */
94 class mdeploytest extends PHPUnit_Framework_TestCase {
96     public function test_same_singletons() {
97         $a = input_manager::instance();
98         $b = input_manager::instance();
99         $this->assertSame($a, $b);
100     }
102     /**
103      * @dataProvider data_for_cast_value
104      */
105     public function test_cast_value($raw, $type, $result) {
106         $input = testable_input_manager::instance();
107         $this->assertSame($input->cast_value($raw, $type), $result);
108     }
110     public function data_for_cast_value() {
111         return array(
112             array('3', input_manager::TYPE_INT, 3),
113             array(4, input_manager::TYPE_INT, 4),
114             array('', input_manager::TYPE_INT, 0),
116             array(true, input_manager::TYPE_FLAG, true),
117             array(false, input_manager::TYPE_FLAG, true),
118             array(0, input_manager::TYPE_FLAG, true),
119             array('1', input_manager::TYPE_FLAG, true),
120             array('0', input_manager::TYPE_FLAG, true),
121             array('muhehe', input_manager::TYPE_FLAG, true),
123             array('C:\\WINDOWS\\user.dat', input_manager::TYPE_PATH, 'C/WINDOWS/user.dat'),
124             array('../../../etc/passwd', input_manager::TYPE_PATH, '/etc/passwd'),
125             array('///////.././public_html/test.php', input_manager::TYPE_PATH, '/public_html/test.php'),
127             array("!@#$%|/etc/qwerty\n\n\t\n\r", input_manager::TYPE_RAW, "!@#$%|/etc/qwerty\n\n\t\n\r"),
129             array("\nrock'n'roll.mp3\t.exe", input_manager::TYPE_FILE, 'rocknroll.mp3.exe'),
131             array('http://localhost/moodle/dev/plugin.zip', input_manager::TYPE_URL, 'http://localhost/moodle/dev/plugin.zip'),
132             array(
133                 'https://moodle.org/plugins/download.php/1292/mod_stampcoll_moodle23_2012062201.zip',
134                 input_manager::TYPE_URL,
135                 'https://moodle.org/plugins/download.php/1292/mod_stampcoll_moodle23_2012062201.zip'
136             ),
138             array('5e8d2ea4f50d154730100b1645fbad67', input_manager::TYPE_MD5, '5e8d2ea4f50d154730100b1645fbad67'),
139         );
140     }
142     /**
143      * @expectedException invalid_coding_exception
144      */
145     public function test_cast_array_argument() {
146         $input = testable_input_manager::instance();
147         $input->cast_value(array(1, 2, 3), input_manager::TYPE_INT); // must throw exception
148     }
150     /**
151      * @expectedException invalid_coding_exception
152      */
153     public function test_cast_object_argument() {
154         $input = testable_input_manager::instance();
155         $o = new stdClass();
156         $input->cast_value($o, input_manager::TYPE_INT); // must throw exception
157     }
159     /**
160      * @expectedException invalid_option_exception
161      */
162     public function test_cast_invalid_url_value() {
163         $input = testable_input_manager::instance();
164         $invalid = 'file:///etc/passwd';
165         $input->cast_value($invalid, input_manager::TYPE_URL); // must throw exception
166     }
168     /**
169      * @expectedException invalid_option_exception
170      */
171     public function test_cast_invalid_md5_value() {
172         $input = testable_input_manager::instance();
173         $invalid = 'this is not a valid md5 hash';
174         $input->cast_value($invalid, input_manager::TYPE_MD5); // must throw exception
175     }
177     /**
178      * @expectedException invalid_option_exception
179      */
180     public function test_cast_tilde_in_path() {
181         $input = testable_input_manager::instance();
182         $invalid = '~/public_html/moodle_dev';
183         $input->cast_value($invalid, input_manager::TYPE_PATH); // must throw exception
184     }
186     public function test_has_option() {
187         $provider = input_fake_provider::instance();
189         $provider->set_fake_options(array());
190         $this->assertFalse($provider->has_option('foo')); // foo not passed
192         $provider->set_fake_options(array('foo' => 1));
193         $this->assertFalse($provider->has_option('foo')); // foo passed but not a known option
195         $provider->set_fake_options(array('foo' => 1, 'help' => false));
196         $this->assertTrue($provider->has_option('help')); // help passed and it is a flag (value ignored)
197         $this->assertTrue($provider->has_option('h')); // 'h' is a shortname for 'help'
198     }
200     public function test_get_option() {
201         $input = testable_input_manager::instance();
202         $provider = input_fake_provider::instance();
204         $provider->set_fake_options(array('help' => false, 'passfile' => '_mdeploy.123456'));
205         $this->assertTrue($input->get_option('h'));
206         $this->assertEquals($input->get_option('passfile'), '_mdeploy.123456');
207         $this->assertEquals($input->get_option('password', 'admin123'), 'admin123');
208         try {
209             $this->assertEquals($input->get_option('password'), 'admin123'); // must throw exception (not passed but required)
210             $this->assertTrue(false);
211         } catch (missing_option_exception $e) {
212             $this->assertTrue(true);
213         }
214     }