diff --git src/bp-forums/bp-forums-screens.php src/bp-forums/bp-forums-screens.php
index 7b8a435..6cf4bba 100644
--- src/bp-forums/bp-forums-screens.php
+++ src/bp-forums/bp-forums-screens.php
@@ -45,7 +45,7 @@ function bp_forums_directory_forums_setup() {
 			$bp->groups->current_group = groups_get_group( array( 'group_id' => $_POST['topic_group_id'] ) );
 			if ( !empty( $bp->groups->current_group->id ) ) {
 				// Auto join this user if they are not yet a member of this group.
-				if ( !bp_current_user_can( 'bp_moderate' ) && 'public' == $bp->groups->current_group->status && !groups_is_user_member( bp_loggedin_user_id(), $bp->groups->current_group->id ) )
+				if ( ! bp_current_user_can( 'bp_moderate' ) && bp_current_user_can( 'groups_join_group', array( 'group_id' => $bp->groups->current_group->id ) ) )
 					groups_join_group( $bp->groups->current_group->id );
 
 				$error_message = '';
diff --git src/bp-groups/bp-groups-actions.php src/bp-groups/bp-groups-actions.php
index 4f80495..e1ff5a2 100644
--- src/bp-groups/bp-groups-actions.php
+++ src/bp-groups/bp-groups-actions.php
@@ -423,7 +423,7 @@ function groups_action_join_group() {
 	if ( !groups_is_user_member( bp_loggedin_user_id(), $bp->groups->current_group->id ) && !groups_is_user_banned( bp_loggedin_user_id(), $bp->groups->current_group->id ) ) {
 
 		// User wants to join a group that is not public.
-		if ( $bp->groups->current_group->status != 'public' ) {
+		if ( bp_current_user_can( 'groups_join_group', array( 'group_id' => $bp->groups->current_group->id ) ) ) {
 			if ( !groups_check_user_has_invite( bp_loggedin_user_id(), $bp->groups->current_group->id ) ) {
 				bp_core_add_message( __( 'There was an error joining the group.', 'buddypress' ), 'error' );
 				bp_core_redirect( bp_get_group_permalink( $bp->groups->current_group ) );
diff --git src/bp-groups/bp-groups-filters.php src/bp-groups/bp-groups-filters.php
index 1071759..23c3e31 100644
--- src/bp-groups/bp-groups-filters.php
+++ src/bp-groups/bp-groups-filters.php
@@ -313,11 +313,8 @@ function bp_groups_disable_at_mention_notification_for_non_public_groups( $send,
 		return $send;
 	}
 
-	if ( 'groups' === $activity->component ) {
-		$group = groups_get_group( $activity->item_id );
-		if ( 'public' !== $group->status && ! groups_is_user_member( $user_id, $group->id ) ) {
-			$send = false;
-		}
+	if ( 'groups' === $activity->component && ! bp_user_can( $user_id, 'groups_access_group', array( 'group_id' => $activity->item_id ) ) ) {
+		$send = false;
 	}
 
 	return $send;
@@ -345,3 +342,173 @@ function bp_groups_default_avatar( $avatar, $params ) {
 
 	return $avatar;
 }
+
+/**
+ * Filter the bp_user_can value to determine what the user can do
+ * with regards to a specific group.
+ *
+ * @since 3.0.0
+ *
+ * @param bool   $retval     Whether or not the current user has the capability.
+ * @param int    $user_id
+ * @param string $capability The capability being checked for.
+ * @param int    $site_id    Site ID. Defaults to the BP root blog.
+ * @param array  $args       Array of extra arguments passed.
+ *
+ * @return bool
+ */
+function bp_groups_user_can_filter( $retval, $user_id, $capability, $site_id, $args ) {
+	if ( empty( $args['group_id'] ) ) {
+		$group_id = bp_get_current_group_id();
+	} else {
+		$group_id = (int) $args['group_id'];
+	}
+
+	switch ( $capability ) {
+		case 'groups_join_group':
+			// Return early if the user isn't logged in or the group ID is unknown.
+			if ( ! $user_id || ! $group_id ) {
+				break;
+			}
+
+			// The group must allow joining, and the user should not currently be a member.
+			$group = groups_get_group( $group_id );
+			if ( 'public' == bp_get_group_status( $group )
+				&& ! groups_is_user_member( $user_id, $group->id )
+				&& ! groups_is_user_banned( $user_id, $group->id )
+			) {
+				$retval = true;
+			}
+
+			break;
+
+		case 'groups_request_membership':
+			// Return early if the user isn't logged in or the group ID is unknown.
+			if ( ! $user_id || ! $group_id ) {
+				break;
+			}
+
+			/*
+			* The group must accept membership requests, and the user should not
+			* currently be a member, have an active request, or be banned.
+			*/
+			$group = groups_get_group( $group_id );
+			if ( 'private' == bp_get_group_status( $group )
+				&& ! groups_is_user_member( $user_id, $group->id )
+				&& ! groups_check_for_membership_request( $user_id, $group->id )
+				&& ! groups_is_user_banned( $user_id, $group->id )
+			) {
+				$retval = true;
+			}
+
+			break;
+
+		case 'groups_send_invitation':
+			// Return early if the user isn't logged in or the group ID is unknown.
+			if ( ! $user_id || ! $group_id ) {
+				break;
+			}
+
+			/*
+			* The group must allow invitations, and the user should not
+			* currently be a member or be banned from the group.
+			*/
+			$group = groups_get_group( $group_id );
+			// Users with the 'bp_moderate' cap can always send invitations.
+			if ( bp_user_can( $user_id, 'bp_moderate' ) ) {
+				$retval = true;
+			} else {
+				$invite_status = bp_group_get_invite_status( $group_id );
+
+				switch ( $invite_status ) {
+					case 'admins' :
+						if ( groups_is_user_admin( $user_id, $group_id ) ) {
+							$retval = true;
+						}
+						break;
+
+					case 'mods' :
+						if ( groups_is_user_mod( $user_id, $group_id ) || groups_is_user_admin( $user_id, $group_id ) ) {
+							$retval = true;
+						}
+						break;
+
+					case 'members' :
+						if ( groups_is_user_member( $user_id, $group_id ) ) {
+							$retval = true;
+						}
+						break;
+				}
+			}
+
+			break;
+
+		case 'groups_receive_invitation':
+			// Return early if the user isn't logged in or the group ID is unknown.
+			if ( ! $user_id || ! $group_id ) {
+				break;
+			}
+
+			/*
+			* The group must allow invitations, and the user should not
+			* currently be a member or be banned from the group.
+			*/
+			$group = groups_get_group( $group_id );
+			if ( in_array( bp_get_group_status( $group ), array( 'private', 'hidden' ) )
+				&& ! groups_is_user_member( $user_id, $group->id )
+				&& ! groups_is_user_banned( $user_id, $group->id )
+			) {
+				$retval = true;
+			}
+
+			break;
+
+		case 'groups_access_group':
+			// Return early if the group ID is unknown.
+			if ( ! $group_id ) {
+				break;
+			}
+
+			$group = groups_get_group( $group_id );
+
+			// If the check is for the logged-in user, use the BP_Groups_Group property.
+			if ( $user_id == bp_loggedin_user_id() ) {
+				$retval = $group->user_has_access;
+
+			/*
+			 * If the check is for a specified user who is not the logged-in user
+			 * run the check manually.
+			 */
+			} elseif ( 'public' == bp_get_group_status( $group ) || groups_is_user_member( $user_id, $group->id ) ) {
+				$retval = true;
+			}
+
+			break;
+
+		case 'groups_see_group':
+			// Return early if the group ID is unknown.
+			if ( ! $group_id ) {
+				break;
+			}
+
+			$group = groups_get_group( $group_id );
+
+			// If the check is for the logged-in user, use the BP_Groups_Group property.
+			if ( $user_id == bp_loggedin_user_id() ) {
+				$retval = $group->is_visible;
+
+			/*
+			 * If the check is for a specified user who is not the logged-in user
+			 * run the check manually.
+			 */
+			} elseif ( 'hidden' != bp_get_group_status( $group ) || groups_is_user_member( $user_id, $group->id ) ) {
+				$retval = true;
+			}
+
+			break;
+	}
+
+	return $retval;
+
+}
+add_filter( 'bp_user_can', 'bp_groups_user_can_filter', 10, 5 );
diff --git src/bp-groups/bp-groups-template.php src/bp-groups/bp-groups-template.php
index ac0d315..77a8a93 100644
--- src/bp-groups/bp-groups-template.php
+++ src/bp-groups/bp-groups-template.php
@@ -2357,32 +2357,7 @@ function bp_groups_user_can_send_invites( $group_id = 0, $user_id = 0 ) {
 	}
 
 	if ( $user_id ) {
-		// Users with the 'bp_moderate' cap can always send invitations.
-		if ( bp_user_can( $user_id, 'bp_moderate' ) ) {
-			$can_send_invites = true;
-		} else {
-			$invite_status = bp_group_get_invite_status( $group_id );
-
-			switch ( $invite_status ) {
-				case 'admins' :
-					if ( groups_is_user_admin( $user_id, $group_id ) ) {
-						$can_send_invites = true;
-					}
-					break;
-
-				case 'mods' :
-					if ( groups_is_user_mod( $user_id, $group_id ) || groups_is_user_admin( $user_id, $group_id ) ) {
-						$can_send_invites = true;
-					}
-					break;
-
-				case 'members' :
-					if ( groups_is_user_member( $user_id, $group_id ) ) {
-						$can_send_invites = true;
-					}
-					break;
-			}
-		}
+		$can_send_invites = bp_user_can( $user_id, 'groups_send_invitation', array( 'group_id' => $group_id ) );
 	}
 
 	/**
diff --git src/bp-groups/classes/class-bp-groups-component.php src/bp-groups/classes/class-bp-groups-component.php
index fc81d04..3e4c092 100644
--- src/bp-groups/classes/class-bp-groups-component.php
+++ src/bp-groups/classes/class-bp-groups-component.php
@@ -544,12 +544,7 @@ class BP_Groups_Component extends BP_Component {
 			// If this is a private group, and the user is not a
 			// member and does not have an outstanding invitation,
 			// show a "Request Membership" nav item.
-			if ( is_user_logged_in() &&
-				 ! $this->current_group->is_member &&
-				 ! groups_check_for_membership_request( bp_loggedin_user_id(), $this->current_group->id ) &&
-				 $this->current_group->status == 'private' &&
-				 ! groups_check_user_has_invite( bp_loggedin_user_id(), $this->current_group->id )
-				) {
+			if ( bp_current_user_can( 'groups_request_membership', array( 'group_id' => $this->current_group->id ) ) ) {
 
 				$sub_nav[] = array(
 					'name'            => _x( 'Request Membership','Group screen nav', 'buddypress' ),
diff --git src/bp-templates/bp-legacy/buddypress-functions.php src/bp-templates/bp-legacy/buddypress-functions.php
index 621eacd..13d2663 100644
--- src/bp-templates/bp-legacy/buddypress-functions.php
+++ src/bp-templates/bp-legacy/buddypress-functions.php
@@ -1492,7 +1492,7 @@ function bp_legacy_theme_ajax_joinleave_group() {
 		return;
 
 	if ( ! groups_is_user_member( bp_loggedin_user_id(), $group->id ) ) {
-		if ( 'public' == $group->status ) {
+		if ( bp_current_user_can( 'groups_join_group', array( 'group_id' => $group->id ) ) ) {
 			check_ajax_referer( 'groups_join_group' );
 
 			if ( ! groups_join_group( $group->id ) ) {
@@ -1501,7 +1501,7 @@ function bp_legacy_theme_ajax_joinleave_group() {
 				echo '<a id="group-' . esc_attr( $group->id ) . '" class="group-button leave-group" rel="leave" href="' . wp_nonce_url( bp_get_group_permalink( $group ) . 'leave-group', 'groups_leave_group' ) . '">' . __( 'Leave Group', 'buddypress' ) . '</a>';
 			}
 
-		} elseif ( 'private' == $group->status ) {
+		} elseif ( bp_current_user_can( 'groups_request_membership', array( 'group_id' => $group->id ) ) ) {
 
 			// If the user has already been invited, then this is
 			// an Accept Invitation button.
@@ -1531,9 +1531,9 @@ function bp_legacy_theme_ajax_joinleave_group() {
 
 		if ( ! groups_leave_group( $group->id ) ) {
 			_e( 'Error leaving group', 'buddypress' );
-		} elseif ( 'public' == $group->status ) {
+		} elseif ( bp_current_user_can( 'groups_join_group', array( 'group_id' => $group->id ) ) ) {
 			echo '<a id="group-' . esc_attr( $group->id ) . '" class="group-button join-group" rel="join" href="' . wp_nonce_url( bp_get_group_permalink( $group ) . 'join', 'groups_join_group' ) . '">' . __( 'Join Group', 'buddypress' ) . '</a>';
-		} elseif ( 'private' == $group->status ) {
+		} elseif ( bp_current_user_can( 'groups_request_membership', array( 'group_id' => $group->id ) ) ) {
 			echo '<a id="group-' . esc_attr( $group->id ) . '" class="group-button request-membership" rel="join" href="' . wp_nonce_url( bp_get_group_permalink( $group ) . 'request-membership', 'groups_request_membership' ) . '">' . __( 'Request Membership', 'buddypress' ) . '</a>';
 		}
 	}
diff --git tests/phpunit/testcases/groups/user_can.php tests/phpunit/testcases/groups/user_can.php
new file mode 100644
index 0000000..96bb4b5
--- /dev/null
+++ tests/phpunit/testcases/groups/user_can.php
@@ -0,0 +1,350 @@
+<?php
+
+/**
+ * @group bp_user_can
+ */
+class BP_Tests_Groups_User_Can_Filter extends BP_UnitTestCase {
+
+	public function test_user_can_groups_join_group_public() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'public'
+		) );
+		$u1 = $this->factory->user->create();
+
+		$this->assertTrue( bp_user_can( $u1, 'groups_join_group', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_join_group_public_already_member() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'public'
+		) );
+		$u1 = $this->factory->user->create();
+		$this->add_user_to_group( $u1, $g1 );
+
+		$this->assertFalse( bp_user_can( $u1, 'groups_join_group', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_join_group_private() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'private'
+		) );
+		$u1 = $this->factory->user->create();
+
+		$this->assertFalse( bp_user_can( $u1, 'groups_join_group', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_join_group_banned() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'public'
+		) );
+		$u1 = $this->factory->user->create();
+		$this->add_user_to_group( $u1, $g1 );
+
+		buddypress()->is_item_admin = true;
+		groups_ban_member( $u1, $g1 );
+
+		$this->assertFalse( bp_user_can( $u1, 'groups_join_group', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_request_membership_public() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'public'
+		) );
+		$u1 = $this->factory->user->create();
+
+		$this->assertFalse( bp_user_can( $u1, 'groups_request_membership', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_request_membership_private() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'private'
+		) );
+		$u1 = $this->factory->user->create();
+
+		$this->assertTrue( bp_user_can( $u1, 'groups_request_membership', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_request_membership_hidden() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'hidden'
+		) );
+		$u1 = $this->factory->user->create();
+
+		$this->assertFalse( bp_user_can( $u1, 'groups_request_membership', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_request_membership_private_already_member() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'private'
+		) );
+		$u1 = $this->factory->user->create();
+		$this->add_user_to_group( $u1, $g1 );
+
+		$this->assertFalse( bp_user_can( $u1, 'groups_request_membership', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_request_membership_private_already_requested() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'private'
+		) );
+		$u1 = $this->factory->user->create();
+		groups_send_membership_request( $u1, $g1 );
+
+		$this->assertFalse( bp_user_can( $u1, 'groups_request_membership', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_request_membership_banned() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'private'
+		) );
+		$u1 = $this->factory->user->create();
+		$this->add_user_to_group( $u1, $g1 );
+
+		buddypress()->is_item_admin = true;
+		groups_ban_member( $u1, $g1 );
+
+		$this->assertFalse( bp_user_can( $u1, 'groups_request_membership', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_receive_invitation_public() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'public'
+		) );
+		$u1 = $this->factory->user->create();
+
+		$this->assertFalse( bp_user_can( $u1, 'groups_receive_invitation', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_receive_invitation_private() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'private'
+		) );
+		$u1 = $this->factory->user->create();
+
+		$this->assertTrue( bp_user_can( $u1, 'groups_receive_invitation', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_receive_invitation_private_already_member() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'private'
+		) );
+		$u1 = $this->factory->user->create();
+		$this->add_user_to_group( $u1, $g1 );
+
+		$this->assertFalse( bp_user_can( $u1, 'groups_receive_invitation', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_receive_invitation_hidden() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'hidden'
+		) );
+		$u1 = $this->factory->user->create();
+
+		$this->assertTrue( bp_user_can( $u1, 'groups_receive_invitation', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_receive_invitation_private_banned() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'private'
+		) );
+		$u1 = $this->factory->user->create();
+		$this->add_user_to_group( $u1, $g1 );
+
+		buddypress()->is_item_admin = true;
+		groups_ban_member( $u1, $g1 );
+
+		$this->assertFalse( bp_user_can( $u1, 'groups_receive_invitation', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_send_invitation_public() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'public'
+		) );
+		$u1 = $this->factory->user->create();
+
+		$this->assertFalse( bp_user_can( $u1, 'groups_send_invitation', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_send_invitation_private() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'private'
+		) );
+		$u1 = $this->factory->user->create();
+
+		$this->assertFalse( bp_user_can( $u1, 'groups_send_invitation', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_send_invitation_private_member() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'private',
+
+		) );
+		groups_update_groupmeta( $g1, 'invite_status', 'members' );
+		$u1 = $this->factory->user->create();
+		$this->add_user_to_group( $u1, $g1 );
+
+		$this->assertTrue( bp_user_can( $u1, 'groups_send_invitation', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_send_invitation_hidden() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'hidden'
+		) );
+		$u1 = $this->factory->user->create();
+		$u1 = $this->factory->user->create();
+		$this->add_user_to_group( $u1, $g1 );
+
+		$this->assertTrue( bp_user_can( $u1, 'groups_send_invitation', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_send_invitation_private_banned() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'private'
+		) );
+		groups_update_groupmeta( $g1, 'invite_status', 'members' );
+		$u1 = $this->factory->user->create();
+		$this->add_user_to_group( $u1, $g1 );
+
+		buddypress()->is_item_admin = true;
+		groups_ban_member( $u1, $g1 );
+
+		$this->assertFalse( bp_user_can( $u1, 'groups_send_invitation', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_access_group_public() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'public'
+		) );
+		$u1 = $this->factory->user->create();
+
+		$this->assertTrue( bp_user_can( $u1, 'groups_access_group', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_access_group_private() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'private'
+		) );
+		$u1 = $this->factory->user->create();
+
+		$this->assertFalse( bp_user_can( $u1, 'groups_access_group', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_access_group_private_logged_in_user() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'private'
+		) );
+		$u1 = $this->factory->user->create();
+		$old_user = get_current_user_id();
+		$this->set_current_user( $u1 );
+
+		$this->assertFalse( bp_current_user_can( 'groups_access_group', array( 'group_id' => $g1 ) ) );
+
+		$this->set_current_user( $old_user );
+	}
+
+	public function test_user_can_groups_access_group_private_member() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'private'
+		) );
+		$u1 = $this->factory->user->create();
+		$this->add_user_to_group( $u1, $g1 );
+
+		$this->assertTrue( bp_user_can( $u1, 'groups_access_group', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_access_group_hidden() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'hidden'
+		) );
+		$u1 = $this->factory->user->create();
+
+		$this->assertFalse( bp_user_can( $u1, 'groups_access_group', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_access_group_hidden_member() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'hidden'
+		) );
+		$u1 = $this->factory->user->create();
+		$this->add_user_to_group( $u1, $g1 );
+
+		$this->assertTrue( bp_user_can( $u1, 'groups_access_group', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_access_group_hidden_logged_in_user() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'hidden'
+		) );
+		$u1 = $this->factory->user->create();
+		$old_user = get_current_user_id();
+		$this->set_current_user( $u1 );
+
+		$this->assertFalse( bp_current_user_can( 'groups_access_group', array( 'group_id' => $g1 ) ) );
+
+		$this->set_current_user( $old_user );
+	}
+
+	public function test_user_can_groups_see_group_public() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'public'
+		) );
+		$u1 = $this->factory->user->create();
+
+		$this->assertTrue( bp_user_can( $u1, 'groups_see_group', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_see_group_private() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'private'
+		) );
+		$u1 = $this->factory->user->create();
+
+		$this->assertTrue( bp_user_can( $u1, 'groups_see_group', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_see_group_private_logged_in_user() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'private'
+		) );
+		$u1 = $this->factory->user->create();
+		$old_user = get_current_user_id();
+		$this->set_current_user( $u1 );
+
+		$this->assertTrue( bp_current_user_can( 'groups_see_group', array( 'group_id' => $g1 ) ) );
+
+		$this->set_current_user( $old_user );
+	}
+
+	public function test_user_can_groups_see_group_hidden() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'hidden'
+		) );
+		$u1 = $this->factory->user->create();
+
+		$this->assertFalse( bp_user_can( $u1, 'groups_see_group', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_see_group_hidden_member() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'hidden'
+		) );
+		$u1 = $this->factory->user->create();
+		$this->add_user_to_group( $u1, $g1 );
+
+		$this->assertTrue( bp_user_can( $u1, 'groups_see_group', array( 'group_id' => $g1 ) ) );
+	}
+
+	public function test_user_can_groups_see_group_hidden_logged_in_user() {
+		$g1 = $this->factory->group->create( array(
+			'status'      => 'hidden'
+		) );
+		$u1 = $this->factory->user->create();
+		$old_user = get_current_user_id();
+		$this->set_current_user( $u1 );
+
+		$this->assertFalse( bp_current_user_can( 'groups_see_group', array( 'group_id' => $g1 ) ) );
+
+		$this->set_current_user( $old_user );
+	}
+
+}
