Make WordPress Core

Ticket #43960: 43960-8.diff

File 43960-8.diff, 7.7 KB (added by birgire, 5 years ago)
  • src/wp-admin/includes/user.php

    diff --git src/wp-admin/includes/user.php src/wp-admin/includes/user.php
    index 4e454c6..5d107ad 100644
    function _wp_personal_data_export_page() { 
    809809                array(
    810810                        'plural'   => 'privacy_requests',
    811811                        'singular' => 'privacy_request',
     812                        'screen'   => 'export_personal_data',
    812813                )
    813814        );
    814815        $requests_table->process_bulk_action();
    function _wp_personal_data_removal_page() { 
    882883                array(
    883884                        'plural'   => 'privacy_requests',
    884885                        'singular' => 'privacy_request',
     886                        'screen'   => 'remove_personal_data',
    885887                )
    886888        );
    887889
    abstract class WP_Privacy_Requests_Table extends WP_List_Table { 
    10901092         * @return array Default sortable columns.
    10911093         */
    10921094        protected function get_sortable_columns() {
    1093                 return array();
     1095                // The initial sorting is by 'Requested' (post_date) and descending.
     1096                // With initial sorting, the first click on 'Requested' should be ascending.
     1097                // With 'Requester' sorting active, the next click on 'Requested' should be descending.
     1098                $desc_first = isset( $_GET['orderby'] );
     1099
     1100                return array(
     1101                        'email'             => 'requester',
     1102                        'created_timestamp' => array( 'requested', $desc_first ),
     1103                );
    10941104        }
    10951105
    10961106        /**
    abstract class WP_Privacy_Requests_Table extends WP_List_Table { 
    12351245         * Prepare items to output.
    12361246         *
    12371247         * @since 4.9.6
     1248         * @since 5.0.3 Added support for column sorting.
    12381249         */
    12391250        public function prepare_items() {
    12401251                global $wpdb;
    12411252
    1242                 $primary               = $this->get_primary_column_name();
    1243                 $this->_column_headers = array(
    1244                         $this->get_columns(),
    1245                         array(),
    1246                         $this->get_sortable_columns(),
    1247                         $primary,
    1248                 );
    1249 
    12501253                $this->items    = array();
    12511254                $posts_per_page = $this->get_items_per_page( $this->request_type . '_requests_per_page' );
    12521255                $args           = array(
    abstract class WP_Privacy_Requests_Table extends WP_List_Table { 
    12581261                        's'              => isset( $_REQUEST['s'] ) ? sanitize_text_field( $_REQUEST['s'] ) : '',
    12591262                );
    12601263
     1264                $orderby_mapping = array(
     1265                        'requester' => 'post_title',
     1266                        'requested' => 'post_date',
     1267                );
     1268
     1269                if ( isset( $_REQUEST['orderby'] ) && isset( $orderby_mapping[ $_REQUEST['orderby'] ] ) ) {
     1270                        $args['orderby'] = $orderby_mapping[ $_REQUEST['orderby'] ];
     1271                }
     1272
     1273                if ( isset( $_REQUEST['order'] ) && in_array( strtoupper( $_REQUEST['order'] ), array( 'ASC', 'DESC' ), true ) ) {
     1274                        $args['order'] = strtoupper( $_REQUEST['order'] );
     1275                }
     1276
    12611277                if ( ! empty( $_REQUEST['filter-status'] ) ) {
    12621278                        $filter_status       = isset( $_REQUEST['filter-status'] ) ? sanitize_text_field( $_REQUEST['filter-status'] ) : '';
    12631279                        $args['post_status'] = $filter_status;
  • new file tests/phpunit/tests/admin/wpPrivacyRequestsTable.php

    diff --git tests/phpunit/tests/admin/wpPrivacyRequestsTable.php tests/phpunit/tests/admin/wpPrivacyRequestsTable.php
    new file mode 100644
    index 0000000..39abd54
    - +  
     1<?php
     2/**
     3 * Test the `WP_Privacy_Requests_Table` class.
     4 *
     5 * @package WordPress\UnitTests
     6 *
     7 * @since 5.0.3
     8 */
     9
     10/**
     11 * Tests_Admin_WpPrivacyRequestsTable class.
     12 *
     13 * @group admin
     14 * @group privacy
     15 *
     16 * @since 5.0.3
     17 */
     18class Tests_Admin_WpPrivacyRequestsTable extends WP_UnitTestCase {
     19        /**
     20         * Get instance for mocked class.
     21         *
     22         * @since 5.0.3
     23         *
     24         * @return PHPUnit_Framework_MockObject_MockObject|WP_Privacy_Requests_Table $instance Mocked class instance.
     25         */
     26        public function get_mocked_class_instance() {
     27                if ( version_compare( PHP_VERSION, '5.3', '<' ) ) {
     28                        $this->markTestSkipped( 'ReflectionMethod::setAccessible is only available in PHP 5.3+' );
     29                }
     30
     31                $args = array(
     32                        'plural'   => 'privacy_requests',
     33                        'singular' => 'privacy_request',
     34                        'screen'   => 'export_personal_data',
     35                );
     36
     37                $instance = $this
     38                        ->getMockBuilder( 'WP_Privacy_Requests_Table' )
     39                        ->setConstructorArgs( array( $args ) )
     40                        ->getMockForAbstractClass();
     41
     42                $reflection = new ReflectionClass( $instance );
     43
     44                // Set the request type as 'export_personal_data'.
     45                $reflection_property = $reflection->getProperty( 'request_type' );
     46                $reflection_property->setAccessible( true );
     47                $reflection_property->setValue( $instance, 'export_personal_data' );
     48
     49                // Set the post type as 'user_request'.
     50                $reflection_property = $reflection->getProperty( 'post_type' );
     51                $reflection_property->setAccessible( true );
     52                $reflection_property->setValue( $instance, 'user_request' );
     53
     54                return $instance;
     55        }
     56
     57        /**
     58         * Test columns should be sortable.
     59         *
     60         * @since 5.0.3
     61         *
     62         * @param string|null $order    Order.
     63         * @param string|null $orderby  Order by.
     64         * @param string|null $search   Search term.
     65         * @param string      $expected Expected in SQL query.
     66
     67         * @dataProvider data_test_columns_should_be_sortable
     68         * @covers WP_Privacy_Requests_Table::prepare_items()
     69         * @ticket 43960
     70         */
     71        public function test_columns_should_be_sortable( $order, $orderby, $search, $expected ) {
     72                global $wpdb;
     73
     74                $table     = $this->get_mocked_class_instance();
     75                $this->sql = '';
     76
     77                $_REQUEST['order']   = $order;
     78                $_REQUEST['orderby'] = $orderby;
     79                $_REQUEST['s']       = $search;
     80
     81                add_filter( 'posts_request', array( $this, 'filter_posts_request' ) );
     82                $table->prepare_items();
     83                remove_filter( 'posts_request', array( $this, 'filter_posts_request' ) );
     84
     85                unset( $_REQUEST['order'] );
     86                unset( $_REQUEST['orderby'] );
     87                unset( $_REQUEST['s'] );
     88
     89                $this->assertContains( "ORDER BY {$wpdb->posts}.{$expected}", $this->sql );
     90        }
     91
     92        /**
     93         * Filter to grab the complete SQL query.
     94         *
     95         * @since 5.0.3
     96         *
     97         * @param string $request The complete SQL query.
     98         * @return string $request The complete SQL query.
     99         */
     100        public function filter_posts_request( $request ) {
     101                $this->sql = $request;
     102                return $request;
     103        }
     104
     105        /**
     106         * Data provider for `test_columns_should_be_sortable()`.
     107         *
     108         * @since 5.0.3
     109         *
     110         * @return array {
     111         *     @type array {
     112         *         @type string|null Order.
     113         *         @type string|null Order by.
     114         *         @type string|null Search term.
     115         *         @type string      Expected in SQL query.
     116         *     }
     117         * }
     118         */
     119        public function data_test_columns_should_be_sortable() {
     120                return array(
     121                        // Default order (ID) DESC.
     122                        array(
     123                                'order'    => null,
     124                                'orderby'  => null,
     125                                's'        => null,
     126                                'expected' => 'post_date DESC',
     127                        ),
     128                        // Default order (ID) DESC.
     129                        array(
     130                                'order'    => '',
     131                                'orderby'  => '',
     132                                's'        => '',
     133                                'expected' => 'post_date DESC',
     134                        ),
     135                        // Order by requester (post_title) ASC.
     136                        array(
     137                                'order'    => 'ASC',
     138                                'orderby'  => 'requester',
     139                                's'        => '',
     140                                'expected' => 'post_title ASC',
     141                        ),
     142                        // Order by requester (post_title) DESC.
     143                        array(
     144                                'order'    => 'DESC',
     145                                'orderby'  => 'requester',
     146                                's'        => null,
     147                                'expected' => 'post_title DESC',
     148                        ),
     149                        // Order by requested (post_date) ASC.
     150                        array(
     151                                'order'    => 'ASC',
     152                                'orderby'  => 'requested',
     153                                's'        => null,
     154                                'expected' => 'post_date ASC',
     155                        ),
     156                        // Order by requested (post_date) DESC.
     157                        array(
     158                                'order'    => 'DESC',
     159                                'orderby'  => 'requested',
     160                                's'        => null,
     161                                'expected' => 'post_date DESC',
     162                        ),
     163                        // Search and order by relevance.
     164                        array(
     165                                'order'    => null,
     166                                'orderby'  => null,
     167                                's'        => 'foo',
     168                                'expected' => 'post_title LIKE',
     169                        ),
     170                        // Search and order by requester (post_title) ASC.
     171                        array(
     172                                'order'    => 'ASC',
     173                                'orderby'  => 'requester',
     174                                's'        => 'foo',
     175                                'expected' => 'post_title ASC',
     176                        ),
     177                        // Search and order by requested (post_date) ASC.
     178                        array(
     179                                'order'    => 'ASC',
     180                                'orderby'  => 'requested',
     181                                's'        => 'foo',
     182                                'expected' => 'post_date ASC',
     183                        ),
     184                );
     185        }
     186}