Make WordPress Core

Ticket #43960: 43960.5.diff

File 43960.5.diff, 7.5 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..792fc10 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 { 
    12301233                        'post_status'    => 'any',
    12311234                        's'              => isset( $_REQUEST['s'] ) ? sanitize_text_field( $_REQUEST['s'] ) : '',
    12321235                );
     1236                $orderby_mapping = array(
     1237                        'requester' => 'post_title',
     1238                        'requested' => 'post_date',
     1239                );
     1240
     1241                if ( isset( $_REQUEST['orderby'] ) && isset( $orderby_mapping[ $_REQUEST['orderby'] ] ) ) {
     1242                        $args['orderby'] = $orderby_mapping[ $_REQUEST['orderby'] ];
     1243                }
     1244
     1245                if ( isset( $_REQUEST['order'] ) && in_array( strtoupper( $_REQUEST['order'] ), array( 'ASC', 'DESC' ), true ) ) {
     1246                        $args['order'] = strtoupper( $_REQUEST['order'] );
     1247                }
    12331248
    12341249                if ( ! empty( $_REQUEST['filter-status'] ) ) {
    12351250                        $filter_status       = isset( $_REQUEST['filter-status'] ) ? sanitize_text_field( $_REQUEST['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..5809754
    - +  
     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                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( $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 4.9.8
     61         * @dataProvider data_test_columns_should_be_sortable
     62         * @covers WP_Privacy_Requests_Table::prepare_items()
     63         */
     64        public function test_columns_should_be_sortable( $order, $orderby, $search, $expected ) {
     65                global $wpdb;
     66
     67                $table     = $this->get_mocked_class_instance();
     68                $this->sql = '';
     69
     70                $_REQUEST['order']   = $order;
     71                $_REQUEST['orderby'] = $orderby;
     72                $_REQUEST['s']       = $search;
     73
     74                add_filter( 'posts_request', array( $this, 'filter_posts_request' ) );
     75                $table->prepare_items();
     76                remove_filter( 'posts_request', array( $this, 'filter_posts_request' ) );
     77
     78                unset( $_REQUEST['order'] );
     79                unset( $_REQUEST['orderby'] );
     80                unset( $_REQUEST['s'] );
     81
     82                $this->assertContains( "ORDER BY {$wpdb->posts}.{$expected}", $this->sql );
     83        }
     84
     85        /**
     86         * Filter to grab the complete SQL query.
     87         *
     88         * @since 4.9.8
     89         *
     90         * @param string $request The complete SQL query.
     91         */
     92        public function filter_posts_request( $request ) {
     93                $this->sql = $request;
     94                return $request;
     95        }
     96
     97        /**
     98         * Data provider for `test_columns_should_be_sortable()`.
     99         *
     100         * @since 4.9.8
     101         *
     102         * @return array {
     103         *     @type array {
     104         *         @type string Order.
     105         *         @type string Order by.
     106         *         @type string Search term.
     107         *         @type string Expected in SQL query.
     108         *     }
     109         * }
     110         */
     111        public function data_test_columns_should_be_sortable() {
     112                return array(
     113                        // Default order (ID) DESC.
     114                        array(
     115                                'order'    => null,
     116                                'orderby'  => null,
     117                                's'        => null,
     118                                'expected' => 'post_date DESC',
     119                        ),
     120                        // Default order (ID) DESC.
     121                        array(
     122                                'order'    => '',
     123                                'orderby'  => '',
     124                                's'        => '',
     125                                'expected' => 'post_date DESC',
     126                        ),
     127                        // Order by requester (post_title) ASC.
     128                        array(
     129                                'order'    => 'ASC',
     130                                'orderby'  => 'requester',
     131                                's'        => '',
     132                                'expected' => 'post_title ASC',
     133                        ),
     134                        // Order by requester (post_title) DESC.
     135                        array(
     136                                'order'    => 'DESC',
     137                                'orderby'  => 'requester',
     138                                's'        => null,
     139                                'expected' => 'post_title DESC',
     140                        ),
     141                        // Order by requested (post_date) ASC.
     142                        array(
     143                                'order'    => 'ASC',
     144                                'orderby'  => 'requested',
     145                                's'        => null,
     146                                'expected' => 'post_date ASC',
     147                        ),
     148                        // Order by requested (post_date) DESC.
     149                        array(
     150                                'order'    => 'DESC',
     151                                'orderby'  => 'requested',
     152                                's'        => null,
     153                                'expected' => 'post_date DESC',
     154                        ),
     155                        // Search and order by relevance.
     156                        array(
     157                                'order'    => null,
     158                                'orderby'  => null,
     159                                's'        => 'foo',
     160                                'expected' => 'post_title LIKE',
     161                        ),
     162                        // Search and order by requester (post_title) ASC.
     163                        array(
     164                                'order'    => 'ASC',
     165                                'orderby'  => 'requester',
     166                                's'        => 'foo',
     167                                'expected' => 'post_title ASC',
     168                        ),
     169                        // Search and order by requested (post_date) ASC.
     170                        array(
     171                                'order'    => 'ASC',
     172                                'orderby'  => 'requested',
     173                                's'        => 'foo',
     174                                'expected' => 'post_date ASC',
     175                        ),
     176                );
     177        }
     178}