2019-07-25 01:24:42 -04:00
# frozen_string_literal: true
2015-05-29 19:02:11 -04:00
require 'spec_helper'
2020-06-16 14:09:01 -04:00
RSpec . describe 'Group' do
2021-05-03 20:10:16 -04:00
let ( :user ) { create ( :user ) }
2018-10-18 21:07:29 -04:00
2016-07-12 15:40:05 -04:00
before do
2018-10-18 21:07:29 -04:00
sign_in ( user )
2016-07-12 15:40:05 -04:00
end
2016-08-25 12:48:08 -04:00
matcher :have_namespace_error_message do
match do | page |
2018-10-30 12:23:47 -04:00
page . has_content? ( " Group URL can contain only letters, digits, '_', '-' and '.'. Cannot start with '-' or end in '.', '.git' or '.atom'. " )
2016-08-25 12:48:08 -04:00
end
end
2021-05-26 20:10:40 -04:00
describe 'create a group' , :js do
2017-06-14 14:18:56 -04:00
before do
visit new_group_path
2021-05-26 20:10:40 -04:00
click_link 'Create group'
2017-06-14 14:18:56 -04:00
end
2016-07-12 15:40:05 -04:00
2018-10-18 21:07:29 -04:00
describe 'as a non-admin' do
it 'creates a group and persists visibility radio selection' , :js do
stub_application_setting ( default_group_visibility : :private )
fill_in 'Group name' , with : 'test-group'
find ( " input[name='group[visibility_level]'][value=' #{ Gitlab :: VisibilityLevel :: PUBLIC } '] " ) . click
click_button 'Create group'
group = Group . find_by ( name : 'test-group' )
expect ( group . visibility_level ) . to eq ( Gitlab :: VisibilityLevel :: PUBLIC )
expect ( current_path ) . to eq ( group_path ( group ) )
2020-07-22 20:09:43 -04:00
expect ( page ) . to have_selector '.visibility-icon [data-testid="earth-icon"]'
2018-10-18 21:07:29 -04:00
end
end
2020-12-04 01:09:34 -05:00
describe 'with expected fields' do
it 'renders from as expected' , :aggregate_failures do
expect ( page ) . to have_field ( 'name' )
expect ( page ) . to have_field ( 'group_path' )
expect ( page ) . to have_field ( 'group_visibility_level_0' )
expect ( page ) . not_to have_field ( 'description' )
end
end
2016-10-14 07:51:59 -04:00
describe 'with space in group path' do
it 'renders new group form with validation errors' do
2018-10-30 12:23:47 -04:00
fill_in 'Group URL' , with : 'space group'
2016-10-14 07:51:59 -04:00
click_button 'Create group'
2016-07-12 15:40:05 -04:00
2021-05-26 20:10:40 -04:00
expect ( current_path ) . to eq ( new_group_path )
2022-02-03 10:12:41 -05:00
expect ( page ) . to have_text ( 'Choose a group path that does not start with a dash or end with a period. It can also contain alphanumeric characters and underscores.' )
2016-10-14 07:51:59 -04:00
end
2016-08-25 12:48:08 -04:00
end
2016-10-14 07:51:59 -04:00
describe 'with .atom at end of group path' do
it 'renders new group form with validation errors' do
2021-05-26 20:10:40 -04:00
fill_in 'Group name' , with : 'test-group'
2018-10-30 12:23:47 -04:00
fill_in 'Group URL' , with : 'atom_group.atom'
2016-10-14 07:51:59 -04:00
click_button 'Create group'
2016-08-25 12:48:08 -04:00
2016-10-14 07:51:59 -04:00
expect ( current_path ) . to eq ( groups_path )
expect ( page ) . to have_namespace_error_message
end
2016-08-25 12:48:08 -04:00
end
2016-10-14 07:51:59 -04:00
describe 'with .git at end of group path' do
it 'renders new group form with validation errors' do
2021-05-26 20:10:40 -04:00
fill_in 'Group name' , with : 'test-group'
2018-10-30 12:23:47 -04:00
fill_in 'Group URL' , with : 'git_group.git'
2016-10-14 07:51:59 -04:00
click_button 'Create group'
2016-08-25 12:48:08 -04:00
2016-10-14 07:51:59 -04:00
expect ( current_path ) . to eq ( groups_path )
expect ( page ) . to have_namespace_error_message
end
2016-07-12 15:40:05 -04:00
end
2017-02-20 08:51:47 -05:00
2020-07-07 08:09:16 -04:00
describe 'real-time group url validation' , :js do
it 'shows a message if group url is available' do
fill_in 'group_path' , with : 'az'
wait_for_requests
expect ( page ) . to have_content ( 'Group path is available' )
end
it 'shows an error if group url is taken' do
fill_in 'group_path' , with : user . username
wait_for_requests
2022-02-03 10:12:41 -05:00
expect ( page ) . to have_content ( " Group path is unavailable. Path has been replaced with a suggested available path. " )
2020-07-07 08:09:16 -04:00
end
it 'does not break after an invalid form submit' do
fill_in 'group_name' , with : 'MyGroup'
fill_in 'group_path' , with : 'z'
click_button 'Create group'
expect ( page ) . to have_content ( 'Group URL is too short' )
fill_in 'group_path' , with : 'az'
wait_for_requests
expect ( page ) . to have_content ( 'Group path is available' )
end
end
2017-02-20 08:51:47 -05:00
describe 'Mattermost team creation' do
before do
2017-03-28 08:12:32 -04:00
stub_mattermost_setting ( enabled : mattermost_enabled )
2017-03-06 02:55:30 -05:00
2017-02-20 08:51:47 -05:00
visit new_group_path
2021-05-26 20:10:40 -04:00
click_link 'Create group'
2017-02-20 08:51:47 -05:00
end
context 'Mattermost enabled' do
let ( :mattermost_enabled ) { true }
it 'displays a team creation checkbox' do
expect ( page ) . to have_selector ( '#group_create_chat_team' )
end
2020-01-23 01:08:32 -05:00
it 'unchecks the checkbox by default' do
2021-05-26 20:10:40 -04:00
expect ( find ( '#group_create_chat_team' ) ) . not_to be_checked
2017-02-20 08:51:47 -05:00
end
it 'updates the team URL on graph path update' , :js do
2017-10-23 03:17:31 -04:00
out_span = find ( 'span[data-bind-out="create_chat_team"]' , visible : false )
2017-02-20 08:51:47 -05:00
expect ( out_span . text ) . to be_empty
fill_in ( 'group_path' , with : 'test-group' )
expect ( out_span . text ) . to eq ( 'test-group' )
end
end
context 'Mattermost disabled' do
let ( :mattermost_enabled ) { false }
it 'doesnt show a team creation checkbox if Mattermost not enabled' do
expect ( page ) . not_to have_selector ( '#group_create_chat_team' )
end
end
end
2021-03-19 05:08:53 -04:00
describe 'showing recaptcha on group creation when it is enabled' do
before do
stub_application_setting ( recaptcha_enabled : true )
allow ( Gitlab :: Recaptcha ) . to receive ( :load_configurations! )
visit new_group_path
2021-05-26 20:10:40 -04:00
click_link 'Create group'
2021-03-19 05:08:53 -04:00
end
it 'renders recaptcha' do
expect ( page ) . to have_css ( '.recaptcha' )
end
end
describe 'not showing recaptcha on group creation when it is disabled' do
before do
stub_feature_flags ( recaptcha_on_top_level_group_creation : false )
stub_application_setting ( recaptcha_enabled : true )
visit new_group_path
2021-05-26 20:10:40 -04:00
click_link 'Create group'
2021-03-19 05:08:53 -04:00
end
it 'does not render recaptcha' do
expect ( page ) . not_to have_css ( '.recaptcha' )
end
end
2022-01-06 22:14:36 -05:00
describe 'showing personalization questions on group creation when it is enabled' do
before do
stub_application_setting ( hide_third_party_offers : false )
visit new_group_path ( anchor : 'create-group-pane' )
end
it 'renders personalization questions' do
expect ( page ) . to have_content ( 'Now, personalize your GitLab experience' )
end
end
describe 'not showing personalization questions on group creation when it is enabled' do
before do
stub_application_setting ( hide_third_party_offers : true )
visit new_group_path ( anchor : 'create-group-pane' )
end
it 'does not render personalization questions' do
expect ( page ) . not_to have_content ( 'Now, personalize your GitLab experience' )
end
end
2016-07-12 15:40:05 -04:00
end
2021-05-26 20:10:40 -04:00
describe 'create a nested group' , :js do
2020-12-04 01:09:34 -05:00
let_it_be ( :group ) { create ( :group , path : 'foo' ) }
2017-01-24 10:32:34 -05:00
2017-04-05 13:20:11 -04:00
context 'as admin' do
2020-11-23 10:09:37 -05:00
let ( :user ) { create ( :admin ) }
2017-04-05 13:20:11 -04:00
before do
2021-05-26 20:10:40 -04:00
visit new_group_path ( parent_id : group . id )
2017-04-05 13:20:11 -04:00
end
2021-03-09 13:09:41 -05:00
context 'when admin mode is enabled' , :enable_admin_mode do
it 'creates a nested group' do
2021-05-26 20:10:40 -04:00
click_link 'Create group'
2021-03-09 13:09:41 -05:00
fill_in 'Group name' , with : 'bar'
click_button 'Create group'
expect ( current_path ) . to eq ( group_path ( 'foo/bar' ) )
2021-05-26 20:10:40 -04:00
expect ( page ) . to have_selector 'h1' , text : 'bar'
2021-03-09 13:09:41 -05:00
end
end
2017-04-05 13:20:11 -04:00
2021-03-09 13:09:41 -05:00
context 'when admin mode is disabled' do
it 'is not allowed' do
2021-05-26 20:10:40 -04:00
expect ( page ) . not_to have_button ( 'Create group' )
2021-03-09 13:09:41 -05:00
end
2017-04-05 13:20:11 -04:00
end
2017-01-24 10:32:34 -05:00
end
2017-04-05 13:20:11 -04:00
context 'as group owner' do
2017-08-09 06:58:00 -04:00
it 'creates a nested group' do
user = create ( :user )
2017-01-24 10:32:34 -05:00
2017-04-05 13:20:11 -04:00
group . add_owner ( user )
2017-06-21 19:44:10 -04:00
sign_out ( :user )
sign_in ( user )
2017-04-05 13:20:11 -04:00
2021-05-26 20:10:40 -04:00
visit new_group_path ( parent_id : group . id )
click_link 'Create group'
2017-09-05 04:03:43 -04:00
2018-10-30 12:23:47 -04:00
fill_in 'Group name' , with : 'bar'
2017-04-05 13:20:11 -04:00
click_button 'Create group'
expect ( current_path ) . to eq ( group_path ( 'foo/bar' ) )
2021-05-26 20:10:40 -04:00
expect ( page ) . to have_selector 'h1' , text : 'bar'
2017-04-05 13:20:11 -04:00
end
2017-01-24 10:32:34 -05:00
end
2021-03-19 05:08:53 -04:00
context 'when recaptcha is enabled' do
before do
stub_application_setting ( recaptcha_enabled : true )
allow ( Gitlab :: Recaptcha ) . to receive ( :load_configurations! )
end
context 'when creating subgroup' do
2021-05-26 20:10:40 -04:00
let ( :path ) { new_group_path ( parent_id : group . id ) }
2021-03-19 05:08:53 -04:00
it 'does not render recaptcha' do
visit path
expect ( page ) . not_to have_css ( '.recaptcha' )
end
end
end
2021-04-19 14:09:09 -04:00
describe 'real-time group url validation' , :js do
let_it_be ( :subgroup ) { create ( :group , path : 'sub' , parent : group ) }
before do
group . add_owner ( user )
visit new_group_path ( parent_id : group . id )
2021-05-26 20:10:40 -04:00
click_link 'Create group'
2021-04-19 14:09:09 -04:00
end
it 'shows a message if group url is available' do
fill_in 'Group URL' , with : group . path
wait_for_requests
expect ( page ) . to have_content ( 'Group path is available' )
end
it 'shows an error if group url is taken' do
fill_in 'Group URL' , with : subgroup . path
wait_for_requests
2022-02-03 10:12:41 -05:00
expect ( page ) . to have_content ( " Group path is unavailable. Path has been replaced with a suggested available path. " )
2021-04-19 14:09:09 -04:00
end
end
2017-01-24 10:32:34 -05:00
end
2021-05-26 20:10:40 -04:00
it 'checks permissions to avoid exposing groups by parent_id' , :js do
2017-03-28 07:09:44 -04:00
group = create ( :group , :private , path : 'secret-group' )
2017-06-21 19:44:10 -04:00
sign_out ( :user )
sign_in ( create ( :user ) )
2017-03-28 07:09:44 -04:00
visit new_group_path ( parent_id : group . id )
2021-05-26 20:10:40 -04:00
expect ( page ) . to have_title ( 'Not Found' )
expect ( page ) . to have_content ( 'Page Not Found' )
2017-03-28 07:09:44 -04:00
end
2017-10-03 04:35:01 -04:00
describe 'group edit' , :js do
2020-12-04 01:09:34 -05:00
let_it_be ( :group ) { create ( :group , :public ) }
2021-04-06 05:09:03 -04:00
2020-12-04 01:09:34 -05:00
let ( :path ) { edit_group_path ( group ) }
2016-10-14 07:51:59 -04:00
let ( :new_name ) { 'new-name' }
2016-10-14 03:06:44 -04:00
2017-06-14 14:18:56 -04:00
before do
2020-11-23 10:09:37 -05:00
group . add_owner ( user )
2017-06-14 14:18:56 -04:00
visit path
end
2016-10-14 03:06:44 -04:00
2018-10-15 09:36:19 -04:00
it_behaves_like 'dirty submit form' , [ { form : '.js-general-settings-form' , input : 'input[name="group[name]"]' } ,
2018-11-14 14:51:39 -05:00
{ form : '.js-general-settings-form' , input : '#group_visibility_level_0' } ,
{ form : '.js-general-permissions-form' , input : '#group_request_access_enabled' } ,
2018-10-15 09:36:19 -04:00
{ form : '.js-general-permissions-form' , input : 'input[name="group[two_factor_grace_period]"]' } ]
2016-10-14 07:51:59 -04:00
it 'saves new settings' do
2018-05-28 11:02:04 -04:00
page . within ( '.gs-general' ) do
2020-11-23 10:09:37 -05:00
# Have to reset it to '' so it overwrites rather than appends
fill_in ( 'group_name' , with : '' )
2018-05-28 08:58:39 -04:00
fill_in 'group_name' , with : new_name
2018-10-15 09:36:19 -04:00
click_button 'Save changes'
2018-05-28 08:58:39 -04:00
end
2016-10-14 03:06:44 -04:00
expect ( page ) . to have_content 'successfully updated'
2016-10-14 07:51:59 -04:00
expect ( find ( '#group_name' ) . value ) . to eq ( new_name )
2017-08-18 07:07:10 -04:00
page . within " .breadcrumbs " do
2016-10-14 07:51:59 -04:00
expect ( page ) . to have_content new_name
end
2016-10-14 03:06:44 -04:00
end
2018-07-06 10:14:31 -04:00
it 'focuses confirmation field on remove group' do
click_button ( 'Remove group' )
expect ( page ) . to have_selector '#confirm_name_input:focus'
end
2019-10-23 05:06:03 -04:00
it 'removes group' , :sidekiq_might_not_need_inline do
2017-07-04 11:18:51 -04:00
expect { remove_with_confirm ( 'Remove group' , group . path ) } . to change { Group . count } . by ( - 1 )
expect ( group . members . all . count ) . to be_zero
2016-10-14 03:06:44 -04:00
expect ( page ) . to have_content " scheduled for deletion "
end
end
2016-10-14 07:51:59 -04:00
describe 'group page with markdown description' do
2020-12-04 01:09:34 -05:00
let_it_be ( :group ) { create ( :group ) }
2021-04-06 05:09:03 -04:00
2020-12-04 01:09:34 -05:00
let ( :path ) { group_path ( group ) }
2015-05-29 19:02:11 -04:00
2020-11-23 10:09:37 -05:00
before do
group . add_owner ( user )
end
2015-05-29 19:02:11 -04:00
it 'parses Markdown' do
group . update_attribute ( :description , 'This is **my** group' )
2016-10-14 07:51:59 -04:00
2015-05-29 19:02:11 -04:00
visit path
2016-10-14 07:51:59 -04:00
2019-01-21 15:52:53 -05:00
expect ( page ) . to have_css ( '.home-panel-description-markdown > p > strong' )
2015-05-29 19:02:11 -04:00
end
it 'passes through html-pipeline' do
group . update_attribute ( :description , 'This group is the :poop:' )
2016-10-14 07:51:59 -04:00
2015-05-29 19:02:11 -04:00
visit path
2016-10-14 07:51:59 -04:00
2019-01-21 15:52:53 -05:00
expect ( page ) . to have_css ( '.home-panel-description-markdown > p > gl-emoji' )
2015-05-29 19:02:11 -04:00
end
it 'sanitizes unwanted tags' do
group . update_attribute ( :description , '# Group Description' )
2016-10-14 07:51:59 -04:00
2015-05-29 19:02:11 -04:00
visit path
2016-10-14 07:51:59 -04:00
2019-01-21 15:52:53 -05:00
expect ( page ) . not_to have_css ( '.home-panel-description-markdown h1' )
2015-05-29 19:02:11 -04:00
end
it 'permits `rel` attribute on links' do
group . update_attribute ( :description , 'https://google.com/' )
2016-10-14 07:51:59 -04:00
2015-05-29 19:02:11 -04:00
visit path
2016-10-14 07:51:59 -04:00
2019-01-21 15:52:53 -05:00
expect ( page ) . to have_css ( '.home-panel-description-markdown a[rel]' )
2015-05-29 19:02:11 -04:00
end
end
2016-12-26 05:51:48 -05:00
2019-07-24 05:20:54 -04:00
describe 'group page with nested groups' , :js do
2020-12-04 01:09:34 -05:00
let_it_be ( :group ) { create ( :group ) }
let_it_be ( :nested_group ) { create ( :group , parent : group ) }
let_it_be ( :project ) { create ( :project , namespace : group ) }
2016-12-26 05:51:48 -05:00
2020-11-23 10:09:37 -05:00
before do
group . add_owner ( user )
end
2019-04-05 04:43:27 -04:00
it 'renders projects and groups on the page' do
2019-10-29 20:07:52 -04:00
visit group_path ( group )
2017-10-05 07:13:24 -04:00
wait_for_requests
2016-12-26 05:51:48 -05:00
2017-01-24 10:32:34 -05:00
expect ( page ) . to have_content ( nested_group . name )
2017-10-05 07:13:24 -04:00
expect ( page ) . to have_content ( project . name )
2021-05-05 11:10:05 -04:00
expect ( page ) . to have_link ( 'Group information' )
2019-10-29 20:07:52 -04:00
end
2021-05-05 11:10:05 -04:00
it 'renders subgroup page with the text "Subgroup information"' do
2019-10-29 20:07:52 -04:00
visit group_path ( nested_group )
wait_for_requests
2021-05-05 11:10:05 -04:00
expect ( page ) . to have_link ( 'Subgroup information' )
2019-10-29 20:07:52 -04:00
end
2021-05-07 14:10:21 -04:00
it 'renders project page with the text "Project information"' do
2019-10-29 20:07:52 -04:00
visit project_path ( project )
wait_for_requests
2021-05-07 14:10:21 -04:00
expect ( page ) . to have_link ( 'Project information' )
2016-12-26 05:51:48 -05:00
end
end
2017-07-04 11:18:51 -04:00
2020-04-28 05:09:34 -04:00
describe 'new subgroup / project button' do
2020-12-04 01:09:34 -05:00
let_it_be ( :group , reload : true ) do
create ( :group ,
project_creation_level : Gitlab :: Access :: NO_ONE_PROJECT_ACCESS ,
subgroup_creation_level : Gitlab :: Access :: OWNER_SUBGROUP_ACCESS )
end
2020-04-28 05:09:34 -04:00
2020-11-23 10:09:37 -05:00
before do
group . add_owner ( user )
end
2020-11-12 10:09:09 -05:00
context 'when user has subgroup creation permissions but not project creation permissions' do
it 'only displays "New subgroup" button' do
visit group_path ( group )
2020-04-28 05:09:34 -04:00
2020-11-12 10:09:09 -05:00
page . within '[data-testid="group-buttons"]' do
expect ( page ) . to have_link ( 'New subgroup' )
expect ( page ) . not_to have_link ( 'New project' )
end
2020-04-28 05:09:34 -04:00
end
end
2020-11-12 10:09:09 -05:00
context 'when user has project creation permissions but not subgroup creation permissions' do
it 'only displays "New project" button' do
group . update! ( project_creation_level : Gitlab :: Access :: MAINTAINER_PROJECT_ACCESS )
user = create ( :user )
2020-04-28 05:09:34 -04:00
2020-11-12 10:09:09 -05:00
group . add_maintainer ( user )
sign_out ( :user )
sign_in ( user )
visit group_path ( group )
page . within '[data-testid="group-buttons"]' do
expect ( page ) . to have_link ( 'New project' )
expect ( page ) . not_to have_link ( 'New subgroup' )
end
2020-04-28 05:09:34 -04:00
end
end
2020-11-12 10:09:09 -05:00
context 'when user has project and subgroup creation permissions' do
it 'displays "New subgroup" and "New project" buttons' do
group . update! ( project_creation_level : Gitlab :: Access :: MAINTAINER_PROJECT_ACCESS )
2020-12-04 01:09:34 -05:00
2020-11-12 10:09:09 -05:00
visit group_path ( group )
2020-04-28 05:09:34 -04:00
2020-11-12 10:09:09 -05:00
page . within '[data-testid="group-buttons"]' do
expect ( page ) . to have_link ( 'New subgroup' )
expect ( page ) . to have_link ( 'New project' )
end
2020-04-28 05:09:34 -04:00
end
end
end
2017-07-04 11:18:51 -04:00
def remove_with_confirm ( button_text , confirm_with )
click_button button_text
fill_in 'confirm_name_input' , with : confirm_with
click_button 'Confirm'
end
2015-05-29 19:02:11 -04:00
end