Make WordPress Core

source: trunk/tests/phpunit/includes/factory.php @ 35242

Last change on this file since 35242 was 34855, checked in by wonderboymusic, 10 years ago

Merge the Responsive Images feature plugin into core, initial commit. See: https://github.com/ResponsiveImagesCG/wp-tevko-responsive-images/

New functions in media.php:

  • wp_get_attachment_image_srcset_array() - Returns an array of image candidate string data used to build a srcset value for an attachment given an $attachement_id and $size.
  • wp_get_attachment_image_srcset() - Returns the srcset value for an attachment given an $attachement_id and $size.
  • wp_get_attachment_image_sizes() - Returns the sizes value for an attachment given an $attachement_id and $size and optional arguments used to alter its output.
  • wp_make_content_images_responsive() - A display filter for adding srcset and sizes to images embedded in content.
  • wp_img_add_srcset_and_sizes() - A utility function used by wp_make_content_images_responsive() to add srcset and sizes to a single <img> element.

Modifies existing core functions:

  • Modify wp_get_attachment_image() so the HTML returned for an image includes srcset and sizes.
  • Modify get_media_embedded_in_content() (sup, 3.6 leftover) by adding <img> to the list of accepted tags that can be matched in content. This is used in wp_make_content_images_responsive() to find all of the images embedded in content before passing them off to wp_img_add_srcset_and_sizes().

Tests:

  • Add a new factory method to WP_UnitTest_Factory_For_Attachment named create_upload_object()
  • Adds unit tests
  • Updates unit tests

Props joemcgill, tevko, jaspermdegroot, mdmcginn, barryceelen, peterwilsoncc, fsylum, wonderboymusic, chriscoyier, benjaminpick, jrfnl, #12kingkool68, janhenckens, ryanmarkel, side777, ryelle, wturrell, micahmills, mattbagwell, coliff, DrewAPicture.
See #33641.

