Skip to:
Content

Ticket #6014: 6014.01.diff

File 6014.01.diff, 24.5 KB (added by dcavins, 10 months ago)

Add support for changing group slug via wp-admin.

  • src/bp-groups/admin/css/admin.css

    diff --git src/bp-groups/admin/css/admin.css src/bp-groups/admin/css/admin.css
    index c802127..d32bd31 100644
    body.toplevel_page_bp-groups table.groups th#last_active { 
    4646        line-height: 24px; 
    4747        color: #666; 
    4848} 
     49#bp-groups-permalink { 
     50        margin-right: 24px; 
     51} 
    4952.bp-groups-member-type { 
    5053        position: relative; 
    5154} 
  • src/bp-groups/bp-groups-actions.php

    diff --git src/bp-groups/bp-groups-actions.php src/bp-groups/bp-groups-actions.php
    index 4f80495..7b4491c 100644
    function bp_groups_update_orphaned_groups_on_group_delete( $group ) { 
    620620        } 
    621621} 
    622622add_action( 'bp_groups_delete_group', 'bp_groups_update_orphaned_groups_on_group_delete', 10, 2 ); 
     623 
     624/** 
     625 * Check whether the current action refers to an out-of-date group slug. 
     626 * 
     627 * @since 2.9.0 
     628 * 
     629 * @return void 
     630 */ 
     631function bp_groups_check_for_previous_slug() { 
     632        $current_action = bp_current_action(); 
     633 
     634        if ( bp_is_groups_component() && ! groups_get_id( $current_action ) ) { 
     635                if ( $group_id = groups_get_id_by_previous_slug( $current_action ) ) { 
     636                        // The requested group URL is out of date. Update to the current slug. 
     637                        $group_object = groups_get_group( $group_id ); 
     638 
     639                        // Call bp_get_group_slug() to make sure all filters are applied. 
     640                        buddypress()->current_action = bp_get_group_slug( $group_object ); 
     641                } 
     642        } 
     643} 
     644add_action( 'bp_groups_setup_globals', 'bp_groups_check_for_previous_slug', 8 ); 
  • src/bp-groups/bp-groups-activity.php

    diff --git src/bp-groups/bp-groups-activity.php src/bp-groups/bp-groups-activity.php
    index c29a03c..cb7c69c 100644
    function bp_groups_format_activity_action_group_details_updated( $action, $activ 
    190190        } elseif ( ! empty( $changed['description']['old'] ) && ! empty( $changed['description']['new'] ) ) { 
    191191                $action = sprintf( __( '%1$s changed the description of the group %2$s from "%3$s" to "%4$s"', 'buddypress' ), $user_link, $group_link, esc_html( $changed['description']['old'] ), esc_html( $changed['description']['new'] ) ); 
    192192 
     193        } elseif ( ! empty( $changed['slug']['old'] ) && ! empty( $changed['slug']['new'] ) ) { 
     194                $action = sprintf( __( '%1$s changed the permalink of the group %2$s.', 'buddypress' ), $user_link, $group_link ); 
     195 
    193196        } 
    194197 
    195198        /** 
    function bp_groups_group_details_updated_add_activity( $group_id, $old_group, $n 
    461464                return false; 
    462465        } 
    463466 
    464         if ( ! isset( $old_group->name ) || ! isset( $old_group->description ) ) { 
     467        if ( ! isset( $old_group->name ) || ! isset( $old_group->slug ) || ! isset( $old_group->description ) ) { 
    465468                return false; 
    466469        } 
    467470 
    function bp_groups_group_details_updated_add_activity( $group_id, $old_group, $n 
    489492                ); 
    490493        } 
    491494 
     495        if ( $group->slug !== $old_group->slug ) { 
     496                $changed['slug'] = array( 
     497                        'old' => $old_group->slug, 
     498                        'new' => $group->slug, 
     499                ); 
     500        } 
     501 
    492502        if ( $group->description !== $old_group->description ) { 
    493503                $changed['description'] = array( 
    494504                        'old' => $old_group->description, 
  • src/bp-groups/bp-groups-admin.php

    diff --git src/bp-groups/bp-groups-admin.php src/bp-groups/bp-groups-admin.php
    index 77f13e1..c3cdac9 100644
    function bp_groups_admin_load() { 
    236236                $error = 0; 
    237237                $success_new = $error_new = $success_modified = $error_modified = array(); 
    238238 
    239                 // Group name and description are handled with 
    240                 // groups_edit_base_group_details(). 
    241                 if ( !groups_edit_base_group_details( $group_id, $_POST['bp-groups-name'], $_POST['bp-groups-description'], 0 ) ) { 
    242                         $error = $group_id; 
     239                // Name, description and slug must not be empty. 
     240                if ( empty( $_POST['bp-groups-name'] ) ) { 
     241                        $error = $error - 1; 
     242                } 
     243                if ( empty( $_POST['bp-groups-description'] ) ) { 
     244                        $error = $error - 2; 
     245                } 
     246                if ( empty( $_POST['bp-groups-slug'] ) ) { 
     247                        $error = $error - 4; 
     248                } 
    243249 
    244                         // Using negative integers for different error messages... eek! 
    245                         if ( empty( $_POST['bp-groups-name'] ) && empty( $_POST['bp-groups-description'] ) ) { 
    246                                 $error = -3; 
    247                         } elseif ( empty( $_POST['bp-groups-name'] ) ) { 
    248                                 $error = -1; 
    249                         } elseif ( empty( $_POST['bp-groups-description'] ) ) { 
    250                                 $error = -2; 
    251                         } 
     250                /* 
     251                 * Group name, slug, and description are handled with 
     252                 * groups_edit_base_group_details(). 
     253                 */ 
     254                if ( ! $error && ! groups_edit_base_group_details( array( 
     255                                'group_id'       => $group_id, 
     256                                'name'           => $_POST['bp-groups-name'], 
     257                                'slug'           => $_POST['bp-groups-slug'], 
     258                                'description'    => $_POST['bp-groups-description'], 
     259                                'notify_members' => false, 
     260                        ) ) ) { 
     261                        $error = $group_id; 
    252262                } 
    253263 
    254264                // Enable discussion forum. 
    function bp_groups_admin_edit() { 
    518528                } 
    519529 
    520530                if ( ! empty( $errors ) ) { 
    521                         switch ( $errors ) { 
    522                                 case -1 : 
    523                                         $messages[] = __( 'Group name cannot be empty.', 'buddypress' ); 
    524                                         break; 
    525  
    526                                 case -2 : 
    527                                         $messages[] = __( 'Group description cannot be empty.', 'buddypress' ); 
    528                                         break; 
    529  
    530                                 case -3 : 
    531                                         $messages[] = __( 'Group name and description cannot be empty.', 'buddypress' ); 
    532                                         break; 
    533  
    534                                 default : 
    535                                         $messages[] = __( 'An error occurred when trying to update your group details.', 'buddypress' ); 
    536                                         break; 
     531                        if ( $errors < 0 ) { 
     532                                $messages[] = __( 'Group name, slug, and description are all required fields.', 'buddypress' ); 
     533                        } else { 
     534                                $messages[] = __( 'An error occurred when trying to update your group details.', 'buddypress' ); 
    537535                        } 
    538536 
    539537                } elseif ( ! empty( $updated ) ) { 
    function bp_groups_admin_edit() { 
    612610                                                                                ?></label> 
    613611                                                                                <input type="text" name="bp-groups-name" id="bp-groups-name" value="<?php echo esc_attr( stripslashes( $group_name ) ) ?>" /> 
    614612                                                                                <div id="bp-groups-permalink-box"> 
    615                                                                                         <strong><?php esc_html_e( 'Permalink:', 'buddypress' ) ?></strong> <span id="sample-permalink"><?php bp_group_permalink( $group ) ?></span> <a href="<?php echo bp_group_permalink( $group ) ?>" class="button button-small" id="bp-groups-visit-group"><?php esc_html_e( 'Visit Group', 'buddypress' ) ?></a> 
     613                                                                                        <strong><?php esc_html_e( 'Permalink:', 'buddypress' ) ?></strong> 
     614                                                                                        <span id="bp-groups-permalink"> 
     615                                                                                                <?php bp_groups_directory_permalink(); ?> <input type="text" id="bp-groups-slug" name="bp-groups-slug" value="<?php bp_group_slug( $group ); ?>" autocomplete="off"> / 
     616                                                                                        </span> 
     617                                                                                        <a href="<?php echo bp_group_permalink( $group ) ?>" class="button button-small" id="bp-groups-visit-group"><?php esc_html_e( 'Visit Group', 'buddypress' ) ?></a> 
    616618                                                                                </div> 
    617619 
    618620                                                                                <label for="bp-groups-description" class="screen-reader-text"><?php 
  • src/bp-groups/bp-groups-functions.php

    diff --git src/bp-groups/bp-groups-functions.php src/bp-groups/bp-groups-functions.php
    index 76d031f..f341ba5 100644
    function groups_create_group( $args = '' ) { 
    218218 * 
    219219 * @since 1.0.0 
    220220 * 
    221  * @param int    $group_id       ID of the group. 
    222  * @param string $group_name     Name of the group. 
    223  * @param string $group_desc     Description of the group. 
    224  * @param bool   $notify_members Whether to send an email notification to group 
    225  *                               members about changes in these details. 
     221 * @param array $args { 
     222 *     An array of optional arguments. 
     223 *     @type int    $group_id       ID of the group. 
     224 *     @type string $name           Name of the group. 
     225 *     @type string $slug           Slug of the group. 
     226 *     @type string $description    Description of the group. 
     227 *     @type bool   $notify_members Whether to send an email notification to group 
     228 *                                  members about changes in these details. 
     229 * } 
    226230 * @return bool True on success, false on failure. 
    227231 */ 
    228 function groups_edit_base_group_details( $group_id, $group_name, $group_desc, $notify_members ) { 
     232function groups_edit_base_group_details( $args = array() ) { 
    229233 
    230         if ( empty( $group_name ) || empty( $group_desc ) ) 
     234        // Backward compatibility with old method of passing arguments. 
     235        if ( ! is_array( $args ) || func_num_args() > 1 ) { 
     236                _deprecated_argument( __METHOD__, '2.9.0', sprintf( __( 'Arguments passed to %1$s should be in an associative array. See the inline documentation at %2$s for more details.', 'buddypress' ), __METHOD__, __FILE__ ) ); 
     237 
     238                $old_args_keys = array( 
     239                        0 => 'group_id', 
     240                        1 => 'name', 
     241                        2 => 'description', 
     242                        3 => 'notify_members', 
     243                ); 
     244 
     245                $args = bp_core_parse_args_array( $old_args_keys, func_get_args() ); 
     246        } 
     247 
     248        $r = wp_parse_args( $args, array( 
     249                'group_id'       => bp_get_current_group_id(), 
     250                'name'           => null, 
     251                'slug'           => null, 
     252                'description'    => null, 
     253                'notify_members' => false, 
     254        ) ); 
     255 
     256        if ( ! $r['group_id'] ) { 
    231257                return false; 
     258        } 
    232259 
    233         $group     = groups_get_group( $group_id ); 
     260        $group     = groups_get_group( $r['group_id'] ); 
    234261        $old_group = clone $group; 
    235262 
    236         $group->name        = $group_name; 
    237         $group->description = $group_desc; 
     263        // Group name, slug and description can never be empty. Update only if provided. 
     264        if ( $r['name'] ) { 
     265                $group->name = $r['name']; 
     266        } 
     267        if ( $r['slug']  && $r['slug'] != $group->slug ) { 
     268                $group->slug = groups_check_slug( $r['slug'] ); 
     269        } 
     270        if ( $r['description'] ) { 
     271                $group->description = $r['description']; 
     272        } 
    238273 
    239         if ( !$group->save() ) 
     274        if ( ! $group->save() ) { 
    240275                return false; 
     276        } 
     277 
     278        // Maybe update the "previous_slug" groupmeta. 
     279        if ( $group->slug != $old_group->slug ) { 
     280                /* 
     281                 * If the old slug exists in this group's past, delete that entry. 
     282                 * Recent previous_slugs are preferred when selecting the current group 
     283                 * from an old group slug, so we want the previous slug to be 
     284                 * saved "now" in the groupmeta table and don't need the old record. 
     285                 */ 
     286                groups_delete_groupmeta( $group->id, 'previous_slug', $old_group->slug ); 
     287                groups_add_groupmeta( $group->id, 'previous_slug', $old_group->slug ); 
     288        } 
    241289 
    242         if ( $notify_members ) { 
     290        if ( $r['notify_members'] ) { 
    243291                groups_notification_group_updated( $group->id, $old_group ); 
    244292        } 
    245293 
    function groups_edit_base_group_details( $group_id, $group_name, $group_desc, $n 
    252300         * @param BP_Groups_Group $old_group      Group object, before being modified. 
    253301         * @param bool            $notify_members Whether to send an email notification to members about the change. 
    254302         */ 
    255         do_action( 'groups_details_updated', $group->id, $old_group, $notify_members ); 
     303        do_action( 'groups_details_updated', $group->id, $old_group, $r['notify_members'] ); 
    256304 
    257305        return true; 
    258306} 
    function groups_get_id( $group_slug ) { 
    428476        return BP_Groups_Group::group_exists( $group_slug ); 
    429477} 
    430478 
     479/** 
     480 * Get a group ID by checking against old (not currently active) slugs. 
     481 * 
     482 * @since 2.9.0 
     483 * 
     484 * @param string $group_slug The group's slug. 
     485 * @return int|null The group ID on success; null on failure. 
     486 */ 
     487function groups_get_id_by_previous_slug( $group_slug ) { 
     488        return BP_Groups_Group::get_id_by_previous_slug( $group_slug ); 
     489} 
     490 
    431491/** User Actions **************************************************************/ 
    432492 
    433493/** 
  • src/bp-groups/bp-groups-notifications.php

    diff --git src/bp-groups/bp-groups-notifications.php src/bp-groups/bp-groups-notifications.php
    index fc8a052..5bf44fd 100644
    function groups_notification_group_updated( $group_id = 0, $old_group = null ) { 
    4444                                esc_html( $group->description ) 
    4545                        ); 
    4646                } 
     47 
     48                if ( $group->slug !== $old_group->slug ) { 
     49                        $changed[] = sprintf( 
     50                                _x( '* Permalink changed from "%s" to "%s".', 'Group update email text', 'buddypress' ), 
     51                                esc_url( bp_get_group_permalink( $old_group ) ), 
     52                                esc_url( bp_get_group_permalink( $group ) ) 
     53                        ); 
     54                } 
    4755        } 
    4856 
    4957        /** 
  • src/bp-groups/bp-groups-screens.php

    diff --git src/bp-groups/bp-groups-screens.php src/bp-groups/bp-groups-screens.php
    index 17e139b..b02419f 100644
    function groups_screen_group_admin_edit_details() { 
    839839 
    840840                        $group_notify_members = isset( $_POST['group-notify-members'] ) ? (int) $_POST['group-notify-members'] : 0; 
    841841 
    842                         if ( !groups_edit_base_group_details( $_POST['group-id'], $_POST['group-name'], $_POST['group-desc'], $group_notify_members ) ) { 
     842                        // Name and description are required and may not be empty. 
     843                        if ( empty( $_POST['group-name'] ) || empty( $_POST['group-desc'] ) ) { 
     844                                bp_core_add_message( __( 'Groups must have a name and a description. Please try again.', 'buddypress' ), 'error' ); 
     845                        } elseif ( ! groups_edit_base_group_details( array( 
     846                                'group_id'       => $_POST['group-id'], 
     847                                'name'           => $_POST['group-name'], 
     848                                'slug'           => null, // @TODO: Add to settings pane? If yes, editable by site admin only, or allow group admins to do this? 
     849                                'description'    => $_POST['group-desc'], 
     850                                'notify_members' => $group_notify_members, 
     851                        ) ) ) { 
    843852                                bp_core_add_message( __( 'There was an error updating group details. Please try again.', 'buddypress' ), 'error' ); 
    844853                        } else { 
    845854                                bp_core_add_message( __( 'Group details were successfully updated.', 'buddypress' ) ); 
  • src/bp-groups/classes/class-bp-groups-group.php

    diff --git src/bp-groups/classes/class-bp-groups-group.php src/bp-groups/classes/class-bp-groups-group.php
    index 2dceead..598cc87 100644
    class BP_Groups_Group { 
    655655        } 
    656656 
    657657        /** 
     658         * Get whether a group exists for an old slug. 
     659         * 
     660         * @since 2.9.0 
     661         * 
     662         * @param string      $slug       Slug to check. 
     663         * @return int|null|false Group ID if found; null if not; false if missing parameters. 
     664         */ 
     665        public static function get_id_by_previous_slug( $slug, $table_name = false ) { 
     666                global $wpdb; 
     667 
     668                if ( ! $table_name ) { 
     669                        $table_name = buddypress()->groups->table_name_groupmeta; 
     670                } 
     671 
     672                if ( empty( $slug ) ) { 
     673                        return false; 
     674                } 
     675 
     676                $group_exists_sql = $wpdb->prepare( "SELECT group_id FROM {$table_name} WHERE meta_key = 'previous_slug' AND meta_value = %s ORDER BY id DESC", strtolower( $slug ) ); 
     677                $cached = bp_core_get_incremented_cache( $group_exists_sql, 'bp_groups' ); 
     678                if ( false === $cached ) { 
     679                        $group_id = $wpdb->get_var( $group_exists_sql ); 
     680                        bp_core_set_incremented_cache( $group_exists_sql, 'bp_groups', $group_id ); 
     681                } else { 
     682                        $group_id = $cached; 
     683                } 
     684 
     685                return is_numeric( $group_id ) ? (int) $group_id : $group_id; 
     686        } 
     687 
     688        /** 
    658689         * Get IDs of users with outstanding invites to a given group from a specified user. 
    659690         * 
    660691         * @since 1.6.0 
  • tests/phpunit/testcases/groups/activity.php

    diff --git tests/phpunit/testcases/groups/activity.php tests/phpunit/testcases/groups/activity.php
    index 1946326..bfb4087 100644
    class BP_Tests_Groups_Activity extends BP_UnitTestCase { 
    5555         */ 
    5656        public function test_bp_groups_format_activity_action_group_details_updated_with_no_change() { 
    5757                $group = $this->factory->group->create_and_get(); 
    58                 groups_edit_base_group_details( $group->id, $group->name, $group->description, true ); 
     58                groups_edit_base_group_details( array( 
     59                                'group_id'       => $group->id, 
     60                                'name'           => $group->name, 
     61                                'slug'           => $group->slug, 
     62                                'description'    => $group->description, 
     63                                'notify_members' => true, 
     64                ) ); 
    5965 
    6066                $a = bp_activity_get( array( 
    6167                        'component' => buddypress()->groups->id, 
    class BP_Tests_Groups_Activity extends BP_UnitTestCase { 
    7278         */ 
    7379        public function test_bp_groups_format_activity_action_group_details_updated_with_notify_members_false() { 
    7480                $group = $this->factory->group->create_and_get(); 
    75                 groups_edit_base_group_details( $group->id, 'Foo', $group->description, false ); 
     81                groups_edit_base_group_details( array( 
     82                        'group_id'       => $group->id, 
     83                        'name'           => 'Foo', 
     84                        'slug'           => $group->slug, 
     85                        'description'    => $group->description, 
     86                        'notify_members' => false, 
     87                ) ); 
    7688 
    7789                $a = bp_activity_get( array( 
    7890                        'component' => buddypress()->groups->id, 
    class BP_Tests_Groups_Activity extends BP_UnitTestCase { 
    93105                $this->set_current_user( $u ); 
    94106 
    95107                $group = $this->factory->group->create_and_get(); 
    96                 groups_edit_base_group_details( $group->id, 'Foo', $group->description, true ); 
     108                groups_edit_base_group_details( array( 
     109                        'group_id'       => $group->id, 
     110                        'name'           => 'Foo', 
     111                        'slug'           => $group->slug, 
     112                        'description'    => $group->description, 
     113                        'notify_members' => true, 
     114                ) ); 
    97115 
    98116                $a = bp_activity_get( array( 
    99117                        'component' => buddypress()->groups->id, 
    class BP_Tests_Groups_Activity extends BP_UnitTestCase { 
    119137                $this->set_current_user( $u ); 
    120138 
    121139                $group = $this->factory->group->create_and_get(); 
    122                 groups_edit_base_group_details( $group->id, $group->name, 'Bar', true ); 
     140                groups_edit_base_group_details( array( 
     141                        'group_id'       => $group->id, 
     142                        'name'           => $group->name, 
     143                        'slug'           => $group->slug, 
     144                        'description'    => 'Bar', 
     145                        'notify_members' => true, 
     146                ) ); 
    123147 
    124148                $a = bp_activity_get( array( 
    125149                        'component' => buddypress()->groups->id, 
    class BP_Tests_Groups_Activity extends BP_UnitTestCase { 
    139163         * @group activity_action 
    140164         * @group bp_groups_format_activity_action_group_details_updated 
    141165         */ 
     166        public function test_bp_groups_format_activity_action_group_details_updated_with_updated_slug() { 
     167                $old_user = get_current_user_id(); 
     168                $u = $this->factory->user->create(); 
     169                $this->set_current_user( $u ); 
     170 
     171                $group = $this->factory->group->create_and_get(); 
     172                groups_edit_base_group_details( array( 
     173                        'group_id'       => $group->id, 
     174                        'name'           => $group->name, 
     175                        'slug'           => 'flaxen', 
     176                        'description'    => $group->description, 
     177                        'notify_members' => true, 
     178                ) ); 
     179                $new_group_details = groups_get_group( $group->id ); 
     180 
     181                $a = bp_activity_get( array( 
     182                        'component' => buddypress()->groups->id, 
     183                        'action' => 'group_details_updated', 
     184                        'item_id' => $group->id, 
     185                ) ); 
     186 
     187                $this->assertNotEmpty( $a['activities'] ); 
     188 
     189                $expected = sprintf( __( '%s changed the permalink of the group %s.', 'buddypress' ), bp_core_get_userlink( $u ),  '<a href="' . bp_get_group_permalink( $new_group_details ) . '">' . $group->name . '</a>' ); 
     190                $this->assertSame( $expected, $a['activities'][0]->action ); 
     191 
     192                $this->set_current_user( $old_user ); 
     193        } 
     194 
     195        /** 
     196         * @group activity_action 
     197         * @group bp_groups_format_activity_action_group_details_updated 
     198         */ 
    142199        public function test_bp_groups_format_activity_action_group_details_updated_with_updated_name_and_description() { 
    143200                $old_user = get_current_user_id(); 
    144201                $u = $this->factory->user->create(); 
    145202                $this->set_current_user( $u ); 
    146203 
    147204                $group = $this->factory->group->create_and_get(); 
    148                 groups_edit_base_group_details( $group->id, 'Foo', 'Bar', true ); 
     205                groups_edit_base_group_details( array( 
     206                        'group_id'       => $group->id, 
     207                        'name'           => 'Foo', 
     208                        'slug'           => $group->slug, 
     209                        'description'    => 'Bar', 
     210                        'notify_members' => true, 
     211                ) ); 
    149212 
    150213                $a = bp_activity_get( array( 
    151214                        'component' => buddypress()->groups->id, 
  • tests/phpunit/testcases/groups/functions.php

    diff --git tests/phpunit/testcases/groups/functions.php tests/phpunit/testcases/groups/functions.php
    index 4a4c8ba..659a52a 100644
    Bar!'; 
    711711 
    712712                $this->assertEquals( $g1, $group->id ); 
    713713        } 
     714 
     715        /** 
     716         * @expectedDeprecated groups_edit_base_group_details 
     717         * @group groups_edit_base_group_details 
     718         */ 
     719        public function test_groups_edit_base_group_details_test_backcompat_arguments() { 
     720                $g1 = $this->factory->group->create(); 
     721                $name = 'Great Scott'; 
     722                $description = 'A must-see in time for the holidays!'; 
     723                groups_edit_base_group_details( $g1, $name, $description, false ); 
     724 
     725                $expected = array( 
     726                        'id'          => $g1, 
     727                        'name'        => $name, 
     728                        'description' => $description 
     729                ); 
     730                $updated_group_object = groups_get_group( $g1 ); 
     731                $updated = array( 
     732                        'id'          => $updated_group_object->id, 
     733                        'name'        => $updated_group_object->name, 
     734                        'description' => $updated_group_object->description 
     735                ); 
     736 
     737                $this->assertEqualSets( $expected, $updated ); 
     738        } 
     739 
     740        /** 
     741         * @group groups_edit_base_group_details 
     742         */ 
     743        public function test_groups_edit_base_group_details_test_new_arguments() { 
     744                $g1 = $this->factory->group->create(); 
     745                $name = 'Great Scott'; 
     746                $slug = 'what-about-it'; 
     747                $description = 'A must-see in time for the holidays!'; 
     748                groups_edit_base_group_details( array( 
     749                                'group_id'       => $g1, 
     750                                'name'           => $name, 
     751                                'slug'           => $slug, 
     752                                'description'    => $description, 
     753                                'notify_members' => false, 
     754                ) ); 
     755 
     756                $expected = array( 
     757                        'id'          => $g1, 
     758                        'slug'        => $slug, 
     759                        'name'        => $name, 
     760                        'description' => $description 
     761                ); 
     762                $updated_group_object = groups_get_group( $g1 ); 
     763                $updated = array( 
     764                        'id'          => $updated_group_object->id, 
     765                        'slug'        => $updated_group_object->slug, 
     766                        'name'        => $updated_group_object->name, 
     767                        'description' => $updated_group_object->description 
     768                ); 
     769 
     770                $this->assertEqualSets( $expected, $updated ); 
     771        } 
     772 
     773        /** 
     774         * @group groups_edit_base_group_details 
     775         */ 
     776        public function test_groups_edit_base_group_details_avoid_slug_collisions() { 
     777                $slug = 'circe'; 
     778                $g1 = $this->factory->group->create( array( 'slug' => $slug ) ); 
     779                $g2 = $this->factory->group->create( array( 'slug' => 'loom' ) ); 
     780 
     781                // Attempt to use a duplicate slug. 
     782                groups_edit_base_group_details( array( 
     783                                'group_id'       => $g2, 
     784                                'slug'           => $slug, 
     785                ) ); 
     786 
     787                $updated_group_object = groups_get_group( $g2 ); 
     788 
     789                $this->assertNotEquals( $slug, $updated_group_object->slug ); 
     790        } 
     791 
     792        /** 
     793         * @group groups_edit_base_group_details 
     794         */ 
     795        public function test_groups_edit_base_group_details_slug_no_change() { 
     796                $slug = 'circe'; 
     797                $g1 = $this->factory->group->create( array( 'slug' => $slug ) ); 
     798 
     799                // Make sure the slug doesn't get incremented when there's no change. 
     800                groups_edit_base_group_details( array( 
     801                                'group_id'       => $g1, 
     802                                'slug'           => $slug, 
     803                ) ); 
     804 
     805                $updated_group_object = groups_get_group( $g1 ); 
     806 
     807                $this->assertEquals( $slug, $updated_group_object->slug ); 
     808        } 
     809 
     810        /** 
     811         * @group groups_edit_base_group_details 
     812         */ 
     813        public function test_groups_edit_base_group_details_slug_null_value() { 
     814                $slug = 'circe'; 
     815                $g1 = $this->factory->group->create( array( 'slug' => $slug ) ); 
     816 
     817                // Make sure the slug doesn't get changed when null is passed. 
     818                groups_edit_base_group_details( array( 
     819                                'group_id'       => $g1, 
     820                                'slug'           => null, 
     821                ) ); 
     822 
     823                $updated_group_object = groups_get_group( $g1 ); 
     824 
     825                $this->assertEquals( $slug, $updated_group_object->slug ); 
     826        } 
    714827} 
  • tests/phpunit/testcases/routing/groups.php

    diff --git tests/phpunit/testcases/routing/groups.php tests/phpunit/testcases/routing/groups.php
    index f4cbb5f..b89c39f 100644
    class BP_Tests_Routing_Groups extends BP_UnitTestCase { 
    6363                $this->go_to( bp_get_members_directory_permalink() . 'type/foo/' ); 
    6464                $this->assertTrue( is_404() ); 
    6565        } 
     66 
     67        /** 
     68         * @group group_previous_slug 
     69         */ 
     70        public function test_group_previous_slug_current_slug_should_resolve() { 
     71                $g1 = $this->factory->group->create( array( 
     72                        'slug' => 'george', 
     73                ) ); 
     74                groups_edit_base_group_details( array( 
     75                        'group_id' => $g1, 
     76                        'slug'     => 'ralph', 
     77                ) ); 
     78 
     79                $this->go_to( bp_get_groups_directory_permalink() . 'ralph' ); 
     80 
     81                $this->assertEquals( $g1, bp_get_current_group_id() ); 
     82        } 
     83 
     84        /** 
     85         * @group group_previous_slug 
     86         */ 
     87        public function test_group_previous_slug_should_resolve() { 
     88                $g1 = $this->factory->group->create( array( 
     89                        'slug' => 'george', 
     90                ) ); 
     91 
     92                groups_edit_base_group_details( array( 
     93                        'group_id'       => $g1, 
     94                        'slug'           => 'sam!', 
     95                        'notify_members' => false, 
     96                ) ); 
     97                $this->go_to( bp_get_groups_directory_permalink() . 'george' ); 
     98 
     99                $this->assertEquals( $g1, bp_get_current_group_id() ); 
     100        } 
     101 
     102        /** 
     103         * @group group_previous_slug 
     104         */ 
     105        public function test_group_previous_slug_most_recent_takes_precedence() { 
     106                $g1 = $this->factory->group->create( array( 
     107                        'slug' => 'george', 
     108                ) ); 
     109                groups_edit_base_group_details( array( 
     110                        'group_id'       => $g1, 
     111                        'slug'           => 'ralph', 
     112                        'notify_members' => false, 
     113                ) ); 
     114                $g2 = $this->factory->group->create( array( 
     115                        'slug' => 'george', 
     116                ) ); 
     117                groups_edit_base_group_details( array( 
     118                        'group_id'       => $g2, 
     119                        'slug'           => 'sam', 
     120                        'notify_members' => false, 
     121                ) ); 
     122 
     123                $this->go_to( bp_get_groups_directory_permalink() . 'george' ); 
     124                $this->assertEquals( $g2, bp_get_current_group_id() ); 
     125        } 
     126 
    66127}