Make WordPress Core

Ticket #43960: 43960.6.diff

File 43960.6.diff, 7.4 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 4634c8e..96dadd1 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 4.9.9 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..98bf5cb
    - +  
     1<?php
     2/**
     3 * Test the `WP_Privacy_Requests_Table` class.
     4 *
     5 * @package WordPress\UnitTests
     6 *
     7 * @since 4.9.9
     8 */
     9
     10/**
     11 * Tests_Admin_WpPrivacyRequestsTable class.
     12 *
     13 * @group admin
     14 * @group privacy
     15 *
     16 * @since 4.9.9
     17 */
     18class Tests_Admin_WpPrivacyRequestsTable extends WP_UnitTestCase {
     19        /**
     20         * Get instance for mocked class.
     21         *
     22         * @since 4.9.9
     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 4.9.9
     61         *
     62         * @dataProvider data_test_columns_should_be_sortable
     63         * @covers WP_Privacy_Requests_Table::prepare_items()
     64         */
     65        public function test_columns_should_be_sortable( $order, $orderby, $search, $expected ) {
     66                global $wpdb;
     67
     68                $table     = $this->get_mocked_class_instance();
     69                $this->sql = '';
     70
     71                $_REQUEST['order']   = $order;
     72                $_REQUEST['orderby'] = $orderby;
     73                $_REQUEST['s']       = $search;
     74
     75                add_filter( 'posts_request', array( $this, 'filter_posts_request' ) );
     76                $table->prepare_items();
     77                remove_filter( 'posts_request', array( $this, 'filter_posts_request' ) );
     78
     79                unset( $_REQUEST['order'] );
     80                unset( $_REQUEST['orderby'] );
     81                unset( $_REQUEST['s'] );
     82
     83                $this->assertContains( "ORDER BY {$wpdb->posts}.{$expected}", $this->sql );
     84        }
     85
     86        /**
     87         * Filter to grab the complete SQL query.
     88         *
     89         * @since 4.9.9
     90         *
     91         * @param string $request The complete SQL query.
     92         */
     93        public function filter_posts_request( $request ) {
     94                $this->sql = $request;
     95                return $request;
     96        }
     97
     98        /**
     99         * Data provider for `test_columns_should_be_sortable()`.
     100         *
     101         * @since 4.9.9
     102         *
     103         * @return array {
     104         *     @type array {
     105         *         @type string Order.
     106         *         @type string Order by.
     107         *         @type string Search term.
     108         *         @type string Expected in SQL query.
     109         *     }
     110         * }
     111         */
     112        public function data_test_columns_should_be_sortable() {
     113                return array(
     114                        // Default order (ID) DESC.
     115                        array(
     116                                'order'    => null,
     117                                'orderby'  => null,
     118                                's'        => null,
     119                                'expected' => 'post_date DESC',
     120                        ),
     121                        // Default order (ID) DESC.
     122                        array(
     123                                'order'    => '',
     124                                'orderby'  => '',
     125                                's'        => '',
     126                                'expected' => 'post_date DESC',
     127                        ),
     128                        // Order by requester (post_title) ASC.
     129                        array(
     130                                'order'    => 'ASC',
     131                                'orderby'  => 'requester',
     132                                's'        => '',
     133                                'expected' => 'post_title ASC',
     134                        ),
     135                        // Order by requester (post_title) DESC.
     136                        array(
     137                                'order'    => 'DESC',
     138                                'orderby'  => 'requester',
     139                                's'        => null,
     140                                'expected' => 'post_title DESC',
     141                        ),
     142                        // Order by requested (post_date) ASC.
     143                        array(
     144                                'order'    => 'ASC',
     145                                'orderby'  => 'requested',
     146                                's'        => null,
     147                                'expected' => 'post_date ASC',
     148                        ),
     149                        // Order by requested (post_date) DESC.
     150                        array(
     151                                'order'    => 'DESC',
     152                                'orderby'  => 'requested',
     153                                's'        => null,
     154                                'expected' => 'post_date DESC',
     155                        ),
     156                        // Search and order by relevance.
     157                        array(
     158                                'order'    => null,
     159                                'orderby'  => null,
     160                                's'        => 'foo',
     161                                'expected' => 'post_title LIKE',
     162                        ),
     163                        // Search and order by requester (post_title) ASC.
     164                        array(
     165                                'order'    => 'ASC',
     166                                'orderby'  => 'requester',
     167                                's'        => 'foo',
     168                                'expected' => 'post_title ASC',
     169                        ),
     170                        // Search and order by requested (post_date) ASC.
     171                        array(
     172                                'order'    => 'ASC',
     173                                'orderby'  => 'requested',
     174                                's'        => 'foo',
     175                                'expected' => 'post_date ASC',
     176                        ),
     177                );
     178        }
     179}