File size: 12.4 KB
Line 
1<?php
2
3class WP_UnitTest_Factory {
4
5        /**
6         * @var WP_UnitTest_Factory_For_Post
7         */
8        public $post;
9
10        /**
11         * @var WP_UnitTest_Factory_For_Attachment
12         */
13        public $attachment;
14
15        /**
16         * @var WP_UnitTest_Factory_For_Comment
17         */
18        public $comment;
19
20        /**
21         * @var WP_UnitTest_Factory_For_User
22         */
23        public $user;
24
25        /**
26         * @var WP_UnitTest_Factory_For_Term
27         */
28        public $term;
29
30        /**
31         * @var WP_UnitTest_Factory_For_Term
32         */
33        public $category;
34
35        /**
36         * @var WP_UnitTest_Factory_For_Term
37         */
38        public $tag;
39
40        /**
41         * @var WP_UnitTest_Factory_For_Blog
42         */
43        public $blog;
44
45        /**
46         * @var WP_UnitTest_Factory_For_Network
47         */
48        public $network;
49
50        function __construct() {
51                $this->post = new WP_UnitTest_Factory_For_Post( $this );
52                $this->attachment = new WP_UnitTest_Factory_For_Attachment( $this );
53                $this->comment = new WP_UnitTest_Factory_For_Comment( $this );
54                $this->user = new WP_UnitTest_Factory_For_User( $this );
55                $this->term = new WP_UnitTest_Factory_For_Term( $this );
56                $this->category = new WP_UnitTest_Factory_For_Term( $this, 'category' );
57                $this->tag = new WP_UnitTest_Factory_For_Term( $this, 'post_tag' );
58                if ( is_multisite() ) {
59                        $this->blog = new WP_UnitTest_Factory_For_Blog( $this );
60                        $this->network = new WP_UnitTest_Factory_For_Network( $this );
61                }
62        }
63}
64
65class WP_UnitTest_Factory_For_Post extends WP_UnitTest_Factory_For_Thing {
66
67        function __construct( $factory = null ) {
68                parent::__construct( $factory );
69                $this->default_generation_definitions = array(
70                        'post_status' => 'publish',
71                        'post_title' => new WP_UnitTest_Generator_Sequence( 'Post title %s' ),
72                        'post_content' => new WP_UnitTest_Generator_Sequence( 'Post content %s' ),
73                        'post_excerpt' => new WP_UnitTest_Generator_Sequence( 'Post excerpt %s' ),
74                        'post_type' => 'post'
75                );
76        }
77
78        function create_object( $args ) {
79                return wp_insert_post( $args );
80        }
81
82        function update_object( $post_id, $fields ) {
83                $fields['ID'] = $post_id;
84                return wp_update_post( $fields );
85        }
86
87        function get_object_by_id( $post_id ) {
88                return get_post( $post_id );
89        }
90}
91
92class WP_UnitTest_Factory_For_Attachment extends WP_UnitTest_Factory_For_Post {
93
94        function create_object( $file, $parent = 0, $args = array() ) {
95                return wp_insert_attachment( $args, $file, $parent );
96        }
97
98        function create_upload_object( $file, $parent = 0 ) {
99                $contents = file_get_contents($file);
100                $upload = wp_upload_bits(basename($file), null, $contents);
101
102                $type = '';
103                if ( ! empty($upload['type']) ) {
104                        $type = $upload['type'];
105                } else {
106                        $mime = wp_check_filetype( $upload['file'] );
107                        if ($mime)
108                                $type = $mime['type'];
109                }
110
111                $attachment = array(
112                        'post_title' => basename( $upload['file'] ),
113                        'post_content' => '',
114                        'post_type' => 'attachment',
115                        'post_parent' => $parent,
116                        'post_mime_type' => $type,
117                        'guid' => $upload[ 'url' ],
118                );
119
120                // Save the data
121                $id = wp_insert_attachment( $attachment, $upload[ 'file' ], $parent );
122                wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $upload['file'] ) );
123
124                return $id;
125        }
126}
127
128class WP_UnitTest_Factory_For_User extends WP_UnitTest_Factory_For_Thing {
129
130        function __construct( $factory = null ) {
131                parent::__construct( $factory );
132                $this->default_generation_definitions = array(
133                        'user_login' => new WP_UnitTest_Generator_Sequence( 'User %s' ),
134                        'user_pass' => 'password',
135                        'user_email' => new WP_UnitTest_Generator_Sequence( 'user_%[email protected]' ),
136                );
137        }
138
139        function create_object( $args ) {
140                return wp_insert_user( $args );
141        }
142
143        function update_object( $user_id, $fields ) {
144                $fields['ID'] = $user_id;
145                return wp_update_user( $fields );
146        }
147
148        function get_object_by_id( $user_id ) {
149                return new WP_User( $user_id );
150        }
151}
152
153class WP_UnitTest_Factory_For_Comment extends WP_UnitTest_Factory_For_Thing {
154
155        function __construct( $factory = null ) {
156                parent::__construct( $factory );
157                $this->default_generation_definitions = array(
158                        'comment_author' => new WP_UnitTest_Generator_Sequence( 'Commenter %s' ),
159                        'comment_author_url' => new WP_UnitTest_Generator_Sequence( 'http://example.com/%s/' ),
160                        'comment_approved' => 1,
161                        'comment_content' => 'This is a comment'
162                );
163        }
164
165        function create_object( $args ) {
166                return wp_insert_comment( $this->addslashes_deep( $args ) );
167        }
168
169        function update_object( $comment_id, $fields ) {
170                $fields['comment_ID'] = $comment_id;
171                return wp_update_comment( $this->addslashes_deep( $fields ) );
172        }
173
174        function create_post_comments( $post_id, $count = 1, $args = array(), $generation_definitions = null ) {
175                $args['comment_post_ID'] = $post_id;
176                return $this->create_many( $count, $args, $generation_definitions );
177        }
178
179        function get_object_by_id( $comment_id ) {
180                return get_comment( $comment_id );
181        }
182}
183
184class WP_UnitTest_Factory_For_Blog extends WP_UnitTest_Factory_For_Thing {
185
186        function __construct( $factory = null ) {
187                global $current_site, $base;
188                parent::__construct( $factory );
189                $this->default_generation_definitions = array(
190                        'domain' => $current_site->domain,
191                        'path' => new WP_UnitTest_Generator_Sequence( $base . 'testpath%s' ),
192                        'title' => new WP_UnitTest_Generator_Sequence( 'Site %s' ),
193                        'site_id' => $current_site->id,
194                );
195        }
196
197        function create_object( $args ) {
198                global $wpdb;
199                $meta = isset( $args['meta'] ) ? $args['meta'] : array();
200                $user_id = isset( $args['user_id'] ) ? $args['user_id'] : get_current_user_id();
201                // temp tables will trigger db errors when we attempt to reference them as new temp tables
202                $suppress = $wpdb->suppress_errors();
203                $blog = wpmu_create_blog( $args['domain'], $args['path'], $args['title'], $user_id, $meta, $args['site_id'] );
204                $wpdb->suppress_errors( $suppress );
205
206                // Tell WP we're done installing.
207                wp_installing( false );
208
209                return $blog;
210        }
211
212        function update_object( $blog_id, $fields ) {}
213
214        function get_object_by_id( $blog_id ) {
215                return get_blog_details( $blog_id, false );
216        }
217}
218
219
220class WP_UnitTest_Factory_For_Network extends WP_UnitTest_Factory_For_Thing {
221
222        function __construct( $factory = null ) {
223                parent::__construct( $factory );
224                $this->default_generation_definitions = array(
225                        'domain' => WP_TESTS_DOMAIN,
226                        'title' => new WP_UnitTest_Generator_Sequence( 'Network %s' ),
227                        'path' => new WP_UnitTest_Generator_Sequence( '/testpath%s/' ),
228                        'network_id' => new WP_UnitTest_Generator_Sequence( '%s', 2 ),
229                        'subdomain_install' => false,
230                );
231        }
232
233        function create_object( $args ) {
234                require_once ABSPATH . 'wp-admin/includes/upgrade.php';
235
236                if ( ! isset( $args['user'] ) ) {
237                        $email = WP_TESTS_EMAIL;
238                } else {
239                        $email = get_userdata( $args['user'] )->user_email;
240                }
241
242                populate_network( $args['network_id'], $args['domain'], $email, $args['title'], $args['path'], $args['subdomain_install'] );
243                return $args['network_id'];
244        }
245
246        function update_object( $network_id, $fields ) {}
247
248        function get_object_by_id( $network_id ) {
249                return wp_get_network( $network_id );
250        }
251}
252
253class WP_UnitTest_Factory_For_Term extends WP_UnitTest_Factory_For_Thing {
254
255        private $taxonomy;
256        const DEFAULT_TAXONOMY = 'post_tag';
257
258        function __construct( $factory = null, $taxonomy = null ) {
259                parent::__construct( $factory );
260                $this->taxonomy = $taxonomy ? $taxonomy : self::DEFAULT_TAXONOMY;
261                $this->default_generation_definitions = array(
262                        'name' => new WP_UnitTest_Generator_Sequence( 'Term %s' ),
263                        'taxonomy' => $this->taxonomy,
264                        'description' => new WP_UnitTest_Generator_Sequence( 'Term description %s' ),
265                );
266        }
267
268        function create_object( $args ) {
269                $args = array_merge( array( 'taxonomy' => $this->taxonomy ), $args );
270                $term_id_pair = wp_insert_term( $args['name'], $args['taxonomy'], $args );
271                if ( is_wp_error( $term_id_pair ) )
272                        return $term_id_pair;
273                return $term_id_pair['term_id'];
274        }
275
276        function update_object( $term, $fields ) {
277                $fields = array_merge( array( 'taxonomy' => $this->taxonomy ), $fields );
278                if ( is_object( $term ) )
279                        $taxonomy = $term->taxonomy;
280                $term_id_pair = wp_update_term( $term, $taxonomy, $fields );
281                return $term_id_pair['term_id'];
282        }
283
284        function add_post_terms( $post_id, $terms, $taxonomy, $append = true ) {
285                return wp_set_post_terms( $post_id, $terms, $taxonomy, $append );
286        }
287
288        function create_and_get( $args = array(), $generation_definitions = null ) {
289                $term_id = $this->create( $args, $generation_definitions );
290                $taxonomy = isset( $args['taxonomy'] ) ? $args['taxonomy'] : $this->taxonomy;
291                return get_term( $term_id, $taxonomy );
292        }
293
294        function get_object_by_id( $term_id ) {
295                return get_term( $term_id, $this->taxonomy );
296        }
297}
298
299abstract class WP_UnitTest_Factory_For_Thing {
300
301        var $default_generation_definitions;
302        var $factory;
303
304        /**
305         * Creates a new factory, which will create objects of a specific Thing
306         *
307         * @param object $factory Global factory that can be used to create other objects on the system
308         * @param array $default_generation_definitions Defines what default values should the properties of the object have. The default values
309         * can be generators -- an object with next() method. There are some default generators: {@link WP_UnitTest_Generator_Sequence},
310         * {@link WP_UnitTest_Generator_Locale_Name}, {@link WP_UnitTest_Factory_Callback_After_Create}.
311         */
312        function __construct( $factory, $default_generation_definitions = array() ) {
313                $this->factory = $factory;
314                $this->default_generation_definitions = $default_generation_definitions;
315        }
316
317        abstract function create_object( $args );
318        abstract function update_object( $object, $fields );
319
320        function create( $args = array(), $generation_definitions = null ) {
321                if ( is_null( $generation_definitions ) )
322                        $generation_definitions = $this->default_generation_definitions;
323
324                $generated_args = $this->generate_args( $args, $generation_definitions, $callbacks );
325                $created = $this->create_object( $generated_args );
326                if ( !$created || is_wp_error( $created ) )
327                        return $created;
328
329                if ( $callbacks ) {
330                        $updated_fields = $this->apply_callbacks( $callbacks, $created );
331                        $save_result = $this->update_object( $created, $updated_fields );
332                        if ( !$save_result || is_wp_error( $save_result ) )
333                                return $save_result;
334                }
335                return $created;
336        }
337
338        function create_and_get( $args = array(), $generation_definitions = null ) {
339                $object_id = $this->create( $args, $generation_definitions );
340                return $this->get_object_by_id( $object_id );
341        }
342
343        abstract function get_object_by_id( $object_id );
344
345        function create_many( $count, $args = array(), $generation_definitions = null ) {
346                $results = array();
347                for ( $i = 0; $i < $count; $i++ ) {
348                        $results[] = $this->create( $args, $generation_definitions );
349                }
350                return $results;
351        }
352
353        function generate_args( $args = array(), $generation_definitions = null, &$callbacks = null ) {
354                $callbacks = array();
355                if ( is_null( $generation_definitions ) )
356                        $generation_definitions = $this->default_generation_definitions;
357
358                foreach( array_keys( $generation_definitions ) as $field_name ) {
359                        if ( !isset( $args[$field_name] ) ) {
360                                $generator = $generation_definitions[$field_name];
361                                if ( is_scalar( $generator ) )
362                                        $args[$field_name] = $generator;
363                                elseif ( is_object( $generator ) && method_exists( $generator, 'call' ) ) {
364                                        $callbacks[$field_name] = $generator;
365                                } elseif ( is_object( $generator ) )
366                                        $args[$field_name] = $generator->next();
367                                else
368                                        return new WP_Error( 'invalid_argument', 'Factory default value should be either a scalar or an generator object.' );
369                        }
370                }
371                return $args;
372        }
373
374        function apply_callbacks( $callbacks, $created ) {
375                $updated_fields = array();
376                foreach( $callbacks as $field_name => $generator ) {
377                        $updated_fields[$field_name] = $generator->call( $created );
378                }
379                return $updated_fields;
380        }
381
382        function callback( $function ) {
383                return new WP_UnitTest_Factory_Callback_After_Create( $function );
384        }
385
386        function addslashes_deep($value) {
387                if ( is_array( $value ) ) {
388                        $value = array_map( array( $this, 'addslashes_deep' ), $value );
389                } elseif ( is_object( $value ) ) {
390                        $vars = get_object_vars( $value );
391                        foreach ($vars as $key=>$data) {
392                                $value->{$key} = $this->addslashes_deep( $data );
393                        }
394                } elseif ( is_string( $value ) ) {
395                        $value = addslashes( $value );
396                }
397
398                return $value;
399        }
400
401}
402
403class WP_UnitTest_Generator_Sequence {
404        var $next;
405        var $template_string;
406
407        function __construct( $template_string = '%s', $start = 1 ) {
408                $this->next = $start;
409                $this->template_string = $template_string;
410        }
411
412        function next() {
413                $generated = sprintf( $this->template_string , $this->next );
414                $this->next++;
415                return $generated;
416        }
417}
418
419class WP_UnitTest_Factory_Callback_After_Create {
420        var $callback;
421
422        function __construct( $callback ) {
423                $this->callback = $callback;
424        }
425
426        function call( $object ) {
427                return call_user_func( $this->callback, $object );
428        }
429}
Note: See TracBrowser for help on using the repository browser.