Make WordPress Core

Ticket #35658: 37924-tests.diff

File 37924-tests.diff, 14.4 KB (added by sc0ttkclark, 8 years ago)

Tests and fixes for register_meta()

  • src/wp-includes/meta.php

    diff --git a/src/wp-includes/meta.php b/src/wp-includes/meta.php
    index 718f42a..0b7033e 100644
    a b function register_meta( $object_type, $meta_key, $args, $deprecated = null ) { 
    10751075                }
    10761076        }
    10771077
     1078        $object_subtype = '';
     1079
     1080        if ( ! empty( $args['object_subtype'] ) ) {
     1081                $object_subtype = $args['object_subtype'];
     1082        }
     1083
    10781084        // Back-compat: old sanitize and auth callbacks applied to all of an object type
    10791085        if ( $has_old_sanitize_cb ) {
    10801086                add_filter( "sanitize_{$object_type}_meta_{$meta_key}", $args['sanitize_callback'], 10, 4 );
    10811087                add_filter( "auth_{$object_type}_meta_{$meta_key}", $args['auth_callback'], 10, 6 );
    10821088        } else {
     1089                // Back-compat: old sanitize and auth callbacks applied to all of an object type
    10831090                if ( is_callable( $args['sanitize_callback'] ) ) {
    1084                         add_filter( "sanitize_{$object_type}_{$object_subtype}_meta_{$meta_key}", $args['sanitize_callback'], 10, 4 );
     1091                        if ( empty( $object_subtype ) || $has_old_sanitize_cb ) {
     1092                                add_filter( "sanitize_{$object_type}_meta_{$meta_key}", $args['sanitize_callback'], 10, 4 );
     1093                        } else {
     1094                                add_filter( "sanitize_{$object_type}_{$object_subtype}_meta_{$meta_key}", $args['sanitize_callback'], 10, 4 );
     1095                        }
    10851096                }
    10861097
    10871098                if ( is_callable( $args['auth_callback'] ) ) {
    1088                         add_filter( "auth_{$object_type}_{$object_subtype}_meta_{$meta_key}", $args['auth_callback'], 10, 6 );
     1099                        if ( empty( $object_subtype ) || $has_old_sanitize_cb ) {
     1100                                add_filter( "auth_{$object_type}_meta_{$meta_key}", $args['auth_callback'], 10, 6 );
     1101                        } else {
     1102                                add_filter( "auth_{$object_type}_{$object_subtype}_meta_{$meta_key}", $args['auth_callback'], 10, 6 );
     1103                        }
    10891104                }
    10901105        }
    10911106
    10921107        // Global registry only contains meta keys registered in the new way with a subtype.
    1093         if ( ! empty( $args['object_subtype'] ) ) {
    1094                 $object_subtype = $args['object_subtype'];
     1108        if ( ! empty( $object_subtype ) ) {
    10951109                $wp_meta_keys[ $object_type ][ $object_subtype ][ $meta_key ] = $args;
    10961110
    10971111                return true;
    function get_registered_metadata( $object_type, $object_subtype, $object_id, $me 
    12341248                return $data;
    12351249        }
    12361250
    1237         $data = get_metadata( $object_type, $object_id, $meta_key );
     1251        $data = get_metadata( $object_type, $object_id );
    12381252
    12391253        $meta_keys = get_registered_meta_keys( $object_type, $object_subtype );
    12401254        $registered_data = array();
  • new file tests/phpunit/tests/meta/registerMeta.php

    diff --git a/tests/phpunit/tests/meta/registerMeta.php b/tests/phpunit/tests/meta/registerMeta.php
    new file mode 100644
    index 0000000..cbd604e
    - +  
     1<?php
     2/**
     3 * @group meta
     4 */
     5class Tests_Meta_Register_Meta extends WP_UnitTestCase {
     6        protected static $editor_id;
     7        protected static $post_id;
     8        protected static $comment_id;
     9
     10        public static function wpSetUpBeforeClass( $factory ) {
     11                self::$editor_id = $factory->user->create( array( 'role' => 'editor' ) );
     12                self::$post_id = $factory->post->create();
     13                self::$comment_id = $factory->comment->create( array( 'comment_post_ID' => self::$post_id ) );
     14        }
     15
     16        public static function wpTearDownAfterClass() {
     17                self::delete_user( self::$editor_id );
     18                wp_delete_comment( self::$comment_id, true );
     19                wp_delete_post( self::$post_id, true );
     20        }
     21
     22        function setUp() {
     23                parent::setUp();
     24                wp_set_current_user( self::$editor_id );
     25        }
     26
     27        public function _old_sanitize_meta_cb( $meta_value, $meta_key, $meta_type ) {
     28                return $meta_key . ' sanitized';
     29        }
     30
     31        public function _new_sanitize_meta_cb( $meta_value, $meta_key, $object_type, $object_subtype ) {
     32                return $meta_key . ' sanitized';
     33        }
     34
     35        public function test_register_meta() {
     36                $this->assertTrue( register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post' ) ) );
     37        }
     38
     39        public function test_register_meta_without_subtype() {
     40                $this->assertFalse( register_meta( 'post', 'flight_number', array( $this, '_new_sanitize_meta_cb' ) ) );
     41        }
     42
     43        public function test_register_meta_without_sanitize_callback_registers_meta_key() {
     44                register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post' ) );
     45                $this->assertTrue( registered_meta_key_exists( 'post', 'post', 'flight_number' ) );
     46        }
     47
     48        public function test_register_meta_for_a_category() {
     49                register_meta( 'term', 'category_icon', array( 'object_subtype' => 'category' ) );
     50                $this->assertTrue( registered_meta_key_exists( 'term', 'category', 'category_icon' ) );
     51        }
     52
     53        public function test_register_meta_for_a_comment() {
     54                register_meta( 'comment', 'comment_rating', array( 'object_subtype' => 'comment' ) );
     55                $this->assertTrue( registered_meta_key_exists( 'comment', 'comment', 'comment_rating' ) );
     56        }
     57
     58        public function test_register_meta_with_sanitize_callback_registers_meta_key() {
     59                register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post', 'sanitize_callback' => array( $this, '_new_sanitize_meta_cb' ) ) );
     60                $this->assertTrue( registered_meta_key_exists( 'post', 'post', 'flight_number' ) );
     61        }
     62
     63        public function test_register_meta_valid_object_type_with_valid_type() {
     64                register_meta( 'post', 'longitude', array( 'object_subtype' => 'post' ) );
     65                $this->assertTrue( registered_meta_key_exists( 'post', 'post', 'longitude' ) );
     66        }
     67
     68        public function test_register_meta_valid_object_type_with_invalid_subtype() {
     69                register_meta( 'post', 'latitude', array( 'object_subtype' => 'post' ) );
     70                $this->assertFalse( registered_meta_key_exists( 'post', 'invalid-type', 'latitude' ) );
     71        }
     72
     73        public function test_register_meta_with_old_sanitize_callback_parameter() {
     74                register_meta( 'post', 'old_sanitized_key', array( $this, '_old_sanitize_meta_cb' ) );
     75                $meta = sanitize_meta( 'old_sanitized_key', 'unsanitized', 'post', 'post' );
     76
     77                $this->assertEquals( 'old_sanitized_key sanitized', $meta );
     78        }
     79
     80        public function test_register_meta_with_new_sanitize_callback_parameter() {
     81                register_meta( 'post', 'new_sanitized_key', array( 'object_subtype' => 'post', 'sanitize_callback' => array( $this, '_new_sanitize_meta_cb' ) ) );
     82                $meta = sanitize_meta( 'new_sanitized_key', 'unsanitized', 'post', 'post' );
     83
     84                $this->assertEquals( 'new_sanitized_key sanitized', $meta );
     85        }
     86
     87        public function test_unregister_meta_key() {
     88                register_meta( 'post', 'registered_key', array( 'object_subtype' => 'post' ) );
     89
     90                $this->assertTrue( unregister_meta_key( 'post', 'post', 'registered_key' ) );
     91        }
     92
     93        public function test_unregister_meta_key_with_invalid_key() {
     94                $this->assertWPError( unregister_meta_key( 'post', 'post', 'not_a_registered_key' ) );
     95        }
     96
     97        public function test_get_registered_meta_keys() {
     98                register_meta( 'post', 'registered_key1', array( 'object_subtype' => 'post' ) );
     99                register_meta( 'post', 'registered_key2', array( 'object_subtype' => 'post' ) );
     100
     101                $meta_keys = get_registered_meta_keys( 'post', 'post' );
     102
     103                $this->assertArrayHasKey( 'registered_key1', $meta_keys );
     104                $this->assertArrayHasKey( 'registered_key2', $meta_keys );
     105        }
     106
     107        public function test_get_registered_meta_keys_subtype_is_empty() {
     108                register_meta( 'post', 'registered_key1', array( 'object_subtype' => 'post' ) );
     109                register_meta( 'post', 'registered_key2', array( 'object_subtype' => 'post' ) );
     110
     111                $meta_keys = get_registered_meta_keys( 'post', 'page' );
     112
     113                $this->assertEmpty( $meta_keys );
     114        }
     115
     116        public function test_get_registered_meta_keys_invalid_type_is_empty() {
     117                register_meta( 'post', 'registered_key1', array( 'object_subtype' => 'post' ) );
     118                register_meta( 'post', 'registered_key2', array( 'object_subtype' => 'post' ) );
     119
     120                $meta_keys = get_registered_meta_keys( 'invalid-type' );
     121
     122                $this->assertEmpty( $meta_keys );
     123        }
     124
     125        public function test_get_registered_meta_keys_has_count() {
     126                register_meta( 'post', 'registered_key1', array( 'object_subtype' => 'post' ) );
     127                register_meta( 'post', 'registered_key2', array( 'object_subtype' => 'page' ) );
     128
     129                $meta_keys = get_registered_meta_keys( 'post' );
     130
     131                $this->assertCount( 2, $meta_keys );
     132        }
     133
     134        public function test_get_registered_meta_keys_type_arg() {
     135                register_meta( 'post', 'registered_key1', array( 'object_subtype' => 'post', 'description' => 'I\'m just a field, take a good look at me' ) );
     136
     137                $meta_keys = get_registered_meta_keys( 'post', 'post' );
     138
     139                $this->assertEquals( 'I\'m just a field, take a good look at me', $meta_keys['registered_key1']['description'] );
     140        }
     141
     142        public function test_get_registered_meta_keys_invalid_arg() {
     143                register_meta( 'post', 'registered_key1', array( 'object_subtype' => 'post', 'invalid_arg' => 'invalid' ) );
     144
     145                $meta_keys = get_registered_meta_keys( 'post', 'post' );
     146
     147                $this->assertArrayNotHasKey( 'invalid_arg', $meta_keys['registered_key1'] );
     148        }
     149
     150        public function test_get_registered_metadata() {
     151                register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post' ) );
     152
     153                add_post_meta( self::$post_id, 'flight_number', 'Oceanic 815' );
     154
     155                $meta = get_registered_metadata( 'post', 'post', self::$post_id );
     156
     157                $this->assertEquals( 'Oceanic 815', $meta['flight_number'][0] );
     158        }
     159
     160        public function test_get_registered_metadata_by_key() {
     161                register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post' ) );
     162
     163                add_post_meta( self::$post_id, 'flight_number', 'Oceanic 815' );
     164
     165                $meta = get_registered_metadata( 'post', 'post', self::$post_id, 'flight_number' );
     166
     167                $this->assertEquals( 'Oceanic 815', $meta[0] );
     168        }
     169
     170        public function test_get_registered_metadata_by_key_single() {
     171                register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post', 'single' => true ) );
     172
     173                add_post_meta( self::$post_id, 'flight_number', 'Oceanic 815' );
     174
     175                $meta = get_registered_metadata( 'post', 'post', self::$post_id, 'flight_number' );
     176
     177                $this->assertEquals( 'Oceanic 815', $meta );
     178        }
     179
     180        public function test_get_registered_metadata_by_invalid_key() {
     181                register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post' ) );
     182
     183                add_post_meta( self::$post_id, 'flight_number', 'Oceanic 815' );
     184
     185                $meta = get_registered_metadata( 'post', 'post', self::$post_id, 'flight_pilot' );
     186
     187                $this->assertWPError( $meta );
     188        }
     189
     190        public function test_get_registered_metadata_invalid_object_type() {
     191                register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post' ) );
     192
     193                add_post_meta( self::$post_id, 'flight_number', 'Oceanic 815' );
     194
     195                $meta = get_registered_metadata( 'invalid-type', 'invalid-subtype', self::$post_id );
     196
     197                $this->assertWPError( $meta );
     198        }
     199
     200        public function test_get_registered_metadata_invalid() {
     201                $meta = get_registered_metadata( 'invalid-type', 'invalid-subtype', self::$post_id );
     202
     203                $this->assertWPError( $meta );
     204        }
     205}
     206 No newline at end of file
  • tests/phpunit/tests/user/capabilities.php

    diff --git a/tests/phpunit/tests/user/capabilities.php b/tests/phpunit/tests/user/capabilities.php
    index 87e498b..85fbf16 100644
    a b function test_post_meta_caps() { 
    772772                        $this->assertTrue( $admin->has_cap('add_post_meta',  $post) );
    773773                        $this->assertTrue( $admin->has_cap('delete_post_meta',  $post) );
    774774
     775                        // Test protected key access is false
    775776                        $this->assertFalse( $admin->has_cap('edit_post_meta', $post, '_protected') );
    776777                        $this->assertFalse( $admin->has_cap('add_post_meta', $post, '_protected') );
    777778                        $this->assertFalse( $admin->has_cap('delete_post_meta', $post, '_protected') );
    778779
    779                         register_meta( 'post', '_protected', array( $this, '_meta_filter' ), array( $this, '_meta_yes_you_can' ) );
     780                        // Register protected key and allow access
     781                        register_meta( 'post', '_protected', array( 'sanitize_callback' => array( $this, '_meta_filter' ), 'auth_callback' => array( $this, '_meta_yes_you_can' ) ) );
     782
     783                        // Test protected key access is now true
    780784                        $this->assertTrue( $admin->has_cap('edit_post_meta',  $post, '_protected') );
    781785                        $this->assertTrue( $admin->has_cap('add_post_meta',  $post, '_protected') );
    782786                        $this->assertTrue( $admin->has_cap('delete_post_meta',  $post, '_protected') );
    783787
     788                        // Test non protected key access is true
    784789                        $this->assertTrue( $admin->has_cap('edit_post_meta', $post, 'not_protected') );
    785790                        $this->assertTrue( $admin->has_cap('add_post_meta', $post, 'not_protected') );
    786791                        $this->assertTrue( $admin->has_cap('delete_post_meta', $post, 'not_protected') );
    787792
    788                         register_meta( 'post', 'not_protected', array( $this, '_meta_filter' ), array( $this, '_meta_no_you_cant' ) );
     793                        // Register non protected key and disallow access
     794                        register_meta( 'post', 'not_protected', array( 'sanitize_callback' => array( $this, '_meta_filter' ), 'auth_callback' => array( $this, '_meta_no_you_cant' ) ) );
     795
     796                        // Test non protected key access is now false
    789797                        $this->assertFalse( $admin->has_cap('edit_post_meta',  $post, 'not_protected') );
    790798                        $this->assertFalse( $admin->has_cap('add_post_meta',  $post, 'not_protected') );
    791799                        $this->assertFalse( $admin->has_cap('delete_post_meta',  $post, 'not_protected') );
     800
     801                        // Backwards compatibility tests for register_meta()
     802
     803                        // Test protected key access is false
     804                        $this->assertFalse( $admin->has_cap('edit_post_meta', $post, '_protected_backcompat') );
     805                        $this->assertFalse( $admin->has_cap('add_post_meta', $post, '_protected_backcompat') );
     806                        $this->assertFalse( $admin->has_cap('delete_post_meta', $post, '_protected_backcompat') );
     807
     808                        // Register protected key and allow access
     809                        register_meta( 'post', '_protected_backcompat', array( $this, '_meta_filter' ), array( $this, '_meta_yes_you_can' ) );
     810
     811                        // Test protected key access is now true
     812                        $this->assertTrue( $admin->has_cap('edit_post_meta',  $post, '_protected_backcompat') );
     813                        $this->assertTrue( $admin->has_cap('add_post_meta',  $post, '_protected_backcompat') );
     814                        $this->assertTrue( $admin->has_cap('delete_post_meta',  $post, '_protected_backcompat') );
     815
     816                        // Test non protected key access is true
     817                        $this->assertTrue( $admin->has_cap('edit_post_meta', $post, 'not_protected_backcompat') );
     818                        $this->assertTrue( $admin->has_cap('add_post_meta', $post, 'not_protected_backcompat') );
     819                        $this->assertTrue( $admin->has_cap('delete_post_meta', $post, 'not_protected_backcompat') );
     820
     821                        // Register non protected key and disallow access
     822                        register_meta( 'post', 'not_protected_backcompat', array( $this, '_meta_filter' ), array( $this, '_meta_no_you_cant' ) );
     823
     824                        // Test non protected key access is now false
     825                        $this->assertFalse( $admin->has_cap('edit_post_meta',  $post, 'not_protected_backcompat') );
     826                        $this->assertFalse( $admin->has_cap('add_post_meta',  $post, 'not_protected_backcompat') );
     827                        $this->assertFalse( $admin->has_cap('delete_post_meta',  $post, 'not_protected_backcompat') );
    792828                }
    793829        }
    794830