Proyectos de Subversion Moodle

Rev

Rev 1 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
// This file is part of Moodle - http://moodle.org/
3
//
4
// Moodle is free software: you can redistribute it and/or modify
5
// it under the terms of the GNU General Public License as published by
6
// the Free Software Foundation, either version 3 of the License, or
7
// (at your option) any later version.
8
//
9
// Moodle is distributed in the hope that it will be useful,
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
// GNU General Public License for more details.
13
//
14
// You should have received a copy of the GNU General Public License
15
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
16
 
17
/**
18
 * Behat arguments transformations.
19
 *
20
 * This methods are used by Behat CLI command.
21
 *
22
 * @package    core
23
 * @category   test
24
 * @copyright  2012 David Monllaó
25
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
26
 */
27
 
28
// NOTE: no MOODLE_INTERNAL test here, this file may be required by behat before including /config.php.
29
 
30
require_once(__DIR__ . '/../../behat/behat_base.php');
31
 
32
use Behat\Gherkin\Node\TableNode;
33
 
34
/**
35
 * Transformations to apply to steps arguments.
36
 *
37
 * This methods are applied to the steps arguments that matches
38
 * the regular expressions specified in the @Transform tag.
39
 *
40
 * @package   core
41
 * @category  test
42
 * @copyright 2013 David Monllaó
43
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
44
 */
45
class behat_transformations extends behat_base {
46
 
47
    /**
48
     * Removes escaped argument delimiters.
49
     *
50
     * We use double quotes as arguments delimiters and
51
     * to add the " as part of an argument we escape it
52
     * with a backslash, this method removes this backslash.
53
     *
54
     * @Transform /^((.*)"(.*))$/
55
     * @param string $string
56
     * @return string The string with the arguments fixed.
57
     */
58
    public function arg_replace_slashes($string) {
59
        if (!is_scalar($string)) {
60
            return $string;
61
        }
62
        return str_replace('\"', '"', $string);
63
    }
64
 
65
    /**
66
     * Replaces $NASTYSTRING vars for a nasty string.
67
     *
68
     * @Transform /^((.*)\$NASTYSTRING(\d)(.*))$/
69
     * @param string $argument The whole argument value.
70
     * @return string
71
     */
72
    public function arg_replace_nasty_strings($argument) {
73
        if (!is_scalar($argument)) {
74
            return $argument;
75
        }
76
        return $this->replace_nasty_strings($argument);
77
    }
78
 
79
    /**
80
     * Convert string time to timestamp.
81
     * Use ::time::STRING_TIME_TO_CONVERT::DATE_FORMAT::
82
     *
83
     * @Transform /^##(.*)##$/
84
     * @param string $time
85
     * @return int timestamp.
86
     */
87
    public function arg_time_to_string($time) {
88
        return $this->get_transformed_timestamp($time);
89
    }
90
 
91
    /**
92
     * Transformations for TableNode arguments.
93
     *
94
     * Transformations applicable to TableNode arguments should also
95
     * be applied, adding them in a different method for Behat API restrictions.
96
     *
97
     * @Transform table:*
98
     * @param TableNode $tablenode
99
     * @return TableNode The transformed table
100
     */
101
    public function tablenode_transformations(TableNode $tablenode) {
102
        global $CFG;
103
        // Walk through all values including the optional headers.
104
        $rows = $tablenode->getRows();
105
        foreach ($rows as $rowkey => $row) {
106
            foreach ($row as $colkey => $value) {
107
 
108
                // Transforms vars into nasty strings.
109
                if (preg_match('/\$NASTYSTRING(\d)/', $rows[$rowkey][$colkey])) {
110
                    $rows[$rowkey][$colkey] = $this->replace_nasty_strings($rows[$rowkey][$colkey]);
111
                }
112
 
113
                // Transform time.
114
                if (preg_match('/^##(.*)##$/', $rows[$rowkey][$colkey], $match)) {
115
                    if (isset($match[1])) {
116
                        $rows[$rowkey][$colkey] = $this->get_transformed_timestamp($match[1]);
117
                    }
118
                }
119
 
120
                // Transform wwwroot.
121
                if (preg_match('/#wwwroot#/', $rows[$rowkey][$colkey])) {
122
                    $rows[$rowkey][$colkey] = $this->replace_wwwroot($rows[$rowkey][$colkey]);
123
                }
124
            }
125
        }
126
 
127
        // Return the transformed TableNode.
128
        unset($tablenode);
129
        $tablenode = new TableNode($rows);
130
 
131
        return $tablenode;
132
    }
133
 
134
    /**
135
     * Convert #wwwroot# to the wwwroot config value, so it is
136
     * possible to reference fully qualified URLs within the site.
137
     *
138
     * @Transform /^((.*)#wwwroot#(.*))$/
139
     * @param string $string
140
     * @return string
141
     */
142
    public function arg_insert_wwwroot(string $string): string {
143
        return $this->replace_wwwroot($string);
144
    }
145
 
146
    /**
1441 ariadna 147
     * Convert #dirroot# to the dirroot config value, so it is
148
     * possible to reference files (e.g. fixtures) with an absolute path.
149
     *
150
     * @Transform /^((.*)#dirroot#(.*))$/
151
     * @param string $string
152
     * @return string
153
     */
154
    public function arg_insert_dirroot(string $string): string {
155
        return $this->replace_dirroot($string);
156
    }
157
 
158
    /**
1 efrain 159
     * Replaces $NASTYSTRING vars for a nasty string.
160
     *
161
     * Method reused by TableNode tranformation.
162
     *
163
     * @param string $string
164
     * @return string
165
     */
166
    public function replace_nasty_strings($string) {
167
        return preg_replace_callback(
168
            '/\$NASTYSTRING(\d)/',
169
            function ($matches) {
170
                return nasty_strings::get($matches[0]);
171
            },
172
            $string
173
        );
174
    }
175
 
176
    /**
177
     * Return timestamp for the time passed.
178
     *
179
     * @param string $time time to convert
180
     * @return string
181
     */
182
    protected function get_transformed_timestamp($time) {
183
        $timepassed = explode('##', $time);
184
 
185
        // If not a valid time string, then just return what was passed.
186
        if ((($timestamp = strtotime($timepassed[0])) === false)) {
187
            return $time;
188
        }
189
 
190
        $count = count($timepassed);
191
        if ($count === 2) {
192
            // If timestamp with specified strftime format, then return formatted date string.
193
            return userdate($timestamp, $timepassed[1]);
194
        } else if ($count === 1) {
195
            return $timestamp;
196
        } else {
197
            // If not a valid time string, then just return what was passed.
198
            return $time;
199
        }
200
    }
201
 
202
    /**
203
     * Replace #wwwroot# with the actual wwwroot config value.
204
     *
205
     * @param string $string String to attempt the replacement in.
206
     * @return string
207
     */
208
    protected function replace_wwwroot(string $string): string {
209
        global $CFG;
210
        return str_replace('#wwwroot#', $CFG->wwwroot, $string);
211
    }
1441 ariadna 212
 
213
    /**
214
     * Replace #dirroot# with the actual dirroot config value.
215
     *
216
     * @param string $string String to attempt the replacement in.
217
     * @return string
218
     */
219
    protected function replace_dirroot(string $string): string {
220
        global $CFG;
221
        return str_replace('#dirroot#', $CFG->dirroot, $string);
222
    }
1 efrain 223
}