Setting the initial order didn't work as expected due to reversed logic. Follow-up to [48151]. See #45089. git-svn-id: https://develop.svn.wordpress.org/trunk@48165 602fd350-edb4-49c9-b593-d223f7449a82
370 lines
10 KiB
PHP
370 lines
10 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @group admin
|
|
*/
|
|
class Tests_Admin_includesListTable extends WP_UnitTestCase {
|
|
protected static $top = array();
|
|
protected static $children = array();
|
|
protected static $grandchildren = array();
|
|
protected static $post_ids = array();
|
|
|
|
/**
|
|
* @var WP_Posts_List_Table
|
|
*/
|
|
protected $table;
|
|
|
|
function setUp() {
|
|
parent::setUp();
|
|
$this->table = _get_list_table( 'WP_Posts_List_Table', array( 'screen' => 'edit-page' ) );
|
|
}
|
|
|
|
public static function wpSetUpBeforeClass( $factory ) {
|
|
// Note that our top/children/grandchildren arrays are 1-indexed.
|
|
|
|
// Create top-level pages.
|
|
$num_posts = 5;
|
|
foreach ( range( 1, $num_posts ) as $i ) {
|
|
$p = $factory->post->create_and_get(
|
|
array(
|
|
'post_type' => 'page',
|
|
'post_title' => sprintf( 'Top Level Page %d', $i ),
|
|
)
|
|
);
|
|
|
|
self::$top[ $i ] = $p;
|
|
self::$post_ids[] = $p->ID;
|
|
}
|
|
|
|
// Create child pages.
|
|
$num_children = 3;
|
|
foreach ( self::$top as $top => $top_page ) {
|
|
foreach ( range( 1, $num_children ) as $i ) {
|
|
$p = $factory->post->create_and_get(
|
|
array(
|
|
'post_type' => 'page',
|
|
'post_parent' => $top_page->ID,
|
|
'post_title' => sprintf( 'Child %d', $i ),
|
|
)
|
|
);
|
|
|
|
self::$children[ $top ][ $i ] = $p;
|
|
self::$post_ids[] = $p->ID;
|
|
}
|
|
}
|
|
|
|
// Create grand-child pages for the third and fourth top-level pages.
|
|
$num_grandchildren = 3;
|
|
foreach ( range( 3, 4 ) as $top ) {
|
|
foreach ( self::$children[ $top ] as $child => $child_page ) {
|
|
foreach ( range( 1, $num_grandchildren ) as $i ) {
|
|
$p = $factory->post->create_and_get(
|
|
array(
|
|
'post_type' => 'page',
|
|
'post_parent' => $child_page->ID,
|
|
'post_title' => sprintf( 'Grandchild %d', $i ),
|
|
)
|
|
);
|
|
|
|
self::$grandchildren[ $top ][ $child ][ $i ] = $p;
|
|
self::$post_ids[] = $p->ID;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @ticket 15459
|
|
*/
|
|
function test_list_hierarchical_pages_first_page() {
|
|
$this->_test_list_hierarchical_page(
|
|
array(
|
|
'paged' => 1,
|
|
'posts_per_page' => 2,
|
|
),
|
|
array(
|
|
self::$top[1]->ID,
|
|
self::$children[1][1]->ID,
|
|
)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @ticket 15459
|
|
*/
|
|
function test_list_hierarchical_pages_second_page() {
|
|
$this->_test_list_hierarchical_page(
|
|
array(
|
|
'paged' => 2,
|
|
'posts_per_page' => 2,
|
|
),
|
|
array(
|
|
self::$top[1]->ID,
|
|
self::$children[1][2]->ID,
|
|
self::$children[1][3]->ID,
|
|
)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @ticket 15459
|
|
*/
|
|
function test_search_hierarchical_pages_first_page() {
|
|
$this->_test_list_hierarchical_page(
|
|
array(
|
|
'paged' => 1,
|
|
'posts_per_page' => 2,
|
|
's' => 'Child',
|
|
),
|
|
array(
|
|
self::$children[1][1]->ID,
|
|
self::$children[1][2]->ID,
|
|
)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @ticket 15459
|
|
*/
|
|
function test_search_hierarchical_pages_second_page() {
|
|
$this->_test_list_hierarchical_page(
|
|
array(
|
|
'paged' => 2,
|
|
'posts_per_page' => 2,
|
|
's' => 'Top',
|
|
),
|
|
array(
|
|
self::$top[3]->ID,
|
|
self::$top[4]->ID,
|
|
)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @ticket 15459
|
|
*/
|
|
function test_grandchildren_hierarchical_pages_first_page() {
|
|
// Page 6 is the first page with grandchildren.
|
|
$this->_test_list_hierarchical_page(
|
|
array(
|
|
'paged' => 6,
|
|
'posts_per_page' => 2,
|
|
),
|
|
array(
|
|
self::$top[3]->ID,
|
|
self::$children[3][1]->ID,
|
|
self::$grandchildren[3][1][1]->ID,
|
|
self::$grandchildren[3][1][2]->ID,
|
|
)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @ticket 15459
|
|
*/
|
|
function test_grandchildren_hierarchical_pages_second_page() {
|
|
// Page 7 is the second page with grandchildren.
|
|
$this->_test_list_hierarchical_page(
|
|
array(
|
|
'paged' => 7,
|
|
'posts_per_page' => 2,
|
|
),
|
|
array(
|
|
self::$top[3]->ID,
|
|
self::$children[3][1]->ID,
|
|
self::$grandchildren[3][1][3]->ID,
|
|
self::$children[3][2]->ID,
|
|
)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Helper function to test the output of a page which uses `WP_Posts_List_Table`.
|
|
*
|
|
* @param array $args Query args for the list of pages.
|
|
* @param array $expected_ids Expected IDs of pages returned.
|
|
*/
|
|
protected function _test_list_hierarchical_page( array $args, array $expected_ids ) {
|
|
$matches = array();
|
|
|
|
$_REQUEST['paged'] = $args['paged'];
|
|
$GLOBALS['per_page'] = $args['posts_per_page'];
|
|
|
|
$args = array_merge(
|
|
array(
|
|
'post_type' => 'page',
|
|
),
|
|
$args
|
|
);
|
|
|
|
// Mimic the behaviour of `wp_edit_posts_query()`:
|
|
if ( ! isset( $args['orderby'] ) ) {
|
|
$args['orderby'] = 'menu_order title';
|
|
$args['order'] = 'asc';
|
|
$args['posts_per_page'] = -1;
|
|
$args['posts_per_archive_page'] = -1;
|
|
}
|
|
|
|
$pages = new WP_Query( $args );
|
|
|
|
ob_start();
|
|
$this->table->set_hierarchical_display( true );
|
|
$this->table->display_rows( $pages->posts );
|
|
$output = ob_get_clean();
|
|
|
|
// Clean up.
|
|
unset( $_REQUEST['paged'] );
|
|
unset( $GLOBALS['per_page'] );
|
|
|
|
preg_match_all( '|<tr[^>]*>|', $output, $matches );
|
|
|
|
$this->assertCount( count( $expected_ids ), array_keys( $matches[0] ) );
|
|
|
|
foreach ( $expected_ids as $id ) {
|
|
$this->assertContains( sprintf( 'id="post-%d"', $id ), $output );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @ticket 37407
|
|
*/
|
|
function test_filter_button_should_not_be_shown_if_there_are_no_posts() {
|
|
// Set post type to a non-existent one.
|
|
$this->table->screen->post_type = 'foo';
|
|
|
|
ob_start();
|
|
$this->table->extra_tablenav( 'top' );
|
|
$output = ob_get_clean();
|
|
|
|
$this->assertNotContains( 'id="post-query-submit"', $output );
|
|
}
|
|
|
|
/**
|
|
* @ticket 37407
|
|
*/
|
|
function test_months_dropdown_should_not_be_shown_if_there_are_no_posts() {
|
|
// Set post type to a non-existent one.
|
|
$this->table->screen->post_type = 'foo';
|
|
|
|
ob_start();
|
|
$this->table->extra_tablenav( 'top' );
|
|
$output = ob_get_clean();
|
|
|
|
$this->assertNotContains( 'id="filter-by-date"', $output );
|
|
}
|
|
|
|
/**
|
|
* @ticket 37407
|
|
*/
|
|
function test_category_dropdown_should_not_be_shown_if_there_are_no_posts() {
|
|
// Set post type to a non-existent one.
|
|
$this->table->screen->post_type = 'foo';
|
|
|
|
ob_start();
|
|
$this->table->extra_tablenav( 'top' );
|
|
$output = ob_get_clean();
|
|
|
|
$this->assertNotContains( 'id="cat"', $output );
|
|
}
|
|
|
|
/**
|
|
* @ticket 38341
|
|
*/
|
|
public function test_empty_trash_button_should_not_be_shown_if_there_are_no_posts() {
|
|
// Set post type to a non-existent one.
|
|
$this->table->screen->post_type = 'foo';
|
|
|
|
ob_start();
|
|
$this->table->extra_tablenav( 'top' );
|
|
$output = ob_get_clean();
|
|
|
|
$this->assertNotContains( 'id="delete_all"', $output );
|
|
}
|
|
|
|
/**
|
|
* @ticket 38341
|
|
*/
|
|
public function test_empty_trash_button_should_not_be_shown_if_there_are_no_comments() {
|
|
$table = _get_list_table( 'WP_Comments_List_Table', array( 'screen' => 'edit-comments' ) );
|
|
|
|
ob_start();
|
|
$table->extra_tablenav( 'top' );
|
|
$output = ob_get_clean();
|
|
|
|
$this->assertNotContains( 'id="delete_all"', $output );
|
|
}
|
|
|
|
/**
|
|
* @ticket 45089
|
|
*/
|
|
public function test_sortable_columns() {
|
|
require_once ABSPATH . 'wp-admin/includes/class-wp-comments-list-table.php';
|
|
|
|
$override_sortable_columns = array(
|
|
'author' => array( 'comment_author', true ),
|
|
'response' => 'comment_post_ID',
|
|
'date' => array( 'comment_date', 'dEsC' ), // The ordering support should be case-insensitive.
|
|
);
|
|
|
|
// Stub the get_sortable_columns() method.
|
|
$object = $this->getMockBuilder( 'WP_Comments_List_Table' )
|
|
->setConstructorArgs( array( array( 'screen' => 'edit-comments' ) ) )
|
|
->setMethods( array( 'get_sortable_columns' ) )
|
|
->getMock();
|
|
|
|
// Change the null return value of the stubbed get_sortable_columns() method.
|
|
$object->method( 'get_sortable_columns' )
|
|
->willReturn( $override_sortable_columns );
|
|
|
|
$output = get_echo( array( $object, 'print_column_headers' ) );
|
|
|
|
$this->assertContains( '?orderby=comment_author&order=desc', $output, 'Mismatch of the default link ordering for comment author column. Should be desc.' );
|
|
$this->assertContains( 'column-author sortable asc', $output, 'Mismatch of CSS classes for the comment author column.' );
|
|
|
|
$this->assertContains( '?orderby=comment_post_ID&order=asc', $output, 'Mismatch of the default link ordering for comment response column. Should be asc.' );
|
|
$this->assertContains( 'column-response sortable desc', $output, 'Mismatch of CSS classes for the comment post ID column.' );
|
|
|
|
$this->assertContains( '?orderby=comment_date&order=desc', $output, 'Mismatch of the default link ordering for comment date column. Should be asc.' );
|
|
$this->assertContains( 'column-date sortable asc', $output, 'Mismatch of CSS classes for the comment date column.' );
|
|
}
|
|
|
|
/**
|
|
* @ticket 45089
|
|
*/
|
|
public function test_sortable_columns_with_current_ordering() {
|
|
require_once ABSPATH . 'wp-admin/includes/class-wp-comments-list-table.php';
|
|
|
|
$override_sortable_columns = array(
|
|
'author' => array( 'comment_author', false ),
|
|
'response' => 'comment_post_ID',
|
|
'date' => array( 'comment_date', 'asc' ), // We will override this with current ordering.
|
|
);
|
|
|
|
// Current ordering.
|
|
$_GET['orderby'] = 'comment_date';
|
|
$_GET['order'] = 'desc';
|
|
|
|
// Stub the get_sortable_columns() method.
|
|
$object = $this->getMockBuilder( 'WP_Comments_List_Table' )
|
|
->setConstructorArgs( array( array( 'screen' => 'edit-comments' ) ) )
|
|
->setMethods( array( 'get_sortable_columns' ) )
|
|
->getMock();
|
|
|
|
// Change the null return value of the stubbed get_sortable_columns() method.
|
|
$object->method( 'get_sortable_columns' )
|
|
->willReturn( $override_sortable_columns );
|
|
|
|
$output = get_echo( array( $object, 'print_column_headers' ) );
|
|
|
|
$this->assertContains( '?orderby=comment_author&order=asc', $output, 'Mismatch of the default link ordering for comment author column. Should be asc.' );
|
|
$this->assertContains( 'column-author sortable desc', $output, 'Mismatch of CSS classes for the comment author column.' );
|
|
|
|
$this->assertContains( '?orderby=comment_post_ID&order=asc', $output, 'Mismatch of the default link ordering for comment response column. Should be asc.' );
|
|
$this->assertContains( 'column-response sortable desc', $output, 'Mismatch of CSS classes for the comment post ID column.' );
|
|
|
|
$this->assertContains( '?orderby=comment_date&order=asc', $output, 'Mismatch of the current link ordering for comment date column. Should be asc.' );
|
|
$this->assertContains( 'column-date sorted desc', $output, 'Mismatch of CSS classes for the comment date column.' );
|
|
}
|
|
|
|
}
|