WordPress.org

Make WordPress Core

Ticket #41593: scratch_50.php

File scratch_50.php, 8.4 KB (added by jdgrimes, 2 years ago)

A mess of unit tests for some of the functions that expect slashed data

Line 
1<?php
2
3class Slashing_Test extends WP_UnitTestCase {
4
5        public $post_id;
6
7        /**
8         * @dataProvider data_provider_functions
9         */
10        public function test_s( $function ) {
11                $s    = 'String with\\slash.';
12                $post = $this->factory()->post->create_and_get(
13                        array( 'post_content' => wp_slash( $s ) )
14                );
15
16                $this->post_id = $post->ID;
17
18                $this->assertSame( $s, $post->post_content );
19
20                if ( is_array( $function ) ) {
21                        $function[0] = $this;
22                }
23                $posts = $this->call_function(
24                        $function
25                        , array( 's' => $s, 'fields' => 'ids' )
26                );
27
28                $this->assertEmpty( $posts );
29
30                $posts = $this->call_function(
31                        $function
32                        , array( 's' => wp_slash( $s ), 'fields' => 'ids' )
33                );
34
35                $this->assertSame( array( $this->post_id ), $posts );
36        }
37
38        public function data_provider_functions() {
39                return array(
40                        'WP_Query::query' => array( array( 'this', 'wp_query_query' ) ),
41                        'WP_Query::__construct' => array( array( 'this', 'wp_query_construct' ) ),
42                        'query_posts' => array( 'query_posts' ),
43                        'get_posts' => array( 'get_posts' ),
44                        'wp_get_recent_posts' => array( array( 'this', 'wp_get_recent_posts' ) ),
45                        'wp_get_nav_menu_items' => array( array( 'this', 'wp_get_nav_menu_items' ) ),
46                        'get_children' => array( 'get_children' ),
47//                      'wp_get_post_revisions' => array( array( 'this', 'wp_get_post_revisions' ) ),
48                );
49        }
50
51        public function wp_query_query( $args ) {
52                $query = new WP_Query();
53                return $query->query( $args );
54        }
55
56        public function wp_query_construct( $args ) {
57                $query = new WP_Query( $args );
58                return $query->posts;
59        }
60
61        public function wp_get_recent_posts( $args ) {
62                $args['fields'] = 'all';
63                return wp_list_pluck( wp_get_recent_posts( $args ), 'ID' );
64        }
65
66        public function wp_get_nav_menu_items( $args ) {
67
68                $menu = wp_create_nav_menu( 'test' . rand() );
69
70                $result = wp_update_post( array( 'ID' => $this->post_id, 'post_type' => 'nav_menu_item' ) );
71                $this->assertSame( $this->post_id, $result );
72
73                $result = wp_set_object_terms( $this->post_id, $menu, 'nav_menu' );
74                $this->assertInternalType( 'array', $result );
75
76                $args['fields'] = 'all';
77                return wp_list_pluck( wp_get_nav_menu_items( $menu, $args ), 'ID' );
78        }
79//
80//  // TODO revisions don't support metadata or taxonomies by default.
81//      public function wp_get_post_revisions( $args ) {
82//
83//              if (
84//                      ! wp_get_post_revisions( $this->post_id )
85//                      && ! wp_get_post_revision( $this->post_id )
86//              ) {
87//                      $revision = wp_save_post_revision( $this->post_id );
88//                      $this->assertNotEmpty( $revision );
89//                      $this->assertInternalType( 'integer', $revision );
90//                      $this->the_post_id = $this->post_id;
91//              } else {
92//                      $revision = $this->post_id;
93//                      $this->post_id = $this->the_post_id;
94//              }
95//
96//              $result = wp_update_post( array( 'ID' => $this->post_id, 'post_status' => 'publish' ) );
97//              $this->assertSame( $this->post_id, $result );
98//
99//              $this->post_id = $revision;
100//              return wp_get_post_revisions( $this->the_post_id, $args );
101//      }
102
103        public function call_function( $function, $args ) {
104
105                if ( is_array( $function ) ) {
106                        $function[0] = $this;
107                }
108
109                return call_user_func( $function, $args );
110        }
111
112        /**
113         * @dataProvider data_provider_functions
114         */
115        public function test_title( $function ) {
116                $s    = 'String with\\slash.';
117                $post = $this->factory()->post->create_and_get(
118                        array( 'post_title' => wp_slash( $s ) )
119                );
120
121                $this->post_id = $post->ID;
122
123                $this->assertSame( $s, $post->post_title );
124
125                $posts = $this->call_function(
126                        $function
127                        , array( 'title' => $s, 'fields' => 'ids' )
128                );
129
130                $this->assertEmpty( $posts );
131
132                $posts = $this->call_function(
133                        $function
134                        , array( 'title' => wp_slash( $s ), 'fields' => 'ids' )
135                );
136
137                $this->assertSame( array( $this->post_id ), $posts );
138        }
139
140        /**
141         * @dataProvider data_provider_functions
142         */
143        public function test_meta_value( $function ) {
144                $s    = 'String with\\slash.';
145                $this->post_id = $this->factory()->post->create();
146                add_post_meta( $this->post_id, 'test', wp_slash( $s ) );
147
148                $this->assertSame( $s, get_post_meta( $this->post_id, 'test', true ) );
149
150                $posts = $this->call_function(
151                        $function
152                        , array( 'meta_value' => $s, 'fields' => 'ids' )
153                );
154
155                $this->assertSame( array( $this->post_id ), $posts );
156
157                $posts = $this->call_function(
158                        $function
159                        , array( 'meta_value' => wp_slash( $s ), 'fields' => 'ids' )
160                );
161
162                $this->assertEmpty( $posts );
163        }
164
165        /**
166         * @dataProvider data_provider_functions
167         */
168        public function test_meta_key( $function ) {
169                $s    = 'string_with\\slash.';
170                $this->post_id = $this->factory()->post->create();
171                add_post_meta( $this->post_id, wp_slash( $s ), 'test' );
172
173                $this->assertSame( 'test', get_post_meta( $this->post_id, $s, true ) );
174
175                $posts = $this->call_function(
176                        $function
177                        , array( 'meta_key' => $s, 'fields' => 'ids' )
178                );
179
180                $this->assertSame( array( $this->post_id ), $posts );
181
182                $posts = $this->call_function(
183                        $function
184                        , array( 'meta_key' => wp_slash( $s ), 'fields' => 'ids' )
185                );
186
187                $this->assertEmpty( $posts );
188        }
189
190        /**
191         * @dataProvider data_provider_functions
192         */
193        public function test_tax_input( $function ) {
194                $s    = 'String with\\slash.';
195                $this->post_id = $this->factory()->post->create();
196                $term = wp_insert_term( wp_slash( $s ), 'post_tag' );
197                $term = get_term( $term['term_id'] );
198
199                $this->assertSame( $s, $term->name );
200
201                wp_set_post_terms( $this->post_id, $term->slug );
202
203                $posts = $this->call_function(
204                        $function
205                        , array(
206                                'fields'    => 'ids',
207                                'tax_query' => array(
208                                        array(
209                                                'terms'    => $s,
210                                                'field'    => 'name',
211                                                'taxonomy' => 'post_tag',
212                                        ),
213                                ),
214                        )
215                );
216
217                $this->assertSame( array( $this->post_id ), $posts );
218
219                $posts = $this->call_function(
220                        $function
221                        , array(
222                                'fields'    => 'ids',
223                                'tax_query' => array(
224                                        array(
225                                                'terms'    => wp_slash( $s ),
226                                                'field'    => 'name',
227                                                'taxonomy' => 'post_tag',
228                                        ),
229                                ),
230                        )
231                );
232
233                $this->assertEmpty( $posts );
234        }
235
236        public function test_sanitize_term_name() {
237                //https://core.trac.wordpress.org/attachment/ticket/35381/35381.diff
238                $s    = 'String with\\slash.';
239                $term = wp_insert_term( wp_slash( $s ), 'post_tag' );
240                $term = get_term( $term['term_id'] );
241                $this->assertSame( $s, $term->name );
242
243                $this->assertSame( $s, sanitize_text_field( $term->name ) );
244                $this->assertSame( wp_unslash( $s ), wp_filter_kses( $term->name ) );
245                $this->assertSame( $s, wp_unslash( wp_filter_kses( wp_slash( $term->name ) ) ) );
246                $this->assertSame( $s, _wp_specialchars( $term->name ) );
247
248                $this->assertSame( $s, wp_unslash( sanitize_term_field( 'name', wp_slash( $term->name ), $term->term_id, $term->taxonomy, 'db' ) ) );
249                $this->assertSame( $s, sanitize_term_field( 'name', $term->name, $term->term_id, $term->taxonomy, 'edit' ) );
250        }
251
252        public function test_wp_insert_user() {
253
254                $s    = 'String with\\slash.';
255                $user = $this->factory()->user->create( array( 'user_pass' => $s ) );
256                $user = get_userdata( $user );
257                $this->assertTrue( wp_check_password( $s, $user->user_pass ) );
258                $this->assertFalse( wp_check_password( wp_slash( $s ), $user->user_pass ) );
259        }
260
261        public function test_wp_update_user() {
262
263                $s    = 'String with\\slash.';
264                $user = $this->factory()->user->create();
265
266                wp_update_user( (object) array( 'ID' => $user, 'user_pass' => $s ) );
267
268                        $user = get_userdata( $user );
269                $this->assertTrue( wp_check_password( $s, $user->user_pass ) );
270                $this->assertFalse( wp_check_password( wp_slash( $s ), $user->user_pass ) );
271        }
272
273        public function test_edit_user() {
274
275                $s    = 'slash"pass.';
276                $_POST['pass1'] = $s;
277                $_POST['pass2'] = $s;
278                $_POST['nickname'] = 'a';
279                $_POST['email'] = 'a@bc.de';
280
281                $_POST = wp_slash( $_POST );
282
283                $user = $this->factory()->user->create();
284
285                $result = edit_user( $user );
286                $this->assertNotWPError( $result );
287
288                $user = get_userdata( $user );
289                $this->assertTrue( wp_check_password( $s, $user->user_pass ) );
290                $this->assertFalse( wp_check_password( wp_slash( $s ), $user->user_pass ) );
291        }
292
293        public function test_esc_js() {
294
295                $s    = 'String with"quote.';
296                $r    = 'String with&quot;quote.';
297                $this->assertSame( $r, esc_js( wp_slash( $s ) ) );
298                $this->assertSame( $r, esc_js( $s ) );
299
300                $s    = 'String with\'quote.';
301                $this->assertSame( wp_slash( $s ), esc_js( wp_slash( $s ) ) );
302                $this->assertSame( wp_slash( $s ), esc_js( $s ) );
303
304                $s    = 'String with\\"slash.';
305                $r    = 'String with\\&quot;slash.';
306                $this->assertSame( wp_slash( $r ), esc_js( wp_slash( $s ) ) );
307                $this->assertSame( $r, esc_js( $s ) );
308
309                $s    = 'String with\\slash.';
310                $this->assertSame( wp_slash( $s ), esc_js( wp_slash( $s ) ) );
311                $this->assertSame( $s, esc_js( $s ) );
312        }
313
314}