PageRenderTime 55ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/tests/user.php

https://gitlab.com/Blueprint-Marketing/wordpress-unit-tests
PHP | 639 lines | 421 code | 133 blank | 85 comment | 11 complexity | bbc45c031e703bb372456471809d78c2 MD5 | raw file
  1. <?php
  2. // test functions in wp-includes/user.php
  3. /**
  4. * @group user
  5. */
  6. class Tests_User extends WP_UnitTestCase {
  7. protected $_deprecated_errors = array();
  8. function setUp() {
  9. parent::setUp();
  10. $this->_deprecated_errors = array();
  11. }
  12. public function deprecated_handler( $function, $message, $version ) {
  13. $this->_deprecated_errors[] = array(
  14. 'function' => $function,
  15. 'message' => $message,
  16. 'version' => $version
  17. );
  18. }
  19. public function disable_deprecated_errors( $value ) {
  20. return false;
  21. }
  22. function test_get_users_of_blog() {
  23. // add one of each user role
  24. $nusers = array();
  25. foreach ( array('administrator', 'editor', 'author', 'contributor', 'subscriber' ) as $role ) {
  26. $id = $this->factory->user->create( array( 'role' => $role ) );
  27. $nusers[ $id ] = $id;
  28. }
  29. $user_list = get_users();
  30. // find the role of each user as returned by get_users_of_blog
  31. $found = array();
  32. foreach ( $user_list as $user ) {
  33. // only include the users we just created - there might be some others that existed previously
  34. if ( isset( $nusers[$user->ID] ) ) {
  35. $found[ $user->ID] = $user->ID;
  36. }
  37. }
  38. // make sure every user we created was returned
  39. $this->assertEquals($nusers, $found);
  40. }
  41. // simple get/set tests for user_option functions
  42. function test_user_option() {
  43. $key = rand_str();
  44. $val = rand_str();
  45. $user_id = $this->factory->user->create( array( 'role' => 'author' ) );
  46. // get an option that doesn't exist
  47. $this->assertFalse(get_user_option($key, $user_id));
  48. // set and get
  49. update_user_option( $user_id, $key, $val );
  50. $this->assertEquals( $val, get_user_option($key, $user_id) );
  51. // change and get again
  52. $val2 = rand_str();
  53. update_user_option( $user_id, $key, $val2 );
  54. $this->assertEquals( $val2, get_user_option($key, $user_id) );
  55. }
  56. // simple tests for usermeta functions
  57. function test_usermeta() {
  58. $key = rand_str();
  59. $val = rand_str();
  60. $user_id = $this->factory->user->create( array( 'role' => 'author' ) );
  61. // get a meta key that doesn't exist
  62. $this->assertEquals( '', get_user_meta($user_id, $key, true));
  63. // set and get
  64. update_user_meta( $user_id, $key, $val );
  65. $this->assertEquals( $val, get_user_meta($user_id, $key, true) );
  66. // change and get again
  67. $val2 = rand_str();
  68. update_user_meta( $user_id, $key, $val2 );
  69. $this->assertEquals( $val2, get_user_meta($user_id, $key, true) );
  70. // delete and get
  71. delete_user_meta( $user_id, $key );
  72. $this->assertEquals( '', get_user_meta($user_id, $key, true) );
  73. // delete by key AND value
  74. update_user_meta( $user_id, $key, $val );
  75. // incorrect key: key still exists
  76. delete_user_meta( $user_id, $key, rand_str() );
  77. $this->assertEquals( $val, get_user_meta($user_id, $key, true) );
  78. // correct key: deleted
  79. delete_user_meta( $user_id, $key, $val );
  80. $this->assertEquals( '', get_user_meta($user_id, $key, true) );
  81. }
  82. // test usermeta functions in array mode
  83. function test_usermeta_array() {
  84. // some values to set
  85. $vals = array(
  86. rand_str() => 'val-'.rand_str(),
  87. rand_str() => 'val-'.rand_str(),
  88. rand_str() => 'val-'.rand_str(),
  89. );
  90. $user_id = $this->factory->user->create( array( 'role' => 'author' ) );
  91. // there is already some stuff in the array
  92. $this->assertTrue(is_array(get_user_meta($user_id)));
  93. foreach ($vals as $k=>$v)
  94. update_user_meta( $user_id, $k, $v );
  95. // get the complete usermeta array
  96. $out = get_user_meta($user_id);
  97. // for reasons unclear, the resulting array is indexed numerically; meta keys are not included anywhere.
  98. // so we'll just check to make sure our values are included somewhere.
  99. foreach ($vals as $k=>$v)
  100. $this->assertTrue(isset($out[$k]) && $out[$k][0] == $v);
  101. // delete one key and check again
  102. $key_to_delete = array_pop(array_keys($vals));
  103. delete_user_meta($user_id, $key_to_delete);
  104. $out = get_user_meta($user_id);
  105. // make sure that key is excluded from the results
  106. foreach ($vals as $k=>$v) {
  107. if ($k == $key_to_delete)
  108. $this->assertFalse(isset($out[$k]));
  109. else
  110. $this->assertTrue(isset($out[$k]) && $out[$k][0] == $v);
  111. }
  112. }
  113. // Test property magic functions for property get/set/isset.
  114. function test_user_properties() {
  115. $user_id = $this->factory->user->create( array( 'role' => 'author' ) );
  116. $user = new WP_User( $user_id );
  117. foreach ( $user->data as $key => $data ) {
  118. $this->assertEquals( $data, $user->$key );
  119. }
  120. $this->assertTrue( isset( $user->$key ) );
  121. $this->assertFalse( isset( $user->fooooooooo ) );
  122. $user->$key = 'foo';
  123. $this->assertEquals( 'foo', $user->$key );
  124. $this->assertEquals( 'foo', $user->data->$key ); // This will fail with WP < 3.3
  125. foreach ( (array) $user as $key => $value ) {
  126. $this->assertEquals( $value, $user->$key );
  127. }
  128. }
  129. /**
  130. * Test the magic __unset method
  131. *
  132. * @ticket 20043
  133. */
  134. public function test_user_unset() {
  135. // New user
  136. $user_id = $this->factory->user->create( array( 'role' => 'author' ) );
  137. $user = new WP_User( $user_id );
  138. // Test custom fields
  139. $user->customField = 123;
  140. $this->assertEquals( $user->customField, 123 );
  141. unset( $user->customField );
  142. $this->assertFalse( isset( $user->customField ) );
  143. // Test 'id' (lowercase)
  144. add_action( 'deprecated_argument_run', array( $this, 'deprecated_handler' ), 10, 3 );
  145. add_filter( 'deprecated_argument_trigger_error', array( $this, 'disable_deprecated_errors' ) );
  146. unset( $user->id );
  147. $this->assertCount( 1, $this->_deprecated_errors );
  148. $this->assertEquals( 'WP_User->id', $this->_deprecated_errors[0]['function'] );
  149. $this->assertEquals( '2.1', $this->_deprecated_errors[0]['version'] );
  150. remove_filter( 'deprecated_argument_trigger_error', array( $this, 'disable_deprecated_errors' ) );
  151. remove_action( 'deprecated_argument_run', array( $this, 'deprecated_handler' ), 10, 3);
  152. // Test 'ID'
  153. $this->assertNotEmpty( $user->ID );
  154. unset( $user->ID );
  155. $this->assertEmpty( $user->ID );
  156. }
  157. // Test meta property magic functions for property get/set/isset.
  158. function test_user_meta_properties() {
  159. global $wpdb;
  160. $user_id = $this->factory->user->create( array( 'role' => 'author' ) );
  161. $user = new WP_User( $user_id );
  162. update_user_option( $user_id, 'foo', 'foo', true );
  163. $this->assertTrue( isset( $user->foo ) );
  164. $this->assertEquals( 'foo', $user->foo );
  165. }
  166. function test_id_property_back_compat() {
  167. $user_id = $this->factory->user->create( array( 'role' => 'author' ) );
  168. $user = new WP_User( $user_id );
  169. add_filter( 'deprecated_argument_trigger_error', array( $this, 'disable_deprecated_errors' ) );
  170. $this->assertTrue( isset( $user->id ) );
  171. $this->assertEquals( $user->ID, $user->id );
  172. $user->id = 1234;
  173. $this->assertEquals( $user->ID, $user->id );
  174. remove_filter( 'deprecated_argument_trigger_error', array( $this, 'disable_deprecated_errors' ) );
  175. }
  176. /**
  177. * ticket 19265
  178. */
  179. function test_user_level_property_back_compat() {
  180. $roles = array(
  181. 'administrator' => 10,
  182. 'editor' => 7,
  183. 'author' => 2,
  184. 'contributor' => 1,
  185. 'subscriber' => 0,
  186. );
  187. foreach ( $roles as $role => $level ) {
  188. $user_id = $this->factory->user->create( array( 'role' => $role ) );
  189. $user = new WP_User( $user_id );
  190. $this->assertTrue( isset( $user->user_level ) );
  191. $this->assertEquals( $level, $user->user_level );
  192. }
  193. }
  194. function test_construction() {
  195. $user_id = $this->factory->user->create( array( 'role' => 'author' ) );
  196. $user = new WP_User( $user_id );
  197. $this->assertInstanceOf( 'WP_User', $user );
  198. $this->assertEquals( $user_id, $user->ID );
  199. $user2 = new WP_User( 0, $user->user_login );
  200. $this->assertInstanceOf( 'WP_User', $user2 );
  201. $this->assertEquals( $user_id, $user2->ID );
  202. $this->assertEquals( $user->user_login, $user2->user_login );
  203. $user3 = new WP_User();
  204. $this->assertInstanceOf( 'WP_User', $user3 );
  205. $this->assertEquals( 0, $user3->ID );
  206. $this->assertFalse( isset( $user3->user_login ) );
  207. $user3->init( $user->data );
  208. $this->assertEquals( $user_id, $user3->ID );
  209. $user4 = new WP_User( $user->user_login );
  210. $this->assertInstanceOf( 'WP_User', $user4 );
  211. $this->assertEquals( $user_id, $user4->ID );
  212. $this->assertEquals( $user->user_login, $user4->user_login );
  213. $user5 = new WP_User( null, $user->user_login );
  214. $this->assertInstanceOf( 'WP_User', $user5 );
  215. $this->assertEquals( $user_id, $user5->ID );
  216. $this->assertEquals( $user->user_login, $user5->user_login );
  217. $user6 = new WP_User( $user );
  218. $this->assertInstanceOf( 'WP_User', $user6 );
  219. $this->assertEquals( $user_id, $user6->ID );
  220. $this->assertEquals( $user->user_login, $user6->user_login );
  221. $user7 = new WP_User( $user->data );
  222. $this->assertInstanceOf( 'WP_User', $user7 );
  223. $this->assertEquals( $user_id, $user7->ID );
  224. $this->assertEquals( $user->user_login, $user7->user_login );
  225. }
  226. function test_get() {
  227. $user_id = $this->factory->user->create( array(
  228. 'role' => 'author',
  229. 'user_login' => 'test_wp_user_get',
  230. 'user_pass' => 'password',
  231. 'user_email' => 'test@test.com',
  232. ) );
  233. $user = new WP_User( $user_id );
  234. $this->assertEquals( 'test_wp_user_get', $user->get( 'user_login' ) );
  235. $this->assertEquals( 'test@test.com', $user->get( 'user_email' ) );
  236. $this->assertEquals( 0, $user->get( 'use_ssl' ) );
  237. $this->assertEquals( '', $user->get( 'field_that_does_not_exist' ) );
  238. update_user_meta( $user_id, 'dashed-key', 'abcdefg' );
  239. $this->assertEquals( 'abcdefg', $user->get( 'dashed-key' ) );
  240. }
  241. function test_has_prop() {
  242. $user_id = $this->factory->user->create( array(
  243. 'role' => 'author',
  244. 'user_login' => 'test_wp_user_has_prop',
  245. 'user_pass' => 'password',
  246. 'user_email' => 'test2@test.com',
  247. ) );
  248. $user = new WP_User( $user_id );
  249. $this->assertTrue( $user->has_prop( 'user_email') );
  250. $this->assertTrue( $user->has_prop( 'use_ssl' ) );
  251. $this->assertFalse( $user->has_prop( 'field_that_does_not_exist' ) );
  252. update_user_meta( $user_id, 'dashed-key', 'abcdefg' );
  253. $this->assertTrue( $user->has_prop( 'dashed-key' ) );
  254. }
  255. function test_update_user() {
  256. $user_id = $this->factory->user->create( array(
  257. 'role' => 'author',
  258. 'user_login' => 'test_wp_update_user',
  259. 'user_pass' => 'password',
  260. 'user_email' => 'test3@test.com',
  261. ) );
  262. $user = new WP_User( $user_id );
  263. update_user_meta( $user_id, 'description', 'about me' );
  264. $this->assertEquals( 'about me', $user->get( 'description' ) );
  265. $user_data = array( 'ID' => $user_id, 'display_name' => 'test user' );
  266. wp_update_user( $user_data );
  267. $user = new WP_User( $user_id );
  268. $this->assertEquals( 'test user', $user->get( 'display_name' ) );
  269. // Make sure there is no collateral damage to fields not in $user_data
  270. $this->assertEquals( 'about me', $user->get( 'description' ) );
  271. // Pass as stdClass
  272. $user_data = array( 'ID' => $user_id, 'display_name' => 'a test user' );
  273. wp_update_user( (object) $user_data );
  274. $user = new WP_User( $user_id );
  275. $this->assertEquals( 'a test user', $user->get( 'display_name' ) );
  276. // Pass as WP_User
  277. $user = new WP_User( $user_id );
  278. $user->display_name = 'some test user';
  279. wp_update_user( $user );
  280. $user = new WP_User( $user_id );
  281. $this->assertEquals( 'some test user', $user->get( 'display_name' ) );
  282. // Test update of fields in _get_additional_user_keys()
  283. $user_data = array( 'ID' => $user_id, 'use_ssl' => 1, 'show_admin_bar_front' => 1,
  284. 'rich_editing' => 1, 'first_name' => 'first', 'last_name' => 'last',
  285. 'nickname' => 'nick', 'comment_shortcuts' => 1, 'admin_color' => 'classic',
  286. 'description' => 'describe' );
  287. wp_update_user( $user_data );
  288. $user = new WP_User( $user_id );
  289. foreach ( $user_data as $key => $value )
  290. $this->assertEquals( $value, $user->get( $key ), $key );
  291. }
  292. /**
  293. * Test that usermeta cache is cleared after user deletion.
  294. *
  295. * @ticket 19500
  296. */
  297. function test_get_blogs_of_user() {
  298. // Logged out users don't have blogs.
  299. $this->assertEquals( array(), get_blogs_of_user( 0 ) );
  300. $user_id = $this->factory->user->create( array( 'role' => 'subscriber' ) );
  301. $blogs = get_blogs_of_user( $user_id );
  302. $this->assertEquals( array( 1 ), array_keys( $blogs ) );
  303. // Non-existent users don't have blogs.
  304. if ( is_multisite() )
  305. wpmu_delete_user( $user_id );
  306. else
  307. wp_delete_user( $user_id );
  308. $this->assertEquals( array(), get_blogs_of_user( $user_id ) );
  309. }
  310. /**
  311. * Test that usermeta cache is cleared after user deletion.
  312. *
  313. * @ticket 19500
  314. */
  315. function test_is_user_member_of_blog() {
  316. $old_current = get_current_user_id();
  317. $user_id = $this->factory->user->create( array( 'role' => 'subscriber' ) );
  318. wp_set_current_user( $user_id );
  319. $this->assertTrue( is_user_member_of_blog() );
  320. $this->assertTrue( is_user_member_of_blog( 0, 0 ) );
  321. $this->assertTrue( is_user_member_of_blog( 0, get_current_blog_id() ) );
  322. $this->assertTrue( is_user_member_of_blog( $user_id ) );
  323. $this->assertTrue( is_user_member_of_blog( $user_id, get_current_blog_id() ) );
  324. // Will only remove the user from the current site in multisite; this is desired
  325. // and will achieve the desired effect with is_user_member_of_blog().
  326. wp_delete_user( $user_id );
  327. $this->assertFalse( is_user_member_of_blog( $user_id ) );
  328. $this->assertFalse( is_user_member_of_blog( $user_id, get_current_blog_id() ) );
  329. wp_set_current_user( $old_current );
  330. }
  331. /**
  332. * ticket 19595
  333. */
  334. function test_global_userdata() {
  335. global $userdata, $wpdb;
  336. $user_id = $this->factory->user->create( array( 'role' => 'subscriber' ) );
  337. wp_set_current_user( $user_id );
  338. $this->assertNotEmpty( $userdata );
  339. $this->assertInstanceOf( 'WP_User', $userdata );
  340. $this->assertEquals( $userdata->ID, $user_id );
  341. $prefix = $wpdb->get_blog_prefix();
  342. $cap_key = $prefix . 'capabilities';
  343. $this->assertTrue( isset( $userdata->$cap_key ) );
  344. }
  345. /**
  346. * ticket 19769
  347. */
  348. function test_global_userdata_is_null_when_logged_out() {
  349. global $userdata;
  350. wp_set_current_user(0);
  351. $this->assertNull( $userdata );
  352. }
  353. function test_exists() {
  354. $user_id = $this->factory->user->create( array( 'role' => 'author' ) );
  355. $user = new WP_User( $user_id );
  356. $this->assertTrue( $user->exists() );
  357. $user = new WP_User( 123456789 );
  358. $this->assertFalse( $user->exists() );
  359. $user = new WP_User( 0 );
  360. $this->assertFalse( $user->exists() );
  361. }
  362. function test_global_authordata() {
  363. global $authordata, $id;
  364. $old_post_id = $id;
  365. $user_id = $this->factory->user->create( array( 'role' => 'author' ) );
  366. $user = new WP_User( $user_id );
  367. $post = array(
  368. 'post_author' => $user_id,
  369. 'post_status' => 'publish',
  370. 'post_content' => rand_str(),
  371. 'post_title' => rand_str(),
  372. 'post_type' => 'post'
  373. );
  374. // insert a post and make sure the ID is ok
  375. $post_id = wp_insert_post( $post );
  376. $this->assertTrue( is_numeric( $post_id ) );
  377. setup_postdata( get_post( $post_id ) );
  378. $this->assertNotEmpty( $authordata );
  379. $this->assertInstanceOf( 'WP_User', $authordata );
  380. $this->assertEquals( $authordata->ID, $user_id );
  381. if ( $old_post_id )
  382. setup_postdata( get_post( $old_post_id ) );
  383. }
  384. function test_delete_user() {
  385. $user_id = $this->factory->user->create( array( 'role' => 'author' ) );
  386. $user = new WP_User( $user_id );
  387. $post = array(
  388. 'post_author' => $user_id,
  389. 'post_status' => 'publish',
  390. 'post_content' => rand_str(),
  391. 'post_title' => rand_str(),
  392. 'post_type' => 'post',
  393. );
  394. // insert a post and make sure the ID is ok
  395. $post_id = wp_insert_post($post);
  396. $this->assertTrue(is_numeric($post_id));
  397. $this->assertTrue($post_id > 0);
  398. $post = get_post( $post_id );
  399. $this->assertEquals( $post_id, $post->ID );
  400. $post = array(
  401. 'post_author' => $user_id,
  402. 'post_status' => 'publish',
  403. 'post_content' => rand_str(),
  404. 'post_title' => rand_str(),
  405. 'post_type' => 'nav_menu_item',
  406. );
  407. // insert a post and make sure the ID is ok
  408. $nav_id = wp_insert_post($post);
  409. $this->assertTrue(is_numeric($nav_id));
  410. $this->assertTrue($nav_id > 0);
  411. $post = get_post( $nav_id );
  412. $this->assertEquals( $nav_id, $post->ID );
  413. wp_delete_user( $user_id );
  414. $user = new WP_User( $user_id );
  415. if ( is_multisite() )
  416. $this->assertTrue( $user->exists() );
  417. else
  418. $this->assertFalse( $user->exists() );
  419. $this->assertNotNull( get_post( $post_id ) );
  420. $this->assertEquals( 'trash', get_post( $post_id )->post_status );
  421. // nav_menu_item is delete_with_user = false so the nav post should remain published.
  422. $this->assertNotNull( get_post( $nav_id ) );
  423. $this->assertEquals( 'publish', get_post( $nav_id )->post_status );
  424. wp_delete_post( $nav_id, true );
  425. $this->assertNull( get_post( $nav_id ) );
  426. wp_delete_post( $post_id, true );
  427. $this->assertNull( get_post( $post_id ) );
  428. }
  429. /**
  430. * @ticket 13317
  431. */
  432. function test_get_userdata() {
  433. $this->assertFalse( get_userdata( 0 ) );
  434. $this->assertFalse( get_userdata( '0' ) );
  435. $this->assertFalse( get_userdata( 'string' ) );
  436. $this->assertFalse( get_userdata( array( 'array' ) ) );
  437. }
  438. function test_user_get_data_by_id() {
  439. $user_id = $this->factory->user->create();
  440. $user = WP_User::get_data_by( 'id', $user_id );
  441. $this->assertInstanceOf( 'stdClass', $user );
  442. $this->assertEquals( $user_id, $user->ID );
  443. // @ticket 23480
  444. $user = WP_User::get_data_by( 'id', -1 );
  445. $this->assertEquals( false, $user );
  446. $user = WP_User::get_data_by( 'id', 0 );
  447. $this->assertEquals( false, $user );
  448. $user = WP_User::get_data_by( 'id', null );
  449. $this->assertEquals( false, $user );
  450. $user = WP_User::get_data_by( 'id', '' );
  451. $this->assertEquals( false, $user );
  452. $user = WP_User::get_data_by( 'id', false );
  453. $this->assertEquals( false, $user );
  454. $user = WP_User::get_data_by( 'id', $user->user_nicename );
  455. $this->assertEquals( false, $user );
  456. $user = WP_User::get_data_by( 'id', 99999 );
  457. $this->assertEquals( false, $user );
  458. }
  459. /**
  460. * @ticket 20447
  461. */
  462. function test_wp_delete_user_reassignment_clears_post_caches() {
  463. $user_id = $this->factory->user->create();
  464. $reassign = $this->factory->user->create();
  465. $post_id = $this->factory->post->create( array( 'post_author' => $user_id ) );
  466. get_post( $post_id ); // Ensure this post is in the cache.
  467. wp_delete_user( $user_id, $reassign );
  468. $post = get_post( $post_id );
  469. $this->assertEquals( $reassign, $post->post_author );
  470. }
  471. /**
  472. * @ticket 21431
  473. */
  474. function test_count_many_users_posts() {
  475. $user_id_a = $this->factory->user->create( array( 'role' => 'author' ) );
  476. $user_id_b = $this->factory->user->create( array( 'role' => 'author' ) );
  477. $post_id_a = $this->factory->post->create( array( 'post_author' => $user_id_a ) );
  478. $post_id_b = $this->factory->post->create( array( 'post_author' => $user_id_b ) );
  479. $post_id_c = $this->factory->post->create( array( 'post_author' => $user_id_b, 'post_status' => 'private' ) );
  480. wp_set_current_user( $user_id_a );
  481. $counts = count_many_users_posts( array( $user_id_a, $user_id_b), 'post', false );
  482. $this->assertEquals( 1, $counts[$user_id_a] );
  483. $this->assertEquals( 1, $counts[$user_id_b] );
  484. $counts = count_many_users_posts( array( $user_id_a, $user_id_b), 'post', true );
  485. $this->assertEquals( 1, $counts[$user_id_a] );
  486. $this->assertEquals( 1, $counts[$user_id_b] );
  487. wp_set_current_user( $user_id_b );
  488. $counts = count_many_users_posts( array( $user_id_a, $user_id_b), 'post', false );
  489. $this->assertEquals( 1, $counts[$user_id_a] );
  490. $this->assertEquals( 2, $counts[$user_id_b] );
  491. $counts = count_many_users_posts( array( $user_id_a, $user_id_b), 'post', true );
  492. $this->assertEquals( 1, $counts[$user_id_a] );
  493. $this->assertEquals( 1, $counts[$user_id_b] );
  494. }
  495. /**
  496. * @ticket 22858
  497. */
  498. function test_wp_update_user_on_nonexistent_users() {
  499. $user_id = 1;
  500. // Find me a non-existent user ID.
  501. while ( get_userdata( $user_id ) )
  502. ++$user_id;
  503. // If this test fails, it will error out for calling the to_array() method on a non-object.
  504. $this->assertInstanceOf( 'WP_Error', wp_update_user( array( 'ID' => $user_id ) ) );
  505. }
  506. }