wordpress-develop/tests/phpunit/tests/query/search.php
Sergey Biryukov 8be943d06e Tests: Introduce assertSameSets() and assertSameSetsWithIndex(), and use them where appropriate.
This ensures that not only the array values being compared are equal, but also that their type is the same.

These new methods replace most of the existing instances of `assertEqualSets()` and `assertEqualSetsWithIndex()`.

Going forward, stricter type checking by using `assertSameSets()` or `assertSameSetsWithIndex()` should generally be preferred, to make the tests more reliable.

Follow-up to [48937].

See #38266.

git-svn-id: https://develop.svn.wordpress.org/trunk@48939 602fd350-edb4-49c9-b593-d223f7449a82
2020-09-04 07:01:00 +00:00

637 lines
15 KiB
PHP

<?php
/**
* @group query
* @group search
*/
class Tests_Query_Search extends WP_UnitTestCase {
protected $q;
protected $post_type;
function setUp() {
parent::setUp();
$this->post_type = rand_str( 12 );
register_post_type( $this->post_type );
$this->q = new WP_Query();
}
function tearDown() {
_unregister_post_type( $this->post_type );
unset( $this->q );
parent::tearDown();
}
function get_search_results( $terms ) {
$args = http_build_query(
array(
's' => $terms,
'post_type' => $this->post_type,
)
);
return $this->q->query( $args );
}
function test_search_order_title_relevance() {
foreach ( range( 1, 7 ) as $i ) {
self::factory()->post->create(
array(
'post_content' => $i . rand_str() . ' about',
'post_type' => $this->post_type,
)
);
}
$post_id = self::factory()->post->create(
array(
'post_title' => 'About',
'post_type' => $this->post_type,
)
);
$posts = $this->get_search_results( 'About' );
$this->assertSame( $post_id, reset( $posts )->ID );
}
function test_search_terms_query_var() {
$terms = 'This is a search term';
$query = new WP_Query( array( 's' => 'This is a search term' ) );
$this->assertNotEquals( explode( ' ', $terms ), $query->get( 'search_terms' ) );
$this->assertSame( array( 'search', 'term' ), $query->get( 'search_terms' ) );
}
function test_filter_stopwords() {
$terms = 'This is a search term';
add_filter( 'wp_search_stopwords', array( $this, 'filter_wp_search_stopwords' ) );
$query = new WP_Query( array( 's' => $terms ) );
remove_filter( 'wp_search_stopwords', array( $this, 'filter_wp_search_stopwords' ) );
$this->assertNotEquals( array( 'search', 'term' ), $query->get( 'search_terms' ) );
$this->assertSame( array( 'This', 'is', 'search', 'term' ), $query->get( 'search_terms' ) );
}
function filter_wp_search_stopwords() {
return array();
}
/**
* @ticket 38099
*/
function test_disable_search_exclusion_prefix() {
$title = '-HYPHENATION_TEST';
// Create a post with a title which starts with a hyphen.
$post_id = self::factory()->post->create(
array(
'post_content' => $title,
'post_type' => $this->post_type,
)
);
// By default, we can use the hyphen prefix to exclude results.
$this->assertSame( array(), $this->get_search_results( $title ) );
// After we disable the feature using the filter, we should get the result.
add_filter( 'wp_query_search_exclusion_prefix', '__return_false' );
$result = $this->get_search_results( $title );
$post = array_pop( $result );
$this->assertSame( $post->ID, $post_id );
remove_filter( 'wp_query_search_exclusion_prefix', '__return_false' );
}
/**
* @ticket 38099
*/
function test_change_search_exclusion_prefix() {
$title = '#OCTOTHORPE_TEST';
// Create a post with a title that starts with a non-hyphen prefix.
$post_id = self::factory()->post->create(
array(
'post_content' => $title,
'post_type' => $this->post_type,
)
);
// By default, we should get the result.
$result = $this->get_search_results( $title );
$post = array_pop( $result );
$this->assertSame( $post->ID, $post_id );
// After we change the prefix, the result should be excluded.
add_filter( 'wp_query_search_exclusion_prefix', array( $this, 'filter_search_exclusion_prefix_octothorpe' ) );
$found = $this->get_search_results( $title );
remove_filter( 'wp_query_search_exclusion_prefix', array( $this, 'filter_search_exclusion_prefix_octothorpe' ) );
$this->assertSame( array(), $found );
}
function filter_search_exclusion_prefix_octothorpe() {
return '#';
}
/**
* @ticket 33988
*/
public function test_s_should_exclude_term_prefixed_with_dash() {
$p1 = self::factory()->post->create(
array(
'post_status' => 'publish',
'post_content' => 'This post has foo but also bar',
)
);
$p2 = self::factory()->post->create(
array(
'post_status' => 'publish',
'post_content' => 'This post has only foo',
)
);
$q = new WP_Query(
array(
's' => 'foo -bar',
'fields' => 'ids',
)
);
$this->assertSameSets( array( $p2 ), $q->posts );
}
/**
* @ticket 33988
*/
public function test_s_should_exclude_first_term_if_prefixed_with_dash() {
$p1 = self::factory()->post->create(
array(
'post_status' => 'publish',
'post_content' => 'This post has foo but also bar',
)
);
$p2 = self::factory()->post->create(
array(
'post_status' => 'publish',
'post_content' => 'This post has only bar',
)
);
$q = new WP_Query(
array(
's' => '-foo bar',
'fields' => 'ids',
)
);
$this->assertSameSets( array( $p2 ), $q->posts );
}
/**
* @ticket 33988
*/
public function test_s_should_not_exclude_for_dashes_in_the_middle_of_words() {
$p1 = self::factory()->post->create(
array(
'post_status' => 'publish',
'post_content' => 'This post has foo but also bar',
)
);
$p2 = self::factory()->post->create(
array(
'post_status' => 'publish',
'post_content' => 'This post has only bar',
)
);
$p3 = self::factory()->post->create(
array(
'post_status' => 'publish',
'post_content' => 'This post has only foo-bar',
)
);
$q = new WP_Query(
array(
's' => 'foo-bar',
'fields' => 'ids',
)
);
$this->assertSameSets( array( $p3 ), $q->posts );
}
/**
* @ticket 36195
*/
public function test_s_should_not_exclude_for_dashes_between_words() {
$p1 = self::factory()->post->create(
array(
'post_status' => 'publish',
'post_content' => 'This post has foo but also bar',
)
);
$p2 = self::factory()->post->create(
array(
'post_status' => 'publish',
'post_content' => 'This post has only bar',
)
);
$p3 = self::factory()->post->create(
array(
'post_status' => 'publish',
'post_content' => 'This post has only foo - bar',
)
);
$q = new WP_Query(
array(
's' => 'foo - bar',
'fields' => 'ids',
)
);
$this->assertSameSets( array( $p1, $p3 ), $q->posts );
}
/**
* @ticket 35361
*/
public function test_search_orderby_should_be_empty_when_search_string_is_longer_than_6_words_and_exclusion_operator_is_used() {
$q = new WP_Query(
array(
's' => 'foo1 foo2 foo3 foo4 foo5 foo6 foo7 -bar',
'fields' => 'ids',
)
);
$this->assertNotRegExp( '|ORDER BY \(CASE[^\)]+\)|', $q->request );
}
/**
* @ticket 31025
*/
public function test_s_zero() {
$p1 = $this->factory->post->create(
array(
'post_status' => 'publish',
'post_title' => '1',
'post_content' => 'this post contains no zeroes',
'post_excerpt' => 'this post contains no zeroes',
)
);
$p2 = $this->factory->post->create(
array(
'post_status' => 'publish',
'post_title' => '0',
'post_content' => 'this post contains zeroes',
'post_excerpt' => 'this post containts zeroes',
)
);
$q = new WP_Query(
array(
's' => '0',
'fields' => 'ids',
)
);
$this->assertSameSets( array( $p2 ), $q->posts );
}
/**
* @ticket 35594
*/
public function test_search_should_respect_suppress_filters() {
add_filter( 'posts_search', array( $this, 'filter_posts_search' ) );
add_filter( 'posts_search_orderby', array( $this, 'filter_posts_search' ) );
$q = new WP_Query(
array(
's' => 'foo',
'suppress_filters' => true,
)
);
remove_filter( 'posts_search', array( $this, 'filter_posts_search' ) );
remove_filter( 'posts_search_orderby', array( $this, 'filter_posts_search' ) );
$this->assertNotContains( 'posts_search', $q->request );
}
/**
* @ticket 35762
*/
public function test_search_post_excerpt() {
$p1 = self::factory()->post->create(
array(
'post_status' => 'publish',
'post_content' => 'This post has foo but also bar',
)
);
$p2 = self::factory()->post->create(
array(
'post_status' => 'publish',
'post_content' => '',
'post_excerpt' => 'This post has bar and baz',
)
);
$p3 = self::factory()->post->create(
array(
'post_status' => 'publish',
'post_content' => '',
'post_excerpt' => 'This post has only foo',
)
);
$q = new WP_Query(
array(
's' => 'foo',
'fields' => 'ids',
)
);
$this->assertSameSets( array( $p1, $p3 ), $q->posts );
$q = new WP_Query(
array(
's' => 'bar',
'fields' => 'ids',
)
);
$this->assertSameSets( array( $p1, $p2 ), $q->posts );
$q = new WP_Query(
array(
's' => 'baz',
'fields' => 'ids',
)
);
$this->assertSameSets( array( $p2 ), $q->posts );
}
/**
* @ticket 35762
*/
public function test_search_order_title_before_excerpt_and_content() {
$p1 = self::factory()->post->create(
array(
'post_status' => 'publish',
'post_title' => 'This post has foo',
'post_content' => '',
'post_excerpt' => '',
)
);
$p2 = self::factory()->post->create(
array(
'post_status' => 'publish',
'post_title' => '',
'post_content' => 'This post has foo',
'post_excerpt' => '',
)
);
$p3 = self::factory()->post->create(
array(
'post_status' => 'publish',
'post_title' => '',
'post_content' => '',
'post_excerpt' => 'This post has foo',
)
);
$q = new WP_Query(
array(
's' => 'this post has foo',
'fields' => 'ids',
'orderby' => false,
)
);
$this->assertSame( array( $p1, $p3, $p2 ), $q->posts );
}
/**
* Unfiltered search queries for attachment post types should not inlcude
* filenames to ensure the postmeta JOINs don't happen on the front end.
*
* @ticket 22744
*/
public function test_exclude_file_names_in_attachment_search_by_default() {
$attachment = self::factory()->post->create(
array(
'post_type' => 'attachment',
'post_status' => 'publish',
'post_title' => 'bar foo',
'post_content' => 'foo bar',
'post_excerpt' => 'This post has foo',
)
);
add_post_meta( $attachment, '_wp_attached_file', 'some-image2.png', true );
// Pass post_type an array value.
$q = new WP_Query(
array(
's' => 'image2',
'fields' => 'ids',
'post_type' => 'attachment',
'post_status' => 'inherit',
)
);
$this->assertNotEquals( array( $attachment ), $q->posts );
}
/**
* @ticket 22744
*/
public function test_include_file_names_in_attachment_search_as_string() {
$attachment = self::factory()->post->create(
array(
'post_type' => 'attachment',
'post_status' => 'publish',
'post_title' => 'bar foo',
'post_content' => 'foo bar',
'post_excerpt' => 'This post has foo',
)
);
add_post_meta( $attachment, '_wp_attached_file', 'some-image1.png', true );
add_filter( 'posts_clauses', '_filter_query_attachment_filenames' );
// Pass post_type a string value.
$q = new WP_Query(
array(
's' => 'image1',
'fields' => 'ids',
'post_type' => 'attachment',
'post_status' => 'inherit',
)
);
$this->assertSame( array( $attachment ), $q->posts );
}
/**
* @ticket 22744
*/
public function test_include_file_names_in_attachment_search_as_array() {
$attachment = self::factory()->post->create(
array(
'post_type' => 'attachment',
'post_status' => 'publish',
'post_title' => 'bar foo',
'post_content' => 'foo bar',
'post_excerpt' => 'This post has foo',
)
);
add_post_meta( $attachment, '_wp_attached_file', 'some-image2.png', true );
add_filter( 'posts_clauses', '_filter_query_attachment_filenames' );
// Pass post_type an array value.
$q = new WP_Query(
array(
's' => 'image2',
'fields' => 'ids',
'post_type' => array( 'attachment' ),
'post_status' => 'inherit',
)
);
$this->assertSame( array( $attachment ), $q->posts );
}
/**
* @ticket 22744
*/
public function test_exclude_attachment_file_names_in_general_searches() {
$attachment = self::factory()->post->create(
array(
'post_type' => 'attachment',
'post_status' => 'publish',
'post_title' => 'bar foo',
'post_content' => 'foo bar',
'post_excerpt' => 'This post has foo',
)
);
add_post_meta( $attachment, '_wp_attached_file', 'some-image3.png', true );
$q = new WP_Query(
array(
's' => 'image3',
'fields' => 'ids',
'post_type' => array( 'post', 'page', 'attachment' ),
'post_status' => 'inherit',
)
);
$this->assertNotEquals( array( $attachment ), $q->posts );
}
/**
* @ticket 22744
*/
public function test_include_file_names_in_attachment_search_with_meta_query() {
$attachment = self::factory()->post->create(
array(
'post_type' => 'attachment',
'post_status' => 'publish',
'post_title' => 'bar foo',
'post_content' => 'foo bar',
'post_excerpt' => 'This post has foo',
)
);
add_post_meta( $attachment, '_wp_attached_file', 'some-image4.png', true );
add_post_meta( $attachment, '_test_meta_key', 'value', true );
add_filter( 'posts_clauses', '_filter_query_attachment_filenames' );
// Pass post_type a string value.
$q = new WP_Query(
array(
's' => 'image4',
'fields' => 'ids',
'post_type' => 'attachment',
'post_status' => 'inherit',
'meta_query' => array(
array(
'key' => '_test_meta_key',
'value' => 'value',
'compare' => '=',
),
),
)
);
$this->assertSame( array( $attachment ), $q->posts );
}
/**
* @ticket 22744
*/
public function test_include_file_names_in_attachment_search_with_tax_query() {
$attachment = self::factory()->post->create(
array(
'post_type' => 'attachment',
'post_status' => 'publish',
'post_title' => 'bar foo',
'post_content' => 'foo bar',
'post_excerpt' => 'This post has foo',
)
);
// Add a tag to the post.
wp_set_post_terms( $attachment, 'test', 'post_tag' );
add_post_meta( $attachment, '_wp_attached_file', 'some-image5.png', true );
add_filter( 'posts_clauses', '_filter_query_attachment_filenames' );
// Pass post_type a string value.
$q = new WP_Query(
array(
's' => 'image5',
'fields' => 'ids',
'post_type' => 'attachment',
'post_status' => 'inherit',
'tax_query' => array(
array(
'taxonomy' => 'post_tag',
'field' => 'slug',
'terms' => 'test',
),
),
)
);
$this->assertSame( array( $attachment ), $q->posts );
}
/**
* @ticket 22744
*/
public function test_filter_query_attachment_filenames_unhooks_itself() {
add_filter( 'posts_clauses', '_filter_query_attachment_filenames' );
apply_filters(
'posts_clauses',
array(
'where' => '',
'groupby' => '',
'join' => '',
'orderby' => '',
'distinct' => '',
'fields' => '',
'limit' => '',
)
);
$result = has_filter( 'posts_clauses', '_filter_query_attachment_filenames' );
$this->assertFalse( $result );
}
public function filter_posts_search( $sql ) {
return $sql . ' /* posts_search */';
}
}