table = _get_list_table( 'WP_Posts_List_Table', array( 'screen' => 'edit-page' ) ); } public static function wpSetUpBeforeClass( WP_UnitTest_Factory $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( '|]*>|', $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 40188 */ public function test_filter_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="post-query-submit"', $output ); } /** * @ticket 40188 */ public function test_filter_button_should_be_shown_if_there_are_comments() { $post_id = self::factory()->post->create(); $comment_id = self::factory()->comment->create( array( 'comment_post_ID' => $post_id, 'comment_approved' => '1', ) ); $table = _get_list_table( 'WP_Comments_List_Table', array( 'screen' => 'edit-comments' ) ); $table->prepare_items(); ob_start(); $table->extra_tablenav( 'top' ); $output = ob_get_clean(); $this->assertContains( 'id="post-query-submit"', $output ); } /** * @ticket 40188 */ public function test_filter_comment_type_dropdown_should_be_shown_if_there_are_comments() { $post_id = self::factory()->post->create(); $comment_id = self::factory()->comment->create( array( 'comment_post_ID' => $post_id, 'comment_approved' => '1', ) ); $table = _get_list_table( 'WP_Comments_List_Table', array( 'screen' => 'edit-comments' ) ); $table->prepare_items(); ob_start(); $table->extra_tablenav( 'top' ); $output = ob_get_clean(); $this->assertContains( 'id="filter-by-comment-type"', $output ); $this->assertContains( " OPTIONS; $expected = str_replace( "\r\n", "\n", $expected ); $this->assertContains( $expected, $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.' ); } }