| | 1 | <?php |
| | 2 | /** |
| | 3 | * @group meta |
| | 4 | */ |
| | 5 | class 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 | |
| | 28 | public function _old_sanitize_meta_cb( $meta_value, $meta_key, $meta_type ) { |
| | 29 | return $meta_key . ' old sanitized'; |
| | 30 | } |
| | 31 | |
| | 32 | public function _new_sanitize_meta_cb( $meta_value, $meta_key, $object_type, $object_subtype ) { |
| | 33 | return $meta_key . ' new sanitized'; |
| | 34 | } |
| | 35 | |
| | 36 | public function test_register_meta_with_valid_object_type_and_object_subtype_returns_true() { |
| | 37 | $result = register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post' ) ); |
| | 38 | unregister_meta_key( 'post', 'post', 'flight_number' ); |
| | 39 | |
| | 40 | $this->assertTrue( $result ); |
| | 41 | } |
| | 42 | |
| | 43 | // @todo remove object_subtype from the meta key's array? |
| | 44 | public function test_register_meta_with_post_object_type_and_subtype_populates_wp_meta_keys() { |
| | 45 | global $wp_meta_keys; |
| | 46 | |
| | 47 | register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post' ) ); |
| | 48 | $actual = $wp_meta_keys; |
| | 49 | unregister_meta_key( 'post', 'post', 'flight_number' ); |
| | 50 | |
| | 51 | $expected = array( |
| | 52 | 'post' => array( |
| | 53 | 'post' => array( |
| | 54 | 'flight_number' => array( |
| | 55 | 'object_subtype' => 'post', |
| | 56 | 'type' => 'string', |
| | 57 | 'description' => '', |
| | 58 | 'single' => false, |
| | 59 | 'sanitize_callback' => null, |
| | 60 | 'auth_callback' => '__return_true', |
| | 61 | 'show_in_rest' => false, |
| | 62 | ), |
| | 63 | ), |
| | 64 | ), |
| | 65 | ); |
| | 66 | |
| | 67 | $this->assertEquals( $actual, $expected ); |
| | 68 | } |
| | 69 | |
| | 70 | public function test_register_meta_with_post_object_type_and_unregistered_subtype_populates_wp_meta_keys() { |
| | 71 | global $wp_meta_keys; |
| | 72 | |
| | 73 | register_meta( 'post', 'flight_number', array( 'object_subtype' => 'not_a_post_type' ) ); |
| | 74 | $actual = $wp_meta_keys; |
| | 75 | unregister_meta_key( 'post', 'not_a_post_type', 'flight_number' ); |
| | 76 | |
| | 77 | $expected = array( |
| | 78 | 'post' => array( |
| | 79 | 'not_a_post_type' => array( |
| | 80 | 'flight_number' => array( |
| | 81 | 'object_subtype' => 'not_a_post_type', |
| | 82 | 'type' => 'string', |
| | 83 | 'description' => '', |
| | 84 | 'single' => false, |
| | 85 | 'sanitize_callback' => null, |
| | 86 | 'auth_callback' => '__return_true', |
| | 87 | 'show_in_rest' => false, |
| | 88 | ), |
| | 89 | ), |
| | 90 | ), |
| | 91 | ); |
| | 92 | |
| | 93 | $this->assertEquals( $actual, $expected ); |
| | 94 | } |
| | 95 | |
| | 96 | // @todo remove object_subtype from the meta key's array? |
| | 97 | public function test_register_meta_with_term_object_type_and_category_subtype_populates_wp_meta_keys() { |
| | 98 | global $wp_meta_keys; |
| | 99 | register_meta( 'term', 'category_icon', array( 'object_subtype' => 'category' ) ); |
| | 100 | $actual = $wp_meta_keys; |
| | 101 | unregister_meta_key( 'term', 'category', 'category_icon' ); |
| | 102 | |
| | 103 | $expected = array( |
| | 104 | 'term' => array( |
| | 105 | 'category' => array( |
| | 106 | 'category_icon' => array( |
| | 107 | 'object_subtype' => 'category', |
| | 108 | 'type' => 'string', |
| | 109 | 'description' => '', |
| | 110 | 'single' => false, |
| | 111 | 'sanitize_callback' => null, |
| | 112 | 'auth_callback' => '__return_true', |
| | 113 | 'show_in_rest' => false, |
| | 114 | ), |
| | 115 | ), |
| | 116 | ), |
| | 117 | ); |
| | 118 | |
| | 119 | $this->assertEquals( $actual, $expected ); |
| | 120 | } |
| | 121 | |
| | 122 | public function test_register_meta_with_comment_object_type_and_subtype_populates_wp_meta_keys() { |
| | 123 | global $wp_meta_keys; |
| | 124 | register_meta( 'comment', 'comment_rating', array( 'object_subtype' => 'comment' ) ); |
| | 125 | $actual = $wp_meta_keys; |
| | 126 | unregister_meta_key( 'comment', 'comment', 'comment_rating' ); |
| | 127 | |
| | 128 | $expected = array( |
| | 129 | 'comment' => array( |
| | 130 | 'comment' => array( |
| | 131 | 'comment_rating' => array( |
| | 132 | 'object_subtype' => 'comment', |
| | 133 | 'type' => 'string', |
| | 134 | 'description' => '', |
| | 135 | 'single' => false, |
| | 136 | 'sanitize_callback' => null, |
| | 137 | 'auth_callback' => '__return_true', |
| | 138 | 'show_in_rest' => false, |
| | 139 | ), |
| | 140 | ), |
| | 141 | ), |
| | 142 | ); |
| | 143 | |
| | 144 | $this->assertEquals( $actual, $expected ); |
| | 145 | } |
| | 146 | |
| | 147 | public function test_register_meta_with_deprecated_sanitize_callback_does_not_populate_wp_meta_keys() { |
| | 148 | global $wp_meta_keys; |
| | 149 | |
| | 150 | register_meta( 'post', 'flight_number', array( $this, '_old_sanitize_meta_cb' ) ); |
| | 151 | $actual = $wp_meta_keys; |
| | 152 | remove_filter( 'sanitize_post_meta_flight_number', array( $this, '_old_sanitize_meta_cb') ); |
| | 153 | remove_filter( 'auth_post_meta_flight_number', '__return_true'); |
| | 154 | |
| | 155 | $this->assertEquals( array(), $actual ); |
| | 156 | } |
| | 157 | |
| | 158 | public function test_register_meta_with_deprecated_sanitize_callback_param_returns_wp_error() { |
| | 159 | $actual = register_meta( 'post', 'flight_number', array( $this, '_old_sanitize_meta_cb' ) ); |
| | 160 | |
| | 161 | remove_filter( 'sanitize_post_meta_flight_number', array( $this, '_old_sanitize_meta_cb') ); |
| | 162 | remove_filter( 'auth_post_meta_flight_number', '__return_true'); |
| | 163 | |
| | 164 | $this->assertTrue( is_wp_error( $actual ) ); |
| | 165 | $this->assertEquals( 'register_meta_failed', $actual->get_error_code() ); |
| | 166 | } |
| | 167 | |
| | 168 | public function test_register_meta_with_deprecated_sanitize_callback_parameter_passes_through_filter() { |
| | 169 | register_meta( 'post', 'old_sanitized_key', array( $this, '_old_sanitize_meta_cb' ) ); |
| | 170 | $meta = sanitize_meta( 'old_sanitized_key', 'unsanitized', 'post', 'post' ); |
| | 171 | |
| | 172 | remove_filter( 'sanitize_post_meta_flight_number', array( $this, '_old_sanitize_meta_cb') ); |
| | 173 | remove_filter( 'auth_post_meta_flight_number', '__return_true'); |
| | 174 | |
| | 175 | $this->assertEquals( 'old_sanitized_key old sanitized', $meta ); |
| | 176 | } |
| | 177 | |
| | 178 | public function test_register_meta_with_current_sanitize_callback_populates_wp_meta_keys() { |
| | 179 | global $wp_meta_keys; |
| | 180 | register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post', 'sanitize_callback' => array( $this, '_new_sanitize_meta_cb' ) ) ); |
| | 181 | $actual = $wp_meta_keys; |
| | 182 | unregister_meta_key( 'post', 'post', 'flight_number' ); |
| | 183 | |
| | 184 | $expected = array( |
| | 185 | 'post' => array( |
| | 186 | 'post' => array( |
| | 187 | 'flight_number' => array( |
| | 188 | 'object_subtype' => 'post', |
| | 189 | 'type' => 'string', |
| | 190 | 'description' => '', |
| | 191 | 'single' => false, |
| | 192 | 'sanitize_callback' => array( $this, '_new_sanitize_meta_cb' ), |
| | 193 | 'auth_callback' => '__return_true', |
| | 194 | 'show_in_rest' => false, |
| | 195 | ), |
| | 196 | ), |
| | 197 | ), |
| | 198 | ); |
| | 199 | $this->assertEquals( $actual, $expected ); |
| | 200 | } |
| | 201 | |
| | 202 | public function test_register_meta_with_current_sanitize_callback_returns_true() { |
| | 203 | $result = register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post', 'sanitize_callback' => array( $this, '_new_sanitize_meta_cb' ) ) ); |
| | 204 | unregister_meta_key( 'post', 'post', 'flight_number' ); |
| | 205 | |
| | 206 | // @todo unregister_meta_key should do this for registered meta keys |
| | 207 | remove_filter( 'sanitize_post_post_meta_flight_number', array( $this, '_new_sanitize_meta_cb') ); |
| | 208 | remove_filter( 'auth_post_post_meta_flight_number', '__return_true'); |
| | 209 | |
| | 210 | $this->assertTrue( $result ); |
| | 211 | } |
| | 212 | |
| | 213 | public function test_register_meta_with_new_sanitize_callback_parameter() { |
| | 214 | register_meta( 'post', 'new_sanitized_key', array( 'object_subtype' => 'post', 'sanitize_callback' => array( $this, '_new_sanitize_meta_cb' ) ) ); |
| | 215 | $meta = sanitize_meta( 'new_sanitized_key', 'unsanitized', 'post', 'post' ); |
| | 216 | |
| | 217 | unregister_meta_key( 'post', 'post', 'new_sanitized_key' ); |
| | 218 | |
| | 219 | // @todo unregister_meta_key should do this for registered meta keys |
| | 220 | remove_filter( 'sanitize_post_post_meta_new_sanitized_key', array( $this, '_new_sanitize_meta_cb') ); |
| | 221 | remove_filter( 'auth_post_post_meta_new_sanitized_key', '__return_true'); |
| | 222 | |
| | 223 | $this->assertEquals( 'new_sanitized_key new sanitized', $meta ); |
| | 224 | } |
| | 225 | |
| | 226 | public function test_unregister_meta_key_clears_key_from_wp_meta_keys() { |
| | 227 | global $wp_meta_keys; |
| | 228 | register_meta( 'post', 'registered_key', array( 'object_subtype' => 'post' ) ); |
| | 229 | unregister_meta_key( 'post', 'post', 'registered_key' ); |
| | 230 | |
| | 231 | $this->assertEquals( array(), $wp_meta_keys ); |
| | 232 | } |
| | 233 | |
| | 234 | public function test_unregister_meta_key_with_invalid_key_returns_wp_error() { |
| | 235 | $this->assertWPError( unregister_meta_key( 'post', 'post', 'not_a_registered_key' ) ); |
| | 236 | } |
| | 237 | |
| | 238 | public function test_get_registered_meta_keys() { |
| | 239 | register_meta( 'post', 'registered_key1', array( 'object_subtype' => 'post' ) ); |
| | 240 | register_meta( 'post', 'registered_key2', array( 'object_subtype' => 'post' ) ); |
| | 241 | |
| | 242 | $meta_keys = get_registered_meta_keys( 'post', 'post' ); |
| | 243 | |
| | 244 | unregister_meta_key( 'post', 'post', 'registered_key1' ); |
| | 245 | unregister_meta_key( 'post', 'post', 'registered_key2' ); |
| | 246 | |
| | 247 | $this->assertArrayHasKey( 'registered_key1', $meta_keys ); |
| | 248 | $this->assertArrayHasKey( 'registered_key2', $meta_keys ); |
| | 249 | } |
| | 250 | |
| | 251 | public function test_get_registered_meta_keys_with_subtype_without_registered_keys_is_empty() { |
| | 252 | register_meta( 'post', 'registered_key1', array( 'object_subtype' => 'post' ) ); |
| | 253 | register_meta( 'post', 'registered_key2', array( 'object_subtype' => 'post' ) ); |
| | 254 | |
| | 255 | $meta_keys = get_registered_meta_keys( 'post', 'page' ); |
| | 256 | |
| | 257 | unregister_meta_key( 'post', 'post', 'registered_key1' ); |
| | 258 | unregister_meta_key( 'post', 'post', 'registered_key2' ); |
| | 259 | |
| | 260 | $this->assertEmpty( $meta_keys ); |
| | 261 | } |
| | 262 | |
| | 263 | public function test_get_registered_meta_keys_with_invalid_type_is_empty() { |
| | 264 | register_meta( 'post', 'registered_key1', array( 'object_subtype' => 'post' ) ); |
| | 265 | register_meta( 'post', 'registered_key2', array( 'object_subtype' => 'post' ) ); |
| | 266 | |
| | 267 | $meta_keys = get_registered_meta_keys( 'invalid-type' ); |
| | 268 | |
| | 269 | unregister_meta_key( 'post', 'post', 'registered_key1' ); |
| | 270 | unregister_meta_key( 'post', 'post', 'registered_key2' ); |
| | 271 | |
| | 272 | $this->assertEmpty( $meta_keys ); |
| | 273 | } |
| | 274 | |
| | 275 | public function test_get_registered_meta_keys_has_count() { |
| | 276 | register_meta( 'post', 'registered_key1', array( 'object_subtype' => 'post' ) ); |
| | 277 | register_meta( 'post', 'registered_key2', array( 'object_subtype' => 'page' ) ); |
| | 278 | |
| | 279 | $meta_keys = get_registered_meta_keys( 'post' ); |
| | 280 | |
| | 281 | $this->assertCount( 2, $meta_keys ); |
| | 282 | } |
| | 283 | |
| | 284 | public function test_get_registered_meta_keys_description_arg() { |
| | 285 | register_meta( 'post', 'registered_key1', array( 'object_subtype' => 'post', 'description' => 'I\'m just a field, take a good look at me' ) ); |
| | 286 | |
| | 287 | $meta_keys = get_registered_meta_keys( 'post', 'post' ); |
| | 288 | |
| | 289 | $this->assertEquals( 'I\'m just a field, take a good look at me', $meta_keys['registered_key1']['description'] ); |
| | 290 | } |
| | 291 | |
| | 292 | public function test_get_registered_meta_keys_invalid_arg() { |
| | 293 | register_meta( 'post', 'registered_key1', array( 'object_subtype' => 'post', 'invalid_arg' => 'invalid' ) ); |
| | 294 | |
| | 295 | $meta_keys = get_registered_meta_keys( 'post', 'post' ); |
| | 296 | |
| | 297 | $this->assertArrayNotHasKey( 'invalid_arg', $meta_keys['registered_key1'] ); |
| | 298 | } |
| | 299 | |
| | 300 | public function test_get_registered_metadata() { |
| | 301 | register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post' ) ); |
| | 302 | |
| | 303 | add_post_meta( self::$post_id, 'flight_number', 'Oceanic 815' ); |
| | 304 | |
| | 305 | $meta = get_registered_metadata( 'post', 'post', self::$post_id ); |
| | 306 | |
| | 307 | $this->assertEquals( 'Oceanic 815', $meta['flight_number'][0] ); |
| | 308 | } |
| | 309 | |
| | 310 | public function test_get_registered_metadata_by_key() { |
| | 311 | register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post' ) ); |
| | 312 | |
| | 313 | add_post_meta( self::$post_id, 'flight_number', 'Oceanic 815' ); |
| | 314 | |
| | 315 | $meta = get_registered_metadata( 'post', 'post', self::$post_id, 'flight_number' ); |
| | 316 | |
| | 317 | $this->assertEquals( 'Oceanic 815', $meta[0] ); |
| | 318 | } |
| | 319 | |
| | 320 | public function test_get_registered_metadata_by_key_single() { |
| | 321 | register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post', 'single' => true ) ); |
| | 322 | |
| | 323 | add_post_meta( self::$post_id, 'flight_number', 'Oceanic 815' ); |
| | 324 | |
| | 325 | $meta = get_registered_metadata( 'post', 'post', self::$post_id, 'flight_number' ); |
| | 326 | |
| | 327 | $this->assertEquals( 'Oceanic 815', $meta ); |
| | 328 | } |
| | 329 | |
| | 330 | public function test_get_registered_metadata_by_invalid_key() { |
| | 331 | register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post' ) ); |
| | 332 | |
| | 333 | add_post_meta( self::$post_id, 'flight_number', 'Oceanic 815' ); |
| | 334 | |
| | 335 | $meta = get_registered_metadata( 'post', 'post', self::$post_id, 'flight_pilot' ); |
| | 336 | |
| | 337 | $this->assertWPError( $meta ); |
| | 338 | } |
| | 339 | |
| | 340 | public function test_get_registered_metadata_invalid_object_type() { |
| | 341 | register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post' ) ); |
| | 342 | |
| | 343 | add_post_meta( self::$post_id, 'flight_number', 'Oceanic 815' ); |
| | 344 | |
| | 345 | $meta = get_registered_metadata( 'invalid-type', 'invalid-subtype', self::$post_id ); |
| | 346 | |
| | 347 | $this->assertWPError( $meta ); |
| | 348 | } |
| | 349 | |
| | 350 | public function test_get_registered_metadata_invalid() { |
| | 351 | $meta = get_registered_metadata( 'invalid-type', 'invalid-subtype', self::$post_id ); |
| | 352 | |
| | 353 | $this->assertWPError( $meta ); |
| | 354 | } |
| | 355 | } |