Make WordPress Core

Ticket #43960: 43960.4.diff

File 43960.4.diff, 6.7 KB (added by birgire, 6 years ago)
  • src/wp-admin/includes/user.php

    diff --git src/wp-admin/includes/user.php src/wp-admin/includes/user.php
    index fa868d9..670946b 100644
    function _wp_personal_data_export_page() { 
    799799        $requests_table = new WP_Privacy_Data_Export_Requests_Table( array(
    800800                'plural'   => 'privacy_requests',
    801801                'singular' => 'privacy_request',
     802                'screen'   => 'export_personal_data',
    802803        ) );
    803804        $requests_table->process_bulk_action();
    804805        $requests_table->prepare_items();
    function _wp_personal_data_removal_page() { 
    870871        $requests_table = new WP_Privacy_Data_Removal_Requests_Table( array(
    871872                'plural'   => 'privacy_requests',
    872873                'singular' => 'privacy_request',
     874                'screen'   => 'remove_personal_data',
    873875        ) );
    874876
    875877        $requests_table->process_bulk_action();
    abstract class WP_Privacy_Requests_Table extends WP_List_Table { 
    10641066         * @return array Default sortable columns.
    10651067         */
    10661068        protected function get_sortable_columns() {
    1067                 return array();
     1069                // The initial sorting is by 'Requested' (post_date) and descending.
     1070                // With initial sorting, the first click on 'Requested' should be ascending.
     1071                // With 'Requester' sorting active, the next click on 'Requested' should be descending.
     1072                $desc_first = isset( $_GET['orderby'] );
     1073
     1074                return array(
     1075                        'email'             => 'requester',
     1076                        'created_timestamp' => array( 'requested', $desc_first ),
     1077                );
    10681078        }
    10691079
    10701080        /**
    abstract class WP_Privacy_Requests_Table extends WP_List_Table { 
    12081218         * Prepare items to output.
    12091219         *
    12101220         * @since 4.9.6
     1221         * @since 4.9.8 Added support for column sorting.
    12111222         */
    12121223        public function prepare_items() {
    12131224                global $wpdb;
    12141225
    1215                 $primary               = $this->get_primary_column_name();
    1216                 $this->_column_headers = array(
    1217                         $this->get_columns(),
    1218                         array(),
    1219                         $this->get_sortable_columns(),
    1220                         $primary,
    1221                 );
    1222 
    12231226                $this->items    = array();
    12241227                $posts_per_page = 20;
    12251228                $args           = array(
    abstract class WP_Privacy_Requests_Table extends WP_List_Table { 
    12311234                        's'              => isset( $_REQUEST['s'] ) ? sanitize_text_field( $_REQUEST['s'] ) : '',
    12321235                );
    12331236
     1237                $orderby_mapping = array(
     1238                        'requester' => 'post_title',
     1239                        'requested' => 'post_date',
     1240                );
     1241
     1242                if ( isset( $_REQUEST['orderby'] ) && isset( $orderby_mapping[ $_REQUEST['orderby'] ] ) ) {
     1243                        $args['orderby'] = $orderby_mapping[ $_REQUEST['orderby'] ];
     1244                }
     1245
     1246                if ( isset( $_REQUEST['order'] ) && in_array( strtoupper( $_REQUEST['order'] ), array( 'ASC', 'DESC' ), true ) ) {
     1247                        $args['order'] = strtoupper( $_REQUEST['order'] );
     1248                }
     1249
    12341250                if ( ! empty( $_REQUEST['filter-status'] ) ) {
    12351251                        $filter_status       = isset( $_REQUEST['filter-status'] ) ? sanitize_text_field( $_REQUEST['filter-status'] ) : '';
    12361252                        $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..a4e9fc1
    - +  
     1<?php
     2/**
     3 * Test the `WP_Privacy_Requests_Table` class.
     4 *
     5 * @package WordPress\UnitTests
     6 *
     7 * @since 4.9.8
     8 */
     9
     10/**
     11 * Tests_Admin_WpPrivacyRequestsTable class.
     12 *
     13 * @group admin
     14 * @group privacy
     15 *
     16 * @since 4.9.8
     17 */
     18class Tests_Admin_WpPrivacyRequestsTable extends WP_UnitTestCase {
     19        /**
     20         * Get instance for mocked class.
     21         *
     22         * @since 4.9.8
     23         *
     24         * @return PHPUnit_Framework_MockObject_MockObject|WP_Privacy_Requests_Table $instance Mocked class instance.
     25         */
     26        public function get_mocked_class_instance() {
     27                $GLOBALS['hook_suffix'] = 'mocked';
     28                $instance               = $this->getMockForAbstractClass( 'WP_Privacy_Requests_Table' );
     29                unset( $GLOBALS['hook_suffix'] );
     30                return $instance;
     31        }
     32
     33        /**
     34         * Test columns should be sortable.
     35         *
     36         * @since 4.9.8
     37         * @dataProvider data_test_columns_should_be_sortable
     38         * @covers WP_Privacy_Requests_Table::prepare_items()
     39         */
     40        public function test_columns_should_be_sortable( $order, $orderby, $search, $expected ) {
     41                global $wpdb;
     42
     43                $table     = $this->get_mocked_class_instance();
     44                $this->sql = '';
     45
     46                $_REQUEST['order']   = $order;
     47                $_REQUEST['orderby'] = $orderby;
     48                $_REQUEST['s']       = $search;
     49
     50                add_filter( 'posts_request', array( $this, 'filter_posts_request' ) );
     51                $table->prepare_items();
     52                remove_filter( 'posts_request', array( $this, 'filter_posts_request' ) );
     53
     54                unset( $_REQUEST['order'] );
     55                unset( $_REQUEST['orderby'] );
     56                unset( $_REQUEST['s'] );
     57
     58                $this->assertContains( "ORDER BY {$wpdb->posts}.{$expected}", $this->sql );
     59        }
     60
     61        /**
     62         * Filter to grab the complete SQL query.
     63         *
     64         * @since 4.9.8
     65         *
     66         * @param string $request The complete SQL query.
     67         */
     68        public function filter_posts_request( $request ) {
     69                $this->sql = $request;
     70                return $request;
     71        }
     72
     73        /**
     74         * Data provider for `test_columns_should_be_sortable()`.
     75         *
     76         * @since 4.9.8
     77         *
     78         * @return array {
     79         *     @type array {
     80         *         @type string Order.
     81         *         @type string Order by.
     82         *         @type string Search term.
     83         *         @type string Expected in SQL query.
     84         *     }
     85         * }
     86         */
     87        public function data_test_columns_should_be_sortable() {
     88                return array(
     89                        // Default order (ID) DESC.
     90                        array(
     91                                'order'    => null,
     92                                'orderby'  => null,
     93                                's'        => null,
     94                                'expected' => 'post_date DESC',
     95                        ),
     96                        // Default order (ID) DESC.
     97                        array(
     98                                'order'    => '',
     99                                'orderby'  => '',
     100                                's'        => '',
     101                                'expected' => 'post_date DESC',
     102                        ),
     103                        // Order by requester (post_title) ASC.
     104                        array(
     105                                'order'    => 'ASC',
     106                                'orderby'  => 'requester',
     107                                's'        => '',
     108                                'expected' => 'post_title ASC',
     109                        ),
     110                        // Order by requester (post_title) DESC.
     111                        array(
     112                                'order'    => 'DESC',
     113                                'orderby'  => 'requester',
     114                                's'        => null,
     115                                'expected' => 'post_title DESC',
     116                        ),
     117                        // Order by requested (post_date) ASC.
     118                        array(
     119                                'order'    => 'ASC',
     120                                'orderby'  => 'requested',
     121                                's'        => null,
     122                                'expected' => 'post_date ASC',
     123                        ),
     124                        // Order by requested (post_date) DESC.
     125                        array(
     126                                'order'    => 'DESC',
     127                                'orderby'  => 'requested',
     128                                's'        => null,
     129                                'expected' => 'post_date DESC',
     130                        ),
     131                        // Search and order by relevance.
     132                        array(
     133                                'order'    => null,
     134                                'orderby'  => null,
     135                                's'        => 'foo',
     136                                'expected' => 'post_title LIKE',
     137                        ),
     138                        // Search and order by requester (post_title) ASC.
     139                        array(
     140                                'order'    => 'ASC',
     141                                'orderby'  => 'requester',
     142                                's'        => 'foo',
     143                                'expected' => 'post_title ASC',
     144                        ),
     145                        // Search and order by requested (post_date) ASC.
     146                        array(
     147                                'order'    => 'ASC',
     148                                'orderby'  => 'requested',
     149                                's'        => 'foo',
     150                                'expected' => 'post_date ASC',
     151                        ),
     152                );
     153        }
     154}