Skip to:
Content

BuddyPress.org

Changeset 13340


Ignore:
Timestamp:
10/11/2022 07:22:19 PM (2 years ago)
Author:
imath
Message:

BP Messages: make sure Threads unread count is consistent

[13102] introduced a regression considering the way we used to set a thread's unread count. This count is set using the list of recipient objects (which include an unread_count property for each user object) by checking for the requested user ID into this list to find the corresponding unread count.

Slicing this list into smaller parts to paginate recipients results introduced potential cases where the requested user ID wasn't found into this paginated list of recipients.

Before doing the slice operation, we need to set the requested user ID thread's unread count to be sure it's the right one and not a null value.

Props sjregan

Fixes #8750 (branch 10.0)

Location:
branches/10.0
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/10.0/src/bp-messages/classes/class-bp-messages-thread.php

    r13196 r13340  
    201201        }
    202202
    203         // Fetch the recipients.
     203        // Fetch the recipients and set the displayed/logged in user's unread count.
    204204        $this->recipients = $this->get_recipients( $thread_id, $r );
    205 
    206         // Get the unread count for the user.
    207         if ( isset( $this->recipients[ $r['user_id'] ] ) ) {
    208             $this->unread_count = $this->recipients[ $r['user_id'] ]->unread_count;
    209         }
    210205
    211206        // Grab all message meta.
     
    312307        }
    313308
     309        // Set the unread count for the user.
     310        if ( isset( $r['user_id'] ) && $r['user_id'] && isset( $recipients[ $r['user_id'] ]->unread_count ) ) {
     311            $this->unread_count = (int) $recipients[ $r['user_id'] ]->unread_count;
     312        }
     313
    314314        // Paginate the results.
    315315        if ( ! empty( $recipients ) && $r['recipients_per_page'] && $r['recipients_page'] ) {
    316316            $start      = ( $r['recipients_page'] - 1 ) * ( $r['recipients_per_page'] );
    317             $recipients = array_slice( $recipients, $start, $r['recipients_per_page'] );
     317            $recipients = array_slice( $recipients, $start, $r['recipients_per_page'], true );
    318318        }
    319319
     
    757757                'ASC',
    758758                array(
     759                    'user_id'             => $r['user_id'],
    759760                    'update_meta_cache'   => false,
    760761                    'recipients_page'     => $r['recipients_page'],
  • branches/10.0/tests/phpunit/testcases/messages/template.php

    r13148 r13340  
    425425        $this->assertCount( 1, $messages_template->threads[0]->recipients );
    426426    }
     427
     428    /**
     429     * @group pagination
     430     * @group BP_Messages_Box_Template
     431     * @group BP8750
     432     */
     433    public function test_thread_unread_count_setting_per_page_recipients() {
     434        $u1 = self::factory()->user->create();
     435        $u2 = self::factory()->user->create();
     436
     437        // create initial thread
     438        $message_1 = self::factory()->message->create_and_get(
     439            array(
     440                'sender_id'  => $u1,
     441                'recipients' => array( $u2 ),
     442            )
     443        );
     444
     445        // create some replies to thread
     446        self::factory()->message->create_and_get(
     447            array(
     448                'thread_id'  => $message_1->thread_id,
     449                'sender_id'  => $u2,
     450                'recipients' => array( $u1 ),
     451            )
     452        );
     453
     454        self::factory()->message->create_and_get(
     455            array(
     456                'thread_id'  => $message_1->thread_id,
     457                'sender_id'  => $u2,
     458                'recipients' => array( $u1 ),
     459            )
     460        );
     461
     462        // set $u1 as current user.
     463        $old_current_user = get_current_user_id();
     464        $this->set_current_user( $u1 );
     465
     466        $messages_template = new BP_Messages_Box_Template(
     467            array(
     468                'recipients_page'     => 1,
     469                'recipients_per_page' => 1,
     470            )
     471        );
     472
     473        $this->set_current_user( $old_current_user );
     474
     475        $thread = reset( $messages_template->threads );
     476
     477        $this->assertEquals( 2, $thread->unread_count );
     478    }
     479
     480    /**
     481     * @group pagination
     482     * @group BP_Messages_Box_Template
     483     * @group BP8750
     484     */
     485    public function test_thread_unread_count_setting_per_page_recipients_with_specific_user_id() {
     486        $u1 = self::factory()->user->create();
     487        $u2 = self::factory()->user->create();
     488        $u3 = self::factory()->user->create();
     489
     490        // create initial thread
     491        $message_1 = self::factory()->message->create_and_get(
     492            array(
     493                'sender_id'  => $u3,
     494                'recipients' => array( $u1, $u2 ),
     495            )
     496        );
     497
     498        // create some replies to thread
     499        self::factory()->message->create_and_get(
     500            array(
     501                'thread_id'  => $message_1->thread_id,
     502                'sender_id'  => $u2,
     503                'recipients' => array( $u1, $u3 ),
     504            )
     505        );
     506
     507        self::factory()->message->create_and_get(
     508            array(
     509                'thread_id'  => $message_1->thread_id,
     510                'sender_id'  => $u1,
     511                'recipients' => array( $u2, $u3 ),
     512            )
     513        );
     514
     515        self::factory()->message->create_and_get(
     516            array(
     517                'thread_id'  => $message_1->thread_id,
     518                'sender_id'  => $u3,
     519                'recipients' => array( $u2, $u1 ),
     520            )
     521        );
     522
     523        $messages_template = new BP_Messages_Box_Template(
     524            array(
     525                'user_id'             => $u3,
     526                'recipients_page'     => 1,
     527                'recipients_per_page' => 1,
     528            )
     529        );
     530
     531        $thread = reset( $messages_template->threads );
     532
     533        $this->assertFalse( isset( $thread->recipients[ $u3 ] ) );
     534        $this->assertCount( 1, $thread->recipients );
     535        $this->assertEquals( 2, $thread->unread_count );
     536    }
    427537}
Note: See TracChangeset for help on using the changeset viewer.