Make WordPress Core


Ignore:
Timestamp:
04/09/2025 01:29:39 PM (5 weeks ago)
Author:
SergeyBiryukov
Message:

Tests: Use the ms-required group where appropriate.

This replaces the if ( is_multisite() ) conditional wrapping entire test classes with the ms-required group for more consistency across the test suite.

Follow-up to [40520].

See #63167.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/multisite/bootstrap.php

    r52010 r60148  
    11<?php
    22
    3 if ( is_multisite() ) :
    4 
    5     /**
    6      * Tests specific to the bootstrap process of Multisite.
     3/**
     4 * Tests specific to the bootstrap process of Multisite.
     5 *
     6 * @group ms-bootstrap
     7 * @group ms-required
     8 * @group multisite
     9 */
     10class Tests_Multisite_Bootstrap extends WP_UnitTestCase {
     11
     12    protected static $network_ids;
     13    protected static $site_ids;
     14
     15    public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) {
     16        self::$network_ids = array(
     17            'wordpress.org/'         => array(
     18                'domain' => 'wordpress.org',
     19                'path'   => '/',
     20            ),
     21            'make.wordpress.org/'    => array(
     22                'domain' => 'make.wordpress.org',
     23                'path'   => '/',
     24            ),
     25            'wordpress.org/one/'     => array(
     26                'domain' => 'wordpress.org',
     27                'path'   => '/one/',
     28            ),
     29            'wordpress.org/one/b/'   => array(
     30                'domain' => 'wordpress.org',
     31                'path'   => '/one/b/',
     32            ),
     33            'wordpress.net/'         => array(
     34                'domain' => 'wordpress.net',
     35                'path'   => '/',
     36            ),
     37            'www.wordpress.net/'     => array(
     38                'domain' => 'www.wordpress.net',
     39                'path'   => '/',
     40            ),
     41            'www.wordpress.net/two/' => array(
     42                'domain' => 'www.wordpress.net',
     43                'path'   => '/two/',
     44            ),
     45            'wordpress.net/three/'   => array(
     46                'domain' => 'wordpress.net',
     47                'path'   => '/three/',
     48            ),
     49        );
     50
     51        foreach ( self::$network_ids as &$id ) {
     52            $id = $factory->network->create( $id );
     53        }
     54        unset( $id );
     55
     56        self::$site_ids = array(
     57            'wordpress.org/'          => array(
     58                'domain'     => 'wordpress.org',
     59                'path'       => '/',
     60                'network_id' => self::$network_ids['wordpress.org/'],
     61            ),
     62            'wordpress.org/foo/'      => array(
     63                'domain'     => 'wordpress.org',
     64                'path'       => '/foo/',
     65                'network_id' => self::$network_ids['wordpress.org/'],
     66            ),
     67            'wordpress.org/foo/bar/'  => array(
     68                'domain'     => 'wordpress.org',
     69                'path'       => '/foo/bar/',
     70                'network_id' => self::$network_ids['wordpress.org/'],
     71            ),
     72            'make.wordpress.org/'     => array(
     73                'domain'     => 'make.wordpress.org',
     74                'path'       => '/',
     75                'network_id' => self::$network_ids['make.wordpress.org/'],
     76            ),
     77            'make.wordpress.org/foo/' => array(
     78                'domain'     => 'make.wordpress.org',
     79                'path'       => '/foo/',
     80                'network_id' => self::$network_ids['make.wordpress.org/'],
     81            ),
     82            'www.w.org/'              => array(
     83                'domain' => 'www.w.org',
     84                'path'   => '/',
     85            ),
     86            'www.w.org/foo/'          => array(
     87                'domain' => 'www.w.org',
     88                'path'   => '/foo/',
     89            ),
     90            'www.w.org/foo/bar/'      => array(
     91                'domain' => 'www.w.org',
     92                'path'   => '/foo/bar/',
     93            ),
     94        );
     95
     96        foreach ( self::$site_ids as &$id ) {
     97            $id = $factory->blog->create( $id );
     98        }
     99        unset( $id );
     100    }
     101
     102    public static function wpTearDownAfterClass() {
     103        global $wpdb;
     104
     105        foreach ( self::$site_ids as $id ) {
     106            wp_delete_site( $id );
     107        }
     108
     109        foreach ( self::$network_ids as $id ) {
     110            $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->sitemeta} WHERE site_id = %d", $id ) );
     111            $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->site} WHERE id= %d", $id ) );
     112        }
     113
     114        wp_update_network_site_counts();
     115    }
     116
     117    /**
     118     * @ticket 27003
     119     * @dataProvider data_get_network_by_path
    7120     *
    8      * @group ms-bootstrap
    9      * @group multisite
    10      */
    11     class Tests_Multisite_Bootstrap extends WP_UnitTestCase {
    12         protected static $network_ids;
    13         protected static $site_ids;
    14 
    15         public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) {
    16             self::$network_ids = array(
    17                 'wordpress.org/'         => array(
    18                     'domain' => 'wordpress.org',
    19                     'path'   => '/',
    20                 ),
    21                 'make.wordpress.org/'    => array(
    22                     'domain' => 'make.wordpress.org',
    23                     'path'   => '/',
    24                 ),
    25                 'wordpress.org/one/'     => array(
    26                     'domain' => 'wordpress.org',
    27                     'path'   => '/one/',
    28                 ),
    29                 'wordpress.org/one/b/'   => array(
    30                     'domain' => 'wordpress.org',
    31                     'path'   => '/one/b/',
    32                 ),
    33                 'wordpress.net/'         => array(
    34                     'domain' => 'wordpress.net',
    35                     'path'   => '/',
    36                 ),
    37                 'www.wordpress.net/'     => array(
    38                     'domain' => 'www.wordpress.net',
    39                     'path'   => '/',
    40                 ),
    41                 'www.wordpress.net/two/' => array(
    42                     'domain' => 'www.wordpress.net',
    43                     'path'   => '/two/',
    44                 ),
    45                 'wordpress.net/three/'   => array(
    46                     'domain' => 'wordpress.net',
    47                     'path'   => '/three/',
    48                 ),
    49             );
    50 
    51             foreach ( self::$network_ids as &$id ) {
    52                 $id = $factory->network->create( $id );
    53             }
    54             unset( $id );
    55 
    56             self::$site_ids = array(
    57                 'wordpress.org/'          => array(
    58                     'domain'     => 'wordpress.org',
    59                     'path'       => '/',
    60                     'network_id' => self::$network_ids['wordpress.org/'],
    61                 ),
    62                 'wordpress.org/foo/'      => array(
    63                     'domain'     => 'wordpress.org',
    64                     'path'       => '/foo/',
    65                     'network_id' => self::$network_ids['wordpress.org/'],
    66                 ),
    67                 'wordpress.org/foo/bar/'  => array(
    68                     'domain'     => 'wordpress.org',
    69                     'path'       => '/foo/bar/',
    70                     'network_id' => self::$network_ids['wordpress.org/'],
    71                 ),
    72                 'make.wordpress.org/'     => array(
    73                     'domain'     => 'make.wordpress.org',
    74                     'path'       => '/',
    75                     'network_id' => self::$network_ids['make.wordpress.org/'],
    76                 ),
    77                 'make.wordpress.org/foo/' => array(
    78                     'domain'     => 'make.wordpress.org',
    79                     'path'       => '/foo/',
    80                     'network_id' => self::$network_ids['make.wordpress.org/'],
    81                 ),
    82                 'www.w.org/'              => array(
    83                     'domain' => 'www.w.org',
    84                     'path'   => '/',
    85                 ),
    86                 'www.w.org/foo/'          => array(
    87                     'domain' => 'www.w.org',
    88                     'path'   => '/foo/',
    89                 ),
    90                 'www.w.org/foo/bar/'      => array(
    91                     'domain' => 'www.w.org',
    92                     'path'   => '/foo/bar/',
    93                 ),
    94             );
    95 
    96             foreach ( self::$site_ids as &$id ) {
    97                 $id = $factory->blog->create( $id );
    98             }
    99             unset( $id );
    100         }
    101 
    102         public static function wpTearDownAfterClass() {
    103             global $wpdb;
    104 
    105             foreach ( self::$site_ids as $id ) {
    106                 wp_delete_site( $id );
    107             }
    108 
    109             foreach ( self::$network_ids as $id ) {
    110                 $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->sitemeta} WHERE site_id = %d", $id ) );
    111                 $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->site} WHERE id= %d", $id ) );
    112             }
    113 
    114             wp_update_network_site_counts();
    115         }
    116 
    117         /**
    118          * @ticket 27003
    119          * @dataProvider data_get_network_by_path
    120          *
    121          * @param string $expected_key The array key associated with expected data for the test.
    122          * @param string $domain       The requested domain.
    123          * @param string $path         The requested path.
    124          * @param string $message      The message to pass for failed tests.
    125          */
    126         public function test_get_network_by_path( $expected_key, $domain, $path, $message ) {
    127             $network = get_network_by_path( $domain, $path );
    128             $this->assertSame( self::$network_ids[ $expected_key ], $network->id, $message );
    129         }
    130 
    131         public function data_get_network_by_path() {
    132             return array(
    133                 array( 'wordpress.org/', 'wordpress.org', '/', 'A standard domain and path request should work.' ),
    134                 array( 'wordpress.net/', 'wordpress.net', '/notapath/', 'A missing path on a top level domain should find the correct network.' ),
    135                 array( 'www.wordpress.net/', 'www.wordpress.net', '/notapath/', 'A missing path should find the correct network.' ),
    136                 array( 'wordpress.org/one/', 'www.wordpress.org', '/one/', 'Should find the path despite the www.' ),
    137                 array( 'wordpress.org/one/', 'wordpress.org', '/one/page/', 'A request with two path segments should find the correct network.' ),
    138                 array( 'wordpress.org/one/b/', 'wordpress.org', '/one/b/', 'A request with two valid path segments should find the correct network.' ),
    139                 array( 'wordpress.org/', 'site1.wordpress.org', '/one/', 'Should not find path because domains do not match.' ),
    140                 array( 'wordpress.net/three/', 'wordpress.net', '/three/', 'A network can have a path.' ),
    141                 array( 'www.wordpress.net/two/', 'www.wordpress.net', '/two/', 'A www network with a path can coexist with a non-www network.' ),
    142                 array( 'wordpress.net/', 'site1.wordpress.net', '/notapath/', 'An invalid subdomain should find the top level network domain.' ),
    143                 array( 'wordpress.net/', 'site1.wordpress.net', '/three/', 'An invalid subdomain and path should find the top level network domain.' ),
    144                 array( 'wordpress.net/', 'x.y.wordpress.net', '/', 'An invalid two level subdomain should find the top level network domain.' ),
    145             );
    146         }
    147 
    148         /**
    149          * @ticket 37217
    150          * @dataProvider data_get_network_by_path_with_zero_path_segments
    151          *
    152          * @param string $expected_key The array key associated with expected data for the test.
    153          * @param string $domain       The requested domain.
    154          * @param string $path         The requested path.
    155          * @param string $message      The message to pass for failed tests.
    156          */
    157         public function test_get_network_by_path_with_zero_path_segments( $expected_key, $domain, $path, $message ) {
    158             add_filter( 'network_by_path_segments_count', '__return_zero' );
    159 
    160             $network = get_network_by_path( $domain, $path );
    161 
    162             remove_filter( 'network_by_path_segments_count', '__return_zero' );
    163 
    164             $this->assertSame( self::$network_ids[ $expected_key ], $network->id, $message );
    165         }
    166 
    167         public function data_get_network_by_path_with_zero_path_segments() {
    168             return array(
    169                 array( 'wordpress.org/', 'wordpress.org', '/', 'A standard domain and path request should work.' ),
    170                 array( 'wordpress.net/', 'wordpress.net', '/notapath/', 'A network matching a top level domain should be found regardless of path.' ),
    171                 array( 'www.wordpress.net/', 'www.wordpress.net', '/notapath/', 'A network matching a domain should be found regardless of path.' ),
    172                 array( 'wordpress.org/', 'www.wordpress.org', '/one/', 'Should find the network despite the www and regardless of path.' ),
    173                 array( 'wordpress.org/', 'site1.wordpress.org', '/one/', 'Should find the network with the corresponding top level domain regardless of path.' ),
    174                 array( 'www.wordpress.net/', 'www.wordpress.net', '/two/', 'A www network can coexist with a non-www network.' ),
    175                 array( 'make.wordpress.org/', 'make.wordpress.org', '/notapath/', 'A subdomain network should be found regardless of path.' ),
    176                 array( 'wordpress.net/', 'x.y.wordpress.net', '/', 'An invalid two level subdomain should find the top level network domain.' ),
    177             );
    178         }
    179 
    180         /**
    181          * Even if a matching network is available, it should not match if the the filtered
    182          * value for network path segments is fewer than the number of paths passed.
    183          */
    184         public function test_get_network_by_path_with_forced_single_path_segment_returns_single_path_network() {
    185             add_filter( 'network_by_path_segments_count', array( $this, 'filter_network_path_segments' ) );
    186             $network = get_network_by_path( 'wordpress.org', '/one/b/' );
    187             remove_filter( 'network_by_path_segments_count', array( $this, 'filter_network_path_segments' ) );
    188 
    189             $this->assertSame( self::$network_ids['wordpress.org/one/'], $network->id );
    190         }
    191 
    192         public function filter_network_path_segments() {
    193             return 1;
    194         }
    195 
    196         /**
    197          * @ticket 27003
    198          * @ticket 27927
    199          * @dataProvider data_get_site_by_path
    200          *
    201          * @param string $expected_key The array key associated with expected data for the test.
    202          * @param string $domain       The requested domain.
    203          * @param string $path         The requested path.
    204          * @param int    $segments     Optional. Number of segments to use in `get_site_by_path()`.
    205          */
    206         public function test_get_site_by_path( $expected_key, $domain, $path, $segments = null ) {
    207             $site = get_site_by_path( $domain, $path, $segments );
    208 
    209             if ( $expected_key ) {
    210                 $this->assertEquals( self::$site_ids[ $expected_key ], $site->blog_id );
    211             } else {
    212                 $this->assertFalse( $site );
    213             }
    214         }
    215 
    216         public function data_get_site_by_path() {
    217             return array(
    218                 array( 'wordpress.org/', 'wordpress.org', '/notapath/' ),
    219                 array( 'wordpress.org/', 'www.wordpress.org', '/notapath/' ),
    220                 array( 'wordpress.org/foo/bar/', 'wordpress.org', '/foo/bar/baz/' ),
    221                 array( 'wordpress.org/foo/bar/', 'www.wordpress.org', '/foo/bar/baz/' ),
    222                 array( 'wordpress.org/foo/bar/', 'wordpress.org', '/foo/bar/baz/', 3 ),
    223                 array( 'wordpress.org/foo/bar/', 'www.wordpress.org', '/foo/bar/baz/', 3 ),
    224                 array( 'wordpress.org/foo/bar/', 'wordpress.org', '/foo/bar/baz/', 2 ),
    225                 array( 'wordpress.org/foo/bar/', 'www.wordpress.org', '/foo/bar/baz/', 2 ),
    226                 array( 'wordpress.org/foo/', 'wordpress.org', '/foo/bar/baz/', 1 ),
    227                 array( 'wordpress.org/foo/', 'www.wordpress.org', '/foo/bar/baz/', 1 ),
    228                 array( 'wordpress.org/', 'wordpress.org', '/', 0 ),
    229                 array( 'wordpress.org/', 'www.wordpress.org', '/', 0 ),
    230                 array( 'make.wordpress.org/foo/', 'make.wordpress.org', '/foo/bar/baz/quz/', 4 ),
    231                 array( 'make.wordpress.org/foo/', 'www.make.wordpress.org', '/foo/bar/baz/quz/', 4 ),
    232                 array( 'www.w.org/', 'www.w.org', '/', 0 ),
    233                 array( 'www.w.org/', 'www.w.org', '/notapath' ),
    234                 array( 'www.w.org/foo/bar/', 'www.w.org', '/foo/bar/baz/' ),
    235                 array( 'www.w.org/foo/', 'www.w.org', '/foo/bar/baz/', 1 ),
    236 
    237                 // A site installed with www will not be found by the root domain.
    238                 array( false, 'w.org', '/' ),
    239                 array( false, 'w.org', '/notapath/' ),
    240                 array( false, 'w.org', '/foo/bar/baz/' ),
    241                 array( false, 'w.org', '/foo/bar/baz/', 1 ),
    242 
    243                 // A site will not be found by its root domain when an invalid subdomain is requested.
    244                 array( false, 'invalid.wordpress.org', '/' ),
    245                 array( false, 'invalid.wordpress.org', '/foo/bar/' ),
    246             );
    247         }
    248 
    249         /**
    250          * @ticket 27884
    251          * @dataProvider data_multisite_bootstrap
    252          *
    253          * @param string $site_key    The array key associated with the expected site for the test.
    254          * @param string $network_key The array key associated with the expected network for the test.
    255          * @param string $domain      The requested domain.
    256          * @param string $path        The requested path.
    257          */
    258         public function test_multisite_bootstrap( $site_key, $network_key, $domain, $path ) {
    259             global $current_blog;
    260 
    261             $expected = array(
    262                 'network_id' => self::$network_ids[ $network_key ],
    263                 'site_id'    => self::$site_ids[ $site_key ],
    264             );
    265 
    266             ms_load_current_site_and_network( $domain, $path );
    267             $actual = array(
    268                 'network_id' => $current_blog->site_id,
    269                 'site_id'    => $current_blog->blog_id,
    270             );
    271             ms_load_current_site_and_network( WP_TESTS_DOMAIN, '/' );
    272 
    273             $this->assertEqualSetsWithIndex( $expected, $actual );
    274         }
    275 
    276         public function data_multisite_bootstrap() {
    277             return array(
    278                 array( 'wordpress.org/', 'wordpress.org/', 'wordpress.org', '/' ),
    279                 array( 'wordpress.org/', 'wordpress.org/', 'wordpress.org', '/2014/04/23/hello-world/' ),
    280                 array( 'wordpress.org/', 'wordpress.org/', 'wordpress.org', '/sample-page/' ),
    281                 array( 'wordpress.org/', 'wordpress.org/', 'wordpress.org', '/?p=1' ),
    282                 array( 'wordpress.org/', 'wordpress.org/', 'wordpress.org', '/wp-admin/' ),
    283                 array( 'wordpress.org/foo/', 'wordpress.org/', 'wordpress.org', '/foo/' ),
    284                 array( 'wordpress.org/foo/', 'wordpress.org/', 'wordpress.org', '/FOO/' ),
    285                 array( 'wordpress.org/foo/', 'wordpress.org/', 'wordpress.org', '/foo/2014/04/23/hello-world/' ),
    286                 array( 'wordpress.org/foo/', 'wordpress.org/', 'wordpress.org', '/foo/sample-page/' ),
    287                 array( 'wordpress.org/foo/', 'wordpress.org/', 'wordpress.org', '/foo/?p=1' ),
    288                 array( 'wordpress.org/foo/', 'wordpress.org/', 'wordpress.org', '/foo/wp-admin/' ),
    289                 array( 'make.wordpress.org/', 'make.wordpress.org/', 'make.wordpress.org', '/' ),
    290                 array( 'make.wordpress.org/foo/', 'make.wordpress.org/', 'make.wordpress.org', '/foo/' ),
    291             );
    292         }
    293 
    294         /**
    295          * @ticket 27884
    296          */
    297         public function test_multisite_bootstrap_additional_path_segments() {
    298             global $current_blog;
    299 
    300             $expected = array(
    301                 'network_id' => self::$network_ids['wordpress.org/'],
    302                 'site_id'    => self::$site_ids['wordpress.org/foo/bar/'],
    303             );
    304             add_filter( 'site_by_path_segments_count', array( $this, 'filter_path_segments_to_two' ) );
    305             ms_load_current_site_and_network( 'wordpress.org', '/foo/bar/' );
    306             $actual = array(
    307                 'network_id' => $current_blog->site_id,
    308                 'site_id'    => $current_blog->blog_id,
    309             );
    310             remove_filter( 'site_by_path_segments_count', array( $this, 'filter_path_segments_to_two' ) );
    311             ms_load_current_site_and_network( WP_TESTS_DOMAIN, '/' );
    312 
    313             $this->assertEqualSetsWithIndex( $expected, $actual );
    314         }
    315 
    316         /**
    317          * @ticket 37053
    318          */
    319         public function test_get_site_by_path_returns_wp_site() {
    320             add_filter( 'pre_get_site_by_path', array( $this, 'filter_pre_get_site_by_path' ), 10, 3 );
    321 
    322             $site = get_site_by_path( 'example.com', '/foo/' );
    323 
    324             remove_filter( 'pre_get_site_by_path', array( $this, 'filter_pre_get_site_by_path' ), 10 );
    325 
    326             $this->assertInstanceOf( 'WP_Site', $site );
    327         }
    328 
    329         public function filter_path_segments_to_two() {
    330             return 2;
    331         }
    332 
    333         public function filter_pre_get_site_by_path( $site, $domain, $path ) {
    334             $site          = new stdClass();
    335             $site->blog_id = 100;
    336             $site->domain  = $domain;
    337             $site->path    = $path;
    338             $site->site_id = 1;
    339 
    340             return $site;
    341         }
    342     }
    343 
    344 endif;
     121     * @param string $expected_key The array key associated with expected data for the test.
     122     * @param string $domain       The requested domain.
     123     * @param string $path         The requested path.
     124     * @param string $message      The message to pass for failed tests.
     125     */
     126    public function test_get_network_by_path( $expected_key, $domain, $path, $message ) {
     127        $network = get_network_by_path( $domain, $path );
     128        $this->assertSame( self::$network_ids[ $expected_key ], $network->id, $message );
     129    }
     130
     131    public function data_get_network_by_path() {
     132        return array(
     133            array( 'wordpress.org/', 'wordpress.org', '/', 'A standard domain and path request should work.' ),
     134            array( 'wordpress.net/', 'wordpress.net', '/notapath/', 'A missing path on a top level domain should find the correct network.' ),
     135            array( 'www.wordpress.net/', 'www.wordpress.net', '/notapath/', 'A missing path should find the correct network.' ),
     136            array( 'wordpress.org/one/', 'www.wordpress.org', '/one/', 'Should find the path despite the www.' ),
     137            array( 'wordpress.org/one/', 'wordpress.org', '/one/page/', 'A request with two path segments should find the correct network.' ),
     138            array( 'wordpress.org/one/b/', 'wordpress.org', '/one/b/', 'A request with two valid path segments should find the correct network.' ),
     139            array( 'wordpress.org/', 'site1.wordpress.org', '/one/', 'Should not find path because domains do not match.' ),
     140            array( 'wordpress.net/three/', 'wordpress.net', '/three/', 'A network can have a path.' ),
     141            array( 'www.wordpress.net/two/', 'www.wordpress.net', '/two/', 'A www network with a path can coexist with a non-www network.' ),
     142            array( 'wordpress.net/', 'site1.wordpress.net', '/notapath/', 'An invalid subdomain should find the top level network domain.' ),
     143            array( 'wordpress.net/', 'site1.wordpress.net', '/three/', 'An invalid subdomain and path should find the top level network domain.' ),
     144            array( 'wordpress.net/', 'x.y.wordpress.net', '/', 'An invalid two level subdomain should find the top level network domain.' ),
     145        );
     146    }
     147
     148    /**
     149     * @ticket 37217
     150     * @dataProvider data_get_network_by_path_with_zero_path_segments
     151     *
     152     * @param string $expected_key The array key associated with expected data for the test.
     153     * @param string $domain       The requested domain.
     154     * @param string $path         The requested path.
     155     * @param string $message      The message to pass for failed tests.
     156     */
     157    public function test_get_network_by_path_with_zero_path_segments( $expected_key, $domain, $path, $message ) {
     158        add_filter( 'network_by_path_segments_count', '__return_zero' );
     159
     160        $network = get_network_by_path( $domain, $path );
     161
     162        remove_filter( 'network_by_path_segments_count', '__return_zero' );
     163
     164        $this->assertSame( self::$network_ids[ $expected_key ], $network->id, $message );
     165    }
     166
     167    public function data_get_network_by_path_with_zero_path_segments() {
     168        return array(
     169            array( 'wordpress.org/', 'wordpress.org', '/', 'A standard domain and path request should work.' ),
     170            array( 'wordpress.net/', 'wordpress.net', '/notapath/', 'A network matching a top level domain should be found regardless of path.' ),
     171            array( 'www.wordpress.net/', 'www.wordpress.net', '/notapath/', 'A network matching a domain should be found regardless of path.' ),
     172            array( 'wordpress.org/', 'www.wordpress.org', '/one/', 'Should find the network despite the www and regardless of path.' ),
     173            array( 'wordpress.org/', 'site1.wordpress.org', '/one/', 'Should find the network with the corresponding top level domain regardless of path.' ),
     174            array( 'www.wordpress.net/', 'www.wordpress.net', '/two/', 'A www network can coexist with a non-www network.' ),
     175            array( 'make.wordpress.org/', 'make.wordpress.org', '/notapath/', 'A subdomain network should be found regardless of path.' ),
     176            array( 'wordpress.net/', 'x.y.wordpress.net', '/', 'An invalid two level subdomain should find the top level network domain.' ),
     177        );
     178    }
     179
     180    /**
     181     * Even if a matching network is available, it should not match if the the filtered
     182     * value for network path segments is fewer than the number of paths passed.
     183     */
     184    public function test_get_network_by_path_with_forced_single_path_segment_returns_single_path_network() {
     185        add_filter( 'network_by_path_segments_count', array( $this, 'filter_network_path_segments' ) );
     186        $network = get_network_by_path( 'wordpress.org', '/one/b/' );
     187        remove_filter( 'network_by_path_segments_count', array( $this, 'filter_network_path_segments' ) );
     188
     189        $this->assertSame( self::$network_ids['wordpress.org/one/'], $network->id );
     190    }
     191
     192    public function filter_network_path_segments() {
     193        return 1;
     194    }
     195
     196    /**
     197     * @ticket 27003
     198     * @ticket 27927
     199     * @dataProvider data_get_site_by_path
     200     *
     201     * @param string $expected_key The array key associated with expected data for the test.
     202     * @param string $domain       The requested domain.
     203     * @param string $path         The requested path.
     204     * @param int    $segments     Optional. Number of segments to use in `get_site_by_path()`.
     205     */
     206    public function test_get_site_by_path( $expected_key, $domain, $path, $segments = null ) {
     207        $site = get_site_by_path( $domain, $path, $segments );
     208
     209        if ( $expected_key ) {
     210            $this->assertEquals( self::$site_ids[ $expected_key ], $site->blog_id );
     211        } else {
     212            $this->assertFalse( $site );
     213        }
     214    }
     215
     216    public function data_get_site_by_path() {
     217        return array(
     218            array( 'wordpress.org/', 'wordpress.org', '/notapath/' ),
     219            array( 'wordpress.org/', 'www.wordpress.org', '/notapath/' ),
     220            array( 'wordpress.org/foo/bar/', 'wordpress.org', '/foo/bar/baz/' ),
     221            array( 'wordpress.org/foo/bar/', 'www.wordpress.org', '/foo/bar/baz/' ),
     222            array( 'wordpress.org/foo/bar/', 'wordpress.org', '/foo/bar/baz/', 3 ),
     223            array( 'wordpress.org/foo/bar/', 'www.wordpress.org', '/foo/bar/baz/', 3 ),
     224            array( 'wordpress.org/foo/bar/', 'wordpress.org', '/foo/bar/baz/', 2 ),
     225            array( 'wordpress.org/foo/bar/', 'www.wordpress.org', '/foo/bar/baz/', 2 ),
     226            array( 'wordpress.org/foo/', 'wordpress.org', '/foo/bar/baz/', 1 ),
     227            array( 'wordpress.org/foo/', 'www.wordpress.org', '/foo/bar/baz/', 1 ),
     228            array( 'wordpress.org/', 'wordpress.org', '/', 0 ),
     229            array( 'wordpress.org/', 'www.wordpress.org', '/', 0 ),
     230            array( 'make.wordpress.org/foo/', 'make.wordpress.org', '/foo/bar/baz/quz/', 4 ),
     231            array( 'make.wordpress.org/foo/', 'www.make.wordpress.org', '/foo/bar/baz/quz/', 4 ),
     232            array( 'www.w.org/', 'www.w.org', '/', 0 ),
     233            array( 'www.w.org/', 'www.w.org', '/notapath' ),
     234            array( 'www.w.org/foo/bar/', 'www.w.org', '/foo/bar/baz/' ),
     235            array( 'www.w.org/foo/', 'www.w.org', '/foo/bar/baz/', 1 ),
     236
     237            // A site installed with www will not be found by the root domain.
     238            array( false, 'w.org', '/' ),
     239            array( false, 'w.org', '/notapath/' ),
     240            array( false, 'w.org', '/foo/bar/baz/' ),
     241            array( false, 'w.org', '/foo/bar/baz/', 1 ),
     242
     243            // A site will not be found by its root domain when an invalid subdomain is requested.
     244            array( false, 'invalid.wordpress.org', '/' ),
     245            array( false, 'invalid.wordpress.org', '/foo/bar/' ),
     246        );
     247    }
     248
     249    /**
     250     * @ticket 27884
     251     * @dataProvider data_multisite_bootstrap
     252     *
     253     * @param string $site_key    The array key associated with the expected site for the test.
     254     * @param string $network_key The array key associated with the expected network for the test.
     255     * @param string $domain      The requested domain.
     256     * @param string $path        The requested path.
     257     */
     258    public function test_multisite_bootstrap( $site_key, $network_key, $domain, $path ) {
     259        global $current_blog;
     260
     261        $expected = array(
     262            'network_id' => self::$network_ids[ $network_key ],
     263            'site_id'    => self::$site_ids[ $site_key ],
     264        );
     265
     266        ms_load_current_site_and_network( $domain, $path );
     267
     268        $actual = array(
     269            'network_id' => $current_blog->site_id,
     270            'site_id'    => $current_blog->blog_id,
     271        );
     272
     273        ms_load_current_site_and_network( WP_TESTS_DOMAIN, '/' );
     274
     275        $this->assertEqualSetsWithIndex( $expected, $actual );
     276    }
     277
     278    public function data_multisite_bootstrap() {
     279        return array(
     280            array( 'wordpress.org/', 'wordpress.org/', 'wordpress.org', '/' ),
     281            array( 'wordpress.org/', 'wordpress.org/', 'wordpress.org', '/2014/04/23/hello-world/' ),
     282            array( 'wordpress.org/', 'wordpress.org/', 'wordpress.org', '/sample-page/' ),
     283            array( 'wordpress.org/', 'wordpress.org/', 'wordpress.org', '/?p=1' ),
     284            array( 'wordpress.org/', 'wordpress.org/', 'wordpress.org', '/wp-admin/' ),
     285            array( 'wordpress.org/foo/', 'wordpress.org/', 'wordpress.org', '/foo/' ),
     286            array( 'wordpress.org/foo/', 'wordpress.org/', 'wordpress.org', '/FOO/' ),
     287            array( 'wordpress.org/foo/', 'wordpress.org/', 'wordpress.org', '/foo/2014/04/23/hello-world/' ),
     288            array( 'wordpress.org/foo/', 'wordpress.org/', 'wordpress.org', '/foo/sample-page/' ),
     289            array( 'wordpress.org/foo/', 'wordpress.org/', 'wordpress.org', '/foo/?p=1' ),
     290            array( 'wordpress.org/foo/', 'wordpress.org/', 'wordpress.org', '/foo/wp-admin/' ),
     291            array( 'make.wordpress.org/', 'make.wordpress.org/', 'make.wordpress.org', '/' ),
     292            array( 'make.wordpress.org/foo/', 'make.wordpress.org/', 'make.wordpress.org', '/foo/' ),
     293        );
     294    }
     295
     296    /**
     297     * @ticket 27884
     298     */
     299    public function test_multisite_bootstrap_additional_path_segments() {
     300        global $current_blog;
     301
     302        $expected = array(
     303            'network_id' => self::$network_ids['wordpress.org/'],
     304            'site_id'    => self::$site_ids['wordpress.org/foo/bar/'],
     305        );
     306
     307        add_filter( 'site_by_path_segments_count', array( $this, 'filter_path_segments_to_two' ) );
     308        ms_load_current_site_and_network( 'wordpress.org', '/foo/bar/' );
     309
     310        $actual = array(
     311            'network_id' => $current_blog->site_id,
     312            'site_id'    => $current_blog->blog_id,
     313        );
     314
     315        remove_filter( 'site_by_path_segments_count', array( $this, 'filter_path_segments_to_two' ) );
     316        ms_load_current_site_and_network( WP_TESTS_DOMAIN, '/' );
     317
     318        $this->assertEqualSetsWithIndex( $expected, $actual );
     319    }
     320
     321    /**
     322     * @ticket 37053
     323     */
     324    public function test_get_site_by_path_returns_wp_site() {
     325        add_filter( 'pre_get_site_by_path', array( $this, 'filter_pre_get_site_by_path' ), 10, 3 );
     326
     327        $site = get_site_by_path( 'example.com', '/foo/' );
     328
     329        remove_filter( 'pre_get_site_by_path', array( $this, 'filter_pre_get_site_by_path' ), 10 );
     330
     331        $this->assertInstanceOf( 'WP_Site', $site );
     332    }
     333
     334    public function filter_path_segments_to_two() {
     335        return 2;
     336    }
     337
     338    public function filter_pre_get_site_by_path( $site, $domain, $path ) {
     339        $site          = new stdClass();
     340        $site->blog_id = 100;
     341        $site->domain  = $domain;
     342        $site->path    = $path;
     343        $site->site_id = 1;
     344
     345        return $site;
     346    }
     347}
Note: See TracChangeset for help on using the changeset viewer.