<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[BuddyPress][8107] trunk/tests/includes/testcase.php: Update BP_UnitTestCase::go_to() for WP 3.9 trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://buddypress.trac.wordpress.org/changeset/8107">8107</a></dd>
<dt>Author</dt> <dd>boonebgorges</dd>
<dt>Date</dt> <dd>2014-03-10 20:47:41 +0000 (Mon, 10 Mar 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Update BP_UnitTestCase::go_to() for WP 3.9 trunk

WordPress 3.9 will introduce an overhauled method for determining the current
network and site when running multisite. The current changeset introduces
conditional logic that works properly with the new multisite routing methods.

A couple of specific tests will need updates after this commit.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunktestsincludestestcasephp">trunk/tests/includes/testcase.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunktestsincludestestcasephp"></a>
<div class="modfile"><h4>Modified: trunk/tests/includes/testcase.php (8106 => 8107)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/tests/includes/testcase.php        2014-03-10 20:47:38 UTC (rev 8106)
+++ trunk/tests/includes/testcase.php   2014-03-10 20:47:41 UTC (rev 8107)
</span><span class="lines">@@ -57,6 +57,7 @@
</span><span class="cx"> 
</span><span class="cx">  function go_to( $url ) {
</span><span class="cx">          global $wpdb;
</span><ins>+               global $current_site, $current_blog, $blog_id, $switched, $_wp_switched_stack, $public, $table_prefix, $current_user, $wp_roles;
</ins><span class="cx"> 
</span><span class="cx">          // note: the WP and WP_Query classes like to silently fetch parameters
</span><span class="cx">          // from all over the place (globals, GET, etc), which makes it tricky
</span><span class="lines">@@ -97,10 +98,11 @@
</span><span class="cx">          // setup $current_site and $current_blog globals for multisite based on
</span><span class="cx">          // REQUEST_URI; mostly copied from /wp-includes/ms-settings.php
</span><span class="cx">          if ( is_multisite() ) {
</span><del>-                       $GLOBALS['current_blog'] = $GLOBALS['current_site'] = $GLOBALS['blog_id'] = null;
</del><ins>+                        $current_blog = $current_site = $blog_id = null;
</ins><span class="cx"> 
</span><del>-                       $domain = addslashes( $_SERVER['HTTP_HOST'] );
-                       if ( false !== strpos( $domain, ':' ) ) {
</del><ins>+                        if ( version_compare( $GLOBALS['wp_version'], '3.8.2', '>' ) ) {
+
+                               $domain = strtolower( stripslashes( $_SERVER['HTTP_HOST'] ) );
</ins><span class="cx">                           if ( substr( $domain, -3 ) == ':80' ) {
</span><span class="cx">                                  $domain = substr( $domain, 0, -3 );
</span><span class="cx">                                  $_SERVER['HTTP_HOST'] = substr( $_SERVER['HTTP_HOST'], 0, -3 );
</span><span class="lines">@@ -108,45 +110,139 @@
</span><span class="cx">                                  $domain = substr( $domain, 0, -4 );
</span><span class="cx">                                  $_SERVER['HTTP_HOST'] = substr( $_SERVER['HTTP_HOST'], 0, -4 );
</span><span class="cx">                          }
</span><del>-                       }
</del><span class="cx"> 
</span><del>-                       $domain = rtrim( $domain, '.' );
-                       $cookie_domain = $domain;
-                       if ( substr( $cookie_domain, 0, 4 ) == 'www.' )
-                               $cookie_domain = substr( $cookie_domain, 4 );
</del><ins>+                                $path = stripslashes( $_SERVER['REQUEST_URI'] );
+                               if ( is_admin() ) {
+                                       $path = preg_replace( '#(.*)/wp-admin/.*#', '$1/', $path );
+                               }
+                               list( $path ) = explode( '?', $path );
</ins><span class="cx"> 
</span><del>-                       $path = preg_replace( '|([a-z0-9-]+.php.*)|', '', $GLOBALS['_SERVER']['REQUEST_URI'] );
-                       $path = str_replace ( '/wp-admin/', '/', $path );
-                       $path = preg_replace( '|(/[a-z0-9-]+?/).*|', '$1', $path );
</del><ins>+                                // Are there even two networks installed?
+                               $one_network = $wpdb->get_row( "SELECT * FROM $wpdb->site LIMIT 2" ); // [sic]
+                               if ( 1 === $wpdb->num_rows ) {
+                                       $current_site = wp_get_network( $one_network );
+                               } elseif ( 0 === $wpdb->num_rows ) {
+                                       ms_not_installed();
+                               }
</ins><span class="cx"> 
</span><del>-                       $GLOBALS['current_site'] = wpmu_current_site();
-                       if ( ! isset( $GLOBALS['current_site']->blog_id ) )
-                               $GLOBALS['current_site']->blog_id = $wpdb->get_var( $wpdb->prepare( "SELECT blog_id FROM $wpdb->blogs WHERE domain = %s AND path = %s", $GLOBALS['current_site']->domain, $GLOBALS['current_site']->path ) );
</del><ins>+                                if ( empty( $current_site ) ) {
+                                       $current_site = get_network_by_path( $domain, $path, 1 );
+                               }
</ins><span class="cx"> 
</span><del>-                       // unit tests only support subdirectory install at the moment
-                       // removed object cache references
-                       if ( ! is_subdomain_install() ) {
-                               $blogname = htmlspecialchars( substr( $GLOBALS['_SERVER']['REQUEST_URI'], strlen( $path ) ) );
-                               if ( false !== strpos( $blogname, '/' ) )
-                                       $blogname = substr( $blogname, 0, strpos( $blogname, '/' ) );
-                               if ( false !== strpos( $blogname, '?' ) )
-                                       $blogname = substr( $blogname, 0, strpos( $blogname, '?' ) );
-                               $reserved_blognames = array( 'page', 'comments', 'blog', 'wp-admin', 'wp-includes', 'wp-content', 'files', 'feed' );
-                               if ( $blogname != '' && ! in_array( $blogname, $reserved_blognames ) && ! is_file( $blogname ) )
-                                       $path .= $blogname . '/';
</del><ins>+                                if ( empty( $current_site ) ) {
+                                       ms_not_installed();
+                               } elseif ( $path === $current_site->path ) {
+                                       $current_blog = get_site_by_path( $domain, $path );
+                               } else {
+                                       // Search the network path + one more path segment (on top of the network path).
+                                       $current_blog = get_site_by_path( $domain, $path, substr_count( $current_site->path, '/' ) );
+                               }
</ins><span class="cx"> 
</span><del>-                               $GLOBALS['current_blog'] = get_blog_details( array( 'domain' => $domain, 'path' => $path ), false );
</del><ins>+                                // The network declared by the site trumps any constants.
+                               if ( $current_blog && $current_blog->site_id != $current_site->id ) {
+                                       $current_site = wp_get_network( $current_blog->site_id );
+                               }
</ins><span class="cx"> 
</span><del>-                               unset($reserved_blognames);
-                       }
</del><ins>+                                // If we don't have a network by now, we have a problem.
+                               if ( empty( $current_site ) ) {
+                                       ms_not_installed();
+                               }
</ins><span class="cx"> 
</span><del>-                       if ( $GLOBALS['current_site'] && ! $GLOBALS['current_blog'] ) {
-                               $GLOBALS['current_blog'] = get_blog_details( array( 'domain' => $GLOBALS['current_site']->domain, 'path' => $GLOBALS['current_site']->path ), false );
</del><ins>+                                // @todo What if the domain of the network doesn't match the current site?
+                               $current_site->cookie_domain = $current_site->domain;
+                               if ( 'www.' === substr( $current_site->cookie_domain, 0, 4 ) ) {
+                                       $current_site->cookie_domain = substr( $current_site->cookie_domain, 4 );
+                               }
+
+                               // Figure out the current network's main site.
+                               if ( ! isset( $current_site->blog_id ) ) {
+                                       if ( $current_blog && $current_blog->domain === $current_site->domain && $current_blog->path === $current_site->path ) {
+                                               $current_site->blog_id = $current_blog->blog_id;
+                                       } else {
+                                               // @todo we should be able to cache the blog ID of a network's main site easily.
+                                               $current_site->blog_id = $wpdb->get_var( $wpdb->prepare( "SELECT blog_id FROM $wpdb->blogs WHERE domain = %s AND path = %s",
+                                                       $current_site->domain, $current_site->path ) );
+                                       }
+                               }
+
+                               $blog_id = $current_blog->blog_id;
+                               $public  = $current_blog->public;
+
+                               if ( empty( $current_blog->site_id ) ) {
+                                       // This dates to [MU134] and shouldn't be relevant anymore,
+                                       // but it could be possible for arguments passed to insert_blog() etc.
+                                       $current_blog->site_id = 1;
+                               }
+
+                               $site_id = $current_blog->site_id;
+                               wp_load_core_site_options( $site_id );
+
+                               $table_prefix = $wpdb->get_blog_prefix( $current_blog->blog_id );
+                               $wpdb->set_blog_id( $current_blog->blog_id, $current_blog->site_id );
+                               $_wp_switched_stack = array();
+                               $switched = false;
+
+                               if ( ! isset( $current_site->site_name ) ) {
+                                       $current_site->site_name = get_site_option( 'site_name' );
+                                       if ( ! $current_site->site_name ) {
+                                               $current_site->site_name = ucfirst( $current_site->domain );
+                                       }
+                               }
+
+                       // Pre WP 3.9
+                       } else {
+
+                               $domain = addslashes( $_SERVER['HTTP_HOST'] );
+                               if ( false !== strpos( $domain, ':' ) ) {
+                                       if ( substr( $domain, -3 ) == ':80' ) {
+                                               $domain = substr( $domain, 0, -3 );
+                                               $_SERVER['HTTP_HOST'] = substr( $_SERVER['HTTP_HOST'], 0, -3 );
+                                       } elseif ( substr( $domain, -4 ) == ':443' ) {
+                                               $domain = substr( $domain, 0, -4 );
+                                               $_SERVER['HTTP_HOST'] = substr( $_SERVER['HTTP_HOST'], 0, -4 );
+                                       }
+                               }
+
+                               $domain = rtrim( $domain, '.' );
+                               $cookie_domain = $domain;
+                               if ( substr( $cookie_domain, 0, 4 ) == 'www.' )
+                                       $cookie_domain = substr( $cookie_domain, 4 );
+
+                               $path = preg_replace( '|([a-z0-9-]+.php.*)|', '', $GLOBALS['_SERVER']['REQUEST_URI'] );
+                               $path = str_replace ( '/wp-admin/', '/', $path );
+                               $path = preg_replace( '|(/[a-z0-9-]+?/).*|', '$1', $path );
+
+                               $GLOBALS['current_site'] = wpmu_current_site();
+                               if ( ! isset( $GLOBALS['current_site']->blog_id ) && ! empty( $GLOBALS['current_site'] ) )
+                                       $GLOBALS['current_site']->blog_id = $wpdb->get_var( $wpdb->prepare( "SELECT blog_id FROM $wpdb->blogs WHERE domain = %s AND path = %s", $GLOBALS['current_site']->domain, $GLOBALS['current_site']->path ) );
+
+                               // unit tests only support subdirectory install at the moment
+                               // removed object cache references
+                               if ( ! is_subdomain_install() ) {
+                                       $blogname = htmlspecialchars( substr( $GLOBALS['_SERVER']['REQUEST_URI'], strlen( $path ) ) );
+                                       if ( false !== strpos( $blogname, '/' ) )
+                                               $blogname = substr( $blogname, 0, strpos( $blogname, '/' ) );
+                                       if ( false !== strpos( $blogname, '?' ) )
+                                               $blogname = substr( $blogname, 0, strpos( $blogname, '?' ) );
+                                       $reserved_blognames = array( 'page', 'comments', 'blog', 'wp-admin', 'wp-includes', 'wp-content', 'files', 'feed' );
+                                       if ( $blogname != '' && ! in_array( $blogname, $reserved_blognames ) && ! is_file( $blogname ) )
+                                               $path .= $blogname . '/';
+
+                                       $GLOBALS['current_blog'] = get_blog_details( array( 'domain' => $domain, 'path' => $path ), false );
+
+                                       unset($reserved_blognames);
+                               }
+
+                               if ( $GLOBALS['current_site'] && ! $GLOBALS['current_blog'] ) {
+                                       $GLOBALS['current_blog'] = get_blog_details( array( 'domain' => $GLOBALS['current_site']->domain, 'path' => $GLOBALS['current_site']->path ), false );
+                               }
+
+                               if ( ! empty( $GLOBALS['current_blog'] ) )
+                                       $GLOBALS['blog_id'] = $GLOBALS['current_blog']->blog_id;
</ins><span class="cx">                   }
</span><del>-
-                       $GLOBALS['blog_id'] = $GLOBALS['current_blog']->blog_id;
</del><span class="cx">           }
</span><span class="cx"> 
</span><ins>+               $this->flush_cache();
</ins><span class="cx">           unset($GLOBALS['wp_query'], $GLOBALS['wp_the_query']);
</span><span class="cx">          $GLOBALS['wp_the_query'] = new WP_Query();
</span><span class="cx">          $GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
</span><span class="lines">@@ -162,6 +258,10 @@
</span><span class="cx"> 
</span><span class="cx">          $GLOBALS['wp']->main($parts['query']);
</span><span class="cx"> 
</span><ins>+               $wp_roles->reinit();
+               $current_user = wp_get_current_user();
+               $current_user->for_blog( $blog_id );
+
</ins><span class="cx">           // For BuddyPress, James.
</span><span class="cx">          $GLOBALS['bp']->loggedin_user = NULL;
</span><span class="cx">          $GLOBALS['bp']->pages = bp_core_get_directory_pages();
</span></span></pre>
</div>
</div>

</body>
</html>