diff --git a/tests/phpunit/tests/multisite.php b/tests/phpunit/tests/multisite.php new file mode 100644 index 0000000000..7427d9f35e --- /dev/null +++ b/tests/phpunit/tests/multisite.php @@ -0,0 +1,72 @@ +suppress = $wpdb->suppress_errors(); + + $_SERVER['REMOTE_ADDR'] = ''; + } + + function tearDown() { + global $wpdb; + parent::tearDown(); + $wpdb->suppress_errors( $this->suppress ); + } + + function test_wpmu_log_new_registrations() { + global $wpdb; + + $user = new WP_User( 1 ); + $ip = preg_replace( '/[^0-9., ]/', '',$_SERVER['REMOTE_ADDR'] ); + + wpmu_log_new_registrations(1,1); + + // currently there is no wrapper function for the registration_log + $reg_blog = $wpdb->get_col( "SELECT email FROM {$wpdb->registration_log} WHERE {$wpdb->registration_log}.blog_id = 1 AND IP LIKE '" . $ip . "'" ); + $this->assertEquals( $user->user_email, $reg_blog[ count( $reg_blog )-1 ] ); + } + + /** + * @ticket 21570 + */ + function test_aggressiveness_of_is_email_address_unsafe() { + update_site_option( 'banned_email_domains', array( 'bar.com', 'foo.co' ) ); + + foreach ( array( 'test@bar.com', 'test@foo.bar.com', 'test@foo.co', 'test@subdomain.foo.co' ) as $email_address ) { + $this->assertTrue( is_email_address_unsafe( $email_address ), "$email_address should be UNSAFE" ); + } + + foreach ( array( 'test@foobar.com', 'test@foo-bar.com', 'test@foo.com', 'test@subdomain.foo.com' ) as $email_address ) { + $this->assertFalse( is_email_address_unsafe( $email_address ), "$email_address should be SAFE" ); + } + } + + /** + * @ticket 25046 + */ + function test_case_sensitivity_of_is_email_address_unsafe() { + update_site_option( 'banned_email_domains', array( 'baR.com', 'Foo.co', 'barfoo.COM', 'BAZ.com' ) ); + + foreach ( array( 'test@Bar.com', 'tEst@bar.com', 'test@barFoo.com', 'tEst@foo.bar.com', 'test@baz.Com' ) as $email_address ) { + $this->assertTrue( is_email_address_unsafe( $email_address ), "$email_address should be UNSAFE" ); + } + + foreach ( array( 'test@Foobar.com', 'test@Foo-bar.com', 'tEst@foobar.com', 'test@Subdomain.Foo.com', 'test@fooBAz.com' ) as $email_address ) { + $this->assertFalse( is_email_address_unsafe( $email_address ), "$email_address should be SAFE" ); + } + + } +} + +endif; diff --git a/tests/phpunit/tests/multisite/bootstrap.php b/tests/phpunit/tests/multisite/bootstrap.php new file mode 100644 index 0000000000..f9f59f6bb3 --- /dev/null +++ b/tests/phpunit/tests/multisite/bootstrap.php @@ -0,0 +1,273 @@ +suppress = $wpdb->suppress_errors(); + + $_SERVER[ 'REMOTE_ADDR' ] = ''; + } + + function tearDown() { + global $wpdb; + parent::tearDown(); + $wpdb->suppress_errors( $this->suppress ); + } + + + /** + * @ticket 27003 + */ + function test_get_network_by_path() { + global $wpdb; + + $ids = array( + 'wordpress.org/' => array( 'domain' => 'wordpress.org', 'path' => '/' ), + 'wordpress.org/one/' => array( 'domain' => 'wordpress.org', 'path' => '/one/' ), + 'wordpress.net/' => array( 'domain' => 'wordpress.net', 'path' => '/' ), + 'www.wordpress.net/' => array( 'domain' => 'www.wordpress.net', 'path' => '/' ), + 'www.wordpress.net/two/' => array( 'domain' => 'www.wordpress.net', 'path' => '/two/' ), + 'wordpress.net/three/' => array( 'domain' => 'wordpress.net', 'path' => '/three/' ), + ); + + foreach ( $ids as &$id ) { + $id = $this->factory->network->create( $id ); + } + unset( $id ); + + $this->assertEquals( $ids['www.wordpress.net/'], + get_network_by_path( 'www.wordpress.net', '/notapath/' )->id ); + + $this->assertEquals( $ids['www.wordpress.net/two/'], + get_network_by_path( 'www.wordpress.net', '/two/' )->id ); + + // This should find /one/ despite the www. + $this->assertEquals( $ids['wordpress.org/one/'], + get_network_by_path( 'www.wordpress.org', '/one/' )->id ); + + // This should not find /one/ because the domains don't match. + $this->assertEquals( $ids['wordpress.org/'], + get_network_by_path( 'site1.wordpress.org', '/one/' )->id ); + + $this->assertEquals( $ids['wordpress.net/three/'], + get_network_by_path( 'wordpress.net', '/three/' )->id ); + + $this->assertEquals( $ids['wordpress.net/'], + get_network_by_path( 'wordpress.net', '/notapath/' )->id ); + + $this->assertEquals( $ids['wordpress.net/'], + get_network_by_path( 'site1.wordpress.net', '/notapath/' )->id ); + + $this->assertEquals( $ids['wordpress.net/'], + get_network_by_path( 'site1.wordpress.net', '/three/' )->id ); + } + + /** + * @ticket 27003 + * @ticket 27927 + */ + function test_get_site_by_path() { + $ids = array( + 'wordpress.org/' => array( 'domain' => 'wordpress.org', 'path' => '/' ), + 'wordpress.org/foo/' => array( 'domain' => 'wordpress.org', 'path' => '/foo/' ), + 'wordpress.org/foo/bar/' => array( 'domain' => 'wordpress.org', 'path' => '/foo/bar/' ), + 'make.wordpress.org/' => array( 'domain' => 'make.wordpress.org', 'path' => '/' ), + 'make.wordpress.org/foo/' => array( 'domain' => 'make.wordpress.org', 'path' => '/foo/' ), + 'www.w.org/' => array( 'domain' => 'www.w.org', 'path' => '/' ), + 'www.w.org/foo/' => array( 'domain' => 'www.w.org', 'path' => '/foo/' ), + 'www.w.org/foo/bar/' => array( 'domain' => 'www.w.org', 'path' => '/foo/bar/' ), + ); + + foreach ( $ids as &$id ) { + $id = $this->factory->blog->create( $id ); + } + unset( $id ); + + $this->assertEquals( $ids['wordpress.org/'], + get_site_by_path( 'wordpress.org', '/notapath/' )->blog_id ); + + $this->assertEquals( $ids['wordpress.org/'], + get_site_by_path( 'www.wordpress.org', '/notapath/' )->blog_id ); + + $this->assertEquals( $ids['wordpress.org/foo/bar/'], + get_site_by_path( 'wordpress.org', '/foo/bar/baz/' )->blog_id ); + + $this->assertEquals( $ids['wordpress.org/foo/bar/'], + get_site_by_path( 'www.wordpress.org', '/foo/bar/baz/' )->blog_id ); + + $this->assertEquals( $ids['wordpress.org/foo/bar/'], + get_site_by_path( 'wordpress.org', '/foo/bar/baz/', 3 )->blog_id ); + + $this->assertEquals( $ids['wordpress.org/foo/bar/'], + get_site_by_path( 'www.wordpress.org', '/foo/bar/baz/', 3 )->blog_id ); + + $this->assertEquals( $ids['wordpress.org/foo/bar/'], + get_site_by_path( 'wordpress.org', '/foo/bar/baz/', 2 )->blog_id ); + + $this->assertEquals( $ids['wordpress.org/foo/bar/'], + get_site_by_path( 'www.wordpress.org', '/foo/bar/baz/', 2 )->blog_id ); + + $this->assertEquals( $ids['wordpress.org/foo/'], + get_site_by_path( 'wordpress.org', '/foo/bar/baz/', 1 )->blog_id ); + + $this->assertEquals( $ids['wordpress.org/foo/'], + get_site_by_path( 'www.wordpress.org', '/foo/bar/baz/', 1 )->blog_id ); + + $this->assertEquals( $ids['wordpress.org/'], + get_site_by_path( 'wordpress.org', '/', 0 )->blog_id ); + + $this->assertEquals( $ids['wordpress.org/'], + get_site_by_path( 'www.wordpress.org', '/', 0 )->blog_id ); + + $this->assertEquals( $ids['make.wordpress.org/foo/'], + get_site_by_path( 'make.wordpress.org', '/foo/bar/baz/qux/', 4 )->blog_id ); + + $this->assertEquals( $ids['make.wordpress.org/foo/'], + get_site_by_path( 'www.make.wordpress.org', '/foo/bar/baz/qux/', 4 )->blog_id ); + + $this->assertEquals( $ids['www.w.org/'], + get_site_by_path( 'www.w.org', '/', 0 )->blog_id ); + + $this->assertEquals( $ids['www.w.org/'], + get_site_by_path( 'www.w.org', '/notapath/' )->blog_id ); + + $this->assertEquals( $ids['www.w.org/foo/bar/'], + get_site_by_path( 'www.w.org', '/foo/bar/baz/' )->blog_id ); + + $this->assertEquals( $ids['www.w.org/foo/'], + get_site_by_path( 'www.w.org', '/foo/bar/baz/', 1 )->blog_id ); + + // A site installed with www will not be found by the root domain. + $this->assertFalse( get_site_by_path( 'w.org', '/' ) ); + $this->assertFalse( get_site_by_path( 'w.org', '/notapath/' ) ); + $this->assertFalse( get_site_by_path( 'w.org', '/foo/bar/baz/' ) ); + $this->assertFalse( get_site_by_path( 'w.org', '/foo/bar/baz/', 1 ) ); + + // A site will not be found by its root domain when an invalid subdomain is requested. + $this->assertFalse( get_site_by_path( 'invalid.wordpress.org', '/' ) ); + $this->assertFalse( get_site_by_path( 'invalid.wordpress.org', '/foo/bar/' ) ); + } + + /** + * @ticket 27884 + */ + function test_multisite_bootstrap() { + global $current_blog; + + $network_ids = array( + 'wordpress.org/' => array( 'domain' => 'wordpress.org', 'path' => '/' ), + 'make.wordpress.org/' => array( 'domain' => 'make.wordpress.org', 'path' => '/' ), + ); + + foreach ( $network_ids as &$id ) { + $id = $this->factory->network->create( $id ); + } + unset( $id ); + + $ids = array( + 'wordpress.org/' => array( 'domain' => 'wordpress.org', 'path' => '/', 'site_id' => $network_ids['wordpress.org/'] ), + 'wordpress.org/foo/' => array( 'domain' => 'wordpress.org', 'path' => '/foo/', 'site_id' => $network_ids['wordpress.org/'] ), + 'wordpress.org/foo/bar/' => array( 'domain' => 'wordpress.org', 'path' => '/foo/bar/', 'site_id' => $network_ids['wordpress.org/'] ), + 'make.wordpress.org/' => array( 'domain' => 'make.wordpress.org', 'path' => '/', 'site_id' => $network_ids['make.wordpress.org/'] ), + 'make.wordpress.org/foo/' => array( 'domain' => 'make.wordpress.org', 'path' => '/foo/', 'site_id' => $network_ids['make.wordpress.org/'] ), + ); + + foreach ( $ids as &$id ) { + $id = $this->factory->blog->create( $id ); + } + unset( $id ); + + $this->_setup_host_request( 'wordpress.org', '/' ); + $this->assertEquals( $ids['wordpress.org/'], $current_blog->blog_id ); + $this->assertEquals( $network_ids['wordpress.org/'], $current_blog->site_id ); + + $this->_setup_host_request( 'wordpress.org', '/2014/04/23/hello-world/' ); + $this->assertEquals( $ids['wordpress.org/'], $current_blog->blog_id ); + $this->assertEquals( $network_ids['wordpress.org/'], $current_blog->site_id ); + + $this->_setup_host_request( 'wordpress.org', '/sample-page/' ); + $this->assertEquals( $ids['wordpress.org/'], $current_blog->blog_id ); + $this->assertEquals( $network_ids['wordpress.org/'], $current_blog->site_id ); + + $this->_setup_host_request( 'wordpress.org', '/?p=1' ); + $this->assertEquals( $ids['wordpress.org/'], $current_blog->blog_id ); + $this->assertEquals( $network_ids['wordpress.org/'], $current_blog->site_id ); + + $this->_setup_host_request( 'wordpress.org', '/wp-admin/' ); + $this->assertEquals( $ids['wordpress.org/'], $current_blog->blog_id ); + $this->assertEquals( $network_ids['wordpress.org/'], $current_blog->site_id ); + + $this->_setup_host_request( 'wordpress.org', '/foo/' ); + $this->assertEquals( $ids['wordpress.org/foo/'], $current_blog->blog_id ); + $this->assertEquals( $network_ids['wordpress.org/'], $current_blog->site_id ); + + $this->_setup_host_request( 'wordpress.org', '/FOO/' ); + $this->assertEquals( $ids['wordpress.org/foo/'], $current_blog->blog_id ); + $this->assertEquals( $network_ids['wordpress.org/'], $current_blog->site_id ); + + $this->_setup_host_request( 'wordpress.org', '/foo/2014/04/23/hello-world/' ); + $this->assertEquals( $ids['wordpress.org/foo/'], $current_blog->blog_id ); + $this->assertEquals( $network_ids['wordpress.org/'], $current_blog->site_id ); + + $this->_setup_host_request( 'wordpress.org', '/foo/sample-page/' ); + $this->assertEquals( $ids['wordpress.org/foo/'], $current_blog->blog_id ); + $this->assertEquals( $network_ids['wordpress.org/'], $current_blog->site_id ); + + $this->_setup_host_request( 'wordpress.org', '/foo/?p=1' ); + $this->assertEquals( $ids['wordpress.org/foo/'], $current_blog->blog_id ); + $this->assertEquals( $network_ids['wordpress.org/'], $current_blog->site_id ); + + $this->_setup_host_request( 'wordpress.org', '/foo/wp-admin/' ); + $this->assertEquals( $ids['wordpress.org/foo/'], $current_blog->blog_id ); + $this->assertEquals( $network_ids['wordpress.org/'], $current_blog->site_id ); + + // @todo not currently passing. + //$this->_setup_host_request( 'wordpress.org', '/foo/bar/' ); + //$this->assertEquals( $ids['wordpress.org/foo/bar/'], $current_blog->blog_id ); + //$this->assertEquals( $network_ids['wordpress.org/'], $current_blog->site_id ); + + $this->_setup_host_request( 'make.wordpress.org', '/' ); + $this->assertEquals( $ids['make.wordpress.org/'], $current_blog->blog_id ); + $this->assertEquals( $network_ids['make.wordpress.org/'], $current_blog->site_id ); + + $this->_setup_host_request( 'make.wordpress.org', '/foo/' ); + $this->assertEquals( $ids['make.wordpress.org/foo/'], $current_blog->blog_id ); + $this->assertEquals( $network_ids['make.wordpress.org/'], $current_blog->site_id ); + + // Request the original tests domain and path to unpollute the stack. + $this->_setup_host_request( WP_TESTS_DOMAIN, '/' ); + } + + /** + * Reset various globals required for a 'clean' multisite boot. + * + * The $wpdb and $table_prefix globals are required for ms-settings.php to + * load properly. + * + * @param string $domain HTTP_HOST of the bootstrap request. + * @param string $path REQUEST_URI of the boot strap request. + */ + function _setup_host_request( $domain, $path ) { + global $current_site, $current_blog, $table_prefix, $wpdb; + + $table_prefix = WP_TESTS_TABLE_PREFIX; + $current_site = $current_blog = null; + $_SERVER['HTTP_HOST'] = $domain; + $_SERVER['REQUEST_URI'] = $path; + + include ABSPATH . '/wp-includes/ms-settings.php'; + } +} + +endif; \ No newline at end of file diff --git a/tests/phpunit/tests/multisite/network.php b/tests/phpunit/tests/multisite/network.php new file mode 100644 index 0000000000..5b424ca8d4 --- /dev/null +++ b/tests/phpunit/tests/multisite/network.php @@ -0,0 +1,187 @@ +suppress = $wpdb->suppress_errors(); + + $_SERVER[ 'REMOTE_ADDR' ] = ''; + } + + function tearDown() { + global $wpdb; + parent::tearDown(); + $wpdb->suppress_errors( $this->suppress ); + } + + /** + * @ticket 22917 + */ + function test_enable_live_network_site_counts_filter() { + $site_count_start = get_blog_count(); + // false for large networks by default + add_filter( 'enable_live_network_counts', '__return_false' ); + $this->factory->blog->create_many( 4 ); + + // count only updated when cron runs, so unchanged + $this->assertEquals( $site_count_start, (int) get_blog_count() ); + + add_filter( 'enable_live_network_counts', '__return_true' ); + $site_ids = $this->factory->blog->create_many( 4 ); + + $this->assertEquals( $site_count_start + 9, (int) get_blog_count() ); + + //clean up + remove_filter( 'enable_live_network_counts', '__return_false' ); + remove_filter( 'enable_live_network_counts', '__return_true' ); + foreach ( $site_ids as $site_id ) { + wpmu_delete_blog( $site_id, true ); + } + } + /** + * @ticket 22917 + */ + function test_enable_live_network_user_counts_filter() { + // false for large networks by default + add_filter( 'enable_live_network_counts', '__return_false' ); + + // Refresh the cache + wp_update_network_counts(); + $start_count = get_user_count(); + + wpmu_create_user( 'user', 'pass', 'email' ); + + // No change, cache not refreshed + $count = get_user_count(); + + $this->assertEquals( $start_count, $count ); + + wp_update_network_counts(); + $start_count = get_user_count(); + + add_filter( 'enable_live_network_counts', '__return_true' ); + + wpmu_create_user( 'user2', 'pass2', 'email2' ); + + $count = get_user_count(); + $this->assertEquals( $start_count + 1, $count ); + + remove_filter( 'enable_live_network_counts', '__return_false' ); + remove_filter( 'enable_live_network_counts', '__return_true' ); + } + + function test_active_network_plugins() { + $path = "hello.php"; + + // local activate, should be invisible for the network + activate_plugin($path); // $network_wide = false + $active_plugins = wp_get_active_network_plugins(); + $this->assertEquals( Array(), $active_plugins ); + + add_action( 'deactivated_plugin', array( $this, '_helper_deactivate_hook' ) ); + + // activate the plugin sitewide + activate_plugin($path, '', $network_wide = true); + $active_plugins = wp_get_active_network_plugins(); + $this->assertEquals( Array(WP_PLUGIN_DIR . '/hello.php'), $active_plugins ); + + //deactivate the plugin + deactivate_plugins($path); + $active_plugins = wp_get_active_network_plugins(); + $this->assertEquals( Array(), $active_plugins ); + + $this->assertEquals( 1, $this->plugin_hook_count ); // testing actions and silent mode + + activate_plugin($path, '', $network_wide = true); + deactivate_plugins($path, true); // silent + + $this->assertEquals( 1, $this->plugin_hook_count ); // testing actions and silent mode + } + + /** + * @ticket 28651 + */ + function test_duplicate_network_active_plugin() { + $path = "hello.php"; + $mock = new MockAction(); + add_action( 'activate_' . $path, array ( $mock, 'action' ) ); + + // should activate on the first try + activate_plugin( $path, '', true ); + $active_plugins = wp_get_active_network_plugins(); + $this->assertCount( 1, $active_plugins ); + $this->assertEquals( 1, $mock->get_call_count() ); + + // should do nothing on the second try + activate_plugin( $path, '', true ); + $active_plugins = wp_get_active_network_plugins(); + $this->assertCount( 1, $active_plugins ); + $this->assertEquals( 1, $mock->get_call_count() ); + + remove_action( 'activate_' . $path, array ( $mock, 'action' ) ); + } + + function _helper_deactivate_hook() { + $this->plugin_hook_count++; + } + + function test_get_user_count() { + // Refresh the cache + wp_update_network_counts(); + $start_count = get_user_count(); + + // Only false for large networks as of 3.7 + add_filter( 'enable_live_network_counts', '__return_false' ); + $this->factory->user->create( array( 'role' => 'administrator' ) ); + + $count = get_user_count(); // No change, cache not refreshed + $this->assertEquals( $start_count, $count ); + + wp_update_network_counts(); // Magic happens here + + $count = get_user_count(); + $this->assertEquals( $start_count + 1, $count ); + remove_filter( 'enable_live_network_counts', '__return_false' ); + } + + function test_wp_schedule_update_network_counts() { + $this->assertFalse(wp_next_scheduled('update_network_counts')); + + // We can't use wp_schedule_update_network_counts() because WP_INSTALLING is set + wp_schedule_event(time(), 'twicedaily', 'update_network_counts'); + + $this->assertInternalType('int', wp_next_scheduled('update_network_counts')); + } + + /** + * @expectedDeprecated get_dashboard_blog + */ + function test_get_dashboard_blog() { + // if there is no dashboard blog set, current blog is used + $dashboard_blog = get_dashboard_blog(); + $this->assertEquals( 1, $dashboard_blog->blog_id ); + + $user_id = $this->factory->user->create( array( 'role' => 'administrator' ) ); + $blog_id = $this->factory->blog->create( array( 'user_id' => $user_id ) ); + $this->assertInternalType( 'int', $blog_id ); + + // set the dashboard blog to another one + update_site_option( 'dashboard_blog', $blog_id ); + $dashboard_blog = get_dashboard_blog(); + $this->assertEquals( $blog_id, $dashboard_blog->blog_id ); + } +} + +endif; \ No newline at end of file diff --git a/tests/phpunit/tests/ms.php b/tests/phpunit/tests/multisite/site.php similarity index 59% rename from tests/phpunit/tests/ms.php rename to tests/phpunit/tests/multisite/site.php index c61a522e06..56081fe79f 100644 --- a/tests/phpunit/tests/ms.php +++ b/tests/phpunit/tests/multisite/site.php @@ -3,12 +3,12 @@ if ( is_multisite() ) : /** - * A set of unit tests for WordPress Multisite + * Tests specific to sites in multisite. * + * @group ms-site * @group multisite */ -class Tests_MS extends WP_UnitTestCase { - protected $plugin_hook_count = 0; +class Tests_Multisite_Site extends WP_UnitTestCase { protected $suppress = false; function setUp() { @@ -16,7 +16,7 @@ class Tests_MS extends WP_UnitTestCase { parent::setUp(); $this->suppress = $wpdb->suppress_errors(); - $_SERVER['REMOTE_ADDR'] = ''; + $_SERVER[ 'REMOTE_ADDR' ] = ''; } function tearDown() { @@ -25,75 +25,50 @@ class Tests_MS extends WP_UnitTestCase { $wpdb->suppress_errors( $this->suppress ); } - function test_remove_user_from_blog() { - $user1 = $this->factory->user->create_and_get(); - $user2 = $this->factory->user->create_and_get(); + function test_switch_restore_blog() { + global $_wp_switched_stack, $wpdb; - $post_id = $this->factory->post->create( array( 'post_author' => $user1->ID ) ); + $this->assertEquals( array(), $_wp_switched_stack ); + $this->assertFalse( ms_is_switched() ); + $current_blog_id = get_current_blog_id(); + $this->assertInternalType( 'integer', $current_blog_id ); - remove_user_from_blog( $user1->ID, 1, $user2->ID ); + wp_cache_set( 'switch-test', $current_blog_id, 'switch-test' ); + $this->assertEquals( $current_blog_id, wp_cache_get( 'switch-test', 'switch-test' ) ); - $post = get_post( $post_id ); + $user_id = $this->factory->user->create( array( 'role' => 'administrator' ) ); + $blog_id = $this->factory->blog->create( array( 'user_id' => $user_id, 'path' => '/test_blogpath', 'title' => 'Test Title' ) ); - $this->assertNotEquals( $user1->ID, $post->post_author ); - $this->assertEquals( $user2->ID, $post->post_author ); - } + $cap_key = wp_get_current_user()->cap_key; + switch_to_blog( $blog_id ); + $this->assertNotEquals( $cap_key, wp_get_current_user()->cap_key ); + $this->assertEquals( array( $current_blog_id ), $_wp_switched_stack ); + $this->assertTrue( ms_is_switched() ); + $this->assertEquals( $blog_id, $wpdb->blogid ); + $this->assertFalse( wp_cache_get( 'switch-test', 'switch-test' ) ); + wp_cache_set( 'switch-test', $blog_id, 'switch-test' ); + $this->assertEquals( $blog_id, wp_cache_get( 'switch-test', 'switch-test' ) ); - /** - * @ticket 22917 - */ - function test_enable_live_network_site_counts_filter() { - $site_count_start = get_blog_count(); - // false for large networks by default - add_filter( 'enable_live_network_counts', '__return_false' ); - $this->factory->blog->create_many( 4 ); + switch_to_blog( $blog_id ); + $this->assertEquals( array( $current_blog_id, $blog_id ), $_wp_switched_stack ); + $this->assertTrue( ms_is_switched() ); + $this->assertEquals( $blog_id, $wpdb->blogid ); + $this->assertEquals( $blog_id, wp_cache_get( 'switch-test', 'switch-test' ) ); - // count only updated when cron runs, so unchanged - $this->assertEquals( $site_count_start, (int) get_blog_count() ); + restore_current_blog(); + $this->assertEquals( array( $current_blog_id ), $_wp_switched_stack ); + $this->assertTrue( ms_is_switched() ); + $this->assertEquals( $blog_id, $wpdb->blogid ); + $this->assertEquals( $blog_id, wp_cache_get( 'switch-test', 'switch-test' ) ); - add_filter( 'enable_live_network_counts', '__return_true' ); - $site_ids = $this->factory->blog->create_many( 4 ); + restore_current_blog(); + $this->assertEquals( $cap_key, wp_get_current_user()->cap_key ); + $this->assertEquals( $current_blog_id, get_current_blog_id() ); + $this->assertEquals( array(), $_wp_switched_stack ); + $this->assertFalse( ms_is_switched() ); + $this->assertEquals( $current_blog_id, wp_cache_get( 'switch-test', 'switch-test' ) ); - $this->assertEquals( $site_count_start + 9, (int) get_blog_count() ); - - //clean up - remove_filter( 'enable_live_network_counts', '__return_false' ); - remove_filter( 'enable_live_network_counts', '__return_true' ); - foreach ( $site_ids as $site_id ) { - wpmu_delete_blog( $site_id, true ); - } - } - - /** - * @ticket 22917 - */ - function test_enable_live_network_user_counts_filter() { - // false for large networks by default - add_filter( 'enable_live_network_counts', '__return_false' ); - - // Refresh the cache - wp_update_network_counts(); - $start_count = get_user_count(); - - wpmu_create_user( 'user', 'pass', 'email' ); - - // No change, cache not refreshed - $count = get_user_count(); - - $this->assertEquals( $start_count, $count ); - - wp_update_network_counts(); - $start_count = get_user_count(); - - add_filter( 'enable_live_network_counts', '__return_true' ); - - wpmu_create_user( 'user2', 'pass2', 'email2' ); - - $count = get_user_count(); - $this->assertEquals( $start_count + 1, $count ); - - remove_filter( 'enable_live_network_counts', '__return_false' ); - remove_filter( 'enable_live_network_counts', '__return_true' ); + $this->assertFalse( restore_current_blog() ); } function test_create_and_delete_blog() { @@ -177,279 +152,6 @@ class Tests_MS extends WP_UnitTestCase { $this->assertEquals( 1, get_blog_count() ); } - function test_get_blogs_of_user() { - // Logged out users don't have blogs. - $this->assertEquals( array(), get_blogs_of_user( 0 ) ); - - $user1_id = $this->factory->user->create( array( 'role' => 'administrator' ) ); - $blog_ids = $this->factory->blog->create_many( 10, array( 'user_id' => $user1_id ) ); - - foreach ( $blog_ids as $blog_id ) - $this->assertInternalType( 'int', $blog_id ); - - $blogs_of_user = array_keys( get_blogs_of_user( $user1_id, false ) ); - sort( $blogs_of_user ); - $this->assertEquals ( array_merge( array( 1 ), $blog_ids), $blogs_of_user ); - - $this->assertTrue( remove_user_from_blog( $user1_id, 1 ) ); - - $blogs_of_user = array_keys( get_blogs_of_user( $user1_id, false ) ); - sort( $blogs_of_user ); - $this->assertEquals ( $blog_ids, $blogs_of_user ); - - foreach ( get_blogs_of_user( $user1_id, false ) as $blog ) { - $this->assertTrue( isset( $blog->userblog_id ) ); - $this->assertTrue( isset( $blog->blogname ) ); - $this->assertTrue( isset( $blog->domain ) ); - $this->assertTrue( isset( $blog->path ) ); - $this->assertTrue( isset( $blog->site_id ) ); - $this->assertTrue( isset( $blog->siteurl ) ); - $this->assertTrue( isset( $blog->archived ) ); - $this->assertTrue( isset( $blog->spam ) ); - $this->assertTrue( isset( $blog->deleted ) ); - } - - // Non-existent users don't have blogs. - wpmu_delete_user( $user1_id ); - $user = new WP_User( $user1_id ); - $this->assertFalse( $user->exists(), 'WP_User->exists' ); - $this->assertEquals( array(), get_blogs_of_user( $user1_id ) ); - } - - /** - * @expectedDeprecated is_blog_user - */ - function test_is_blog_user() { - global $wpdb; - - $user1_id = $this->factory->user->create( array( 'role' => 'administrator' ) ); - - $old_current = get_current_user_id(); - wp_set_current_user( $user1_id ); - - $this->assertTrue( is_blog_user() ); - $this->assertTrue( is_blog_user( $wpdb->blogid ) ); - - $blog_ids = array(); - - $blog_ids = $this->factory->blog->create_many( 5 ); - foreach ( $blog_ids as $blog_id ) { - $this->assertInternalType( 'int', $blog_id ); - $this->assertTrue( is_blog_user( $blog_id ) ); - $this->assertTrue( remove_user_from_blog( $user1_id, $blog_id ) ); - $this->assertFalse( is_blog_user( $blog_id ) ); - } - - wp_set_current_user( $old_current ); - } - - function test_is_user_member_of_blog() { - global $wpdb; - - $user1_id = $this->factory->user->create( array( 'role' => 'administrator' ) ); - - $old_current = get_current_user_id(); - wp_set_current_user( $user1_id ); - - $this->assertTrue( is_user_member_of_blog() ); - $this->assertTrue( is_user_member_of_blog( 0, 0 ) ); - $this->assertTrue( is_user_member_of_blog( 0, $wpdb->blogid ) ); - $this->assertTrue( is_user_member_of_blog( $user1_id ) ); - $this->assertTrue( is_user_member_of_blog( $user1_id, $wpdb->blogid ) ); - - $blog_ids = $this->factory->blog->create_many( 5 ); - foreach ( $blog_ids as $blog_id ) { - $this->assertInternalType( 'int', $blog_id ); - $this->assertTrue( is_user_member_of_blog( $user1_id, $blog_id ) ); - $this->assertTrue( remove_user_from_blog( $user1_id, $blog_id ) ); - $this->assertFalse( is_user_member_of_blog( $user1_id, $blog_id ) ); - } - - wpmu_delete_user( $user1_id ); - $user = new WP_User( $user1_id ); - $this->assertFalse( $user->exists(), 'WP_User->exists' ); - $this->assertFalse( is_user_member_of_blog( $user1_id ), 'is_user_member_of_blog' ); - - wp_set_current_user( $old_current ); - } - - function test_active_network_plugins() { - $path = "hello.php"; - - // local activate, should be invisible for the network - activate_plugin($path); // $network_wide = false - $active_plugins = wp_get_active_network_plugins(); - $this->assertEquals( Array(), $active_plugins ); - - add_action( 'deactivated_plugin', array( $this, '_helper_deactivate_hook' ) ); - - // activate the plugin sitewide - activate_plugin($path, '', $network_wide = true); - $active_plugins = wp_get_active_network_plugins(); - $this->assertEquals( Array(WP_PLUGIN_DIR . '/hello.php'), $active_plugins ); - - //deactivate the plugin - deactivate_plugins($path); - $active_plugins = wp_get_active_network_plugins(); - $this->assertEquals( Array(), $active_plugins ); - - $this->assertEquals( 1, $this->plugin_hook_count ); // testing actions and silent mode - - activate_plugin($path, '', $network_wide = true); - deactivate_plugins($path, true); // silent - - $this->assertEquals( 1, $this->plugin_hook_count ); // testing actions and silent mode - } - - /** - * @ticket 28651 - */ - function test_duplicate_network_active_plugin() { - $path = "hello.php"; - $mock = new MockAction(); - add_action( 'activate_' . $path, array ( $mock, 'action' ) ); - - // should activate on the first try - activate_plugin( $path, '', true ); - $active_plugins = wp_get_active_network_plugins(); - $this->assertCount( 1, $active_plugins ); - $this->assertEquals( 1, $mock->get_call_count() ); - - // should do nothing on the second try - activate_plugin( $path, '', true ); - $active_plugins = wp_get_active_network_plugins(); - $this->assertCount( 1, $active_plugins ); - $this->assertEquals( 1, $mock->get_call_count() ); - - remove_action( 'activate_' . $path, array ( $mock, 'action' ) ); - } - - function _helper_deactivate_hook() { - $this->plugin_hook_count++; - } - - function test_get_user_count() { - // Refresh the cache - wp_update_network_counts(); - $start_count = get_user_count(); - - // Only false for large networks as of 3.7 - add_filter( 'enable_live_network_counts', '__return_false' ); - $this->factory->user->create( array( 'role' => 'administrator' ) ); - - $count = get_user_count(); // No change, cache not refreshed - $this->assertEquals( $start_count, $count ); - - wp_update_network_counts(); // Magic happens here - - $count = get_user_count(); - $this->assertEquals( $start_count + 1, $count ); - remove_filter( 'enable_live_network_counts', '__return_false' ); - } - - function test_wp_schedule_update_network_counts() { - $this->assertFalse(wp_next_scheduled('update_network_counts')); - - // We can't use wp_schedule_update_network_counts() because WP_INSTALLING is set - wp_schedule_event(time(), 'twicedaily', 'update_network_counts'); - - $this->assertInternalType('int', wp_next_scheduled('update_network_counts')); - } - - function test_users_can_register_signup_filter() { - - $registration = get_site_option('registration'); - $this->assertFalse( users_can_register_signup_filter() ); - - update_site_option('registration', 'all'); - $this->assertTrue( users_can_register_signup_filter() ); - - update_site_option('registration', 'user'); - $this->assertTrue( users_can_register_signup_filter() ); - - update_site_option('registration', 'none'); - $this->assertFalse( users_can_register_signup_filter() ); - } - - /** - * @expectedDeprecated get_dashboard_blog - */ - function test_get_dashboard_blog() { - // if there is no dashboard blog set, current blog is used - $dashboard_blog = get_dashboard_blog(); - $this->assertEquals( 1, $dashboard_blog->blog_id ); - - $user_id = $this->factory->user->create( array( 'role' => 'administrator' ) ); - $blog_id = $this->factory->blog->create( array( 'user_id' => $user_id ) ); - $this->assertInternalType( 'int', $blog_id ); - - // set the dashboard blog to another one - update_site_option( 'dashboard_blog', $blog_id ); - $dashboard_blog = get_dashboard_blog(); - $this->assertEquals( $blog_id, $dashboard_blog->blog_id ); - } - - function test_wpmu_log_new_registrations() { - global $wpdb; - - $user = new WP_User( 1 ); - $ip = preg_replace( '/[^0-9., ]/', '',$_SERVER['REMOTE_ADDR'] ); - - wpmu_log_new_registrations(1,1); - - // currently there is no wrapper function for the registration_log - $reg_blog = $wpdb->get_col( "SELECT email FROM {$wpdb->registration_log} WHERE {$wpdb->registration_log}.blog_id = 1 AND IP LIKE '" . $ip . "'" ); - $this->assertEquals( $user->user_email, $reg_blog[ count( $reg_blog )-1 ] ); - } - - /** - * @ticket 18119 - */ - function test_upload_is_user_over_quota() { - $default_space_allowed = 100; - $echo = false; - - $this->assertFalse( upload_is_user_over_quota( $echo ) ); - $this->assertTrue( is_upload_space_available() ); - - update_site_option('upload_space_check_disabled', true); - $this->assertFalse( upload_is_user_over_quota( $echo ) ); - $this->assertTrue( is_upload_space_available() ); - - update_site_option( 'blog_upload_space', 0 ); - $this->assertFalse( upload_is_user_over_quota( $echo ) ); - $this->assertEquals( $default_space_allowed, get_space_allowed() ); - $this->assertTrue( is_upload_space_available() ); - - update_site_option('upload_space_check_disabled', false); - $this->assertFalse( upload_is_user_over_quota( $echo ) ); - $this->assertTrue( is_upload_space_available() ); - - if ( defined( 'BLOGSUPLOADDIR' ) && ! file_exists( BLOGSUPLOADDIR ) ) - $this->markTestSkipped( 'This test is broken when blogs.dir does not exist. '); - - /* - This is broken when blogs.dir does not exist, as get_upload_space_available() - simply returns the value of blog_upload_space (converted to bytes), which would - be negative but still not false. When blogs.dir does exist, < 0 is returned as 0. - */ - - update_site_option( 'blog_upload_space', -1 ); - $this->assertTrue( upload_is_user_over_quota( $echo ) ); - $this->assertEquals( -1, get_space_allowed() ); - $this->assertFalse( is_upload_space_available() ); - - update_option( 'blog_upload_space', 0 ); - $this->assertFalse( upload_is_user_over_quota( $echo ) ); - $this->assertEquals( $default_space_allowed, get_space_allowed() ); - $this->assertTrue( is_upload_space_available() ); - - update_option( 'blog_upload_space', -1 ); - $this->assertTrue( upload_is_user_over_quota( $echo ) ); - $this->assertEquals( -1, get_space_allowed() ); - $this->assertFalse( is_upload_space_available() ); - } - function test_wpmu_update_blogs_date() { global $wpdb; @@ -483,11 +185,6 @@ class Tests_MS extends WP_UnitTestCase { $this->assertEquals( $blog_id, get_id_from_blogname('test_blogname') ); } - function _action_counter_cb( $blog_id ) { - global $test_action_counter; - $test_action_counter++; - } - function test_update_blog_details() { global $test_action_counter; @@ -640,6 +337,11 @@ class Tests_MS extends WP_UnitTestCase { remove_action( 'unmature_blog', array( $this, '_action_counter_cb' ), 10, 1 ); } + function _action_counter_cb( $blog_id ) { + global $test_action_counter; + $test_action_counter++; + } + /** * Test fetching a blog that doesn't exist and again after it exists. * @@ -867,277 +569,6 @@ class Tests_MS extends WP_UnitTestCase { $this->assertEquals( 1, $result ); } - function test_switch_restore_blog() { - global $_wp_switched_stack, $wpdb; - - $this->assertEquals( array(), $_wp_switched_stack ); - $this->assertFalse( ms_is_switched() ); - $current_blog_id = get_current_blog_id(); - $this->assertInternalType( 'integer', $current_blog_id ); - - wp_cache_set( 'switch-test', $current_blog_id, 'switch-test' ); - $this->assertEquals( $current_blog_id, wp_cache_get( 'switch-test', 'switch-test' ) ); - - $user_id = $this->factory->user->create( array( 'role' => 'administrator' ) ); - $blog_id = $this->factory->blog->create( array( 'user_id' => $user_id, 'path' => '/test_blogpath', 'title' => 'Test Title' ) ); - - $cap_key = wp_get_current_user()->cap_key; - switch_to_blog( $blog_id ); - $this->assertNotEquals( $cap_key, wp_get_current_user()->cap_key ); - $this->assertEquals( array( $current_blog_id ), $_wp_switched_stack ); - $this->assertTrue( ms_is_switched() ); - $this->assertEquals( $blog_id, $wpdb->blogid ); - $this->assertFalse( wp_cache_get( 'switch-test', 'switch-test' ) ); - wp_cache_set( 'switch-test', $blog_id, 'switch-test' ); - $this->assertEquals( $blog_id, wp_cache_get( 'switch-test', 'switch-test' ) ); - - switch_to_blog( $blog_id ); - $this->assertEquals( array( $current_blog_id, $blog_id ), $_wp_switched_stack ); - $this->assertTrue( ms_is_switched() ); - $this->assertEquals( $blog_id, $wpdb->blogid ); - $this->assertEquals( $blog_id, wp_cache_get( 'switch-test', 'switch-test' ) ); - - restore_current_blog(); - $this->assertEquals( array( $current_blog_id ), $_wp_switched_stack ); - $this->assertTrue( ms_is_switched() ); - $this->assertEquals( $blog_id, $wpdb->blogid ); - $this->assertEquals( $blog_id, wp_cache_get( 'switch-test', 'switch-test' ) ); - - restore_current_blog(); - $this->assertEquals( $cap_key, wp_get_current_user()->cap_key ); - $this->assertEquals( $current_blog_id, get_current_blog_id() ); - $this->assertEquals( array(), $_wp_switched_stack ); - $this->assertFalse( ms_is_switched() ); - $this->assertEquals( $current_blog_id, wp_cache_get( 'switch-test', 'switch-test' ) ); - - $this->assertFalse( restore_current_blog() ); - } - - function test_get_blog_post() { - $user_id = $this->factory->user->create( array( 'role' => 'administrator' ) ); - $blog_id = $this->factory->blog->create( array( 'user_id' => $user_id, 'path' => '/test_blogpath', 'title' => 'Test Title' ) ); - $current_blog_id = get_current_blog_id(); - - $post_id = $this->factory->post->create(); - $this->assertInstanceOf( 'WP_Post', get_post( $post_id ) ); - switch_to_blog( $blog_id ); - $this->assertNull( get_post( $post_id ) ); - $post = get_blog_post( $current_blog_id, $post_id ); - $this->assertInstanceOf( 'WP_Post', $post ); - $this->assertEquals( $post_id, $post->ID ); - restore_current_blog(); - - wp_update_post( array( 'ID' => $post_id, 'post_title' => 'A Different Title' ) ); - switch_to_blog( $blog_id ); - $post = get_blog_post( $current_blog_id, $post_id ); - // Make sure cache is good - $this->assertEquals( 'A Different Title', $post->post_title ); - - $post_id2 = $this->factory->post->create(); - // Test get_blog_post() with currently active blog ID. - $post = get_blog_post( $blog_id, $post_id2 ); - $this->assertInstanceOf( 'WP_Post', $post ); - $this->assertEquals( $post_id2, $post->ID ); - restore_current_blog(); - } - - /** - * @ticket 21570 - */ - function test_aggressiveness_of_is_email_address_unsafe() { - update_site_option( 'banned_email_domains', array( 'bar.com', 'foo.co' ) ); - - foreach ( array( 'test@bar.com', 'test@foo.bar.com', 'test@foo.co', 'test@subdomain.foo.co' ) as $email_address ) { - $this->assertTrue( is_email_address_unsafe( $email_address ), "$email_address should be UNSAFE" ); - } - - foreach ( array( 'test@foobar.com', 'test@foo-bar.com', 'test@foo.com', 'test@subdomain.foo.com' ) as $email_address ) { - $this->assertFalse( is_email_address_unsafe( $email_address ), "$email_address should be SAFE" ); - } - } - - /** - * @ticket 25046 - */ - function test_case_sensitivity_of_is_email_address_unsafe() { - update_site_option( 'banned_email_domains', array( 'baR.com', 'Foo.co', 'barfoo.COM', 'BAZ.com' ) ); - - foreach ( array( 'test@Bar.com', 'tEst@bar.com', 'test@barFoo.com', 'tEst@foo.bar.com', 'test@baz.Com' ) as $email_address ) { - $this->assertTrue( is_email_address_unsafe( $email_address ), "$email_address should be UNSAFE" ); - } - - foreach ( array( 'test@Foobar.com', 'test@Foo-bar.com', 'tEst@foobar.com', 'test@Subdomain.Foo.com', 'test@fooBAz.com' ) as $email_address ) { - $this->assertFalse( is_email_address_unsafe( $email_address ), "$email_address should be SAFE" ); - } - - } - /** - * @ticket 21552 - * @ticket 23418 - */ - function test_sanitize_ms_options() { - update_site_option( 'illegal_names', array( '', 'Woo', '' ) ); - update_site_option( 'limited_email_domains', array( 'woo', '', 'boo.com', 'foo.net.biz..' ) ); - update_site_option( 'banned_email_domains', array( 'woo', '', 'boo.com', 'foo.net.biz..' ) ); - - $this->assertEquals( array( 'Woo' ), get_site_option( 'illegal_names' ) ); - $this->assertEquals( array( 'woo', 'boo.com' ), get_site_option( 'limited_email_domains' ) ); - $this->assertEquals( array( 'woo', 'boo.com' ), get_site_option( 'banned_email_domains' ) ); - - update_site_option( 'illegal_names', 'foo bar' ); - update_site_option( 'limited_email_domains', "foo\nbar" ); - update_site_option( 'banned_email_domains', "foo\nbar" ); - - $this->assertEquals( array( 'foo', 'bar' ), get_site_option( 'illegal_names' ) ); - $this->assertEquals( array( 'foo', 'bar' ), get_site_option( 'limited_email_domains' ) ); - $this->assertEquals( array( 'foo', 'bar' ), get_site_option( 'banned_email_domains' ) ); - - foreach ( array( 'illegal_names', 'limited_email_domains', 'banned_email_domains' ) as $option ) { - update_site_option( $option, array() ); - $this->assertSame( '', get_site_option( $option ) ); - } - } - - function _domain_exists_cb( $exists, $domain, $path, $site_id ) { - if ( 'foo' == $domain && 'bar/' == $path ) - return 1234; - else - return null; - } - - function test_domain_exists() { - $user_id = $this->factory->user->create( array( 'role' => 'administrator' ) ); - $blog_id = $this->factory->blog->create( array( 'user_id' => $user_id, 'path' => '/testdomainexists', 'title' => 'Test Title' ) ); - - $details = get_blog_details( $blog_id, false ); - - $this->assertEquals( $blog_id, domain_exists( $details->domain, $details->path ) ); - $this->assertEquals( $blog_id, domain_exists( $details->domain, $details->path, $details->site_id ) ); - $this->assertEquals( null, domain_exists( $details->domain, $details->path, 999 ) ); - $this->assertEquals( null, domain_exists( 'foo', 'bar' ) ); - - add_filter( 'domain_exists', array( $this, '_domain_exists_cb' ), 10, 4 ); - $this->assertEquals( 1234, domain_exists( 'foo', 'bar' ) ); - $this->assertEquals( null, domain_exists( 'foo', 'baz' ) ); - $this->assertEquals( null, domain_exists( 'bar', 'foo' ) ); - - // Make sure the same result is returned with or without a trailing slash - $this->assertEquals( domain_exists( 'foo', 'bar' ), domain_exists( 'foo', 'bar/' ) ); - - remove_filter( 'domain_exists', array( $this, '_domain_exists_cb' ), 10, 4 ); - $this->assertEquals( null, domain_exists( 'foo', 'bar' ) ); - - wpmu_delete_blog( $blog_id ); - $this->assertEquals( $blog_id, domain_exists( $details->domain, $details->path ) ); - wpmu_delete_blog( $blog_id, true ); - $this->assertEquals( null, domain_exists( $details->domain, $details->path ) ); - } - - function test_get_blog_id_from_url() { - $user_id = $this->factory->user->create( array( 'role' => 'administrator' ) ); - $blog_id = $this->factory->blog->create( array( 'user_id' => $user_id, 'path' => '/testdomainexists', 'title' => 'Test Title' ) ); - - $details = get_blog_details( $blog_id, false ); - - $this->assertEquals( $blog_id, get_blog_id_from_url( $details->domain, $details->path ) ); - $key = md5( $details->domain . $details->path ); - $this->assertEquals( $blog_id, wp_cache_get( $key, 'blog-id-cache' ) ); - - $this->assertEquals( 0, get_blog_id_from_url( $details->domain, 'foo' ) ); - - wpmu_delete_blog( $blog_id ); - $this->assertEquals( $blog_id, get_blog_id_from_url( $details->domain, $details->path ) ); - wpmu_delete_blog( $blog_id, true ); - - $this->assertEquals( false, wp_cache_get( $key, 'blog-id-cache' ) ); - $this->assertEquals( 0, get_blog_id_from_url( $details->domain, $details->path ) ); - } - - function test_is_main_site() { - $this->assertTrue( is_main_site() ); - $this->assertTrue( is_main_site( get_current_blog_id() ) ); - - $user_id = $this->factory->user->create( array( 'role' => 'administrator' ) ); - $blog_id = $this->factory->blog->create( array( 'user_id' => $user_id ) ); - - switch_to_blog( $blog_id ); - $this->assertFalse( is_main_site( $blog_id ) ); - $this->assertFalse( is_main_site( get_current_blog_id() ) ); - $this->assertFalse( is_main_site() ); - - restore_current_blog(); - } - - function test_switch_upload_dir() { - $this->assertTrue( is_main_site() ); - - $site = get_current_site(); - - $info = wp_upload_dir(); - $this->assertEquals( 'http://' . $site->domain . '/wp-content/uploads/' . gmstrftime('%Y/%m'), $info['url'] ); - $this->assertEquals( ABSPATH . 'wp-content/uploads/' . gmstrftime('%Y/%m'), $info['path'] ); - $this->assertEquals( gmstrftime('/%Y/%m'), $info['subdir'] ); - $this->assertEquals( '', $info['error'] ); - - $user_id = $this->factory->user->create( array( 'role' => 'administrator' ) ); - $blog_id = $this->factory->blog->create( array( 'user_id' => $user_id ) ); - - switch_to_blog( $blog_id ); - $info = wp_upload_dir(); - $this->assertEquals( 'http://' . $site->domain . '/wp-content/uploads/sites/' . get_current_blog_id() . '/' . gmstrftime('%Y/%m'), $info['url'] ); - $this->assertEquals( ABSPATH . 'wp-content/uploads/sites/' . get_current_blog_id() . '/' . gmstrftime('%Y/%m'), $info['path'] ); - $this->assertEquals( gmstrftime('/%Y/%m'), $info['subdir'] ); - $this->assertEquals( '', $info['error'] ); - restore_current_blog(); - - $info = wp_upload_dir(); - $this->assertEquals( 'http://' . $site->domain . '/wp-content/uploads/' . gmstrftime('%Y/%m'), $info['url'] ); - $this->assertEquals( ABSPATH . 'wp-content/uploads/' . gmstrftime('%Y/%m'), $info['path'] ); - $this->assertEquals( gmstrftime('/%Y/%m'), $info['subdir'] ); - $this->assertEquals( '', $info['error'] ); - - update_site_option( 'ms_files_rewriting', 1 ); - ms_upload_constants(); - - $user_id = $this->factory->user->create( array( 'role' => 'administrator' ) ); - $blog_id2 = $this->factory->blog->create( array( 'user_id' => $user_id ) ); - $info = wp_upload_dir(); - $this->assertEquals( 'http://' . $site->domain . '/wp-content/uploads/' . gmstrftime('%Y/%m'), $info['url'] ); - $this->assertEquals( ABSPATH . 'wp-content/uploads/' . gmstrftime('%Y/%m'), $info['path'] ); - $this->assertEquals( gmstrftime('/%Y/%m'), $info['subdir'] ); - $this->assertEquals( '', $info['error'] ); - - switch_to_blog( $blog_id2 ); - $info2 = wp_upload_dir(); - $this->assertNotEquals( $info, $info2 ); - $this->assertEquals( get_option( 'siteurl' ) . '/wp-content/blogs.dir/' . get_current_blog_id() . '/files/' . gmstrftime('%Y/%m'), $info2['url'] ); - $this->assertEquals( ABSPATH . 'wp-content/blogs.dir/' . get_current_blog_id() . '/files/' . gmstrftime('%Y/%m'), $info2['path'] ); - $this->assertEquals( gmstrftime('/%Y/%m'), $info2['subdir'] ); - $this->assertEquals( '', $info2['error'] ); - restore_current_blog(); - update_site_option( 'ms_files_rewriting', 0 ); - } - - /** - * @ticket 23192 - */ - function test_is_user_spammy() { - $user_id = $this->factory->user->create( array( - 'role' => 'author', - 'user_login' => 'testuser1', - ) ); - - $spam_username = (string) $user_id; - $spam_user_id = $this->factory->user->create( array( - 'role' => 'author', - 'user_login' => $spam_username, - ) ); - update_user_status( $spam_user_id, 'spam', '1' ); - - $this->assertTrue( is_user_spammy( $spam_username ) ); - $this->assertFalse( is_user_spammy( 'testuser1' ) ); - } - /** * @ticket 14511 */ @@ -1199,215 +630,6 @@ class Tests_MS extends WP_UnitTestCase { $this->assertCount( 0, wp_get_sites( array( 'offset' => 20 ) ) ); } - /** - * @ticket 27003 - */ - function test_get_network_by_path() { - global $wpdb; - - $ids = array( - 'wordpress.org/' => array( 'domain' => 'wordpress.org', 'path' => '/' ), - 'wordpress.org/one/' => array( 'domain' => 'wordpress.org', 'path' => '/one/' ), - 'wordpress.net/' => array( 'domain' => 'wordpress.net', 'path' => '/' ), - 'www.wordpress.net/' => array( 'domain' => 'www.wordpress.net', 'path' => '/' ), - 'www.wordpress.net/two/' => array( 'domain' => 'www.wordpress.net', 'path' => '/two/' ), - 'wordpress.net/three/' => array( 'domain' => 'wordpress.net', 'path' => '/three/' ), - ); - - foreach ( $ids as &$id ) { - $id = $this->factory->network->create( $id ); - } - unset( $id ); - - $this->assertEquals( $ids['www.wordpress.net/'], - get_network_by_path( 'www.wordpress.net', '/notapath/' )->id ); - - $this->assertEquals( $ids['www.wordpress.net/two/'], - get_network_by_path( 'www.wordpress.net', '/two/' )->id ); - - // This should find /one/ despite the www. - $this->assertEquals( $ids['wordpress.org/one/'], - get_network_by_path( 'www.wordpress.org', '/one/' )->id ); - - // This should not find /one/ because the domains don't match. - $this->assertEquals( $ids['wordpress.org/'], - get_network_by_path( 'site1.wordpress.org', '/one/' )->id ); - - $this->assertEquals( $ids['wordpress.net/three/'], - get_network_by_path( 'wordpress.net', '/three/' )->id ); - - $this->assertEquals( $ids['wordpress.net/'], - get_network_by_path( 'wordpress.net', '/notapath/' )->id ); - - $this->assertEquals( $ids['wordpress.net/'], - get_network_by_path( 'site1.wordpress.net', '/notapath/' )->id ); - - $this->assertEquals( $ids['wordpress.net/'], - get_network_by_path( 'site1.wordpress.net', '/three/' )->id ); - } - - /** - * @ticket 27003 - * @ticket 27927 - */ - function test_get_site_by_path() { - $ids = array( - 'wordpress.org/' => array( 'domain' => 'wordpress.org', 'path' => '/' ), - 'wordpress.org/foo/' => array( 'domain' => 'wordpress.org', 'path' => '/foo/' ), - 'wordpress.org/foo/bar/' => array( 'domain' => 'wordpress.org', 'path' => '/foo/bar/' ), - 'make.wordpress.org/' => array( 'domain' => 'make.wordpress.org', 'path' => '/' ), - 'make.wordpress.org/foo/' => array( 'domain' => 'make.wordpress.org', 'path' => '/foo/' ), - 'www.w.org/' => array( 'domain' => 'www.w.org', 'path' => '/' ), - 'www.w.org/foo/' => array( 'domain' => 'www.w.org', 'path' => '/foo/' ), - 'www.w.org/foo/bar/' => array( 'domain' => 'www.w.org', 'path' => '/foo/bar/' ), - ); - - foreach ( $ids as &$id ) { - $id = $this->factory->blog->create( $id ); - } - unset( $id ); - - $this->assertEquals( $ids['wordpress.org/'], - get_site_by_path( 'wordpress.org', '/notapath/' )->blog_id ); - - $this->assertEquals( $ids['wordpress.org/'], - get_site_by_path( 'www.wordpress.org', '/notapath/' )->blog_id ); - - $this->assertEquals( $ids['wordpress.org/foo/bar/'], - get_site_by_path( 'wordpress.org', '/foo/bar/baz/' )->blog_id ); - - $this->assertEquals( $ids['wordpress.org/foo/bar/'], - get_site_by_path( 'www.wordpress.org', '/foo/bar/baz/' )->blog_id ); - - $this->assertEquals( $ids['wordpress.org/foo/bar/'], - get_site_by_path( 'wordpress.org', '/foo/bar/baz/', 3 )->blog_id ); - - $this->assertEquals( $ids['wordpress.org/foo/bar/'], - get_site_by_path( 'www.wordpress.org', '/foo/bar/baz/', 3 )->blog_id ); - - $this->assertEquals( $ids['wordpress.org/foo/bar/'], - get_site_by_path( 'wordpress.org', '/foo/bar/baz/', 2 )->blog_id ); - - $this->assertEquals( $ids['wordpress.org/foo/bar/'], - get_site_by_path( 'www.wordpress.org', '/foo/bar/baz/', 2 )->blog_id ); - - $this->assertEquals( $ids['wordpress.org/foo/'], - get_site_by_path( 'wordpress.org', '/foo/bar/baz/', 1 )->blog_id ); - - $this->assertEquals( $ids['wordpress.org/foo/'], - get_site_by_path( 'www.wordpress.org', '/foo/bar/baz/', 1 )->blog_id ); - - $this->assertEquals( $ids['wordpress.org/'], - get_site_by_path( 'wordpress.org', '/', 0 )->blog_id ); - - $this->assertEquals( $ids['wordpress.org/'], - get_site_by_path( 'www.wordpress.org', '/', 0 )->blog_id ); - - $this->assertEquals( $ids['make.wordpress.org/foo/'], - get_site_by_path( 'make.wordpress.org', '/foo/bar/baz/qux/', 4 )->blog_id ); - - $this->assertEquals( $ids['make.wordpress.org/foo/'], - get_site_by_path( 'www.make.wordpress.org', '/foo/bar/baz/qux/', 4 )->blog_id ); - - $this->assertEquals( $ids['www.w.org/'], - get_site_by_path( 'www.w.org', '/', 0 )->blog_id ); - - $this->assertEquals( $ids['www.w.org/'], - get_site_by_path( 'www.w.org', '/notapath/' )->blog_id ); - - $this->assertEquals( $ids['www.w.org/foo/bar/'], - get_site_by_path( 'www.w.org', '/foo/bar/baz/' )->blog_id ); - - $this->assertEquals( $ids['www.w.org/foo/'], - get_site_by_path( 'www.w.org', '/foo/bar/baz/', 1 )->blog_id ); - - // A site installed with www will not be found by the root domain. - $this->assertFalse( get_site_by_path( 'w.org', '/' ) ); - $this->assertFalse( get_site_by_path( 'w.org', '/notapath/' ) ); - $this->assertFalse( get_site_by_path( 'w.org', '/foo/bar/baz/' ) ); - $this->assertFalse( get_site_by_path( 'w.org', '/foo/bar/baz/', 1 ) ); - - // A site will not be found by its root domain when an invalid subdomain is requested. - $this->assertFalse( get_site_by_path( 'invalid.wordpress.org', '/' ) ); - $this->assertFalse( get_site_by_path( 'invalid.wordpress.org', '/foo/bar/' ) ); - } - - /** - * @ticket 20601 - */ - function test_user_member_of_blog() { - global $wp_rewrite; - - $this->factory->blog->create(); - $user_id = $this->factory->user->create(); - $this->factory->blog->create( array( 'user_id' => $user_id ) ); - - $blogs = get_blogs_of_user( $user_id ); - $this->assertCount( 2, $blogs ); - $first = reset( $blogs )->userblog_id; - remove_user_from_blog( $user_id, $first ); - - $blogs = get_blogs_of_user( $user_id ); - $second = reset( $blogs )->userblog_id; - $this->assertCount( 1, $blogs ); - - switch_to_blog( $first ); - $wp_rewrite->init(); - - $this->go_to( get_author_posts_url( $user_id ) ); - $this->assertQueryTrue( 'is_404' ); - - switch_to_blog( $second ); - $wp_rewrite->init(); - - $this->go_to( get_author_posts_url( $user_id ) ); - $this->assertQueryTrue( 'is_author', 'is_archive' ); - - add_user_to_blog( $first, $user_id, 'administrator' ); - $blogs = get_blogs_of_user( $user_id ); - $this->assertCount( 2, $blogs ); - - switch_to_blog( $first ); - $wp_rewrite->init(); - - $this->go_to( get_author_posts_url( $user_id ) ); - $this->assertQueryTrue( 'is_author', 'is_archive' ); - } - - /** - * @ticket 27205 - */ - function test_granting_super_admins() { - if ( isset( $GLOBALS['super_admins'] ) ) { - $old_global = $GLOBALS['super_admins']; - unset( $GLOBALS['super_admins'] ); - } - - $user_id = $this->factory->user->create(); - - $this->assertFalse( is_super_admin( $user_id ) ); - $this->assertFalse( revoke_super_admin( $user_id ) ); - $this->assertTrue( grant_super_admin( $user_id ) ); - $this->assertTrue( is_super_admin( $user_id ) ); - $this->assertFalse( grant_super_admin( $user_id ) ); - $this->assertTrue( revoke_super_admin( $user_id ) ); - - // None of these operations should set the $super_admins global. - $this->assertFalse( isset( $GLOBALS['super_admins'] ) ); - - // Try with two users. - $second_user = $this->factory->user->create(); - $this->assertTrue( grant_super_admin( $user_id ) ); - $this->assertTrue( grant_super_admin( $second_user ) ); - $this->assertTrue( is_super_admin( $second_user ) ); - $this->assertTrue( is_super_admin( $user_id ) ); - $this->assertTrue( revoke_super_admin( $user_id ) ); - $this->assertTrue( revoke_super_admin( $second_user ) ); - - if ( isset( $old_global ) ) { - $GLOBALS['super_admins'] = $old_global; - } - } /** * @ticket 27952 @@ -1510,115 +732,201 @@ class Tests_MS extends WP_UnitTestCase { $this->assertFalse( $site ); } - /** - * @ticket 27884 - */ - function test_multisite_bootstrap() { - global $current_blog; + function test_get_blog_id_from_url() { + $user_id = $this->factory->user->create( array( 'role' => 'administrator' ) ); + $blog_id = $this->factory->blog->create( array( 'user_id' => $user_id, 'path' => '/testdomainexists', 'title' => 'Test Title' ) ); - $network_ids = array( - 'wordpress.org/' => array( 'domain' => 'wordpress.org', 'path' => '/' ), - 'make.wordpress.org/' => array( 'domain' => 'make.wordpress.org', 'path' => '/' ), - ); + $details = get_blog_details( $blog_id, false ); - foreach ( $network_ids as &$id ) { - $id = $this->factory->network->create( $id ); - } - unset( $id ); + $this->assertEquals( $blog_id, get_blog_id_from_url( $details->domain, $details->path ) ); + $key = md5( $details->domain . $details->path ); + $this->assertEquals( $blog_id, wp_cache_get( $key, 'blog-id-cache' ) ); - $ids = array( - 'wordpress.org/' => array( 'domain' => 'wordpress.org', 'path' => '/', 'site_id' => $network_ids['wordpress.org/'] ), - 'wordpress.org/foo/' => array( 'domain' => 'wordpress.org', 'path' => '/foo/', 'site_id' => $network_ids['wordpress.org/'] ), - 'wordpress.org/foo/bar/' => array( 'domain' => 'wordpress.org', 'path' => '/foo/bar/', 'site_id' => $network_ids['wordpress.org/'] ), - 'make.wordpress.org/' => array( 'domain' => 'make.wordpress.org', 'path' => '/', 'site_id' => $network_ids['make.wordpress.org/'] ), - 'make.wordpress.org/foo/' => array( 'domain' => 'make.wordpress.org', 'path' => '/foo/', 'site_id' => $network_ids['make.wordpress.org/'] ), - ); + $this->assertEquals( 0, get_blog_id_from_url( $details->domain, 'foo' ) ); - foreach ( $ids as &$id ) { - $id = $this->factory->blog->create( $id ); - } - unset( $id ); + wpmu_delete_blog( $blog_id ); + $this->assertEquals( $blog_id, get_blog_id_from_url( $details->domain, $details->path ) ); + wpmu_delete_blog( $blog_id, true ); - $this->_setup_host_request( 'wordpress.org', '/' ); - $this->assertEquals( $ids['wordpress.org/'], $current_blog->blog_id ); - $this->assertEquals( $network_ids['wordpress.org/'], $current_blog->site_id ); + $this->assertEquals( false, wp_cache_get( $key, 'blog-id-cache' ) ); + $this->assertEquals( 0, get_blog_id_from_url( $details->domain, $details->path ) ); + } - $this->_setup_host_request( 'wordpress.org', '/2014/04/23/hello-world/' ); - $this->assertEquals( $ids['wordpress.org/'], $current_blog->blog_id ); - $this->assertEquals( $network_ids['wordpress.org/'], $current_blog->site_id ); + function test_is_main_site() { + $this->assertTrue( is_main_site() ); + $this->assertTrue( is_main_site( get_current_blog_id() ) ); - $this->_setup_host_request( 'wordpress.org', '/sample-page/' ); - $this->assertEquals( $ids['wordpress.org/'], $current_blog->blog_id ); - $this->assertEquals( $network_ids['wordpress.org/'], $current_blog->site_id ); + $user_id = $this->factory->user->create( array( 'role' => 'administrator' ) ); + $blog_id = $this->factory->blog->create( array( 'user_id' => $user_id ) ); - $this->_setup_host_request( 'wordpress.org', '/?p=1' ); - $this->assertEquals( $ids['wordpress.org/'], $current_blog->blog_id ); - $this->assertEquals( $network_ids['wordpress.org/'], $current_blog->site_id ); + switch_to_blog( $blog_id ); + $this->assertFalse( is_main_site( $blog_id ) ); + $this->assertFalse( is_main_site( get_current_blog_id() ) ); + $this->assertFalse( is_main_site() ); - $this->_setup_host_request( 'wordpress.org', '/wp-admin/' ); - $this->assertEquals( $ids['wordpress.org/'], $current_blog->blog_id ); - $this->assertEquals( $network_ids['wordpress.org/'], $current_blog->site_id ); + restore_current_blog(); + } - $this->_setup_host_request( 'wordpress.org', '/foo/' ); - $this->assertEquals( $ids['wordpress.org/foo/'], $current_blog->blog_id ); - $this->assertEquals( $network_ids['wordpress.org/'], $current_blog->site_id ); + function test_switch_upload_dir() { + $this->assertTrue( is_main_site() ); - $this->_setup_host_request( 'wordpress.org', '/FOO/' ); - $this->assertEquals( $ids['wordpress.org/foo/'], $current_blog->blog_id ); - $this->assertEquals( $network_ids['wordpress.org/'], $current_blog->site_id ); + $site = get_current_site(); - $this->_setup_host_request( 'wordpress.org', '/foo/2014/04/23/hello-world/' ); - $this->assertEquals( $ids['wordpress.org/foo/'], $current_blog->blog_id ); - $this->assertEquals( $network_ids['wordpress.org/'], $current_blog->site_id ); + $info = wp_upload_dir(); + $this->assertEquals( 'http://' . $site->domain . '/wp-content/uploads/' . gmstrftime('%Y/%m'), $info['url'] ); + $this->assertEquals( ABSPATH . 'wp-content/uploads/' . gmstrftime('%Y/%m'), $info['path'] ); + $this->assertEquals( gmstrftime('/%Y/%m'), $info['subdir'] ); + $this->assertEquals( '', $info['error'] ); - $this->_setup_host_request( 'wordpress.org', '/foo/sample-page/' ); - $this->assertEquals( $ids['wordpress.org/foo/'], $current_blog->blog_id ); - $this->assertEquals( $network_ids['wordpress.org/'], $current_blog->site_id ); + $user_id = $this->factory->user->create( array( 'role' => 'administrator' ) ); + $blog_id = $this->factory->blog->create( array( 'user_id' => $user_id ) ); - $this->_setup_host_request( 'wordpress.org', '/foo/?p=1' ); - $this->assertEquals( $ids['wordpress.org/foo/'], $current_blog->blog_id ); - $this->assertEquals( $network_ids['wordpress.org/'], $current_blog->site_id ); + switch_to_blog( $blog_id ); + $info = wp_upload_dir(); + $this->assertEquals( 'http://' . $site->domain . '/wp-content/uploads/sites/' . get_current_blog_id() . '/' . gmstrftime('%Y/%m'), $info['url'] ); + $this->assertEquals( ABSPATH . 'wp-content/uploads/sites/' . get_current_blog_id() . '/' . gmstrftime('%Y/%m'), $info['path'] ); + $this->assertEquals( gmstrftime('/%Y/%m'), $info['subdir'] ); + $this->assertEquals( '', $info['error'] ); + restore_current_blog(); - $this->_setup_host_request( 'wordpress.org', '/foo/wp-admin/' ); - $this->assertEquals( $ids['wordpress.org/foo/'], $current_blog->blog_id ); - $this->assertEquals( $network_ids['wordpress.org/'], $current_blog->site_id ); + $info = wp_upload_dir(); + $this->assertEquals( 'http://' . $site->domain . '/wp-content/uploads/' . gmstrftime('%Y/%m'), $info['url'] ); + $this->assertEquals( ABSPATH . 'wp-content/uploads/' . gmstrftime('%Y/%m'), $info['path'] ); + $this->assertEquals( gmstrftime('/%Y/%m'), $info['subdir'] ); + $this->assertEquals( '', $info['error'] ); - // @todo not currently passing. - //$this->_setup_host_request( 'wordpress.org', '/foo/bar/' ); - //$this->assertEquals( $ids['wordpress.org/foo/bar/'], $current_blog->blog_id ); - //$this->assertEquals( $network_ids['wordpress.org/'], $current_blog->site_id ); + update_site_option( 'ms_files_rewriting', 1 ); + ms_upload_constants(); - $this->_setup_host_request( 'make.wordpress.org', '/' ); - $this->assertEquals( $ids['make.wordpress.org/'], $current_blog->blog_id ); - $this->assertEquals( $network_ids['make.wordpress.org/'], $current_blog->site_id ); + $user_id = $this->factory->user->create( array( 'role' => 'administrator' ) ); + $blog_id2 = $this->factory->blog->create( array( 'user_id' => $user_id ) ); + $info = wp_upload_dir(); + $this->assertEquals( 'http://' . $site->domain . '/wp-content/uploads/' . gmstrftime('%Y/%m'), $info['url'] ); + $this->assertEquals( ABSPATH . 'wp-content/uploads/' . gmstrftime('%Y/%m'), $info['path'] ); + $this->assertEquals( gmstrftime('/%Y/%m'), $info['subdir'] ); + $this->assertEquals( '', $info['error'] ); - $this->_setup_host_request( 'make.wordpress.org', '/foo/' ); - $this->assertEquals( $ids['make.wordpress.org/foo/'], $current_blog->blog_id ); - $this->assertEquals( $network_ids['make.wordpress.org/'], $current_blog->site_id ); - - // Request the original tests domain and path to unpollute the stack. - $this->_setup_host_request( WP_TESTS_DOMAIN, '/' ); + switch_to_blog( $blog_id2 ); + $info2 = wp_upload_dir(); + $this->assertNotEquals( $info, $info2 ); + $this->assertEquals( get_option( 'siteurl' ) . '/wp-content/blogs.dir/' . get_current_blog_id() . '/files/' . gmstrftime('%Y/%m'), $info2['url'] ); + $this->assertEquals( ABSPATH . 'wp-content/blogs.dir/' . get_current_blog_id() . '/files/' . gmstrftime('%Y/%m'), $info2['path'] ); + $this->assertEquals( gmstrftime('/%Y/%m'), $info2['subdir'] ); + $this->assertEquals( '', $info2['error'] ); + restore_current_blog(); + update_site_option( 'ms_files_rewriting', 0 ); } /** - * Reset various globals required for a 'clean' multisite boot. - * - * The $wpdb and $table_prefix globals are required for ms-settings.php to - * load properly. - * - * @param string $domain HTTP_HOST of the bootstrap request. - * @param string $path REQUEST_URI of the boot strap request. + * @ticket 18119 */ - function _setup_host_request( $domain, $path ) { - global $current_site, $current_blog, $table_prefix, $wpdb; + function test_upload_is_user_over_quota() { + $default_space_allowed = 100; + $echo = false; - $table_prefix = WP_TESTS_TABLE_PREFIX; - $current_site = $current_blog = null; - $_SERVER['HTTP_HOST'] = $domain; - $_SERVER['REQUEST_URI'] = $path; + $this->assertFalse( upload_is_user_over_quota( $echo ) ); + $this->assertTrue( is_upload_space_available() ); - include ABSPATH . '/wp-includes/ms-settings.php'; + update_site_option('upload_space_check_disabled', true); + $this->assertFalse( upload_is_user_over_quota( $echo ) ); + $this->assertTrue( is_upload_space_available() ); + + update_site_option( 'blog_upload_space', 0 ); + $this->assertFalse( upload_is_user_over_quota( $echo ) ); + $this->assertEquals( $default_space_allowed, get_space_allowed() ); + $this->assertTrue( is_upload_space_available() ); + + update_site_option('upload_space_check_disabled', false); + $this->assertFalse( upload_is_user_over_quota( $echo ) ); + $this->assertTrue( is_upload_space_available() ); + + if ( defined( 'BLOGSUPLOADDIR' ) && ! file_exists( BLOGSUPLOADDIR ) ) + $this->markTestSkipped( 'This test is broken when blogs.dir does not exist. '); + + /* + This is broken when blogs.dir does not exist, as get_upload_space_available() + simply returns the value of blog_upload_space (converted to bytes), which would + be negative but still not false. When blogs.dir does exist, < 0 is returned as 0. + */ + + update_site_option( 'blog_upload_space', -1 ); + $this->assertTrue( upload_is_user_over_quota( $echo ) ); + $this->assertEquals( -1, get_space_allowed() ); + $this->assertFalse( is_upload_space_available() ); + + update_option( 'blog_upload_space', 0 ); + $this->assertFalse( upload_is_user_over_quota( $echo ) ); + $this->assertEquals( $default_space_allowed, get_space_allowed() ); + $this->assertTrue( is_upload_space_available() ); + + update_option( 'blog_upload_space', -1 ); + $this->assertTrue( upload_is_user_over_quota( $echo ) ); + $this->assertEquals( -1, get_space_allowed() ); + $this->assertFalse( is_upload_space_available() ); + } + + function test_get_blog_post() { + $user_id = $this->factory->user->create( array( 'role' => 'administrator' ) ); + $blog_id = $this->factory->blog->create( array( 'user_id' => $user_id, 'path' => '/test_blogpath', 'title' => 'Test Title' ) ); + $current_blog_id = get_current_blog_id(); + + $post_id = $this->factory->post->create(); + $this->assertInstanceOf( 'WP_Post', get_post( $post_id ) ); + switch_to_blog( $blog_id ); + $this->assertNull( get_post( $post_id ) ); + $post = get_blog_post( $current_blog_id, $post_id ); + $this->assertInstanceOf( 'WP_Post', $post ); + $this->assertEquals( $post_id, $post->ID ); + restore_current_blog(); + + wp_update_post( array( 'ID' => $post_id, 'post_title' => 'A Different Title' ) ); + switch_to_blog( $blog_id ); + $post = get_blog_post( $current_blog_id, $post_id ); + // Make sure cache is good + $this->assertEquals( 'A Different Title', $post->post_title ); + + $post_id2 = $this->factory->post->create(); + // Test get_blog_post() with currently active blog ID. + $post = get_blog_post( $blog_id, $post_id2 ); + $this->assertInstanceOf( 'WP_Post', $post ); + $this->assertEquals( $post_id2, $post->ID ); + restore_current_blog(); + } + + function _domain_exists_cb( $exists, $domain, $path, $site_id ) { + if ( 'foo' == $domain && 'bar/' == $path ) + return 1234; + else + return null; + } + + function test_domain_exists() { + $user_id = $this->factory->user->create( array( 'role' => 'administrator' ) ); + $blog_id = $this->factory->blog->create( array( 'user_id' => $user_id, 'path' => '/testdomainexists', 'title' => 'Test Title' ) ); + + $details = get_blog_details( $blog_id, false ); + + $this->assertEquals( $blog_id, domain_exists( $details->domain, $details->path ) ); + $this->assertEquals( $blog_id, domain_exists( $details->domain, $details->path, $details->site_id ) ); + $this->assertEquals( null, domain_exists( $details->domain, $details->path, 999 ) ); + $this->assertEquals( null, domain_exists( 'foo', 'bar' ) ); + + add_filter( 'domain_exists', array( $this, '_domain_exists_cb' ), 10, 4 ); + $this->assertEquals( 1234, domain_exists( 'foo', 'bar' ) ); + $this->assertEquals( null, domain_exists( 'foo', 'baz' ) ); + $this->assertEquals( null, domain_exists( 'bar', 'foo' ) ); + + // Make sure the same result is returned with or without a trailing slash + $this->assertEquals( domain_exists( 'foo', 'bar' ), domain_exists( 'foo', 'bar/' ) ); + + remove_filter( 'domain_exists', array( $this, '_domain_exists_cb' ), 10, 4 ); + $this->assertEquals( null, domain_exists( 'foo', 'bar' ) ); + + wpmu_delete_blog( $blog_id ); + $this->assertEquals( $blog_id, domain_exists( $details->domain, $details->path ) ); + wpmu_delete_blog( $blog_id, true ); + $this->assertEquals( null, domain_exists( $details->domain, $details->path ) ); } } -endif; +endif; \ No newline at end of file diff --git a/tests/phpunit/tests/option/blogOption.php b/tests/phpunit/tests/option/multisite.php similarity index 72% rename from tests/phpunit/tests/option/blogOption.php rename to tests/phpunit/tests/option/multisite.php index 03b989c4d5..af419ea875 100644 --- a/tests/phpunit/tests/option/blogOption.php +++ b/tests/phpunit/tests/option/multisite.php @@ -1,10 +1,15 @@ assertFalse( get_blog_option( $blog_id, $key2 ) ); //$this->assertFalse( get_option( $key2 ) ); // check get_option() } + + /** + * @group multisite + */ + function test_site_notoptions() { + global $wpdb; + $notoptions_key = "{$wpdb->siteid}:notoptions"; + + $_notoptions = wp_cache_get( 'notoptions', 'site-options' ); + $this->assertEmpty( $_notoptions ); + $_notoptions1 = wp_cache_get( $notoptions_key, 'site-options' ); + $this->assertEmpty( $_notoptions1 ); + + get_site_option( 'burrito' ); + + $notoptions = wp_cache_get( 'notoptions', 'site-options' ); + $this->assertEmpty( $notoptions ); + $notoptions1 = wp_cache_get( $notoptions_key, 'site-options' ); + $this->assertNotEmpty( $notoptions1 ); + } + + function test_users_can_register_signup_filter() { + + $registration = get_site_option('registration'); + $this->assertFalse( users_can_register_signup_filter() ); + + update_site_option('registration', 'all'); + $this->assertTrue( users_can_register_signup_filter() ); + + update_site_option('registration', 'user'); + $this->assertTrue( users_can_register_signup_filter() ); + + update_site_option('registration', 'none'); + $this->assertFalse( users_can_register_signup_filter() ); + } + + /** + * @ticket 21552 + * @ticket 23418 + */ + function test_sanitize_ms_options() { + update_site_option( 'illegal_names', array( '', 'Woo', '' ) ); + update_site_option( 'limited_email_domains', array( 'woo', '', 'boo.com', 'foo.net.biz..' ) ); + update_site_option( 'banned_email_domains', array( 'woo', '', 'boo.com', 'foo.net.biz..' ) ); + + $this->assertEquals( array( 'Woo' ), get_site_option( 'illegal_names' ) ); + $this->assertEquals( array( 'woo', 'boo.com' ), get_site_option( 'limited_email_domains' ) ); + $this->assertEquals( array( 'woo', 'boo.com' ), get_site_option( 'banned_email_domains' ) ); + + update_site_option( 'illegal_names', 'foo bar' ); + update_site_option( 'limited_email_domains', "foo\nbar" ); + update_site_option( 'banned_email_domains', "foo\nbar" ); + + $this->assertEquals( array( 'foo', 'bar' ), get_site_option( 'illegal_names' ) ); + $this->assertEquals( array( 'foo', 'bar' ), get_site_option( 'limited_email_domains' ) ); + $this->assertEquals( array( 'foo', 'bar' ), get_site_option( 'banned_email_domains' ) ); + + foreach ( array( 'illegal_names', 'limited_email_domains', 'banned_email_domains' ) as $option ) { + update_site_option( $option, array() ); + $this->assertSame( '', get_site_option( $option ) ); + } + } } + endif; \ No newline at end of file diff --git a/tests/phpunit/tests/option/siteOption.php b/tests/phpunit/tests/option/siteOption.php index 026a7dcece..47bef17c42 100644 --- a/tests/phpunit/tests/option/siteOption.php +++ b/tests/phpunit/tests/option/siteOption.php @@ -90,28 +90,4 @@ class Tests_Option_SiteOption extends WP_UnitTestCase { $this->assertEquals( get_site_option( $option, $default ), $default ); $this->assertFalse( get_site_option( $option ) ); } - - /** - * @group multisite - */ - function test_site_notoptions() { - if ( ! is_multisite() ) { - $this->markTestSkipped( 'Should only run in multisite' ); - } - - global $wpdb; - $notoptions_key = "{$wpdb->siteid}:notoptions"; - - $_notoptions = wp_cache_get( 'notoptions', 'site-options' ); - $this->assertEmpty( $_notoptions ); - $_notoptions1 = wp_cache_get( $notoptions_key, 'site-options' ); - $this->assertEmpty( $_notoptions1 ); - - get_site_option( 'burrito' ); - - $notoptions = wp_cache_get( 'notoptions', 'site-options' ); - $this->assertEmpty( $notoptions ); - $notoptions1 = wp_cache_get( $notoptions_key, 'site-options' ); - $this->assertNotEmpty( $notoptions1 ); - } } diff --git a/tests/phpunit/tests/user/multisite.php b/tests/phpunit/tests/user/multisite.php new file mode 100644 index 0000000000..2e1da1e759 --- /dev/null +++ b/tests/phpunit/tests/user/multisite.php @@ -0,0 +1,238 @@ +suppress = $wpdb->suppress_errors(); + + $_SERVER[ 'REMOTE_ADDR' ] = ''; + } + + function tearDown() { + global $wpdb; + parent::tearDown(); + $wpdb->suppress_errors( $this->suppress ); + } + + function test_remove_user_from_blog() { + $user1 = $this->factory->user->create_and_get(); + $user2 = $this->factory->user->create_and_get(); + + $post_id = $this->factory->post->create( array( 'post_author' => $user1->ID ) ); + + remove_user_from_blog( $user1->ID, 1, $user2->ID ); + + $post = get_post( $post_id ); + + $this->assertNotEquals( $user1->ID, $post->post_author ); + $this->assertEquals( $user2->ID, $post->post_author ); + } + + function test_get_blogs_of_user() { + // Logged out users don't have blogs. + $this->assertEquals( array(), get_blogs_of_user( 0 ) ); + + $user1_id = $this->factory->user->create( array( 'role' => 'administrator' ) ); + $blog_ids = $this->factory->blog->create_many( 10, array( 'user_id' => $user1_id ) ); + + foreach ( $blog_ids as $blog_id ) + $this->assertInternalType( 'int', $blog_id ); + + $blogs_of_user = array_keys( get_blogs_of_user( $user1_id, false ) ); + sort( $blogs_of_user ); + $this->assertEquals ( array_merge( array( 1 ), $blog_ids), $blogs_of_user ); + + $this->assertTrue( remove_user_from_blog( $user1_id, 1 ) ); + + $blogs_of_user = array_keys( get_blogs_of_user( $user1_id, false ) ); + sort( $blogs_of_user ); + $this->assertEquals ( $blog_ids, $blogs_of_user ); + + foreach ( get_blogs_of_user( $user1_id, false ) as $blog ) { + $this->assertTrue( isset( $blog->userblog_id ) ); + $this->assertTrue( isset( $blog->blogname ) ); + $this->assertTrue( isset( $blog->domain ) ); + $this->assertTrue( isset( $blog->path ) ); + $this->assertTrue( isset( $blog->site_id ) ); + $this->assertTrue( isset( $blog->siteurl ) ); + $this->assertTrue( isset( $blog->archived ) ); + $this->assertTrue( isset( $blog->spam ) ); + $this->assertTrue( isset( $blog->deleted ) ); + } + + // Non-existent users don't have blogs. + wpmu_delete_user( $user1_id ); + $user = new WP_User( $user1_id ); + $this->assertFalse( $user->exists(), 'WP_User->exists' ); + $this->assertEquals( array(), get_blogs_of_user( $user1_id ) ); + } + + /** + * @expectedDeprecated is_blog_user + */ + function test_is_blog_user() { + global $wpdb; + + $user1_id = $this->factory->user->create( array( 'role' => 'administrator' ) ); + + $old_current = get_current_user_id(); + wp_set_current_user( $user1_id ); + + $this->assertTrue( is_blog_user() ); + $this->assertTrue( is_blog_user( $wpdb->blogid ) ); + + $blog_ids = array(); + + $blog_ids = $this->factory->blog->create_many( 5 ); + foreach ( $blog_ids as $blog_id ) { + $this->assertInternalType( 'int', $blog_id ); + $this->assertTrue( is_blog_user( $blog_id ) ); + $this->assertTrue( remove_user_from_blog( $user1_id, $blog_id ) ); + $this->assertFalse( is_blog_user( $blog_id ) ); + } + + wp_set_current_user( $old_current ); + } + + function test_is_user_member_of_blog() { + global $wpdb; + + $user1_id = $this->factory->user->create( array( 'role' => 'administrator' ) ); + + $old_current = get_current_user_id(); + wp_set_current_user( $user1_id ); + + $this->assertTrue( is_user_member_of_blog() ); + $this->assertTrue( is_user_member_of_blog( 0, 0 ) ); + $this->assertTrue( is_user_member_of_blog( 0, $wpdb->blogid ) ); + $this->assertTrue( is_user_member_of_blog( $user1_id ) ); + $this->assertTrue( is_user_member_of_blog( $user1_id, $wpdb->blogid ) ); + + $blog_ids = $this->factory->blog->create_many( 5 ); + foreach ( $blog_ids as $blog_id ) { + $this->assertInternalType( 'int', $blog_id ); + $this->assertTrue( is_user_member_of_blog( $user1_id, $blog_id ) ); + $this->assertTrue( remove_user_from_blog( $user1_id, $blog_id ) ); + $this->assertFalse( is_user_member_of_blog( $user1_id, $blog_id ) ); + } + + wpmu_delete_user( $user1_id ); + $user = new WP_User( $user1_id ); + $this->assertFalse( $user->exists(), 'WP_User->exists' ); + $this->assertFalse( is_user_member_of_blog( $user1_id ), 'is_user_member_of_blog' ); + + wp_set_current_user( $old_current ); + } + + /** + * @ticket 23192 + */ + function test_is_user_spammy() { + $user_id = $this->factory->user->create( array( + 'role' => 'author', + 'user_login' => 'testuser1', + ) ); + + $spam_username = (string) $user_id; + $spam_user_id = $this->factory->user->create( array( + 'role' => 'author', + 'user_login' => $spam_username, + ) ); + update_user_status( $spam_user_id, 'spam', '1' ); + + $this->assertTrue( is_user_spammy( $spam_username ) ); + $this->assertFalse( is_user_spammy( 'testuser1' ) ); + } + + /** + * @ticket 20601 + */ + function test_user_member_of_blog() { + global $wp_rewrite; + + $this->factory->blog->create(); + $user_id = $this->factory->user->create(); + $this->factory->blog->create( array( 'user_id' => $user_id ) ); + + $blogs = get_blogs_of_user( $user_id ); + $this->assertCount( 2, $blogs ); + $first = reset( $blogs )->userblog_id; + remove_user_from_blog( $user_id, $first ); + + $blogs = get_blogs_of_user( $user_id ); + $second = reset( $blogs )->userblog_id; + $this->assertCount( 1, $blogs ); + + switch_to_blog( $first ); + $wp_rewrite->init(); + + $this->go_to( get_author_posts_url( $user_id ) ); + $this->assertQueryTrue( 'is_404' ); + + switch_to_blog( $second ); + $wp_rewrite->init(); + + $this->go_to( get_author_posts_url( $user_id ) ); + $this->assertQueryTrue( 'is_author', 'is_archive' ); + + add_user_to_blog( $first, $user_id, 'administrator' ); + $blogs = get_blogs_of_user( $user_id ); + $this->assertCount( 2, $blogs ); + + switch_to_blog( $first ); + $wp_rewrite->init(); + + $this->go_to( get_author_posts_url( $user_id ) ); + $this->assertQueryTrue( 'is_author', 'is_archive' ); + } + + /** + * @ticket 27205 + */ + function test_granting_super_admins() { + if ( isset( $GLOBALS['super_admins'] ) ) { + $old_global = $GLOBALS['super_admins']; + unset( $GLOBALS['super_admins'] ); + } + + $user_id = $this->factory->user->create(); + + $this->assertFalse( is_super_admin( $user_id ) ); + $this->assertFalse( revoke_super_admin( $user_id ) ); + $this->assertTrue( grant_super_admin( $user_id ) ); + $this->assertTrue( is_super_admin( $user_id ) ); + $this->assertFalse( grant_super_admin( $user_id ) ); + $this->assertTrue( revoke_super_admin( $user_id ) ); + + // None of these operations should set the $super_admins global. + $this->assertFalse( isset( $GLOBALS['super_admins'] ) ); + + // Try with two users. + $second_user = $this->factory->user->create(); + $this->assertTrue( grant_super_admin( $user_id ) ); + $this->assertTrue( grant_super_admin( $second_user ) ); + $this->assertTrue( is_super_admin( $second_user ) ); + $this->assertTrue( is_super_admin( $user_id ) ); + $this->assertTrue( revoke_super_admin( $user_id ) ); + $this->assertTrue( revoke_super_admin( $second_user ) ); + + if ( isset( $old_global ) ) { + $GLOBALS['super_admins'] = $old_global; + } + } + +} + +endif ; \ No newline at end of file