Wordpress/tests/phpunit/tests/rest-api/rest-schema-setup.php

710 lines
33 KiB
PHP

<?php
/**
* Unit tests covering schema initialization.
*
* Also generates the fixture data used by the wp-api.js QUnit tests.
*
* @package WordPress
* @subpackage REST API
*/
/**
* @group restapi
* @group restapi-jsclient
*/
class WP_Test_REST_Schema_Initialization extends WP_Test_REST_TestCase {
const YOUTUBE_VIDEO_ID = 'i_cVJgIz_Cs';
public function setUp() {
parent::setUp();
/** @var WP_REST_Server $wp_rest_server */
global $wp_rest_server;
$wp_rest_server = new Spy_REST_Server;
do_action( 'rest_api_init', $wp_rest_server );
add_filter( 'pre_http_request', array( $this, 'mock_embed_request' ), 10, 3 );
}
public function tearDown() {
parent::tearDown();
/** @var WP_REST_Server $wp_rest_server */
global $wp_rest_server;
$wp_rest_server = null;
remove_filter( 'pre_http_request', array( $this, 'mock_embed_request' ), 10, 3 );
}
public function mock_embed_request( $preempt, $r, $url ) {
unset( $preempt, $r );
// Mock request to YouTube Embed.
if ( false !== strpos( $url, self::YOUTUBE_VIDEO_ID ) ) {
return array(
'response' => array(
'code' => 200,
),
'body' => wp_json_encode(
array(
'version' => '1.0',
'type' => 'video',
'provider_name' => 'YouTube',
'provider_url' => 'https://www.youtube.com',
'thumbnail_width' => 480,
'width' => 500,
'thumbnail_height' => 360,
'html' => '<iframe width="500" height="375" src="https://www.youtube.com/embed/' . self::YOUTUBE_VIDEO_ID . '?feature=oembed" frameborder="0" allowfullscreen></iframe>',
'author_name' => 'Jorge Rubira Santos',
'thumbnail_url' => 'https://i.ytimg.com/vi/' . self::YOUTUBE_VIDEO_ID . '/hqdefault.jpg',
'title' => 'No te olvides de poner el Where en el Delete From. (Una cancion para programadores)',
'height' => 375,
)
),
);
} else {
return array(
'response' => array(
'code' => 404,
),
);
}
}
public function test_expected_routes_in_schema() {
$routes = rest_get_server()->get_routes();
$this->assertTrue( is_array( $routes ), '`get_routes` should return an array.' );
$this->assertTrue( ! empty( $routes ), 'Routes should not be empty.' );
$routes = array_filter( array_keys( $routes ), array( $this, 'is_builtin_route' ) );
$expected_routes = array(
'/',
'/oembed/1.0',
'/oembed/1.0/embed',
'/oembed/1.0/proxy',
'/wp/v2',
'/wp/v2/posts',
'/wp/v2/posts/(?P<id>[\\d]+)',
'/wp/v2/posts/(?P<parent>[\\d]+)/revisions',
'/wp/v2/posts/(?P<parent>[\\d]+)/revisions/(?P<id>[\\d]+)',
'/wp/v2/posts/(?P<id>[\\d]+)/autosaves',
'/wp/v2/posts/(?P<parent>[\\d]+)/autosaves/(?P<id>[\\d]+)',
'/wp/v2/pages',
'/wp/v2/pages/(?P<id>[\\d]+)',
'/wp/v2/pages/(?P<parent>[\\d]+)/revisions',
'/wp/v2/pages/(?P<parent>[\\d]+)/revisions/(?P<id>[\\d]+)',
'/wp/v2/pages/(?P<id>[\\d]+)/autosaves',
'/wp/v2/pages/(?P<parent>[\\d]+)/autosaves/(?P<id>[\\d]+)',
'/wp/v2/media',
'/wp/v2/media/(?P<id>[\\d]+)',
'/wp/v2/media/(?P<id>[\\d]+)/post-process',
'/wp/v2/media/(?P<id>[\\d]+)/edit',
'/wp/v2/blocks',
'/wp/v2/blocks/(?P<id>[\d]+)',
'/wp/v2/blocks/(?P<id>[\d]+)/autosaves',
'/wp/v2/blocks/(?P<parent>[\d]+)/autosaves/(?P<id>[\d]+)',
'/wp/v2/types',
'/wp/v2/types/(?P<type>[\\w-]+)',
'/wp/v2/statuses',
'/wp/v2/statuses/(?P<status>[\\w-]+)',
'/wp/v2/taxonomies',
'/wp/v2/taxonomies/(?P<taxonomy>[\\w-]+)',
'/wp/v2/categories',
'/wp/v2/categories/(?P<id>[\\d]+)',
'/wp/v2/tags',
'/wp/v2/tags/(?P<id>[\\d]+)',
'/wp/v2/users',
'/wp/v2/users/(?P<id>[\\d]+)',
'/wp/v2/users/me',
'/wp/v2/users/(?P<user_id>(?:[\\d]+|me))/application-passwords',
'/wp/v2/users/(?P<user_id>(?:[\\d]+|me))/application-passwords/(?P<uuid>[\\w\\-]+)',
'/wp/v2/comments',
'/wp/v2/comments/(?P<id>[\\d]+)',
'/wp/v2/search',
'/wp/v2/block-renderer/(?P<name>[a-z0-9-]+/[a-z0-9-]+)',
'/wp/v2/block-types',
'/wp/v2/block-types/(?P<namespace>[a-zA-Z0-9_-]+)',
'/wp/v2/block-types/(?P<namespace>[a-zA-Z0-9_-]+)/(?P<name>[a-zA-Z0-9_-]+)',
'/wp/v2/settings',
'/wp/v2/themes',
'/wp/v2/plugins',
'/wp/v2/plugins/(?P<plugin>[^.\/]+(?:\/[^.\/]+)?)',
'/wp/v2/block-directory/search',
);
$this->assertSameSets( $expected_routes, $routes );
}
private function is_builtin_route( $route ) {
return (
'/' === $route ||
preg_match( '#^/oembed/1\.0(/.+)?$#', $route ) ||
preg_match( '#^/wp/v2(/.+)?$#', $route )
);
}
public function test_build_wp_api_client_fixtures() {
// Set up data for individual endpoint responses. We need to specify
// lots of different fields on these objects, otherwise the generated
// fixture file will be different between runs of PHPUnit tests, which
// is not desirable.
$administrator_id = $this->factory->user->create(
array(
'role' => 'administrator',
'display_name' => 'REST API Client Fixture: User',
'user_nicename' => 'restapiclientfixtureuser',
'user_email' => 'administrator@example.org',
)
);
wp_set_current_user( $administrator_id );
$post_id = $this->factory->post->create(
array(
'post_name' => 'restapi-client-fixture-post',
'post_title' => 'REST API Client Fixture: Post',
'post_content' => 'REST API Client Fixture: Post',
'post_excerpt' => 'REST API Client Fixture: Post',
'post_author' => 0,
)
);
wp_update_post(
array(
'ID' => $post_id,
'post_content' => 'Updated post content.',
)
);
$post_revisions = array_values( wp_get_post_revisions( $post_id ) );
$post_revision_id = $post_revisions[ count( $post_revisions ) - 1 ]->ID;
// Create an autosave.
wp_create_post_autosave(
array(
'post_ID' => $post_id,
'post_content' => 'Autosave post content.',
'post_type' => 'post',
)
);
$page_id = $this->factory->post->create(
array(
'post_type' => 'page',
'post_name' => 'restapi-client-fixture-page',
'post_title' => 'REST API Client Fixture: Page',
'post_content' => 'REST API Client Fixture: Page',
'post_excerpt' => 'REST API Client Fixture: Page',
'post_date' => '2017-02-14 00:00:00',
'post_date_gmt' => '2017-02-14 00:00:00',
'post_author' => 0,
)
);
wp_update_post(
array(
'ID' => $page_id,
'post_content' => 'Updated page content.',
)
);
$page_revisions = array_values( wp_get_post_revisions( $page_id ) );
$page_revision_id = $page_revisions[ count( $page_revisions ) - 1 ]->ID;
// Create an autosave.
wp_create_post_autosave(
array(
'post_ID' => $page_id,
'post_content' => 'Autosave page content.',
'post_type' => 'page',
)
);
$tag_id = $this->factory->tag->create(
array(
'name' => 'REST API Client Fixture: Tag',
'slug' => 'restapi-client-fixture-tag',
'description' => 'REST API Client Fixture: Tag',
)
);
$media_id = $this->factory->attachment->create_object(
get_temp_dir() . 'canola.jpg',
0,
array(
'post_mime_type' => 'image/jpeg',
'post_excerpt' => 'A sample caption',
'post_name' => 'restapi-client-fixture-attachment',
'post_title' => 'REST API Client Fixture: Attachment',
'post_date' => '2017-02-14 00:00:00',
'post_date_gmt' => '2017-02-14 00:00:00',
'post_author' => 0,
)
);
$comment_id = $this->factory->comment->create(
array(
'comment_approved' => 1,
'comment_post_ID' => $post_id,
'user_id' => 0,
'comment_date' => '2017-02-14 00:00:00',
'comment_date_gmt' => '2017-02-14 00:00:00',
'comment_author' => 'Internet of something or other',
'comment_author_email' => 'lights@example.org',
'comment_author_url' => 'http://lights.example.org/',
)
);
$meta_args = array(
'sanitize_callback' => 'sanitize_my_meta_key',
'auth_callback' => '__return_true',
'type' => 'string',
'description' => 'Test meta key',
'single' => true,
'show_in_rest' => true,
);
$meta_multi_args = $meta_args;
$meta_multi_args['single'] = false;
// Set up meta.
register_meta( 'term', 'test_single', $meta_args );
register_meta( 'term', 'test_multi', $meta_multi_args );
register_term_meta( 'category', 'test_cat_single', $meta_args );
register_term_meta( 'category', 'test_cat_multi', $meta_multi_args );
register_term_meta( 'post_tag', 'test_tag_meta', $meta_args );
register_meta( 'user', 'meta_key', $meta_args );
update_user_meta( 1, 'meta_key', 'meta_value' ); // Always use the first user.
register_meta( 'post', 'meta_key', $meta_args );
update_post_meta( $post_id, 'meta_key', 'meta_value' );
register_meta( 'comment', 'meta_key', $meta_args );
update_comment_meta( $comment_id, 'meta_key', 'meta_value' );
register_meta( 'term', 'meta_key', $meta_args );
update_term_meta( $tag_id, 'meta_key', 'meta_value' );
// Generate route data for subsequent QUnit tests.
$routes_to_generate_data = array(
array(
'route' => '/',
'name' => 'Schema',
),
array(
'route' => '/oembed/1.0',
'name' => 'oembed',
),
array(
'route' => '/oembed/1.0/embed',
'name' => 'oembeds',
'args' => array(
'url' => '?p=' . $post_id,
),
),
array(
'route' => '/oembed/1.0/proxy',
'name' => 'oembedProxy',
'args' => array(
'url' => 'https://www.youtube.com/watch?v=i_cVJgIz_Cs',
),
),
array(
'route' => '/wp/v2/posts',
'name' => 'PostsCollection',
),
array(
'route' => '/wp/v2/posts/' . $post_id,
'name' => 'PostModel',
),
array(
'route' => '/wp/v2/posts/' . $post_id . '/revisions',
'name' => 'postRevisions',
),
array(
'route' => '/wp/v2/posts/' . $post_id . '/revisions/' . $post_revision_id,
'name' => 'revision',
),
array(
'route' => '/wp/v2/posts/' . $post_id . '/autosaves',
'name' => 'postAutosaves',
),
array(
'route' => '/wp/v2/posts/' . $post_id . '/autosaves/' . $post_revision_id,
'name' => 'autosave',
),
array(
'route' => '/wp/v2/pages',
'name' => 'PagesCollection',
),
array(
'route' => '/wp/v2/pages/' . $page_id,
'name' => 'PageModel',
),
array(
'route' => '/wp/v2/pages/' . $page_id . '/revisions',
'name' => 'pageRevisions',
),
array(
'route' => '/wp/v2/pages/' . $page_id . '/revisions/' . $page_revision_id,
'name' => 'pageRevision',
),
array(
'route' => '/wp/v2/pages/' . $page_id . '/autosaves',
'name' => 'pageAutosaves',
),
array(
'route' => '/wp/v2/pages/' . $page_id . '/autosaves/' . $page_revision_id,
'name' => 'pageAutosave',
),
array(
'route' => '/wp/v2/media',
'name' => 'MediaCollection',
),
array(
'route' => '/wp/v2/media/' . $media_id,
'name' => 'MediaModel',
),
array(
'route' => '/wp/v2/types',
'name' => 'TypesCollection',
),
array(
'route' => '/wp/v2/types/post',
'name' => 'TypeModel',
),
array(
'route' => '/wp/v2/statuses',
'name' => 'StatusesCollection',
),
array(
'route' => '/wp/v2/statuses/publish',
'name' => 'StatusModel',
),
array(
'route' => '/wp/v2/taxonomies',
'name' => 'TaxonomiesCollection',
),
array(
'route' => '/wp/v2/taxonomies/category',
'name' => 'TaxonomyModel',
),
array(
'route' => '/wp/v2/categories',
'name' => 'CategoriesCollection',
),
array(
'route' => '/wp/v2/categories/1',
'name' => 'CategoryModel',
),
array(
'route' => '/wp/v2/tags',
'name' => 'TagsCollection',
),
array(
'route' => '/wp/v2/tags/' . $tag_id,
'name' => 'TagModel',
),
array(
'route' => '/wp/v2/users',
'name' => 'UsersCollection',
),
array(
'route' => '/wp/v2/users/' . $administrator_id,
'name' => 'UserModel',
),
array(
'route' => '/wp/v2/users/me',
'name' => 'me',
),
array(
'route' => '/wp/v2/comments',
'name' => 'CommentsCollection',
),
array(
'route' => '/wp/v2/comments/' . $comment_id,
'name' => 'CommentModel',
),
array(
'route' => '/wp/v2/settings',
'name' => 'settings',
),
);
$mocked_responses = "/**\n";
$mocked_responses .= " * DO NOT EDIT\n";
$mocked_responses .= " * Auto-generated by test_build_wp_api_client_fixtures\n";
$mocked_responses .= " */\n";
$mocked_responses .= "var mockedApiResponse = {};\n";
$mocked_responses .= "/* jshint -W109 */\n";
foreach ( $routes_to_generate_data as $route ) {
$request = new WP_REST_Request( 'GET', $route['route'] );
if ( isset( $route['args'] ) ) {
$request->set_query_params( $route['args'] );
}
$response = rest_get_server()->dispatch( $request );
$status = $response->get_status();
$data = $response->get_data();
$this->assertSame(
200,
$response->get_status(),
"HTTP $status from $route[route]: " . json_encode( $data )
);
$this->assertTrue( ! empty( $data ), $route['name'] . ' route should return data.' );
$fixture = $this->normalize_fixture( $data, $route['name'] );
$mocked_responses .= "\nmockedApiResponse." . $route['name'] . ' = '
. json_encode( $fixture, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES )
. ";\n";
}
// Only generate API client fixtures in single site and when required JSON_* constants are supported.
if ( ! is_multisite() ) {
// Save the route object for QUnit tests.
$file = dirname( DIR_TESTROOT ) . '/qunit/fixtures/wp-api-generated.js';
file_put_contents( $file, $mocked_responses );
}
// Clean up our test data.
wp_delete_post( $post_id, true );
wp_delete_post( $page_id, true );
wp_delete_term( $tag_id, 'tags' );
wp_delete_attachment( $media_id );
wp_delete_comment( $comment_id );
}
/**
* This array contains normalized versions of object IDs and other values
* that can change depending on how PHPUnit is executed. For details on
* how they were generated, see #41123.
*/
private static $fixture_replacements = array(
'Schema.name' => 'Test Blog',
'Schema.url' => 'http://example.org',
'Schema.home' => 'http://example.org',
'Schema.routes./._links.self' => 'http://example.org/index.php?rest_route=/',
'Schema.routes./oembed/1.0._links.self' => 'http://example.org/index.php?rest_route=/oembed/1.0',
'Schema.routes./oembed/1.0/embed._links.self' => 'http://example.org/index.php?rest_route=/oembed/1.0/embed',
'Schema.routes./oembed/1.0/proxy._links.self' => 'http://example.org/index.php?rest_route=/oembed/1.0/proxy',
'Schema.routes./wp/v2._links.self' => 'http://example.org/index.php?rest_route=/wp/v2',
'Schema.routes./wp/v2/posts._links.self' => 'http://example.org/index.php?rest_route=/wp/v2/posts',
'Schema.routes./wp/v2/pages._links.self' => 'http://example.org/index.php?rest_route=/wp/v2/pages',
'Schema.routes./wp/v2/media._links.self' => 'http://example.org/index.php?rest_route=/wp/v2/media',
'Schema.routes./wp/v2/blocks._links.self' => 'http://example.org/index.php?rest_route=/wp/v2/blocks',
'Schema.routes./wp/v2/types._links.self' => 'http://example.org/index.php?rest_route=/wp/v2/types',
'Schema.routes./wp/v2/statuses._links.self' => 'http://example.org/index.php?rest_route=/wp/v2/statuses',
'Schema.routes./wp/v2/taxonomies._links.self' => 'http://example.org/index.php?rest_route=/wp/v2/taxonomies',
'Schema.routes./wp/v2/categories._links.self' => 'http://example.org/index.php?rest_route=/wp/v2/categories',
'Schema.routes./wp/v2/tags._links.self' => 'http://example.org/index.php?rest_route=/wp/v2/tags',
'Schema.routes./wp/v2/users._links.self' => 'http://example.org/index.php?rest_route=/wp/v2/users',
'Schema.routes./wp/v2/users/me._links.self' => 'http://example.org/index.php?rest_route=/wp/v2/users/me',
'Schema.routes./wp/v2/comments._links.self' => 'http://example.org/index.php?rest_route=/wp/v2/comments',
'Schema.routes./wp/v2/search._links.self' => 'http://example.org/index.php?rest_route=/wp/v2/search',
'Schema.routes./wp/v2/settings._links.self' => 'http://example.org/index.php?rest_route=/wp/v2/settings',
'Schema.routes./wp/v2/themes._links.self' => 'http://example.org/index.php?rest_route=/wp/v2/themes',
'oembed.routes./oembed/1.0._links.self' => 'http://example.org/index.php?rest_route=/oembed/1.0',
'oembed.routes./oembed/1.0/embed._links.self' => 'http://example.org/index.php?rest_route=/oembed/1.0/embed',
'oembed.routes./oembed/1.0/proxy._links.self' => 'http://example.org/index.php?rest_route=/oembed/1.0/proxy',
'oembeds.provider_name' => 'Test Blog',
'oembeds.provider_url' => 'http://example.org',
'oembeds.author_name' => 'Test Blog',
'oembeds.author_url' => 'http://example.org',
'oembeds.html' => '<blockquote class="wp-embedded-content">...</blockquote>...',
'PostsCollection.0.id' => 4,
'PostsCollection.0.guid.rendered' => 'http://example.org/?p=4',
'PostsCollection.0.link' => 'http://example.org/?p=4',
'PostsCollection.0._links.self.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/posts/4',
'PostsCollection.0._links.collection.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/posts',
'PostsCollection.0._links.about.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/types/post',
'PostsCollection.0._links.replies.0.href' => 'http://example.org/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4',
'PostsCollection.0._links.version-history.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/posts/4/revisions',
'PostsCollection.0._links.predecessor-version.0.id' => 6,
'PostsCollection.0._links.predecessor-version.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/posts/4/revisions/6',
'PostsCollection.0._links.wp:attachment.0.href' => 'http://example.org/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4',
'PostsCollection.0._links.wp:term.0.href' => 'http://example.org/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4',
'PostsCollection.0._links.wp:term.1.href' => 'http://example.org/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4',
'PostModel.id' => 4,
'PostModel.guid.rendered' => 'http://example.org/?p=4',
'PostModel.link' => 'http://example.org/?p=4',
'postRevisions.0.author' => 2,
'postRevisions.0.id' => 6,
'postRevisions.0.parent' => 4,
'postRevisions.0.slug' => '4-autosave-v1',
'postRevisions.0.guid.rendered' => 'http://example.org/?p=6',
'postRevisions.0._links.parent.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/posts/4',
'postRevisions.1.author' => 2,
'postRevisions.1.id' => 5,
'postRevisions.1.parent' => 4,
'postRevisions.1.slug' => '4-revision-v1',
'postRevisions.1.guid.rendered' => 'http://example.org/?p=5',
'postRevisions.1._links.parent.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/posts/4',
'revision.author' => 2,
'revision.id' => 5,
'revision.parent' => 4,
'revision.slug' => '4-revision-v1',
'revision.guid.rendered' => 'http://example.org/?p=5',
'postAutosaves.0.author' => 2,
'postAutosaves.0.id' => 6,
'postAutosaves.0.parent' => 4,
'postAutosaves.0.slug' => '4-autosave-v1',
'postAutosaves.0.guid.rendered' => 'http://example.org/?p=6',
'postAutosaves.0._links.parent.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/posts/4',
'autosave.author' => 2,
'autosave.id' => 6,
'autosave.parent' => 4,
'autosave.slug' => '4-autosave-v1',
'autosave.guid.rendered' => 'http://example.org/?p=6',
'PagesCollection.0.id' => 7,
'PagesCollection.0.guid.rendered' => 'http://example.org/?page_id=7',
'PagesCollection.0.link' => 'http://example.org/?page_id=7',
'PagesCollection.0._links.self.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/pages/7',
'PagesCollection.0._links.collection.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/pages',
'PagesCollection.0._links.about.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/types/page',
'PagesCollection.0._links.replies.0.href' => 'http://example.org/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=7',
'PagesCollection.0._links.version-history.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/pages/7/revisions',
'PagesCollection.0._links.predecessor-version.0.id' => 9,
'PagesCollection.0._links.predecessor-version.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/pages/7/revisions/9',
'PagesCollection.0._links.wp:attachment.0.href' => 'http://example.org/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=7',
'PageModel.id' => 7,
'PageModel.guid.rendered' => 'http://example.org/?page_id=7',
'PageModel.link' => 'http://example.org/?page_id=7',
'pageRevisions.0.author' => 2,
'pageRevisions.0.id' => 9,
'pageRevisions.0.parent' => 7,
'pageRevisions.0.slug' => '7-autosave-v1',
'pageRevisions.0.guid.rendered' => 'http://example.org/?p=9',
'pageRevisions.0._links.parent.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/pages/7',
'pageRevisions.1.author' => 2,
'pageRevisions.1.id' => 8,
'pageRevisions.1.parent' => 7,
'pageRevisions.1.slug' => '7-revision-v1',
'pageRevisions.1.guid.rendered' => 'http://example.org/?p=8',
'pageRevisions.1._links.parent.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/pages/7',
'pageRevision.author' => 2,
'pageRevision.id' => 8,
'pageRevision.parent' => 7,
'pageRevision.slug' => '7-revision-v1',
'pageRevision.guid.rendered' => 'http://example.org/?p=8',
'pageAutosaves.0.author' => 2,
'pageAutosaves.0.id' => 9,
'pageAutosaves.0.parent' => 7,
'pageAutosaves.0.slug' => '7-autosave-v1',
'pageAutosaves.0.guid.rendered' => 'http://example.org/?p=9',
'pageAutosaves.0._links.parent.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/pages/7',
'pageAutosave.author' => 2,
'pageAutosave.id' => 9,
'pageAutosave.parent' => 7,
'pageAutosave.slug' => '7-autosave-v1',
'pageAutosave.guid.rendered' => 'http://example.org/?p=9',
'MediaCollection.0.id' => 10,
'MediaCollection.0.guid.rendered' => 'http://example.org/?attachment_id=10',
'MediaCollection.0.link' => 'http://example.org/?attachment_id=10',
'MediaCollection.0.description.rendered' => '<p class="attachment"><!-- <a...><img.../></a> --></p>',
'MediaCollection.0.source_url' => 'http://example.org/wp-content/uploads//tmp/canola.jpg',
'MediaCollection.0._links.self.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/media/10',
'MediaCollection.0._links.collection.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/media',
'MediaCollection.0._links.about.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/types/attachment',
'MediaCollection.0._links.replies.0.href' => 'http://example.org/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10',
'MediaModel.id' => 10,
'MediaModel.guid.rendered' => 'http://example.org/?attachment_id=10',
'MediaModel.link' => 'http://example.org/?attachment_id=10',
'MediaModel.description.rendered' => '<p class="attachment"><!-- <a...><img.../></a> --></p>',
'MediaModel.source_url' => 'http://example.org/wp-content/uploads//tmp/canola.jpg',
'TypesCollection.post._links.collection.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/types',
'TypesCollection.post._links.wp:items.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/posts',
'TypesCollection.page._links.collection.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/types',
'TypesCollection.page._links.wp:items.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/pages',
'TypesCollection.attachment._links.collection.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/types',
'TypesCollection.attachment._links.wp:items.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/media',
'TypesCollection.wp_block._links.collection.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/types',
'TypesCollection.wp_block._links.wp:items.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/blocks',
'StatusesCollection.publish._links.archives.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/posts',
'StatusesCollection.future._links.archives.0.href' => 'http://example.org/index.php?rest_route=%2Fwp%2Fv2%2Fposts&status=future',
'StatusesCollection.draft._links.archives.0.href' => 'http://example.org/index.php?rest_route=%2Fwp%2Fv2%2Fposts&status=draft',
'StatusesCollection.pending._links.archives.0.href' => 'http://example.org/index.php?rest_route=%2Fwp%2Fv2%2Fposts&status=pending',
'StatusesCollection.private._links.archives.0.href' => 'http://example.org/index.php?rest_route=%2Fwp%2Fv2%2Fposts&status=private',
'StatusesCollection.trash._links.archives.0.href' => 'http://example.org/index.php?rest_route=%2Fwp%2Fv2%2Fposts&status=trash',
'TaxonomiesCollection.category._links.collection.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/taxonomies',
'TaxonomiesCollection.category._links.wp:items.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/categories',
'TaxonomiesCollection.post_tag._links.collection.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/taxonomies',
'TaxonomiesCollection.post_tag._links.wp:items.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/tags',
'CategoriesCollection.0.link' => 'http://example.org/?cat=1',
'CategoriesCollection.0.meta.test_single' => '',
'CategoriesCollection.0.meta.test_multi' => array(),
'CategoriesCollection.0.meta.test_cat_single' => '',
'CategoriesCollection.0.meta.test_cat_multi' => array(),
'CategoriesCollection.0._links.self.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/categories/1',
'CategoriesCollection.0._links.collection.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/categories',
'CategoriesCollection.0._links.about.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/taxonomies/category',
'CategoriesCollection.0._links.wp:post_type.0.href' => 'http://example.org/index.php?rest_route=%2Fwp%2Fv2%2Fposts&categories=1',
'CategoryModel.link' => 'http://example.org/?cat=1',
'CategoryModel.meta.test_single' => '',
'CategoryModel.meta.test_multi' => array(),
'CategoryModel.meta.test_cat_single' => '',
'CategoryModel.meta.test_cat_multi' => array(),
'TagsCollection.0.id' => 2,
'TagsCollection.0.link' => 'http://example.org/?tag=restapi-client-fixture-tag',
'TagsCollection.0.meta.test_single' => '',
'TagsCollection.0.meta.test_multi' => array(),
'TagsCollection.0.meta.test_tag_meta' => '',
'TagsCollection.0._links.self.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/tags/2',
'TagsCollection.0._links.collection.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/tags',
'TagsCollection.0._links.about.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/taxonomies/post_tag',
'TagsCollection.0._links.wp:post_type.0.href' => 'http://example.org/index.php?rest_route=%2Fwp%2Fv2%2Fposts&tags=2',
'TagModel.id' => 2,
'TagModel.link' => 'http://example.org/?tag=restapi-client-fixture-tag',
'TagModel.meta.test_single' => '',
'TagModel.meta.test_multi' => array(),
'TagModel.meta.test_tag_meta' => '',
'UsersCollection.0.link' => 'http://example.org/?author=1',
'UsersCollection.0.avatar_urls.24' => 'http://0.gravatar.com/avatar/96614ec98aa0c0d2ee75796dced6df54?s=24&d=mm&r=g',
'UsersCollection.0.avatar_urls.48' => 'http://0.gravatar.com/avatar/96614ec98aa0c0d2ee75796dced6df54?s=48&d=mm&r=g',
'UsersCollection.0.avatar_urls.96' => 'http://0.gravatar.com/avatar/96614ec98aa0c0d2ee75796dced6df54?s=96&d=mm&r=g',
'UsersCollection.0._links.self.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/users/1',
'UsersCollection.0._links.collection.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/users',
'UsersCollection.1.id' => 2,
'UsersCollection.1.link' => 'http://example.org/?author=2',
'UsersCollection.1._links.self.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/users/2',
'UsersCollection.1._links.collection.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/users',
'UserModel.id' => 2,
'UserModel.link' => 'http://example.org/?author=2',
'me.id' => 2,
'me.link' => 'http://example.org/?author=2',
'CommentsCollection.0.id' => 2,
'CommentsCollection.0.post' => 4,
'CommentsCollection.0.link' => 'http://example.org/?p=4#comment-2',
'CommentsCollection.0._links.self.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/comments/2',
'CommentsCollection.0._links.collection.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/comments',
'CommentsCollection.0._links.up.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/posts/4',
'CommentModel.id' => 2,
'CommentModel.post' => 4,
'CommentModel.link' => 'http://example.org/?p=4#comment-2',
'settings.title' => 'Test Blog',
'settings.url' => 'http://example.org',
'settings.email' => 'admin@example.org',
);
private function normalize_fixture( $data, $path ) {
if ( isset( self::$fixture_replacements[ $path ] ) ) {
return self::$fixture_replacements[ $path ];
}
if ( ! is_array( $data ) ) {
return $data;
}
foreach ( $data as $key => $value ) {
if ( is_string( $value ) && (
'date' === $key ||
'date_gmt' === $key ||
'modified' === $key ||
'modified_gmt' === $key
) ) {
$data[ $key ] = '2017-02-14T00:00:00';
} else {
$data[ $key ] = $this->normalize_fixture( $value, "$path.$key" );
}
}
return $data;
}
}