permalink_structure = get_option( 'permalink_structure', '' ); } public function tear_down() { $this->set_permalink_structure( $this->permalink_structure ); parent::tear_down(); } public static function wpSetUpBeforeClass( $factory ) { global $wpdb, $bp; self::$user_ids = $factory->user->create_many( 4 ); self::$group_ids = $factory->group->create_many( 3, array( 'creator_id' => self::$user_ids[3], ) ); } public static function wpTearDownAfterClass() { array_map( array( __CLASS__, 'delete_user' ), self::$user_ids ); array_map( 'groups_delete_group', self::$group_ids ); } public function test_get_recently_joined_clauses_restrict_duplicate_joins_and_total() { $user = self::factory()->user->create(); $groups = self::factory()->group->create_many( 2, array( 'creator_id' => self::$user_ids[3], 'name' => 'Phase Four', ) ); foreach ( $groups as $group ) { self::add_user_to_group( $user, $group ); } $baseline = BP_Groups_Member::get_recently_joined( $user, 1, 1, 'Phase Four' ); $this->assertSame( 2, $baseline['total'] ); $allowed = $groups[0]; $calls = array(); $filter = static function( $clauses, $args ) use ( $allowed, &$calls, &$filter ) { remove_filter( 'bp_groups_member_recently_joined_get_sql_clauses', $filter, 0 ); $calls[] = $args; $clauses['select'] = str_replace( 'SELECT ', 'SELECT DISTINCT ', $clauses['select'] ); $clauses['join'] .= " INNER JOIN (SELECT {$allowed} AS id UNION ALL SELECT {$allowed}) access ON access.id = m.group_id"; $clauses['where_conditions']['access'] = "access.id = {$allowed}"; return $clauses; }; add_filter( 'bp_groups_member_recently_joined_get_sql_clauses', $filter, 0, 2 ); try { $found = BP_Groups_Member::get_recently_joined( $user, 1, 1, 'Phase Four' ); $this->assertSame( array( $allowed ), wp_list_pluck( $found['groups'], 'id' ) ); $this->assertSame( 1, $found['total'] ); add_filter( 'bp_groups_member_recently_joined_get_sql_clauses', $filter, 0, 2 ); $second_page = BP_Groups_Member::get_recently_joined( $user, 1, 2, 'Phase Four' ); $this->assertSame( array(), $second_page['groups'] ); $this->assertSame( 1, $second_page['total'] ); $this->assertSame( array( 'user_id' => $user, 'limit' => 1, 'page' => 1, 'filter' => 'Phase Four', ), $calls[0] ); $this->assertCount( 2, $calls ); } finally { remove_filter( 'bp_groups_member_recently_joined_get_sql_clauses', $filter, 0 ); } } public function test_get_recently_joined_final_sql_receives_both_contexts() { $user = self::factory()->user->create(); $groups = self::factory()->group->create_many( 2, array( 'creator_id' => self::$user_ids[3], 'name' => 'Phase Four', ) ); foreach ( $groups as $group ) { self::add_user_to_group( $user, $group ); } $contexts = array(); $filter = static function( $sql, $type, $args, $clauses ) use ( &$contexts ) { $contexts[ $type ] = array( $args, $clauses ); return 'count' === $type ? 'SELECT 42' : str_replace( 'WHERE', 'WHERE 1 = 0 AND', $sql ); }; add_filter( 'bp_groups_member_recently_joined_get_sql', $filter, 10, 4 ); try { $found = BP_Groups_Member::get_recently_joined( $user, 1, 1, 'Phase Four' ); } finally { remove_filter( 'bp_groups_member_recently_joined_get_sql', $filter ); } $this->assertSame( array(), $found['groups'] ); $this->assertSame( 42, $found['total'] ); $this->assertSame( array( 'paged', 'count' ), array_keys( $contexts ) ); $this->assertSame( $contexts['paged'], $contexts['count'] ); $this->assertSame( $user, $contexts['paged'][0]['user_id'] ); $this->assertArrayHasKey( 'where_conditions', $contexts['paged'][1] ); } public function test_get_is_admin_of_clauses_restrict_duplicate_joins_and_total() { $user = self::factory()->user->create(); $groups = self::factory()->group->create_many( 2, array( 'creator_id' => self::$user_ids[3], 'name' => 'Phase Four', ) ); foreach ( $groups as $group ) { self::add_user_to_group( $user, $group ); $membership = new BP_Groups_Member( $user, $group ); $membership->promote( 'admin' ); } $baseline = BP_Groups_Member::get_is_admin_of( $user, 1, 1, 'Phase Four' ); $this->assertSame( 2, $baseline['total'] ); $allowed = $groups[0]; $calls = array(); $filter = static function( $clauses, $args ) use ( $allowed, &$calls, &$filter ) { remove_filter( 'bp_groups_member_is_admin_of_get_sql_clauses', $filter, 0 ); $calls[] = $args; $clauses['select'] = str_replace( 'SELECT ', 'SELECT DISTINCT ', $clauses['select'] ); $clauses['join'] .= " INNER JOIN (SELECT {$allowed} AS id UNION ALL SELECT {$allowed}) access ON access.id = m.group_id"; $clauses['where_conditions']['access'] = "access.id = {$allowed}"; return $clauses; }; add_filter( 'bp_groups_member_is_admin_of_get_sql_clauses', $filter, 0, 2 ); try { $found = BP_Groups_Member::get_is_admin_of( $user, 1, 1, 'Phase Four' ); $this->assertSame( array( $allowed ), wp_list_pluck( $found['groups'], 'id' ) ); $this->assertSame( 1, $found['total'] ); add_filter( 'bp_groups_member_is_admin_of_get_sql_clauses', $filter, 0, 2 ); $second_page = BP_Groups_Member::get_is_admin_of( $user, 1, 2, 'Phase Four' ); $this->assertSame( array(), $second_page['groups'] ); $this->assertSame( 1, $second_page['total'] ); $this->assertSame( array( 'user_id' => $user, 'limit' => 1, 'page' => 1, 'filter' => 'Phase Four', ), $calls[0] ); $this->assertCount( 2, $calls ); } finally { remove_filter( 'bp_groups_member_is_admin_of_get_sql_clauses', $filter, 0 ); } } public function test_get_is_admin_of_final_sql_receives_both_contexts() { $user = self::factory()->user->create(); $groups = self::factory()->group->create_many( 2, array( 'creator_id' => self::$user_ids[3], 'name' => 'Phase Four', ) ); foreach ( $groups as $group ) { self::add_user_to_group( $user, $group ); $membership = new BP_Groups_Member( $user, $group ); $membership->promote( 'admin' ); } $contexts = array(); $filter = static function( $sql, $type, $args, $clauses ) use ( &$contexts ) { $contexts[ $type ] = array( $args, $clauses ); return 'count' === $type ? 'SELECT 42' : str_replace( 'WHERE', 'WHERE 1 = 0 AND', $sql ); }; add_filter( 'bp_groups_member_is_admin_of_get_sql', $filter, 10, 4 ); try { $found = BP_Groups_Member::get_is_admin_of( $user, 1, 1, 'Phase Four' ); } finally { remove_filter( 'bp_groups_member_is_admin_of_get_sql', $filter ); } $this->assertSame( array(), $found['groups'] ); $this->assertSame( 42, $found['total'] ); $this->assertSame( array( 'paged', 'count' ), array_keys( $contexts ) ); $this->assertSame( $contexts['paged'], $contexts['count'] ); $this->assertSame( $user, $contexts['paged'][0]['user_id'] ); $this->assertArrayHasKey( 'where_conditions', $contexts['paged'][1] ); } public function test_get_is_mod_of_clauses_restrict_duplicate_joins_and_total() { $user = self::factory()->user->create(); $groups = self::factory()->group->create_many( 2, array( 'creator_id' => self::$user_ids[3], 'name' => 'Phase Four', ) ); foreach ( $groups as $group ) { self::add_user_to_group( $user, $group ); $membership = new BP_Groups_Member( $user, $group ); $membership->promote( 'mod' ); } $baseline = BP_Groups_Member::get_is_mod_of( $user, 1, 1, 'Phase Four' ); $this->assertSame( 2, $baseline['total'] ); $allowed = $groups[0]; $calls = array(); $filter = static function( $clauses, $args ) use ( $allowed, &$calls, &$filter ) { remove_filter( 'bp_groups_member_is_mod_of_get_sql_clauses', $filter, 0 ); $calls[] = $args; $clauses['select'] = str_replace( 'SELECT ', 'SELECT DISTINCT ', $clauses['select'] ); $clauses['join'] .= " INNER JOIN (SELECT {$allowed} AS id UNION ALL SELECT {$allowed}) access ON access.id = m.group_id"; $clauses['where_conditions']['access'] = "access.id = {$allowed}"; return $clauses; }; add_filter( 'bp_groups_member_is_mod_of_get_sql_clauses', $filter, 0, 2 ); try { $found = BP_Groups_Member::get_is_mod_of( $user, 1, 1, 'Phase Four' ); $this->assertSame( array( $allowed ), wp_list_pluck( $found['groups'], 'id' ) ); $this->assertSame( 1, $found['total'] ); add_filter( 'bp_groups_member_is_mod_of_get_sql_clauses', $filter, 0, 2 ); $second_page = BP_Groups_Member::get_is_mod_of( $user, 1, 2, 'Phase Four' ); $this->assertSame( array(), $second_page['groups'] ); $this->assertSame( 1, $second_page['total'] ); $this->assertSame( array( 'user_id' => $user, 'limit' => 1, 'page' => 1, 'filter' => 'Phase Four', ), $calls[0] ); $this->assertCount( 2, $calls ); } finally { remove_filter( 'bp_groups_member_is_mod_of_get_sql_clauses', $filter, 0 ); } } public function test_get_is_mod_of_final_sql_receives_both_contexts() { $user = self::factory()->user->create(); $groups = self::factory()->group->create_many( 2, array( 'creator_id' => self::$user_ids[3], 'name' => 'Phase Four', ) ); foreach ( $groups as $group ) { self::add_user_to_group( $user, $group ); $membership = new BP_Groups_Member( $user, $group ); $membership->promote( 'mod' ); } $contexts = array(); $filter = static function( $sql, $type, $args, $clauses ) use ( &$contexts ) { $contexts[ $type ] = array( $args, $clauses ); return 'count' === $type ? 'SELECT 42' : str_replace( 'WHERE', 'WHERE 1 = 0 AND', $sql ); }; add_filter( 'bp_groups_member_is_mod_of_get_sql', $filter, 10, 4 ); try { $found = BP_Groups_Member::get_is_mod_of( $user, 1, 1, 'Phase Four' ); } finally { remove_filter( 'bp_groups_member_is_mod_of_get_sql', $filter ); } $this->assertSame( array(), $found['groups'] ); $this->assertSame( 42, $found['total'] ); $this->assertSame( array( 'paged', 'count' ), array_keys( $contexts ) ); $this->assertSame( $contexts['paged'], $contexts['count'] ); $this->assertSame( $user, $contexts['paged'][0]['user_id'] ); $this->assertArrayHasKey( 'where_conditions', $contexts['paged'][1] ); } public function test_get_is_banned_of_clauses_restrict_duplicate_joins_and_total() { $user = self::factory()->user->create(); $groups = self::factory()->group->create_many( 2, array( 'creator_id' => self::$user_ids[3], 'name' => 'Phase Four', ) ); foreach ( $groups as $group ) { self::add_user_to_group( $user, $group ); $membership = new BP_Groups_Member( $user, $group ); $membership->ban(); } $baseline = BP_Groups_Member::get_is_banned_of( $user, 1, 1, 'Phase Four' ); $this->assertSame( 2, $baseline['total'] ); $allowed = $groups[0]; $calls = array(); $filter = static function( $clauses, $args ) use ( $allowed, &$calls, &$filter ) { remove_filter( 'bp_groups_member_is_banned_of_get_sql_clauses', $filter, 0 ); $calls[] = $args; $clauses['select'] = str_replace( 'SELECT ', 'SELECT DISTINCT ', $clauses['select'] ); $clauses['join'] .= " INNER JOIN (SELECT {$allowed} AS id UNION ALL SELECT {$allowed}) access ON access.id = m.group_id"; $clauses['where_conditions']['access'] = "access.id = {$allowed}"; return $clauses; }; add_filter( 'bp_groups_member_is_banned_of_get_sql_clauses', $filter, 0, 2 ); try { $found = BP_Groups_Member::get_is_banned_of( $user, 1, 1, 'Phase Four' ); $this->assertSame( array( $allowed ), wp_list_pluck( $found['groups'], 'id' ) ); $this->assertSame( 1, $found['total'] ); add_filter( 'bp_groups_member_is_banned_of_get_sql_clauses', $filter, 0, 2 ); $second_page = BP_Groups_Member::get_is_banned_of( $user, 1, 2, 'Phase Four' ); $this->assertSame( array(), $second_page['groups'] ); $this->assertSame( 1, $second_page['total'] ); $this->assertSame( array( 'user_id' => $user, 'limit' => 1, 'page' => 1, 'filter' => 'Phase Four', ), $calls[0] ); $this->assertCount( 2, $calls ); } finally { remove_filter( 'bp_groups_member_is_banned_of_get_sql_clauses', $filter, 0 ); } } public function test_get_is_banned_of_final_sql_receives_both_contexts() { $user = self::factory()->user->create(); $groups = self::factory()->group->create_many( 2, array( 'creator_id' => self::$user_ids[3], 'name' => 'Phase Four', ) ); foreach ( $groups as $group ) { self::add_user_to_group( $user, $group ); $membership = new BP_Groups_Member( $user, $group ); $membership->ban(); } $contexts = array(); $filter = static function( $sql, $type, $args, $clauses ) use ( &$contexts ) { $contexts[ $type ] = array( $args, $clauses ); return 'count' === $type ? 'SELECT 42' : str_replace( 'WHERE', 'WHERE 1 = 0 AND', $sql ); }; add_filter( 'bp_groups_member_is_banned_of_get_sql', $filter, 10, 4 ); try { $found = BP_Groups_Member::get_is_banned_of( $user, 1, 1, 'Phase Four' ); } finally { remove_filter( 'bp_groups_member_is_banned_of_get_sql', $filter ); } $this->assertSame( array(), $found['groups'] ); $this->assertSame( 42, $found['total'] ); $this->assertSame( array( 'paged', 'count' ), array_keys( $contexts ) ); $this->assertSame( $contexts['paged'], $contexts['count'] ); $this->assertSame( $user, $contexts['paged'][0]['user_id'] ); $this->assertArrayHasKey( 'where_conditions', $contexts['paged'][1] ); } public function test_get_recently_joined_default_sql_visibility_and_pagination() { global $wpdb; $bp = buddypress(); $user = self::factory()->user->create(); $groups = self::factory()->group->create_many( 2, array( 'creator_id' => self::$user_ids[3], 'name' => 'Phase Four', ) ); $groups[] = self::factory()->group->create( array( 'creator_id' => self::$user_ids[3], 'name' => 'Phase Four Hidden', 'status' => 'hidden', ) ); foreach ( $groups as $group ) { self::add_user_to_group( $user, $group ); } $previous_user = get_current_user_id(); $queries = array(); $capture = static function( $sql, $type ) use ( &$queries ) { $queries[ $type ] = $sql; return $sql; }; add_filter( 'bp_groups_member_recently_joined_get_sql', $capture, 10, 2 ); try { foreach ( array( 0, $user ) as $viewer ) { wp_set_current_user( $viewer ); $hidden = $viewer === $user ? '' : " AND g.status != 'hidden'"; $search = $wpdb->prepare( ' AND ( g.name LIKE %s OR g.description LIKE %s )', '%Phase Four%', '%Phase Four%' ); $expected = array( 'paged' => "SELECT g.*, gm1.meta_value as total_member_count, gm2.meta_value as last_activity FROM {$bp->groups->table_name_groupmeta} gm1, {$bp->groups->table_name_groupmeta} gm2, {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE g.id = m.group_id AND g.id = gm1.group_id AND g.id = gm2.group_id AND gm2.meta_key = 'last_activity' AND gm1.meta_key = 'total_member_count'{$hidden}{$search} AND m.user_id = {$user} AND m.is_confirmed = 1 AND m.is_banned = 0 ORDER BY m.date_modified DESC LIMIT 1, 1", 'count' => "SELECT COUNT(DISTINCT m.group_id) FROM {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE m.group_id = g.id{$hidden}{$search} AND m.user_id = {$user} AND m.is_banned = 0 AND m.is_confirmed = 1 ORDER BY m.date_modified DESC", ); $found = BP_Groups_Member::get_recently_joined( $user, 1, 2, 'Phase Four' ); $this->assertSame( $expected, $queries ); $this->assertCount( 1, $found['groups'] ); $this->assertSame( $viewer === $user ? 3 : 2, $found['total'] ); $this->assertIsInt( $found['groups'][0]->id ); } } finally { remove_filter( 'bp_groups_member_recently_joined_get_sql', $capture ); wp_set_current_user( $previous_user ); } } public function test_get_is_admin_of_default_sql_visibility_and_pagination() { global $wpdb; $bp = buddypress(); $user = self::factory()->user->create(); $groups = self::factory()->group->create_many( 2, array( 'creator_id' => self::$user_ids[3], 'name' => 'Phase Four', ) ); $groups[] = self::factory()->group->create( array( 'creator_id' => self::$user_ids[3], 'name' => 'Phase Four Hidden', 'status' => 'hidden', ) ); foreach ( $groups as $group ) { self::add_user_to_group( $user, $group ); $membership = new BP_Groups_Member( $user, $group ); $membership->promote( 'admin' ); } $previous_user = get_current_user_id(); $queries = array(); $capture = static function( $sql, $type ) use ( &$queries ) { $queries[ $type ] = $sql; return $sql; }; add_filter( 'bp_groups_member_is_admin_of_get_sql', $capture, 10, 2 ); try { foreach ( array( 0, $user ) as $viewer ) { wp_set_current_user( $viewer ); $hidden = $viewer === $user ? '' : " AND g.status != 'hidden'"; $search = $wpdb->prepare( ' AND ( g.name LIKE %s OR g.description LIKE %s )', '%Phase Four%', '%Phase Four%' ); $expected = array( 'paged' => "SELECT g.*, gm1.meta_value as total_member_count, gm2.meta_value as last_activity FROM {$bp->groups->table_name_groupmeta} gm1, {$bp->groups->table_name_groupmeta} gm2, {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE g.id = m.group_id AND g.id = gm1.group_id AND g.id = gm2.group_id AND gm2.meta_key = 'last_activity' AND gm1.meta_key = 'total_member_count'{$hidden}{$search} AND m.user_id = {$user} AND m.is_confirmed = 1 AND m.is_banned = 0 AND m.is_admin = 1 ORDER BY m.date_modified ASC LIMIT 1, 1", 'count' => "SELECT COUNT(DISTINCT m.group_id) FROM {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE m.group_id = g.id{$hidden}{$search} AND m.user_id = {$user} AND m.is_confirmed = 1 AND m.is_banned = 0 AND m.is_admin = 1 ORDER BY date_modified ASC", ); $found = BP_Groups_Member::get_is_admin_of( $user, 1, 2, 'Phase Four' ); $this->assertSame( $expected, $queries ); $this->assertCount( 1, $found['groups'] ); $this->assertSame( $viewer === $user ? 3 : 2, $found['total'] ); $this->assertIsInt( $found['groups'][0]->id ); } } finally { remove_filter( 'bp_groups_member_is_admin_of_get_sql', $capture ); wp_set_current_user( $previous_user ); } } public function test_get_is_mod_of_default_sql_visibility_and_pagination() { global $wpdb; $bp = buddypress(); $user = self::factory()->user->create(); $groups = self::factory()->group->create_many( 2, array( 'creator_id' => self::$user_ids[3], 'name' => 'Phase Four', ) ); $groups[] = self::factory()->group->create( array( 'creator_id' => self::$user_ids[3], 'name' => 'Phase Four Hidden', 'status' => 'hidden', ) ); foreach ( $groups as $group ) { self::add_user_to_group( $user, $group ); $membership = new BP_Groups_Member( $user, $group ); $membership->promote( 'mod' ); } $previous_user = get_current_user_id(); $queries = array(); $capture = static function( $sql, $type ) use ( &$queries ) { $queries[ $type ] = $sql; return $sql; }; add_filter( 'bp_groups_member_is_mod_of_get_sql', $capture, 10, 2 ); try { foreach ( array( 0, $user ) as $viewer ) { wp_set_current_user( $viewer ); $hidden = $viewer === $user ? '' : " AND g.status != 'hidden'"; $search = $wpdb->prepare( ' AND ( g.name LIKE %s OR g.description LIKE %s )', '%Phase Four%', '%Phase Four%' ); $expected = array( 'paged' => "SELECT g.*, gm1.meta_value as total_member_count, gm2.meta_value as last_activity FROM {$bp->groups->table_name_groupmeta} gm1, {$bp->groups->table_name_groupmeta} gm2, {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE g.id = m.group_id AND g.id = gm1.group_id AND g.id = gm2.group_id AND gm2.meta_key = 'last_activity' AND gm1.meta_key = 'total_member_count'{$hidden}{$search} AND m.user_id = {$user} AND m.is_confirmed = 1 AND m.is_banned = 0 AND m.is_mod = 1 ORDER BY m.date_modified ASC LIMIT 1, 1", 'count' => "SELECT COUNT(DISTINCT m.group_id) FROM {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE m.group_id = g.id{$hidden}{$search} AND m.user_id = {$user} AND m.is_confirmed = 1 AND m.is_banned = 0 AND m.is_mod = 1 ORDER BY date_modified ASC", ); $found = BP_Groups_Member::get_is_mod_of( $user, 1, 2, 'Phase Four' ); $this->assertSame( $expected, $queries ); $this->assertCount( 1, $found['groups'] ); $this->assertSame( $viewer === $user ? 3 : 2, $found['total'] ); $this->assertIsInt( $found['groups'][0]->id ); } } finally { remove_filter( 'bp_groups_member_is_mod_of_get_sql', $capture ); wp_set_current_user( $previous_user ); } } public function test_get_is_banned_of_default_sql_visibility_and_pagination() { global $wpdb; $bp = buddypress(); $user = self::factory()->user->create(); $groups = self::factory()->group->create_many( 2, array( 'creator_id' => self::$user_ids[3], 'name' => 'Phase Four', ) ); $groups[] = self::factory()->group->create( array( 'creator_id' => self::$user_ids[3], 'name' => 'Phase Four Hidden', 'status' => 'hidden', ) ); foreach ( $groups as $group ) { self::add_user_to_group( $user, $group ); $membership = new BP_Groups_Member( $user, $group ); $membership->ban(); } $previous_user = get_current_user_id(); $queries = array(); $capture = static function( $sql, $type ) use ( &$queries ) { $queries[ $type ] = $sql; return $sql; }; add_filter( 'bp_groups_member_is_banned_of_get_sql', $capture, 10, 2 ); try { foreach ( array( 0, $user ) as $viewer ) { wp_set_current_user( $viewer ); $hidden = $viewer === $user ? '' : " AND g.status != 'hidden'"; $search = $wpdb->prepare( ' AND ( g.name LIKE %s OR g.description LIKE %s )', '%Phase Four%', '%Phase Four%' ); $expected = array( 'paged' => "SELECT g.*, gm1.meta_value as total_member_count, gm2.meta_value as last_activity FROM {$bp->groups->table_name_groupmeta} gm1, {$bp->groups->table_name_groupmeta} gm2, {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE g.id = m.group_id AND g.id = gm1.group_id AND g.id = gm2.group_id AND gm2.meta_key = 'last_activity' AND gm1.meta_key = 'total_member_count'{$hidden}{$search} AND m.user_id = {$user} AND m.is_banned = 1 ORDER BY m.date_modified ASC LIMIT 1, 1", 'count' => "SELECT COUNT(DISTINCT m.group_id) FROM {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE m.group_id = g.id{$hidden}{$search} AND m.user_id = {$user} AND m.is_banned = 1 ORDER BY date_modified ASC", ); $found = BP_Groups_Member::get_is_banned_of( $user, 1, 2, 'Phase Four' ); $this->assertSame( $expected, $queries ); $this->assertCount( 1, $found['groups'] ); $this->assertSame( $viewer === $user ? 3 : 2, $found['total'] ); $this->assertIsInt( $found['groups'][0]->id ); } } finally { remove_filter( 'bp_groups_member_is_banned_of_get_sql', $capture ); wp_set_current_user( $previous_user ); } } public function test_get_group_ids_should_return_integers() { $group_id = self::factory()->group->create(); $user_id = self::factory()->user->create(); self::add_user_to_group( $user_id, $group_id ); $found = BP_Groups_Member::get_group_ids( $user_id ); $this->assertSame( array( $group_id ), $found['groups'] ); $this->assertSame( 1, $found['total'] ); } public function test_get_recently_joined_with_filter() { $g1 = self::factory()->group->create( array( 'name' => 'Tab', ) ); $g2 = self::factory()->group->create( array( 'name' => 'Diet Rite', ) ); $u = self::factory()->user->create(); self::add_user_to_group( $u, $g1 ); self::add_user_to_group( $u, $g2 ); $groups = BP_Groups_Member::get_recently_joined( $u, false, false, 'Rite' ); $ids = wp_list_pluck( $groups['groups'], 'id' ); $this->assertSame( array( $g2 ), $ids ); } public function test_get_is_admin_of_with_filter() { $g1 = self::factory()->group->create( array( 'name' => 'RC Cola', ) ); $g2 = self::factory()->group->create( array( 'name' => 'Pepsi', ) ); $u = self::factory()->user->create(); self::add_user_to_group( $u, $g1 ); self::add_user_to_group( $u, $g2 ); $m1 = new BP_Groups_Member( $u, $g1 ); $m1->promote( 'admin' ); $m2 = new BP_Groups_Member( $u, $g2 ); $m2->promote( 'admin' ); $groups = BP_Groups_Member::get_is_admin_of( $u, false, false, 'eps' ); $ids = wp_list_pluck( $groups['groups'], 'id' ); $this->assertSame( array( $g2 ), $ids ); } public function test_get_is_mod_of_with_filter() { $g1 = self::factory()->group->create( array( 'name' => 'RC Cola', ) ); $g2 = self::factory()->group->create( array( 'name' => 'Pepsi', ) ); $u = self::factory()->user->create(); self::add_user_to_group( $u, $g1 ); self::add_user_to_group( $u, $g2 ); $m1 = new BP_Groups_Member( $u, $g1 ); $m1->promote( 'mod' ); $m2 = new BP_Groups_Member( $u, $g2 ); $m2->promote( 'mod' ); $groups = BP_Groups_Member::get_is_mod_of( $u, false, false, 'eps' ); $ids = wp_list_pluck( $groups['groups'], 'id' ); $this->assertSame( array( $g2 ), $ids ); } public function test_get_is_banned_of_with_filter() { $g1 = self::factory()->group->create( array( 'name' => 'RC Cola', ) ); $g2 = self::factory()->group->create( array( 'name' => 'Pepsi', ) ); $u = self::factory()->user->create(); self::add_user_to_group( $u, $g1 ); self::add_user_to_group( $u, $g2 ); $m1 = new BP_Groups_Member( $u, $g1 ); $m1->ban(); $m2 = new BP_Groups_Member( $u, $g2 ); $m2->ban(); $groups = BP_Groups_Member::get_is_banned_of( $u, false, false, 'eps' ); $ids = wp_list_pluck( $groups['groups'], 'id' ); $this->assertSame( array( $g2 ), $ids ); } public function test_get_invites_with_exclude() { $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); $g1 = self::factory()->group->create( array( 'status' => 'private', 'creator_id' => $u1 ) ); $g2 = self::factory()->group->create( array( 'status' => 'private', 'creator_id' => $u1 ) ); groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g1, 'inviter_id' => $u1, 'send_invite' => 1, ) ); groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g2, 'inviter_id' => $u1, 'send_invite' => 1, ) ); $groups = BP_Groups_Member::get_invites( $u2, false, false, array( 'awesome', $g1 ) ); $ids = wp_list_pluck( $groups['groups'], 'id' ); $this->assertSame( array( $g2 ), $ids ); } /** * @expectedDeprecated BP_Groups_Member::get_all_for_group */ public function test_get_all_for_group_with_exclude() { $g1 = self::factory()->group->create(); $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); self::add_user_to_group( $u1, $g1 ); self::add_user_to_group( $u2, $g1 ); $members = BP_Groups_Member::get_all_for_group( $g1, false, false, true, true, array( $u1 ) ); $mm = (array) $members['members']; $ids = wp_list_pluck( $mm, 'user_id' ); $this->assertSame( array( $u2 ), $ids ); } /** * @group bp_groups_user_can_send_invites */ public function test_bp_groups_user_can_send_invites() { $this->set_permalink_structure( '/%postname%/' ); $u_nonmembers = self::factory()->user->create(); $u_members = self::factory()->user->create(); $u_mods = self::factory()->user->create(); $u_admins = self::factory()->user->create(); $u_siteadmin = self::factory()->user->create(); $user_siteadmin = new WP_User( $u_siteadmin ); $user_siteadmin->add_role( 'administrator' ); $g = self::factory()->group->create(); $time = time() - 60; // Create member-level user $this->add_user_to_group( $u_members, $g, array( 'date_modified' => date( 'Y-m-d H:i:s', $time ), ) ); // Create mod-level user $this->add_user_to_group( $u_mods, $g, array( 'date_modified' => date( 'Y-m-d H:i:s', $time ), ) ); $m_mod = new BP_Groups_Member( $u_mods, $g ); $m_mod->promote( 'mod' ); // Create admin-level user $this->add_user_to_group( $u_admins, $g, array( 'date_modified' => date( 'Y-m-d H:i:s', $time ), ) ); $m_admin = new BP_Groups_Member( $u_admins, $g ); $m_admin->promote( 'admin' ); // Test with no status // In bp_group_get_invite_status(), no status falls back to "members" $this->assertFalse( bp_groups_user_can_send_invites( $g, $u_nonmembers ) ); $this->assertTrue( bp_groups_user_can_send_invites( $g, $u_members ) ); $this->assertTrue( bp_groups_user_can_send_invites( $g, $u_mods ) ); $this->assertTrue( bp_groups_user_can_send_invites( $g, $u_admins ) ); $this->assertTrue( bp_groups_user_can_send_invites( $g, $u_siteadmin ) ); // Test with members status groups_update_groupmeta( $g, 'invite_status', 'members' ); $this->assertFalse( bp_groups_user_can_send_invites( $g, $u_nonmembers ) ); $this->assertTrue( bp_groups_user_can_send_invites( $g, $u_members ) ); $this->assertTrue( bp_groups_user_can_send_invites( $g, $u_mods ) ); $this->assertTrue( bp_groups_user_can_send_invites( $g, $u_admins ) ); $this->assertTrue( bp_groups_user_can_send_invites( $g, $u_siteadmin ) ); // Falling back to current user wp_set_current_user( $u_members ); $this->assertTrue( bp_groups_user_can_send_invites( $g, null ) ); // Test with mod status groups_update_groupmeta( $g, 'invite_status', 'mods' ); $this->assertFalse( bp_groups_user_can_send_invites( $g, $u_nonmembers ) ); $this->assertFalse( bp_groups_user_can_send_invites( $g, $u_members ) ); $this->assertTrue( bp_groups_user_can_send_invites( $g, $u_mods ) ); $this->assertTrue( bp_groups_user_can_send_invites( $g, $u_admins ) ); $this->assertTrue( bp_groups_user_can_send_invites( $g, $u_siteadmin ) ); // Falling back to current user wp_set_current_user( $u_members ); $this->assertFalse( bp_groups_user_can_send_invites( $g, null ) ); wp_set_current_user( $u_mods ); $this->assertTrue( bp_groups_user_can_send_invites( $g, null ) ); // Test with admin status groups_update_groupmeta( $g, 'invite_status', 'admins' ); $this->assertFalse( bp_groups_user_can_send_invites( $g, $u_nonmembers ) ); $this->assertFalse( bp_groups_user_can_send_invites( $g, $u_members ) ); $this->assertFalse( bp_groups_user_can_send_invites( $g, $u_mods ) ); $this->assertTrue( bp_groups_user_can_send_invites( $g, $u_admins ) ); $this->assertTrue( bp_groups_user_can_send_invites( $g, $u_siteadmin ) ); // Falling back to current user wp_set_current_user( $u_mods ); $this->assertFalse( bp_groups_user_can_send_invites( $g, null ) ); wp_set_current_user( $u_admins ); $this->assertTrue( bp_groups_user_can_send_invites( $g, null ) ); // Bad or null parameters $this->assertFalse( bp_groups_user_can_send_invites( 59876454257, $u_members ) ); $this->assertFalse( bp_groups_user_can_send_invites( $g, 958647515 ) ); // Not in group context $this->assertFalse( bp_groups_user_can_send_invites( null, $u_members ) ); // In group context $g_obj = groups_get_group( $g ); $this->go_to( bp_get_group_url( $g_obj ) ); groups_update_groupmeta( $g, 'invite_status', 'mods' ); $this->assertFalse( bp_groups_user_can_send_invites( null, $u_nonmembers ) ); $this->assertFalse( bp_groups_user_can_send_invites( null, $u_members ) ); $this->assertTrue( bp_groups_user_can_send_invites( null, $u_mods ) ); } /** * @group groups_reject_membership_request * @group group_membership_requests * @group group_membership */ public function test_bp_groups_reject_membership_request_remove_request() { $u1 = self::factory()->user->create(); $g = self::factory()->group->create( array( 'status' => 'private', ) ); // Membership requests should be removed. groups_send_membership_request( array( 'user_id' => $u1, 'group_id' => $g ) ); groups_reject_membership_request( null, $u1, $g ); $u1_has_request = groups_check_for_membership_request( $u1, $g ); $this->assertFalse( $u1_has_request ); } /** * @group groups_reject_membership_request * @group group_membership_requests * @group group_membership */ public function test_bp_groups_reject_membership_request_leave_memberships_intact() { $u1 = self::factory()->user->create(); $g = self::factory()->group->create( array( 'status' => 'private', ) ); $this->add_user_to_group( $u1, $g ); // Confirmed memberships should be left intact. groups_reject_membership_request( null, $u1, $g ); $u1_is_member = groups_is_user_member( $u1, $g ); $this->assertTrue( is_numeric( $u1_is_member ) && $u1_is_member > 0 ); } /** * @group groups_reject_membership_request * @group group_membership_requests * @group group_membership */ public function test_bp_groups_reject_membership_request_leave_invites_intact() { $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); $g = self::factory()->group->create( array( 'status' => 'private', ) ); $time = time() - 60; $this->add_user_to_group( $u1, $g, array( 'date_modified' => date( 'Y-m-d H:i:s', $time ), ) ); // Outstanding invitations should be left intact. groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g, 'inviter_id' => $u1, 'send_invite' => 1, ) ); groups_reject_membership_request( null, $u2, $g ); $u2_has_invite = groups_check_user_has_invite( $u2, $g ); $this->assertTrue( is_numeric( $u2_has_invite ) && $u2_has_invite > 0 ); } /** * @group groups_delete_membership_request * @group group_membership_requests * @group group_membership */ public function test_bp_groups_delete_membership_request_remove_request() { $u1 = self::factory()->user->create(); $g = self::factory()->group->create( array( 'status' => 'private', ) ); // Membership requests should be removed. groups_send_membership_request( array( 'user_id' => $u1, 'group_id' => $g ) ); groups_delete_membership_request( null, $u1, $g ); $u1_has_request = groups_check_for_membership_request( $u1, $g ); $this->assertFalse( $u1_has_request ); } /** * @group groups_delete_membership_request * @group group_membership_requests * @group group_membership */ public function test_bp_groups_delete_membership_request_leave_memberships_intact() { $u1 = self::factory()->user->create(); $g = self::factory()->group->create( array( 'status' => 'private', ) ); $this->add_user_to_group( $u1, $g ); // Confirmed memberships should be left intact. groups_delete_membership_request( null, $u1, $g ); $u1_is_member = groups_is_user_member( $u1, $g ); $this->assertTrue( is_numeric( $u1_is_member ) && $u1_is_member > 0 ); } /** * @group groups_delete_membership_request * @group group_membership_requests * @group group_membership */ public function test_bp_groups_delete_membership_request_leave_invites_intact() { $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); $g = self::factory()->group->create( array( 'status' => 'private', ) ); $time = time() - 60; $this->add_user_to_group( $u1, $g, array( 'date_modified' => date( 'Y-m-d H:i:s', $time ), ) ); // Outstanding invitations should be left intact. groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g, 'inviter_id' => $u1, 'send_invite' => 1, ) ); groups_delete_membership_request( null, $u2, $g ); $u2_has_invite = groups_check_user_has_invite( $u2, $g ); $this->assertTrue( is_numeric( $u2_has_invite ) && $u2_has_invite > 0 ); } /** * @group groups_reject_invite * @group group_invitations * @group group_membership */ public function test_bp_groups_reject_invite_remove_invite() { $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); $g = self::factory()->group->create( array( 'status' => 'private', ) ); $time = time() - 60; $this->add_user_to_group( $u1, $g, array( 'date_modified' => date( 'Y-m-d H:i:s', $time ), ) ); // The invitation should be removed. groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g, 'inviter_id' => $u1, 'send_invite' => 1, ) ); groups_reject_invite( $u2, $g ); $u2_has_invite = groups_check_user_has_invite( $u2, $g, 'all' ); $this->assertFalse( $u2_has_invite ); } /** * @group groups_reject_invite * @group group_invitations * @group group_membership */ public function test_bp_groups_reject_invite_leave_memberships_intact() { $u1 = self::factory()->user->create(); $g = self::factory()->group->create( array( 'status' => 'private', ) ); $time = time() - 60; $this->add_user_to_group( $u1, $g, array( 'date_modified' => date( 'Y-m-d H:i:s', $time ), ) ); // Confirmed memberships should be left intact. groups_reject_invite( $u1, $g ); $u1_is_member = groups_is_user_member( $u1, $g ); $this->assertTrue( is_numeric( $u1_is_member ) && $u1_is_member > 0 ); } /** * @group groups_reject_invite * @group group_invitations * @group group_membership */ public function test_bp_groups_reject_invite_leave_requests_intact() { $u1 = self::factory()->user->create(); $g = self::factory()->group->create( array( 'status' => 'private', ) ); // Membership requests should be left intact. groups_send_membership_request( array( 'user_id' => $u1, 'group_id' => $g ) ); groups_reject_invite( $u1, $g ); $u1_has_request = groups_check_for_membership_request( $u1, $g ); $this->assertTrue( is_numeric( $u1_has_request ) && $u1_has_request > 0 ); } /** * @group groups_delete_invite * @group group_invitations * @group group_membership */ public function test_bp_groups_delete_invite_remove_invite() { $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); $g = self::factory()->group->create( array( 'status' => 'private', ) ); $time = time() - 60; $this->add_user_to_group( $u1, $g, array( 'date_modified' => date( 'Y-m-d H:i:s', $time ), ) ); // The invitation should be removed. groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g, 'inviter_id' => $u1, 'send_invite' => 1, ) ); groups_delete_invite( $u2, $g ); $u2_has_invite = groups_check_user_has_invite( $u2, $g, 'all' ); $this->assertFalse( $u2_has_invite ); } /** * @group groups_delete_invite * @group group_invitations * @group group_membership */ public function test_bp_groups_delete_invite_remove_draft_invite() { $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); $g = self::factory()->group->create( array( 'status' => 'private', ) ); $time = time() - 60; $this->add_user_to_group( $u1, $g, array( 'date_modified' => date( 'Y-m-d H:i:s', $time ), ) ); // Create the draft invitation. groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g, 'inviter_id' => $u1 ) ); // Check that the invite got created. $u2_has_invite = groups_check_user_has_invite( $u2, $g, 'all' ); $this->assertTrue( is_numeric( $u2_has_invite ) && $u2_has_invite > 0 ); // The invitation should be removed. groups_delete_invite( $u2, $g ); $u2_has_invite = groups_check_user_has_invite( $u2, $g, 'all' ); $this->assertFalse( $u2_has_invite ); } /** * @group groups_delete_invite * @group group_invitations * @group group_membership */ public function test_bp_groups_delete_invite_leave_memberships_intact() { $u1 = self::factory()->user->create(); $g = self::factory()->group->create( array( 'status' => 'private', ) ); $time = time() - 60; $this->add_user_to_group( $u1, $g, array( 'date_modified' => date( 'Y-m-d H:i:s', $time ), ) ); groups_delete_invite( $u1, $g ); $u1_is_member = groups_is_user_member( $u1, $g ); $this->assertTrue( is_numeric( $u1_is_member ) && $u1_is_member > 0 ); } /** * @group groups_delete_invite * @group group_invitations * @group group_membership */ public function test_bp_groups_delete_invite_leave_requests_intact() { $u1 = self::factory()->user->create(); $g = self::factory()->group->create( array( 'status' => 'private', ) ); // Membership requests should be left intact. groups_send_membership_request( array( 'user_id' => $u1, 'group_id' => $g ) ); groups_delete_invite( $u1, $g ); $u1_has_request = groups_check_for_membership_request( $u1, $g ); $this->assertTrue( is_numeric( $u1_has_request ) && $u1_has_request > 0 ); } /** * @group groups_uninvite_user * @group group_invitations * @group group_membership */ public function test_bp_groups_uninvite_user_remove_invite() { $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); $g = self::factory()->group->create( array( 'status' => 'private', ) ); $time = time() - 60; $this->add_user_to_group( $u1, $g, array( 'date_modified' => date( 'Y-m-d H:i:s', $time ), ) ); // The invitation should be removed. groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g, 'inviter_id' => $u1, 'send_invite' => 1, ) ); groups_uninvite_user( $u2, $g ); $u2_has_invite = groups_check_user_has_invite( $u2, $g, 'all' ); $this->assertFalse( $u2_has_invite ); } /** * @group groups_uninvite_user * @group group_invitations * @group group_membership */ public function test_bp_groups_uninvite_user_leave_memberships_intact() { $u1 = self::factory()->user->create(); $g = self::factory()->group->create( array( 'status' => 'private', ) ); $time = time() - 60; $this->add_user_to_group( $u1, $g, array( 'date_modified' => date( 'Y-m-d H:i:s', $time ), ) ); // Confirmed memberships should be left intact. groups_is_user_member( $u1, $g ); groups_uninvite_user( $u1, $g ); $u1_is_member = groups_is_user_member( $u1, $g ); $this->assertTrue( is_numeric( $u1_is_member ) && $u1_is_member > 0 ); } /** * @group groups_uninvite_user * @group group_invitations * @group group_membership */ public function test_bp_groups_uninvite_user_leave_requests_intact() { $u1 = self::factory()->user->create(); $g = self::factory()->group->create( array( 'status' => 'private', ) ); // Membership requests should be left intact. groups_send_membership_request( array( 'user_id' => $u1, 'group_id' => $g ) ); groups_uninvite_user( $u1, $g ); $u1_has_request = groups_check_for_membership_request( $u1, $g ); $this->assertTrue( is_numeric( $u1_has_request ) && $u1_has_request > 0 ); } /** * @group groups_join_group * @group group_membership */ public function test_groups_join_group_basic_join() { $u1 = self::factory()->user->create(); $g = self::factory()->group->create(); groups_join_group( $g, $u1 ); $membership_id = groups_is_user_member( $u1, $g ); $this->assertTrue( is_numeric( $membership_id ) && $membership_id > 0 ); } /** * @group groups_join_group * @group group_membership */ public function test_groups_join_group_basic_join_use_current_user() { $u1 = self::factory()->user->create(); $g = self::factory()->group->create(); wp_set_current_user( $u1 ); groups_join_group( $g ); $membership_id = groups_is_user_member( $u1, $g ); $this->assertTrue( is_numeric( $membership_id ) && $membership_id > 0 ); } /** * @group groups_join_group * @group group_membership */ public function test_groups_join_group_already_member() { $u1 = self::factory()->user->create(); $g = self::factory()->group->create(); $this->add_user_to_group( $u1, $g ); $this->assertTrue( groups_join_group( $g, $u1 ) ); } /** * @group groups_join_group * @group group_membership */ public function test_groups_join_group_cleanup_invites() { $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); $g = self::factory()->group->create(); $this->add_user_to_group( $u1, $g ); $m1 = new BP_Groups_Member( $u1, $g ); $m1->promote( 'admin' ); groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g, 'inviter_id' => $u1, 'send_invite' => 1, ) ); groups_join_group( $g, $u2 ); // Upon joining the group, outstanding invitations should be cleaned up. $this->assertFalse( groups_check_user_has_invite( $u2, $g, 'any' ) ); } /** * @group groups_join_group * @group group_membership */ public function test_groups_join_group_cleanup_requests() { $u1 = self::factory()->user->create(); $g = self::factory()->group->create(); groups_send_membership_request( array( 'user_id' => $u1, 'group_id' => $g ) ); groups_join_group( $g, $u1 ); // Upon joining the group, outstanding requests should be cleaned up. $this->assertFalse( groups_check_for_membership_request( $u1, $g ) ); } /** * @group groups_leave_group * @group group_membership */ public function test_groups_leave_group_basic_leave_self_initiated() { $u1 = self::factory()->user->create(); $g = self::factory()->group->create( array( 'creator_id' => $u1 ) ); $u2 = self::factory()->user->create(); $this->add_user_to_group( $u2, $g ); $before = groups_get_total_member_count( $g ); wp_set_current_user( $u2 ); groups_leave_group( $g, $u2 ); $after = groups_get_total_member_count( $g ); $this->assertSame( $before - 1, $after ); } /** * @group groups_leave_group * @group group_membership */ public function test_groups_leave_group_basic_leave_use_current_user() { $u1 = self::factory()->user->create(); $g = self::factory()->group->create( array( 'creator_id' => $u1 ) ); $u2 = self::factory()->user->create(); $this->add_user_to_group( $u2, $g ); $before = groups_get_total_member_count( $g ); wp_set_current_user( $u2 ); groups_leave_group( $g ); $after = groups_get_total_member_count( $g ); $this->assertSame( $before - 1, $after ); } /** * @group groups_leave_group * @group group_membership */ public function test_groups_leave_group_basic_leave_group_admin_initiated() { $u1 = self::factory()->user->create(); $g = self::factory()->group->create( array( 'creator_id' => $u1 ) ); $u2 = self::factory()->user->create(); $this->add_user_to_group( $u2, $g ); $before = groups_get_total_member_count( $g ); wp_set_current_user( $u1 ); groups_leave_group( $g, $u2 ); $after = groups_get_total_member_count( $g ); $this->assertSame( $before - 1, $after ); } /** * @group groups_leave_group * @group group_membership */ public function test_groups_leave_group_basic_leave_site_admin_initiated() { $u1 = self::factory()->user->create(); $u1_siteadmin = new WP_User( $u1 ); $u1_siteadmin->add_role( 'administrator' ); $g = self::factory()->group->create( array( 'creator_id' => $u1 ) ); $u2 = self::factory()->user->create(); $this->add_user_to_group( $u2, $g ); $before = groups_get_total_member_count( $g ); wp_set_current_user( $u1 ); groups_leave_group( $g, $u2 ); $after = groups_get_total_member_count( $g ); $this->assertSame( $before - 1, $after ); } /** * @group groups_leave_group * @group group_membership */ public function test_groups_leave_group_single_admin_prevent_leave() { $u1 = self::factory()->user->create(); $g = self::factory()->group->create( array( 'creator_id' => $u1 ) ); $u2 = self::factory()->user->create(); $this->add_user_to_group( $u2, $g ); $before = groups_get_total_member_count( $g ); wp_set_current_user( $u1 ); groups_leave_group( $g, $u1 ); $after = groups_get_total_member_count( $g ); $this->assertSame( $before, $after ); } /** * @group groups_leave_group * @group group_membership */ public function test_groups_leave_group_multiple_admins_allow_leave() { $u1 = self::factory()->user->create(); $g = self::factory()->group->create( array( 'creator_id' => $u1 ) ); $u2 = self::factory()->user->create(); $this->add_user_to_group( $u2, $g ); $m2 = new BP_Groups_Member( $u2, $g ); $m2->promote( 'admin' ); $before = groups_get_total_member_count( $g ); wp_set_current_user( $u1 ); groups_leave_group( $g, $u1 ); $after = groups_get_total_member_count( $g ); $this->assertSame( $before - 1, $after ); } /** * @group groups_get_invites_for_user * @group group_invitations * @group group_membership */ public function test_groups_get_invites_for_user() { $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) ); $g2 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) ); $g3 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) ); groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g1, 'inviter_id' => $u1, 'send_invite' => 1, ) ); groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g2, 'inviter_id' => $u1, 'send_invite' => 1, ) ); groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g3, 'inviter_id' => $u1, 'send_invite' => 1, ) ); $groups = groups_get_invites_for_user( $u2 ); $this->assertEqualSets( array( $g1, $g2, $g3 ), wp_list_pluck( $groups['groups'], 'id' ) ); $this->assertSame( 3, $groups['total'] ); } /** * @group groups_get_invites_for_user * @group group_invitations * @group group_membership */ public function test_groups_get_invites_for_user_infer_user() { $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) ); $g2 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) ); $g3 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) ); groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g1, 'inviter_id' => $u1, 'send_invite' => 1, ) ); groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g2, 'inviter_id' => $u1, 'send_invite' => 1, ) ); groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g3, 'inviter_id' => $u1, 'send_invite' => 1, ) ); wp_set_current_user( $u2 ); $groups = groups_get_invites_for_user(); $this->assertEqualSets( array( $g1, $g2, $g3 ), wp_list_pluck( $groups['groups'], 'id' ) ); } /** * @group groups_get_invites_for_user * @group group_invitations * @group group_membership */ public function test_groups_get_invites_for_user_with_exclude() { $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) ); $g2 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) ); $g3 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) ); groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g1, 'inviter_id' => $u1, 'send_invite' => 1, ) ); groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g2, 'inviter_id' => $u1, 'send_invite' => 1, ) ); groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g3, 'inviter_id' => $u1, 'send_invite' => 1, ) ); $groups = groups_get_invites_for_user( $u2, false, false, array( $g2 ) ); $this->assertEqualSets( array( $g1, $g3 ), wp_list_pluck( $groups['groups'], 'id' ) ); $this->assertSame( 2, $groups['total'] ); } /** * @group groups_get_invite_count_for_user * @group group_invitations * @group group_membership */ public function test_groups_get_invite_count_for_user() { $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) ); $g2 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) ); $g3 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) ); groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g1, 'inviter_id' => $u1, 'send_invite' => 1, ) ); groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g2, 'inviter_id' => $u1, 'send_invite' => 1, ) ); groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g3, 'inviter_id' => $u1, 'send_invite' => 1, ) ); $this->assertSame( 3, groups_get_invite_count_for_user( $u2 ) ); } /** * @group groups_get_invite_count_for_user * @group group_invitations * @group group_membership */ public function test_groups_get_invite_count_for_user_ignore_drafts() { $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) ); // Create draft invitation. groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g1, 'inviter_id' => $u1, 'date_modified' => bp_core_current_time(), 'is_confirmed' => 0 ) ); // groups_get_invite_count_for_user should ignore draft invitations. $this->assertSame( 0, groups_get_invite_count_for_user( $u2 ) ); } /** * @group groups_invite_user * @group group_invitations * @group group_membership */ public function test_groups_invite_user() { $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) ); // Create draft invitation groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g1, 'inviter_id' => $u1, 'date_modified' => bp_core_current_time(), 'is_confirmed' => 0 ) ); // Check that the draft invitation has been created. $draft = groups_check_user_has_invite( $u2, $g1, 'all' ); $this->assertTrue( is_numeric( $draft ) && $draft > 0 ); } /** * @group groups_send_invites * @group group_invitations * @group group_membership */ public function test_groups_send_invites() { $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) ); // Create draft invitation groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g1, 'inviter_id' => $u1, 'date_modified' => bp_core_current_time(), 'is_confirmed' => 0 ) ); // Send the invitation groups_send_invites( array( 'group_id' => $g1, 'inviter_id' => $u1, ) ); // Check that the invitation has been sent. $sent = groups_check_user_has_invite( $u2, $g1, $type = 'sent' ); $this->assertTrue( is_numeric( $sent ) && $sent > 0 ); } /** * @group groups_send_invites * @group group_invitations * @group group_membership * @expectedDeprecated groups_send_invites */ public function test_groups_send_invites_deprecated_args() { $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) ); // Create draft invitation groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g1, 'inviter_id' => $u1, 'date_modified' => bp_core_current_time(), 'is_confirmed' => 0 ) ); // Send the invitation groups_send_invites( $u1, $g1 ); // Check that the invitation has been sent. $sent = groups_check_user_has_invite( $u2, $g1, $type = 'sent' ); $this->assertTrue( is_numeric( $sent ) && $sent > 0 ); } /** * @group groups_accept_invite * @group group_invitations * @group group_membership */ public function test_groups_accept_invite() { $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) ); // Create draft invitation groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g1, 'inviter_id' => $u1, 'date_modified' => bp_core_current_time(), 'is_confirmed' => 0, 'send_invite' => 1 ) ); // Accept the invitation groups_accept_invite( $u2, $g1 ); // Check that the user is a member of the group. $member = groups_is_user_member( $u2, $g1 ); $this->assertTrue( is_numeric( $member ) && $member > 0 ); // Check that the invite has been removed. $invite = groups_check_user_has_invite( $u2, $g1, 'all' ); $this->assertFalse( $invite ); } /** * @group groups_accept_invite * @group group_invitations * @group group_membership */ public function test_groups_accept_invite_removes_membership_requests() { $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) ); // Create draft invitation groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g1, 'inviter_id' => $u1, 'date_modified' => bp_core_current_time(), 'is_confirmed' => 0 ) ); // Create membership request $request_id = groups_send_membership_request( array( 'user_id' => $u2, 'group_id' => $g1, ) ); $request = groups_check_for_membership_request( $u2, $g1 ); $this->assertTrue( is_numeric( $request ) && $request > 0 ); // Send the invitation groups_send_invites( array( 'group_id' => $g1, 'inviter_id' => $u1, ) ); // Accept the invitation groups_accept_invite( $u2, $g1 ); // Check that the membership request has been removed. $this->assertTrue( 0 == groups_check_for_membership_request( $u2, $g1 ) ); } /** * @group groups_send_invites * @group group_invitations * @group group_membership_requests * @group group_membership */ public function test_groups_sent_invite_plus_request_equals_member() { $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) ); // Create draft invitation groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g1, 'inviter_id' => $u1, 'date_modified' => bp_core_current_time(), 'is_confirmed' => 0, 'send_invite' => 1 ) ); // Create membership request groups_send_membership_request( array( 'user_id' => $u2, 'group_id' => $g1 ) ); // User should now be a group member $member = groups_is_user_member( $u2, $g1 ); $this->assertTrue( is_numeric( $member ) && $member > 0 ); } /** * @group groups_delete_all_group_invites * @group group_invitations * @group group_membership */ public function test_groups_delete_all_group_invites() { $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); $u3 = self::factory()->user->create(); $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) ); groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g1, 'inviter_id' => $u1, 'send_invite' => 1, ) ); groups_invite_user( array( 'user_id' => $u3, 'group_id' => $g1, 'inviter_id' => $u1, 'send_invite' => 1, ) ); groups_delete_all_group_invites( $g1 ); // Get group invitations of any type, from any user in the group. $invitees = groups_get_invites( array( 'group_id' => $g1, 'invite_sent' => 'all', ) ); $this->assertEmpty( $invitees ); } /** * @group groups_invite_user * @group group_invitations * @group group_membership */ public function test_groups_send_invites_fail_on_empty_group_id() { $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); // Create draft invitation with empty inviter_id $invite_created = groups_invite_user( array( 'user_id' => $u2, 'group_id' => 0, 'inviter_id' => $u1, 'date_modified' => bp_core_current_time(), 'is_confirmed' => 0 ) ); $this->assertFalse( $invite_created ); } /** * @group groups_invite_user * @group group_invitations * @group group_membership */ public function test_groups_send_invites_fail_on_empty_user_id() { $u1 = self::factory()->user->create(); $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) ); // Create draft invitation with empty inviter_id $invite_created = groups_invite_user( array( 'user_id' => 0, 'group_id' => $g1, 'inviter_id' => $u1, 'date_modified' => bp_core_current_time(), 'is_confirmed' => 0 ) ); $this->assertFalse( $invite_created ); } /** * @group groups_invite_user * @group group_invitations * @group group_membership */ public function test_groups_send_invites_fail_on_empty_inviter_id() { $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) ); // Create draft invitation with empty inviter_id $invite_created = groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g1, 'inviter_id' => 0, 'date_modified' => bp_core_current_time(), 'is_confirmed' => 0 ) ); $this->assertFalse( $invite_created ); } /** * @group groups_get_invites_for_group * @group group_send_invites * @group group_invitations * @group group_membership */ public function test_groups_get_invites_for_group_with_sent_parameter() { $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) ); // Create draft invitation groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g1, 'inviter_id' => $u1, 'date_modified' => bp_core_current_time(), 'is_confirmed' => 0, 'send_invite' => 1 ) ); // Default groups_get_invites_for_group() call $i = groups_get_invites_for_group( $u1, $g1 ); $this->assertEqualSets( array( $u2 ), $i ); // Fetch users whose invites have been sent out; should be the same as above. $i = groups_get_invites_for_group( $u1, $g1 ); $this->assertEqualSets( array( $u2 ), $i ); // Fetch users whose invites haven't been sent yet. $i = groups_get_invites_for_group( $u1, $g1, 0 ); $this->assertEmpty( $i ); } /** * @group groups_send_membership_request * @group group_membership_requests * @group group_membership */ public function test_groups_send_membership_request() { $u1 = self::factory()->user->create(); $g1 = self::factory()->group->create( array( 'status' => 'private' ) ); // Create membership request groups_send_membership_request( array( 'user_id' => $u1, 'group_id' => $g1 ) ); $request = groups_check_for_membership_request( $u1, $g1 ); $this->assertTrue( is_numeric( $request ) && $request > 0 ); } /** * @group groups_send_membership_request * @group group_membership_requests * @group group_membership * @expectedDeprecated groups_send_membership_request */ public function test_groups_send_membership_request_deprecated_args() { $u1 = self::factory()->user->create(); $g1 = self::factory()->group->create( array( 'status' => 'private' ) ); // Create membership request groups_send_membership_request( $u1, $g1 ); $request = groups_check_for_membership_request( $u1, $g1 ); $this->assertTrue( is_numeric( $request ) && $request > 0 ); } /** * @group groups_accept_membership_request * @group group_membership_requests * @group group_membership */ public function test_groups_accept_membership_request_by_membership_id() { $u1 = self::factory()->user->create(); $g1 = self::factory()->group->create( array( 'status' => 'private' ) ); // Create membership request groups_send_membership_request( array( 'user_id' => $u1, 'group_id' => $g1 ) ); // Get group invitations of any type, from any user in the group. $member = new BP_Groups_Member( $u1, $g1 ); groups_accept_membership_request( false, $u1, $g1 ); // User should now be a group member. $member = groups_is_user_member( $u1, $g1 ); $this->assertTrue( is_numeric( $member ) && $member > 0 ); } /** * @group groups_accept_membership_request * @group group_membership_requests * @group group_membership */ public function test_groups_accept_membership_request_by_user_id_group_id() { $u1 = self::factory()->user->create(); $g1 = self::factory()->group->create( array( 'status' => 'private' ) ); // Create membership request groups_send_membership_request( array( 'user_id' => $u1, 'group_id' => $g1 ) ); groups_accept_membership_request( null, $u1, $g1 ); // User should now be a group member $member = groups_is_user_member( $u1, $g1 ); $this->assertTrue( is_numeric( $member ) && $member > 0 ); } /** * @group groups_send_invites * @group group_invitations * @group group_membership_requests * @group group_membership */ public function test_groups_membership_request_plus_invite_equals_member() { $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) ); // Create membership request groups_send_membership_request( array( 'user_id' => $u2, 'group_id' => $g1 ) ); // Create draft invitation groups_invite_user( array( 'user_id' => $u2, 'group_id' => $g1, 'inviter_id' => $u1, 'date_modified' => bp_core_current_time(), 'is_confirmed' => 0, 'send_invite' => 1 ) ); // User should now be a group member $member = groups_is_user_member( $u2, $g1 ); $this->assertTrue( is_numeric( $member ) && $member > 0 ); } /** * @group groups_accept_all_pending_membership_requests * @group group_membership_requests * @group group_membership */ public function test_groups_accept_all_pending_membership_requests() { $u1 = self::factory()->user->create(); $u2 = self::factory()->user->create(); $u3 = self::factory()->user->create(); $g1 = self::factory()->group->create( array( 'status' => 'private' ) ); // Create membership request groups_send_membership_request( array( 'user_id' => $u1, 'group_id' => $g1 ) ); groups_send_membership_request( array( 'user_id' => $u2, 'group_id' => $g1 ) ); groups_send_membership_request( array( 'user_id' => $u3, 'group_id' => $g1 ) ); groups_accept_all_pending_membership_requests( $g1 ); // All users should now be group members. $members = new BP_Group_Member_Query( array( 'group_id' => $g1 ) ); $this->assertEqualSets( array( $u1, $u2, $u3 ), $members->user_ids ); } /** * @group total_group_count * @ticket BP6813 */ public function test_total_group_count_should_return_integer() { $this->assertIsInt( BP_Groups_Member::total_group_count( 123 ) ); } /** * @group get_memberships_by_id */ public function test_get_memberships_by_id_with_single_id() { $users = self::factory()->user->create_many( 2 ); $groups = self::factory()->group->create_many( 2 ); $m0 = $this->add_user_to_group( $users[0], $groups[0] ); $m1 = $this->add_user_to_group( $users[1], $groups[1] ); $found = BP_Groups_Member::get_memberships_by_id( $m0 ); $this->assertCount( 1, $found ); $this->assertSame( $m0, $found[0]->id ); } /** * @group get_memberships_by_id */ public function test_get_memberships_by_id_with_multiple_ids() { $users = self::factory()->user->create_many( 2 ); $groups = self::factory()->group->create_many( 2 ); $m0 = $this->add_user_to_group( $users[0], $groups[0] ); $m1 = $this->add_user_to_group( $users[1], $groups[1] ); $found = BP_Groups_Member::get_memberships_by_id( array( $m0, $m1 ) ); $expected_ids = array( $m0, $m1 ); $found_ids = wp_list_pluck( $found, 'id' ); sort( $expected_ids ); sort( $found_ids ); $this->assertCount( 2, $found ); $this->assertSame( $expected_ids, $found_ids ); } /** * @ticket BP7382 */ public function test_user_property_should_be_accessible() { $user = self::factory()->user->create(); $group = self::factory()->group->create(); $this->add_user_to_group( $user, $group ); $membership = new BP_Groups_Member( $user, $group ); $user_obj = $membership->user; $this->assertInstanceOf( 'BP_Core_User', $user_obj ); $this->assertSame( $user, $user_obj->id ); } /** * @group get_group_moderator_ids */ public function test_groups_get_group_mods_bad_id() { $mods = groups_get_group_mods( null ); $this->assertIsArray( $mods ); $this->assertEmpty( $mods ); } /** * @group get_group_moderator_ids */ public function test_groups_get_group_admins_bad_id() { $admins = groups_get_group_admins( null ); $this->assertIsArray( $admins ); $this->assertEmpty( $admins ); } /** * @ticket BP7859 */ public function test_get_user_memberships_type_membership() { groups_join_group( self::$group_ids[0], self::$user_ids[0] ); $memberships = BP_Groups_Member::get_user_memberships( self::$user_ids[0], array( 'type' => 'membership', ) ); $this->assertCount( 1, $memberships ); $this->assertSame( self::$group_ids[0], $memberships[0]->group_id ); } /** * @ticket BP7476 */ public function test_delete_all_for_user() { $new_user = self::factory()->user->create(); $admin_users = get_users( array( 'blog_id' => bp_get_root_blog_id(), 'fields' => 'id', 'number' => 1, 'orderby' => 'ID', 'role' => 'administrator', ) ); $admin_user = (int) $admin_users[0]; // Sole admin of group. $new_group = self::factory()->group->create( array( 'creator_id' => $new_user, ) ); // One of two group admins. groups_join_group( self::$group_ids[0], $new_user ); $m1 = new BP_Groups_Member( $new_user, self::$group_ids[0] ); $m1->promote( 'admin' ); // Not an admin. groups_join_group( self::$group_ids[1], $new_user ); $m2 = new BP_Groups_Member( $new_user, self::$group_ids[1] ); BP_Groups_Member::delete_all_for_user( $new_user ); $new_group_members = BP_Groups_Member::get_group_administrator_ids( $new_group ); $this->assertSame( array( $admin_user ), wp_list_pluck( $new_group_members, 'user_id' ) ); $g0_members = BP_Groups_Member::get_group_administrator_ids( self::$group_ids[0] ); $this->assertSame( array( self::$user_ids[3] ), wp_list_pluck( $g0_members, 'user_id' ) ); $g1_members = BP_Groups_Member::get_group_administrator_ids( self::$group_ids[1] ); $this->assertSame( array( self::$user_ids[3] ), wp_list_pluck( $g1_members, 'user_id' ) ); } }