wordpress-develop/tests/phpunit/tests/post/primePostCaches.php
Dominik Schilling 35421f2b07 Query: Account for primed post caches without primed post meta/term caches.
In [54352] `update_post_caches()` was replaced by `_prime_post_caches()` to reduce excessive object cache calls. That's because `_prime_post_caches()` checks first if post IDs aren't already cached. Unfortunately this becomes an issue if a post itself is cached but not the meta/terms.
To fix this regression, `_prime_post_caches()` now always calls `update_postmeta_cache()` and `update_object_term_cache()` depending on the arguments passed to it. Both functions internally check whether IDs are already cached so the fix from [54352] remains in place.

Props peterwilsoncc, spacedmonkey, ocean90.
Fixes #57163.

git-svn-id: https://develop.svn.wordpress.org/trunk@54894 602fd350-edb4-49c9-b593-d223f7449a82
2022-11-29 20:27:29 +00:00

230 lines
6.9 KiB
PHP

<?php
/**
* Test `_prime_post_caches()`.
*
* @package WordPress
*/
/**
* Test class for `_prime_post_caches()`.
*
* @group post
* @group cache
*
* @covers ::_prime_post_caches
*/
class Tests_Post_PrimePostCaches extends WP_UnitTestCase {
/**
* Post IDs.
*
* @var int[]
*/
public static $posts;
/**
* Set up test resources before the class.
*
* @param WP_UnitTest_Factory $factory The unit test factory.
*/
public static function wpSetupBeforeClass( WP_UnitTest_Factory $factory ) {
self::$posts = $factory->post->create_many( 3 );
$category = $factory->term->create(
array(
'taxonomy' => 'category',
'slug' => 'foo',
'name' => 'Foo',
)
);
wp_set_post_terms( self::$posts[0], $category, 'category' );
add_post_meta( self::$posts[0], 'meta', 'foo' );
add_post_meta( self::$posts[1], 'meta', 'bar' );
}
/**
* @ticket 57163
*/
public function test_prime_post_caches() {
$post_id = self::$posts[0];
$this->assertSame( array( $post_id ), _get_non_cached_ids( array( $post_id ), 'posts' ), 'Post is already cached.' );
// Test posts cache.
$before_num_queries = get_num_queries();
_prime_post_caches( array( $post_id ) );
$num_queries = get_num_queries() - $before_num_queries;
/*
* Four expected queries:
* 1: Posts data,
* 2: Post meta data,
* 3: Taxonomy data,
* 4: Term data.
*/
$this->assertSame( 4, $num_queries, 'Unexpected number of queries.' );
$this->assertSame( array(), _get_non_cached_ids( array( $post_id ), 'posts' ), 'Post is not cached.' );
// Test post meta cache.
$before_num_queries = get_num_queries();
$meta = get_post_meta( $post_id, 'meta', true );
$num_queries = get_num_queries() - $before_num_queries;
$this->assertSame( 'foo', $meta, 'Meta has unexpected value.' );
$this->assertSame( 0, $num_queries, 'Unexpected number of queries.' );
// Test term cache.
$before_num_queries = get_num_queries();
$categories = get_the_category( $post_id );
$num_queries = get_num_queries() - $before_num_queries;
$this->assertNotEmpty( $categories, 'Categories does return an empty result set.' );
$this->assertSame( 0, $num_queries, 'Unexpected number of queries.' );
}
/**
* @ticket 57163
*/
public function test_prime_post_caches_with_multiple_posts() {
$this->assertSame( self::$posts, _get_non_cached_ids( self::$posts, 'posts' ), 'Posts are already cached.' );
$before_num_queries = get_num_queries();
_prime_post_caches( self::$posts );
$num_queries = get_num_queries() - $before_num_queries;
/*
* Four expected queries:
* 1: Posts data,
* 2: Post meta data,
* 3: Taxonomy data,
* 4: Term data.
*/
$this->assertSame( 4, $num_queries, 'Unexpected number of queries.' );
$this->assertSame( array(), _get_non_cached_ids( self::$posts, 'posts' ), 'Posts are not cached.' );
}
/**
* @ticket 57163
*/
public function test_prime_post_caches_only_posts_cache() {
$this->assertSame( self::$posts, _get_non_cached_ids( self::$posts, 'posts' ), 'Posts are already cached.' );
$before_num_queries = get_num_queries();
_prime_post_caches( self::$posts, false, false );
$num_queries = get_num_queries() - $before_num_queries;
/*
* One expected query:
* 1: Posts data.
*/
$this->assertSame( 1, $num_queries, 'Unexpected number of queries.' );
$this->assertSame( array(), _get_non_cached_ids( self::$posts, 'posts' ), 'Posts are not cached.' );
}
/**
* @ticket 57163
*/
public function test_prime_post_caches_only_posts_and_term_cache() {
$this->assertSame( self::$posts, _get_non_cached_ids( self::$posts, 'posts' ), 'Posts are already cached.' );
$before_num_queries = get_num_queries();
_prime_post_caches( self::$posts, true, false );
$num_queries = get_num_queries() - $before_num_queries;
/*
* Three expected queries:
* 1: Posts data.
* 2: Taxonomy data,
* 3: Term data.
*/
$this->assertSame( 3, $num_queries, 'Unexpected number of queries.' );
$this->assertSame( array(), _get_non_cached_ids( self::$posts, 'posts' ), 'Posts are not cached.' );
// Test term cache.
$before_num_queries = get_num_queries();
$categories = get_the_category( self::$posts[0] );
$num_queries = get_num_queries() - $before_num_queries;
$this->assertNotEmpty( $categories, 'Categories does return an empty result set.' );
$this->assertSame( 0, $num_queries, 'Unexpected number of queries.' );
}
/**
* @ticket 57163
*/
public function test_prime_post_caches_only_posts_and_meta_cache() {
$this->assertSame( self::$posts, _get_non_cached_ids( self::$posts, 'posts' ), 'Posts are already cached.' );
$before_num_queries = get_num_queries();
_prime_post_caches( self::$posts, false, true );
$num_queries = get_num_queries() - $before_num_queries;
/*
* Two expected queries:
* 1: Posts data.
* 2: Post meta data.
*/
$this->assertSame( 2, $num_queries, 'Unexpected number of queries warming cache.' );
$this->assertSame( array(), _get_non_cached_ids( self::$posts, 'posts' ), 'Posts are not cached.' );
// Test post meta cache.
$before_num_queries = get_num_queries();
$meta_1 = get_post_meta( self::$posts[0], 'meta', true );
$meta_2 = get_post_meta( self::$posts[1], 'meta', true );
$num_queries = get_num_queries() - $before_num_queries;
$this->assertSame( 'foo', $meta_1, 'Meta 1 has unexpected value.' );
$this->assertSame( 'bar', $meta_2, 'Meta 2 has unexpected value.' );
$this->assertSame( 0, $num_queries, 'Unexpected number of queries getting post meta.' );
}
/**
* @ticket 57163
*/
public function test_prime_post_caches_accounts_for_posts_without_primed_meta_terms() {
$post_id = self::$posts[0];
$this->assertSame( array( $post_id ), _get_non_cached_ids( array( $post_id ), 'posts' ), 'Post is already cached.' );
// Warm only the posts cache.
$post = get_post( $post_id );
$this->assertNotEmpty( $post, 'Post does not exist.' );
$this->assertEmpty( _get_non_cached_ids( array( $post_id ), 'posts' ), 'Post is not cached.' );
$before_num_queries = get_num_queries();
_prime_post_caches( array( $post_id ) );
$num_queries = get_num_queries() - $before_num_queries;
/*
* Three expected queries:
* 1: Post meta data,
* 2: Taxonomy data,
* 3: Term data.
*/
$this->assertSame( 3, $num_queries, 'Unexpected number of queries.' );
}
/**
* @ticket 57163
*/
public function test_prime_post_caches_does_not_prime_caches_twice() {
$this->assertSame( self::$posts, _get_non_cached_ids( self::$posts, 'posts' ), 'Posts are already cached.' );
_prime_post_caches( self::$posts );
$this->assertSame( array(), _get_non_cached_ids( self::$posts, 'posts' ), 'Posts are not cached.' );
$before_num_queries = get_num_queries();
_prime_post_caches( self::$posts );
$num_queries = get_num_queries() - $before_num_queries;
$this->assertSame( 0, $num_queries, 'Unexpected number of queries.' );
}
}