Changeset 36347 for trunk/tests/phpunit/includes/factory.php
- Timestamp:
- 01/19/2016 03:55:19 AM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/tests/phpunit/includes/factory.php
r35244 r36347 1 1 <?php 2 3 require_once( dirname( __FILE__ ) . '/factory/class-wp-unittest-factory-for-thing.php' ); 4 require_once( dirname( __FILE__ ) . '/factory/class-wp-unittest-factory-for-post.php' ); 5 require_once( dirname( __FILE__ ) . '/factory/class-wp-unittest-factory-for-attachment.php' ); 6 require_once( dirname( __FILE__ ) . '/factory/class-wp-unittest-factory-for-user.php' ); 7 require_once( dirname( __FILE__ ) . '/factory/class-wp-unittest-factory-for-comment.php' ); 8 require_once( dirname( __FILE__ ) . '/factory/class-wp-unittest-factory-for-blog.php' ); 9 require_once( dirname( __FILE__ ) . '/factory/class-wp-unittest-factory-for-network.php' ); 10 require_once( dirname( __FILE__ ) . '/factory/class-wp-unittest-factory-for-term.php' ); 11 require_once( dirname( __FILE__ ) . '/factory/class-wp-unittest-generator-sequence.php' ); 12 require_once( dirname( __FILE__ ) . '/factory/class-wp-unittest-factory-callback-after-create.php' ); 2 13 3 14 class WP_UnitTest_Factory { … … 62 73 } 63 74 } 64 65 class 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 92 class 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 data121 $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 128 class 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_%s@example.org' ),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 153 class 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 184 class 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 tables202 $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 220 class 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 253 class 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 299 abstract 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 Thing306 *307 * @param object $factory Global factory that can be used to create other objects on the system308 * @param array $default_generation_definitions Defines what default values should the properties of the object have. The default values309 * 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 else368 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 403 class WP_UnitTest_Generator_Sequence {404 static $incr = -1;405 public $next;406 public $template_string;407 408 function __construct( $template_string = '%s', $start = null ) {409 if ( $start ) {410 $this->next = $start;411 } else {412 self::$incr++;413 $this->next = self::$incr;414 }415 $this->template_string = $template_string;416 }417 418 function next() {419 $generated = sprintf( $this->template_string , $this->next );420 $this->next++;421 return $generated;422 }423 }424 425 class WP_UnitTest_Factory_Callback_After_Create {426 var $callback;427 428 function __construct( $callback ) {429 $this->callback = $callback;430 }431 432 function call( $object ) {433 return call_user_func( $this->callback, $object );434 }435 }
Note: See TracChangeset
for help on using the changeset viewer.