<!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][10043] trunk: BP User Query: Remove invalid IDs from `$user_ids` property after query is run.</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" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="http://buddypress.trac.wordpress.org/changeset/10043">10043</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"http://buddypress.trac.wordpress.org/changeset/10043","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>r-a-y</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2015-08-11 16:54:03 +0000 (Tue, 11 Aug 2015)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>BP User Query: Remove invalid IDs from `$user_ids` property after query is run.

If the `user_ids` parameter is passed to `BP_User_Query` with invalid user
IDs, after the user query is run, the `user_ids` property still references
these invalid user IDs.  This can lead to devs to assume that the user ID
exists when it does not.

This commit removes these invalid user IDs and includes a unit test.

See <a href="http://buddypress.trac.wordpress.org/ticket/6577">#6577</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcbpcoreclassesclassbpuserqueryphp">trunk/src/bp-core/classes/class-bp-user-query.php</a></li>
<li><a href="#trunktestsphpunittestcasescoreclassbpuserqueryphp">trunk/tests/phpunit/testcases/core/class-bp-user-query.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcbpcoreclassesclassbpuserqueryphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-core/classes/class-bp-user-query.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-core/classes/class-bp-user-query.php 2015-08-11 16:43:28 UTC (rev 10042)
+++ trunk/src/bp-core/classes/class-bp-user-query.php   2015-08-11 16:54:03 UTC (rev 10043)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -595,13 +595,17 @@
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                // Match up to the user ids from the main query
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                foreach ( $this->user_ids as $uid ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         foreach ( $this->user_ids as $key => $uid ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         if ( isset( $r[ $uid ] ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                $this->results[ $uid ] = $r[ $uid ];
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                                // The BP template functions expect an 'id'
</span><span class="cx" style="display: block; padding: 0 10px">                                // (as opposed to 'ID') property
</span><span class="cx" style="display: block; padding: 0 10px">                                $this->results[ $uid ]->id = $uid;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+                       // remove user ID from original user_ids property
+                       } else {
+                               unset( $this->user_ids[ $key ] );
</ins><span class="cx" style="display: block; padding: 0 10px">                         }
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span></span></pre></div>
<a id="trunktestsphpunittestcasescoreclassbpuserqueryphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/testcases/core/class-bp-user-query.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/testcases/core/class-bp-user-query.php        2015-08-11 16:43:28 UTC (rev 10042)
+++ trunk/tests/phpunit/testcases/core/class-bp-user-query.php  2015-08-11 16:54:03 UTC (rev 10043)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -66,6 +66,32 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertEquals( $friend_ids, array() );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * @group user_ids
+        */
+       public function test_bp_user_query_user_ids_with_invalid_user_id() {
+               $now = time();
+               $u1 = $this->factory->user->create();
+               $u2 = $this->factory->user->create();
+
+               // invalid user ID
+               $u3 = $u2 + 1;
+
+               $old_user = get_current_user_id();
+               $this->set_current_user( $u1 );
+
+               // pass 'user_ids' to user query to trigger this bug
+               $q = new BP_User_Query( array(
+                       'user_ids' => array( $u2, $u3 )
+               ) );
+
+               // $q->user_ids property should now not contain invalid user IDs
+               $this->assertNotContains( $u3, $q->user_ids );
+
+               // clean up
+               $this->set_current_user( $old_user );
+       }
+
</ins><span class="cx" style="display: block; padding: 0 10px">         public function test_bp_user_query_sort_by_popular() {
</span><span class="cx" style="display: block; padding: 0 10px">                $u1 = $this->factory->user->create();
</span><span class="cx" style="display: block; padding: 0 10px">                $u2 = $this->factory->user->create();
</span></span></pre>
</div>
</div>

</body>
</html>