WordPress.org

Make WordPress Core

Ticket #17054: unit-query-flags.php

File unit-query-flags.php, 7.5 KB (added by scribu, 3 years ago)

query flag unit tests

Line 
1<?php
2
3/*
4Plugin Name: Unit Test: Query Flags
5Description: Drop into mu-plugins folder and go to front page
6Author: scribu
7Version: 1.0
8*/
9
10class Unit_Query_Flags {
11
12        const POSTS_PAGE_ID = 111;
13
14        // Expected flags are set without the is_ prefix and separated by a space
15        static $tests = array(
16
17                // Singles
18
19                array(
20                        'query' => array( 'p' => 123 ),
21                        'flags' => 'single singular',
22                ),
23
24                array(
25                        'query' => array( 'p' => 123, 'cpage' => 2 ),
26                        'flags' => 'single singular',
27                ),
28
29                array(
30                        'query' => array( 'name' => 'foo' ),
31                        'flags' => 'single singular',
32                ),
33
34                array(
35                        'query' => array( 'pagename' => 'foo/bar' ),
36                        'flags' => 'page singular',
37                ),
38
39                array(
40                        'query' => array( 'page_id' => 123 ),
41                        'flags' => 'page singular',
42                ),
43
44                array(
45                        'query' => array( 'pagename' => 'foo/bar', 'page' => 2 ),
46                        'flags' => 'page singular',
47                ),
48
49                array(
50                        'query' => array( 'post_type' => 'book', 'name' => 'foo' ),
51                        'flags' => 'single singular',
52                ),
53
54                array(
55                        'query' => array( 'attachment' => 'foo' ),
56                        'flags' => 'attachment single singular',
57                ),
58
59                array(
60                        'query' => array( 'attachment_id' => 123 ),
61                        'flags' => 'attachment single singular',
62                ),
63
64                // Basic archives
65
66                array(
67                        'query' => array(),
68                        'flags' => 'home',
69                ),
70
71                array(
72                        'query' => array( 'page_id' => self::POSTS_PAGE_ID ),
73                        'flags' => 'home posts_page',
74                ),
75
76                array(
77                        'query' => array( 'paged' => 2 ),
78                        'flags' => 'home paged',
79                ),
80
81                array(
82                        'query' => array( 's' => 'foo' ),
83                        'flags' => 'search',
84                ),
85
86                array(
87                        'query' => array( 's' => 'foo' ),
88                        'flags' => 'search'
89                ),
90
91                array(
92                        'query' => array( 'author_name' => 'admin' ),
93                        'flags' => 'archive author'
94                ),
95
96                array(
97                        'query' => array( 'post__in' => array( 1, 2 ) ),
98                        'flags' => 'home'
99                ),
100
101                // Date archives
102
103                array(
104                        'query' => array( 'second' => 1 ),
105                        'flags' => 'archive date time'
106                ),
107
108                array(
109                        'query' => array( 'day' => 22 ),
110                        'flags' => 'archive date day'
111                ),
112
113                array(
114                        'query' => array( 'monthnum' => 1 ),
115                        'flags' => 'archive date month'
116                ),
117
118                array(
119                        'query' => array( 'year' => 2011 ),
120                        'flags' => 'archive date year'
121                ),
122
123                // Tag archives
124
125                array(
126                        'query' => array( 'tag' => 'featured' ),
127                        'flags' => 'archive tag'
128                ),
129
130                array(
131                        'query' => array( 'tag' => 'foo+bar' ),
132                        'flags' => 'archive tag'
133                ),
134
135                array(
136                        'query' => array( 'tag' => 'foo,bar' ),
137                        'flags' => 'archive tag'
138                ),
139
140                array(
141                        'query' => array( 'tag_id' => 123 ),
142                        'flags' => 'archive tag'
143                ),
144
145                // Category archives
146
147                array(
148                        'query' => array( 'category_name' => 'foo/bar' ),
149                        'flags' => 'archive category'
150                ),
151
152                array(
153                        'query' => array( 'cat' => '1+2+3' ),
154                        'flags' => 'archive category'
155                ),
156
157                array(
158                        'query' => array( 'cat' => '-1,2,3' ),
159                        'flags' => 'archive category'
160                ),
161
162                array(
163                        'query' => array( 'cat' => -1 ),
164                        'flags' => 'home'
165                ),
166
167                // Taxonomy archives
168
169                array(
170                        'query' => array( 'color' => 'green' ),
171                        'flags' => 'archive tax'
172                ),
173
174                array(
175                        'query' => array( 'color' => 'green+white' ),
176                        'flags' => 'archive tax'
177                ),
178
179                array(
180                        'query' => array( 'color' => 'green,white' ),
181                        'flags' => 'archive tax'
182                ),
183
184                array(
185                        'query' => array( 'tax_query' => array(
186                                array( 'taxonomy' => 'color', 'terms' => array( 'green' ), 'operator' => 'IN' )
187                        ) ),
188                        'flags' => 'archive tax'
189                ),
190
191                array(
192                        'query' => array( 'tax_query' => array(
193                                array( 'taxonomy' => 'color', 'terms' => array( 'green' ), 'operator' => 'NOT IN' )
194                        ) ),
195                        'flags' => 'home'
196                ),
197
198                array(
199                        'query' => array( 'tax_query' => array(
200                                array( 'taxonomy' => 'category', 'terms' => array( 'green' ), 'operator' => 'NOT IN' )
201                        ) ),
202                        'flags' => 'home'
203                ),
204
205                array(
206                        'query' => array( 'tax_query' => array(
207                                array( 'taxonomy' => 'post_tag', 'terms' => array( 'green' ), 'operator' => 'NOT IN' )
208                        ) ),
209                        'flags' => 'home'
210                ),
211
212                // Taxonomy combinations
213
214                array(
215                        'query' => array( 'tag' => 'foo', 'cat' => 1 ),
216                        'flags' => 'archive category tag'
217                ),
218
219                array(
220                        'query' => array( 'tag' => 'foo', 'color' => 'green' ),
221                        'flags' => 'archive tag tax'
222                ),
223
224                array(
225                        'query' => array( 'cat' => 1, 'color' => 'green' ),
226                        'flags' => 'archive category tax'
227                ),
228
229                array(
230                        'query' => array( 'color' => 'green', 'weight' => 'heavy' ),
231                        'flags' => 'archive tax'
232                ),
233
234                // CPT Archives
235
236                array(
237                        'query' => array( 'post_type' => 'book' ),
238                        'flags' => 'archive post_type_archive'
239                ),
240
241                array(
242                        'query' => array( 'post_type' => 'book', 's' => 'foo' ),
243                        'flags' => 'archive post_type_archive search'
244                ),
245
246                array(
247                        'query' => array( 'post_type' => 'book', 'color' => 'green' ),
248                        'flags' => 'archive post_type_archive tax'
249                ),
250
251                // Feeds
252
253                array(
254                        'query' => array( 'feed' => 'rss' ),
255                        'flags' => 'feed'
256                ),
257
258                array(
259                        'query' => array( 's' => 'foo', 'feed' => 'rss' ),
260                        'flags' => 'feed search'
261                ),
262
263                array(
264                        'query' => array( 'author_name' => 'foo', 'feed' => 'rss' ),
265                        'flags' => 'archive author feed'
266                ),
267
268                array(
269                        'query' => array( 'p' => 1, 'feed' => 'rss' ),
270                        'flags' => 'comment_feed feed single singular'
271                ),
272
273                // Misc
274
275                array(
276                        'query' => array( 'p' => 123, 'preview' => true ),
277                        'flags' => 'preview single singular'
278                ),
279
280                array(
281                        'query' => array( 'p' => 123, 'tb' => true ),
282                        'flags' => 'trackback single singular'
283                ),
284
285                array(
286                        'query' => array( 'robots' => true ),
287                        'flags' => 'robots'
288                ),
289
290                array(
291                        'query' => array( 'p' => 123, 'comments_popup' => true ),
292                        'flags' => 'comments_popup single singular'
293                ),
294        );
295
296        static $query_flags = array(
297                'single',
298                'preview',
299                'page',
300                'archive',
301                'date',
302                'year',
303                'month',
304                'day',
305                'time',
306                'author',
307                'category',
308                'tag',
309                'tax',
310                'search',
311                'feed',
312                'comment_feed',
313                'trackback',
314                'home',
315                '404',
316                'comments_popup',
317                'paged',
318                'admin',
319                'attachment',
320                'singular',
321                'robots',
322                'posts_page',
323                'post_type_archive',
324        );
325
326        // Register any necessary post types and taxonomies
327        function init() {
328                register_post_type( 'book', array(
329                        'public' => true,
330                        'has_archive' => true,
331                        'label' => 'Books',
332                ) );
333
334                register_taxonomy( 'color', 'book' );
335
336                register_taxonomy( 'weight', 'book' );
337
338                // For is_posts_page           
339                add_filter( 'pre_option_show_on_front', function() { return 'page'; } );
340                add_filter( 'pre_option_page_for_posts', function() { return Unit_Query_Flags::POSTS_PAGE_ID; } );
341        }
342
343        // Run the tests
344        function run() {
345                // We're not interested in actually running the query
346                add_filter( 'posts_request', '__return_false' );
347
348                echo "<pre>";
349
350                $failed = $passed = 0;
351                foreach ( self::$tests as $i => $test ) {
352                        $args = $test['query'];
353                        $args['ignore_sticky_posts'] = true;    // prevents warning caused by null $posts
354
355                        $q = new WP_Query( $args );
356
357                        $result = array();
358                        foreach ( self::$query_flags as $flag ) {
359                                $key = "is_$flag";
360
361                                if ( isset( $q->$key ) && $q->$key )
362                                        $result[] = $flag;
363                        }
364
365                        $expected = explode( ' ', $test['flags'] );
366
367                        sort( $expected );
368                        sort( $result );
369
370                        if ( $expected == $result ) {
371                                $passed++;
372                        } else {
373                                $failed++;
374
375                                echo "Failed test $i:\n";
376                                echo "    Expected: " . implode( ' ', $expected ) . "\n";
377                                echo "    Result: " . implode( ' ', $result ) . "\n";
378                                echo "    Query: \n";
379                                print_r( $test['query'] );
380                                echo "<hr>";
381                        }
382                }
383
384                echo "Summary:\n";
385                echo "    Passed: $passed\n";
386                echo "    Failed: $failed\n";
387
388                remove_filter( 'posts_request', '__return_false' );
389                die;
390        }
391}
392
393add_action( 'init', array( 'Unit_Query_Flags', 'init' ) );
394add_action( 'template_redirect', array( 'Unit_Query_Flags', 'run' ) );
395