multisite.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  1. <?php
  2. if ( is_multisite() ) :
  3. /**
  4. * Tests specific to users in multisite.
  5. *
  6. * @group user
  7. * @group ms-user
  8. * @group multisite
  9. */
  10. class Tests_Multisite_User extends WP_UnitTestCase {
  11. protected $suppress = false;
  12. function setUp() {
  13. global $wpdb;
  14. parent::setUp();
  15. $this->suppress = $wpdb->suppress_errors();
  16. }
  17. function tearDown() {
  18. global $wpdb;
  19. $wpdb->suppress_errors( $this->suppress );
  20. parent::tearDown();
  21. }
  22. function test_remove_user_from_blog() {
  23. $user1 = self::factory()->user->create_and_get();
  24. $user2 = self::factory()->user->create_and_get();
  25. $post_id = self::factory()->post->create( array( 'post_author' => $user1->ID ) );
  26. remove_user_from_blog( $user1->ID, 1, $user2->ID );
  27. $post = get_post( $post_id );
  28. $this->assertNotEquals( $user1->ID, $post->post_author );
  29. $this->assertEquals( $user2->ID, $post->post_author );
  30. }
  31. /**
  32. * Test the returned data from get_blogs_of_user()
  33. */
  34. function test_get_blogs_of_user() {
  35. $user1_id = self::factory()->user->create( array( 'role' => 'administrator' ) );
  36. // Maintain a list of 6 total sites and include the primary network site.
  37. $blog_ids = self::factory()->blog->create_many( 5, array( 'user_id' => $user1_id ) );
  38. $blog_ids = array_merge( array( 1 ), $blog_ids );
  39. // All sites are new and not marked as spam, archived, or deleted.
  40. $blog_ids_of_user = array_keys( get_blogs_of_user( $user1_id ) );
  41. // User should be a member of the created sites and the network's initial site.
  42. $this->assertSame( $blog_ids, $blog_ids_of_user );
  43. $this->assertTrue( remove_user_from_blog( $user1_id, $blog_ids[0] ) );
  44. $this->assertTrue( remove_user_from_blog( $user1_id, $blog_ids[2] ) );
  45. $this->assertTrue( remove_user_from_blog( $user1_id, $blog_ids[4] ) );
  46. unset( $blog_ids[0] );
  47. unset( $blog_ids[2] );
  48. unset( $blog_ids[4] );
  49. sort( $blog_ids );
  50. $blogs_of_user = get_blogs_of_user( $user1_id, false );
  51. // The user should still be a member of all remaining sites.
  52. $blog_ids_of_user = array_keys( $blogs_of_user );
  53. $this->assertSame( $blog_ids, $blog_ids_of_user );
  54. // Each site retrieved should match the expected structure.
  55. foreach ( $blogs_of_user as $blog_id => $blog ) {
  56. $this->assertSame( $blog_id, $blog->userblog_id );
  57. $this->assertTrue( isset( $blog->userblog_id ) );
  58. $this->assertTrue( isset( $blog->blogname ) );
  59. $this->assertTrue( isset( $blog->domain ) );
  60. $this->assertTrue( isset( $blog->path ) );
  61. $this->assertTrue( isset( $blog->site_id ) );
  62. $this->assertTrue( isset( $blog->siteurl ) );
  63. $this->assertTrue( isset( $blog->archived ) );
  64. $this->assertTrue( isset( $blog->spam ) );
  65. $this->assertTrue( isset( $blog->deleted ) );
  66. }
  67. // Mark each remaining site as spam, archived, and deleted.
  68. update_blog_details( $blog_ids[0], array( 'spam' => 1 ) );
  69. update_blog_details( $blog_ids[1], array( 'archived' => 1 ) );
  70. update_blog_details( $blog_ids[2], array( 'deleted' => 1 ) );
  71. // Passing true as the second parameter should retrieve ALL sites, even if marked.
  72. $blogs_of_user = get_blogs_of_user( $user1_id, true );
  73. $blog_ids_of_user = array_keys( $blogs_of_user );
  74. $this->assertSame( $blog_ids, $blog_ids_of_user );
  75. // Check if sites are flagged as expected.
  76. $this->assertEquals( 1, $blogs_of_user[ $blog_ids[0] ]->spam );
  77. $this->assertEquals( 1, $blogs_of_user[ $blog_ids[1] ]->archived );
  78. $this->assertEquals( 1, $blogs_of_user[ $blog_ids[2] ]->deleted );
  79. unset( $blog_ids[0] );
  80. unset( $blog_ids[1] );
  81. unset( $blog_ids[2] );
  82. sort( $blog_ids );
  83. // Passing false (the default) as the second parameter should retrieve only good sites.
  84. $blog_ids_of_user = array_keys( get_blogs_of_user( $user1_id, false ) );
  85. $this->assertSame( $blog_ids, $blog_ids_of_user );
  86. }
  87. /**
  88. * @expectedDeprecated is_blog_user
  89. */
  90. function test_is_blog_user() {
  91. global $wpdb;
  92. $user1_id = self::factory()->user->create( array( 'role' => 'administrator' ) );
  93. $old_current = get_current_user_id();
  94. wp_set_current_user( $user1_id );
  95. $this->assertTrue( is_blog_user() );
  96. $this->assertTrue( is_blog_user( get_current_blog_id() ) );
  97. $blog_id = self::factory()->blog->create( array( 'user_id' => get_current_user_id() ) );
  98. $this->assertInternalType( 'int', $blog_id );
  99. $this->assertTrue( is_blog_user( $blog_id ) );
  100. $this->assertTrue( remove_user_from_blog( $user1_id, $blog_id ) );
  101. $this->assertFalse( is_blog_user( $blog_id ) );
  102. wp_set_current_user( $old_current );
  103. }
  104. function test_is_user_member_of_blog() {
  105. global $wpdb;
  106. $user1_id = self::factory()->user->create( array( 'role' => 'administrator' ) );
  107. $user2_id = self::factory()->user->create( array( 'role' => 'administrator' ) );
  108. $old_current = get_current_user_id();
  109. $this->assertSame( 0, $old_current );
  110. // Test for "get current user" when not logged in.
  111. $this->assertFalse( is_user_member_of_blog() );
  112. wp_set_current_user( $user1_id );
  113. $site_id = get_current_blog_id();
  114. $this->assertTrue( is_user_member_of_blog() );
  115. $this->assertTrue( is_user_member_of_blog( 0, 0 ) );
  116. $this->assertTrue( is_user_member_of_blog( 0, $site_id ) );
  117. $this->assertTrue( is_user_member_of_blog( $user1_id ) );
  118. $this->assertTrue( is_user_member_of_blog( $user1_id, $site_id ) );
  119. $blog_id = self::factory()->blog->create( array( 'user_id' => get_current_user_id() ) );
  120. $this->assertInternalType( 'int', $blog_id );
  121. // Current user gets added to new blogs.
  122. $this->assertTrue( is_user_member_of_blog( $user1_id, $blog_id ) );
  123. // Other users should not.
  124. $this->assertFalse( is_user_member_of_blog( $user2_id, $blog_id ) );
  125. switch_to_blog( $blog_id );
  126. $this->assertTrue( is_user_member_of_blog( $user1_id ) );
  127. $this->assertFalse( is_user_member_of_blog( $user2_id ) );
  128. // Remove user 1 from blog.
  129. $this->assertTrue( remove_user_from_blog( $user1_id, $blog_id ) );
  130. // Add user 2 to blog.
  131. $this->assertTrue( add_user_to_blog( $blog_id, $user2_id, 'subscriber' ) );
  132. $this->assertFalse( is_user_member_of_blog( $user1_id ) );
  133. $this->assertTrue( is_user_member_of_blog( $user2_id ) );
  134. restore_current_blog();
  135. $this->assertFalse( is_user_member_of_blog( $user1_id, $blog_id ) );
  136. $this->assertTrue( is_user_member_of_blog( $user2_id, $blog_id ) );
  137. wpmu_delete_user( $user1_id );
  138. $user = new WP_User( $user1_id );
  139. $this->assertFalse( $user->exists() );
  140. $this->assertFalse( is_user_member_of_blog( $user1_id ) );
  141. wp_set_current_user( $old_current );
  142. }
  143. /**
  144. * @ticket 23192
  145. */
  146. function test_is_user_spammy() {
  147. $user_id = self::factory()->user->create(
  148. array(
  149. 'role' => 'author',
  150. 'user_login' => 'testuser1',
  151. )
  152. );
  153. $spam_username = (string) $user_id;
  154. $spam_user_id = self::factory()->user->create(
  155. array(
  156. 'role' => 'author',
  157. 'user_login' => $spam_username,
  158. )
  159. );
  160. wp_update_user(
  161. array(
  162. 'ID' => $spam_user_id,
  163. 'spam' => '1',
  164. )
  165. );
  166. $this->assertTrue( is_user_spammy( $spam_username ) );
  167. $this->assertFalse( is_user_spammy( 'testuser1' ) );
  168. }
  169. /**
  170. * @ticket 20601
  171. */
  172. function test_user_member_of_blog() {
  173. global $wp_rewrite;
  174. self::factory()->blog->create();
  175. $user_id = self::factory()->user->create();
  176. self::factory()->blog->create( array( 'user_id' => $user_id ) );
  177. $blogs = get_blogs_of_user( $user_id );
  178. $this->assertCount( 2, $blogs );
  179. $first = reset( $blogs )->userblog_id;
  180. remove_user_from_blog( $user_id, $first );
  181. $blogs = get_blogs_of_user( $user_id );
  182. $second = reset( $blogs )->userblog_id;
  183. $this->assertCount( 1, $blogs );
  184. switch_to_blog( $first );
  185. $wp_rewrite->init();
  186. $this->go_to( get_author_posts_url( $user_id ) );
  187. $this->assertQueryTrue( 'is_404' );
  188. switch_to_blog( $second );
  189. $wp_rewrite->init();
  190. $this->go_to( get_author_posts_url( $user_id ) );
  191. $this->assertQueryTrue( 'is_author', 'is_archive' );
  192. add_user_to_blog( $first, $user_id, 'administrator' );
  193. $blogs = get_blogs_of_user( $user_id );
  194. $this->assertCount( 2, $blogs );
  195. switch_to_blog( $first );
  196. $wp_rewrite->init();
  197. $this->go_to( get_author_posts_url( $user_id ) );
  198. $this->assertQueryTrue( 'is_author', 'is_archive' );
  199. }
  200. function test_revoked_super_admin_can_be_deleted() {
  201. if ( isset( $GLOBALS['super_admins'] ) ) {
  202. $old_global = $GLOBALS['super_admins'];
  203. unset( $GLOBALS['super_admins'] );
  204. }
  205. $user_id = self::factory()->user->create();
  206. grant_super_admin( $user_id );
  207. revoke_super_admin( $user_id );
  208. $this->assertTrue( wpmu_delete_user( $user_id ) );
  209. if ( isset( $old_global ) ) {
  210. $GLOBALS['super_admins'] = $old_global;
  211. }
  212. }
  213. function test_revoked_super_admin_is_deleted() {
  214. if ( isset( $GLOBALS['super_admins'] ) ) {
  215. $old_global = $GLOBALS['super_admins'];
  216. unset( $GLOBALS['super_admins'] );
  217. }
  218. $user_id = self::factory()->user->create();
  219. grant_super_admin( $user_id );
  220. revoke_super_admin( $user_id );
  221. wpmu_delete_user( $user_id );
  222. $user = new WP_User( $user_id );
  223. $this->assertFalse( $user->exists(), 'WP_User->exists' );
  224. if ( isset( $old_global ) ) {
  225. $GLOBALS['super_admins'] = $old_global;
  226. }
  227. }
  228. function test_super_admin_cannot_be_deleted() {
  229. if ( isset( $GLOBALS['super_admins'] ) ) {
  230. $old_global = $GLOBALS['super_admins'];
  231. unset( $GLOBALS['super_admins'] );
  232. }
  233. $user_id = self::factory()->user->create();
  234. grant_super_admin( $user_id );
  235. $this->assertFalse( wpmu_delete_user( $user_id ) );
  236. if ( isset( $old_global ) ) {
  237. $GLOBALS['super_admins'] = $old_global;
  238. }
  239. }
  240. /**
  241. * @ticket 27205
  242. */
  243. function test_granting_super_admins() {
  244. if ( isset( $GLOBALS['super_admins'] ) ) {
  245. $old_global = $GLOBALS['super_admins'];
  246. unset( $GLOBALS['super_admins'] );
  247. }
  248. $user_id = self::factory()->user->create();
  249. $this->assertFalse( is_super_admin( $user_id ) );
  250. $this->assertFalse( revoke_super_admin( $user_id ) );
  251. $this->assertTrue( grant_super_admin( $user_id ) );
  252. $this->assertTrue( is_super_admin( $user_id ) );
  253. $this->assertFalse( grant_super_admin( $user_id ) );
  254. $this->assertTrue( revoke_super_admin( $user_id ) );
  255. // None of these operations should set the $super_admins global.
  256. $this->assertFalse( isset( $GLOBALS['super_admins'] ) );
  257. // Try with two users.
  258. $second_user = self::factory()->user->create();
  259. $this->assertTrue( grant_super_admin( $user_id ) );
  260. $this->assertTrue( grant_super_admin( $second_user ) );
  261. $this->assertTrue( is_super_admin( $second_user ) );
  262. $this->assertTrue( is_super_admin( $user_id ) );
  263. $this->assertTrue( revoke_super_admin( $user_id ) );
  264. $this->assertTrue( revoke_super_admin( $second_user ) );
  265. if ( isset( $old_global ) ) {
  266. $GLOBALS['super_admins'] = $old_global;
  267. }
  268. }
  269. public function test_numeric_string_user_id() {
  270. $u = self::factory()->user->create();
  271. $u_string = (string) $u;
  272. $this->assertTrue( wpmu_delete_user( $u_string ) );
  273. $this->assertFalse( get_user_by( 'id', $u ) );
  274. }
  275. /**
  276. * @ticket 33800
  277. */
  278. public function test_should_return_false_for_non_numeric_string_user_id() {
  279. $this->assertFalse( wpmu_delete_user( 'abcde' ) );
  280. }
  281. /**
  282. * @ticket 33800
  283. */
  284. public function test_should_return_false_for_object_user_id() {
  285. $u_obj = self::factory()->user->create_and_get();
  286. $this->assertFalse( wpmu_delete_user( $u_obj ) );
  287. $this->assertSame( $u_obj->ID, username_exists( $u_obj->user_login ) );
  288. }
  289. /**
  290. * @ticket 38356
  291. */
  292. public function test_add_user_to_blog_subscriber() {
  293. $site_id = self::factory()->blog->create();
  294. $user_id = self::factory()->user->create();
  295. add_user_to_blog( $site_id, $user_id, 'subscriber' );
  296. switch_to_blog( $site_id );
  297. $user = get_user_by( 'id', $user_id );
  298. restore_current_blog();
  299. wp_delete_site( $site_id );
  300. wpmu_delete_user( $user_id );
  301. $this->assertContains( 'subscriber', $user->roles );
  302. }
  303. /**
  304. * @ticket 38356
  305. */
  306. public function test_add_user_to_blog_invalid_user() {
  307. $site_id = self::factory()->blog->create();
  308. $result = add_user_to_blog( 73622, $site_id, 'subscriber' );
  309. wp_delete_site( $site_id );
  310. $this->assertWPError( $result );
  311. }
  312. /**
  313. * @ticket 41101
  314. */
  315. public function test_should_fail_can_add_user_to_blog_filter() {
  316. $site_id = self::factory()->blog->create();
  317. $user_id = self::factory()->user->create();
  318. add_filter( 'can_add_user_to_blog', '__return_false' );
  319. $result = add_user_to_blog( $site_id, $user_id, 'subscriber' );
  320. $this->assertWPError( $result );
  321. }
  322. /**
  323. * @ticket 41101
  324. */
  325. public function test_should_succeed_can_add_user_to_blog_filter() {
  326. $site_id = self::factory()->blog->create();
  327. $user_id = self::factory()->user->create();
  328. add_filter( 'can_add_user_to_blog', '__return_true' );
  329. $result = add_user_to_blog( $site_id, $user_id, 'subscriber' );
  330. $this->assertTrue( $result );
  331. }
  332. /**
  333. * @ticket 23016
  334. */
  335. public function test_wp_roles_global_is_reset() {
  336. global $wp_roles;
  337. $role = 'test_global_is_reset';
  338. $role_name = 'Test Global Is Reset';
  339. $blog_id = self::factory()->blog->create();
  340. $wp_roles->add_role( $role, $role_name, array() );
  341. $this->assertNotEmpty( $wp_roles->get_role( $role ) );
  342. switch_to_blog( $blog_id );
  343. $this->assertEmpty( $wp_roles->get_role( $role ) );
  344. $wp_roles->add_role( $role, $role_name, array() );
  345. $this->assertNotEmpty( $wp_roles->get_role( $role ) );
  346. restore_current_blog();
  347. $this->assertNotEmpty( $wp_roles->get_role( $role ) );
  348. $wp_roles->remove_role( $role );
  349. }
  350. }
  351. endif;