2019-10-12 21:52:04 +05:30
# frozen_string_literal: true
2015-09-11 14:41:01 +05:30
require 'spec_helper'
2020-06-23 00:09:42 +05:30
RSpec . describe 'Group' do
2021-06-08 01:23:25 +05:30
let ( :user ) { create ( :user ) }
2018-12-13 13:39:08 +05:30
2016-08-24 12:49:21 +05:30
before do
2018-12-13 13:39:08 +05:30
sign_in ( user )
2016-08-24 12:49:21 +05:30
end
2016-11-03 12:29:30 +05:30
matcher :have_namespace_error_message do
match do | page |
2018-12-13 13:39:08 +05:30
page . has_content? ( " Group URL can contain only letters, digits, '_', '-' and '.'. Cannot start with '-' or end in '.', '.git' or '.atom'. " )
2016-11-03 12:29:30 +05:30
end
end
2021-09-04 01:27:46 +05:30
describe 'create a group' , :js do
2017-09-10 17:25:29 +05:30
before do
visit new_group_path
2021-09-04 01:27:46 +05:30
click_link 'Create group'
2017-09-10 17:25:29 +05:30
end
2016-11-03 12:29:30 +05:30
2018-12-13 13:39:08 +05:30
describe 'as a non-admin' do
2022-08-13 15:12:31 +05:30
it 'creates a group and persists visibility radio selection' , :js do
2018-12-13 13:39:08 +05:30
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 )
2022-05-07 20:08:51 +05:30
expect ( page ) . to have_current_path ( group_path ( group ) , ignore_query : true )
2020-10-24 23:57:45 +05:30
expect ( page ) . to have_selector '.visibility-icon [data-testid="earth-icon"]'
2018-12-13 13:39:08 +05:30
end
end
2021-02-22 17:27:13 +05:30
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-11-03 12:29:30 +05:30
describe 'with space in group path' do
it 'renders new group form with validation errors' do
2018-12-13 13:39:08 +05:30
fill_in 'Group URL' , with : 'space group'
2016-11-03 12:29:30 +05:30
click_button 'Create group'
2022-05-07 20:08:51 +05:30
expect ( page ) . to have_current_path ( new_group_path , ignore_query : true )
2022-04-04 11:22:00 +05:30
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-11-03 12:29:30 +05:30
end
end
describe 'with .atom at end of group path' do
it 'renders new group form with validation errors' do
2021-09-04 01:27:46 +05:30
fill_in 'Group name' , with : 'test-group'
2018-12-13 13:39:08 +05:30
fill_in 'Group URL' , with : 'atom_group.atom'
2016-11-03 12:29:30 +05:30
click_button 'Create group'
2022-05-07 20:08:51 +05:30
expect ( page ) . to have_current_path ( groups_path , ignore_query : true )
2016-11-03 12:29:30 +05:30
expect ( page ) . to have_namespace_error_message
end
end
describe 'with .git at end of group path' do
it 'renders new group form with validation errors' do
2021-09-04 01:27:46 +05:30
fill_in 'Group name' , with : 'test-group'
2018-12-13 13:39:08 +05:30
fill_in 'Group URL' , with : 'git_group.git'
2016-11-03 12:29:30 +05:30
click_button 'Create group'
2022-05-07 20:08:51 +05:30
expect ( page ) . to have_current_path ( groups_path , ignore_query : true )
2016-11-03 12:29:30 +05:30
expect ( page ) . to have_namespace_error_message
end
end
2017-08-17 22:00:37 +05:30
2020-07-28 23:09:34 +05:30
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-04-04 11:22:00 +05:30
expect ( page ) . to have_content ( " Group path is unavailable. Path has been replaced with a suggested available path. " )
2020-07-28 23:09:34 +05:30
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
2022-07-16 23:28:13 +05:30
context 'when filling in the `Group name` field' do
let_it_be ( :group1 ) { create ( :group , :public , path : 'foo-bar' ) }
let_it_be ( :group2 ) { create ( :group , :public , path : 'bar-baz' ) }
it 'automatically populates the `Group URL` field' do
fill_in 'Group name' , with : 'Foo bar'
# Wait for debounce in app/assets/javascripts/group.js#18
sleep ( 1 )
fill_in 'Group name' , with : 'Bar baz'
# Wait for debounce in app/assets/javascripts/group.js#18
sleep ( 1 )
wait_for_requests
expect ( page ) . to have_field ( 'Group URL' , with : 'bar-baz1' )
end
end
2020-07-28 23:09:34 +05:30
end
2017-08-17 22:00:37 +05:30
describe 'Mattermost team creation' do
before do
2022-07-23 23:45:48 +05:30
stub_mattermost_setting ( enabled : mattermost_enabled , host : 'https://mattermost.test' )
2017-08-17 22:00:37 +05:30
visit new_group_path
2021-09-04 01:27:46 +05:30
click_link 'Create group'
2017-08-17 22:00:37 +05:30
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-03-13 15:44:24 +05:30
it 'unchecks the checkbox by default' do
2021-09-04 01:27:46 +05:30
expect ( find ( '#group_create_chat_team' ) ) . not_to be_checked
2017-08-17 22:00:37 +05:30
end
it 'updates the team URL on graph path update' , :js do
2022-07-23 23:45:48 +05:30
label = find ( '#group_create_chat_team ~ label[for=group_create_chat_team]' )
url = 'https://mattermost.test/test-group'
2017-08-17 22:00:37 +05:30
2022-07-23 23:45:48 +05:30
expect ( label . text ) . not_to match ( url )
2017-08-17 22:00:37 +05:30
fill_in ( 'group_path' , with : 'test-group' )
2022-07-23 23:45:48 +05:30
expect ( label . text ) . to match ( url )
2017-08-17 22:00:37 +05:30
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-04-29 21:17:54 +05:30
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-09-04 01:27:46 +05:30
click_link 'Create group'
2021-04-29 21:17:54 +05:30
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-09-04 01:27:46 +05:30
click_link 'Create group'
2021-04-29 21:17:54 +05:30
end
it 'does not render recaptcha' do
expect ( page ) . not_to have_css ( '.recaptcha' )
end
end
2022-03-02 08:16:31 +05:30
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
2017-08-17 22:00:37 +05:30
end
2021-09-04 01:27:46 +05:30
describe 'create a nested group' , :js do
2021-02-22 17:27:13 +05:30
let_it_be ( :group ) { create ( :group , path : 'foo' ) }
2017-08-17 22:00:37 +05:30
context 'as admin' do
2021-02-22 17:27:13 +05:30
let ( :user ) { create ( :admin ) }
2017-08-17 22:00:37 +05:30
before do
2022-08-27 11:52:29 +05:30
visit new_group_path ( parent_id : group . id , anchor : 'create-group-pane' )
2017-08-17 22:00:37 +05:30
end
2021-04-17 20:07:23 +05:30
context 'when admin mode is enabled' , :enable_admin_mode do
it 'creates a nested group' do
2022-08-27 11:52:29 +05:30
fill_in 'Subgroup name' , with : 'bar'
click_button 'Create subgroup'
2021-04-17 20:07:23 +05:30
2022-05-07 20:08:51 +05:30
expect ( page ) . to have_current_path ( group_path ( 'foo/bar' ) , ignore_query : true )
2021-09-04 01:27:46 +05:30
expect ( page ) . to have_selector 'h1' , text : 'bar'
2021-04-17 20:07:23 +05:30
end
end
2017-08-17 22:00:37 +05:30
2021-04-17 20:07:23 +05:30
context 'when admin mode is disabled' do
it 'is not allowed' do
2022-08-27 11:52:29 +05:30
expect ( page ) . not_to have_button ( 'Create subgroup' )
2021-04-17 20:07:23 +05:30
end
2017-08-17 22:00:37 +05:30
end
end
context 'as group owner' do
2018-03-17 18:26:18 +05:30
it 'creates a nested group' do
user = create ( :user )
2017-08-17 22:00:37 +05:30
group . add_owner ( user )
2017-09-10 17:25:29 +05:30
sign_out ( :user )
sign_in ( user )
2017-08-17 22:00:37 +05:30
2022-08-27 11:52:29 +05:30
visit new_group_path ( parent_id : group . id , anchor : 'create-group-pane' )
2017-08-17 22:00:37 +05:30
2022-08-27 11:52:29 +05:30
fill_in 'Subgroup name' , with : 'bar'
click_button 'Create subgroup'
2017-08-17 22:00:37 +05:30
2022-05-07 20:08:51 +05:30
expect ( page ) . to have_current_path ( group_path ( 'foo/bar' ) , ignore_query : true )
2021-09-04 01:27:46 +05:30
expect ( page ) . to have_selector 'h1' , text : 'bar'
2017-08-17 22:00:37 +05:30
end
end
2021-04-29 21:17:54 +05:30
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
2022-08-27 11:52:29 +05:30
let ( :path ) { new_group_path ( parent_id : group . id , anchor : 'create-group-pane' ) }
2021-04-29 21:17:54 +05:30
it 'does not render recaptcha' do
visit path
expect ( page ) . not_to have_css ( '.recaptcha' )
end
end
end
2022-08-27 11:52:29 +05:30
context 'when many parent groups are available' do
let_it_be ( :group2 ) { create ( :group , path : 'foo2' ) }
let_it_be ( :group3 ) { create ( :group , path : 'foo3' ) }
before do
group . add_owner ( user )
group2 . add_maintainer ( user )
group3 . add_developer ( user )
visit new_group_path ( parent_id : group . id , anchor : 'create-group-pane' )
end
it 'creates private subgroup' do
fill_in 'Subgroup name' , with : 'bar'
click_button 'foo'
expect ( page ) . to have_css ( '[data-testid="select_group_dropdown_item"]' , text : 'foo2' )
expect ( page ) . not_to have_css ( '[data-testid="select_group_dropdown_item"]' , text : 'foo3' )
click_button 'foo2'
click_button 'Create subgroup'
expect ( page ) . to have_current_path ( group_path ( 'foo2/bar' ) , ignore_query : true )
expect ( page ) . to have_selector ( 'h1' , text : 'bar' )
expect ( page ) . to have_selector ( '.visibility-icon [data-testid="lock-icon"]' )
end
end
2021-04-29 21:17:54 +05:30
describe 'real-time group url validation' , :js do
let_it_be ( :subgroup ) { create ( :group , path : 'sub' , parent : group ) }
before do
group . add_owner ( user )
2022-08-27 11:52:29 +05:30
visit new_group_path ( parent_id : group . id , anchor : 'create-group-pane' )
2021-04-29 21:17:54 +05:30
end
it 'shows a message if group url is available' do
2022-08-27 11:52:29 +05:30
fill_in 'Subgroup slug' , with : group . path
2021-04-29 21:17:54 +05:30
wait_for_requests
expect ( page ) . to have_content ( 'Group path is available' )
end
it 'shows an error if group url is taken' do
2022-08-27 11:52:29 +05:30
fill_in 'Subgroup slug' , with : subgroup . path
2021-04-29 21:17:54 +05:30
wait_for_requests
2022-04-04 11:22:00 +05:30
expect ( page ) . to have_content ( " Group path is unavailable. Path has been replaced with a suggested available path. " )
2021-04-29 21:17:54 +05:30
end
end
2017-08-17 22:00:37 +05:30
end
2021-09-04 01:27:46 +05:30
it 'checks permissions to avoid exposing groups by parent_id' , :js do
2017-08-17 22:00:37 +05:30
group = create ( :group , :private , path : 'secret-group' )
2017-09-10 17:25:29 +05:30
sign_out ( :user )
sign_in ( create ( :user ) )
2022-08-27 11:52:29 +05:30
visit new_group_path ( parent_id : group . id , anchor : 'create-group-pane' )
2017-08-17 22:00:37 +05:30
2021-09-04 01:27:46 +05:30
expect ( page ) . to have_title ( 'Not Found' )
expect ( page ) . to have_content ( 'Page Not Found' )
2016-11-03 12:29:30 +05:30
end
2018-03-17 18:26:18 +05:30
describe 'group edit' , :js do
2021-02-22 17:27:13 +05:30
let_it_be ( :group ) { create ( :group , :public ) }
2021-04-29 21:17:54 +05:30
2021-02-22 17:27:13 +05:30
let ( :path ) { edit_group_path ( group ) }
2016-11-03 12:29:30 +05:30
let ( :new_name ) { 'new-name' }
2017-09-10 17:25:29 +05:30
before do
2021-02-22 17:27:13 +05:30
group . add_owner ( user )
2017-09-10 17:25:29 +05:30
visit path
end
2016-08-24 12:49:21 +05:30
2018-12-13 13:39:08 +05:30
it_behaves_like 'dirty submit form' , [ { form : '.js-general-settings-form' , input : 'input[name="group[name]"]' } ,
2019-03-02 22:35:43 +05:30
{ form : '.js-general-settings-form' , input : '#group_visibility_level_0' } ,
{ form : '.js-general-permissions-form' , input : '#group_request_access_enabled' } ,
2018-12-13 13:39:08 +05:30
{ form : '.js-general-permissions-form' , input : 'input[name="group[two_factor_grace_period]"]' } ]
2016-11-03 12:29:30 +05:30
it 'saves new settings' do
2018-11-08 19:23:39 +05:30
page . within ( '.gs-general' ) do
2021-02-22 17:27:13 +05:30
# Have to reset it to '' so it overwrites rather than appends
fill_in ( 'group_name' , with : '' )
2018-11-08 19:23:39 +05:30
fill_in 'group_name' , with : new_name
2018-12-13 13:39:08 +05:30
click_button 'Save changes'
2018-11-08 19:23:39 +05:30
end
2016-08-24 12:49:21 +05:30
2016-11-03 12:29:30 +05:30
expect ( page ) . to have_content 'successfully updated'
expect ( find ( '#group_name' ) . value ) . to eq ( new_name )
2018-03-17 18:26:18 +05:30
page . within " .breadcrumbs " do
2016-11-03 12:29:30 +05:30
expect ( page ) . to have_content new_name
end
end
2018-11-18 11:00:15 +05:30
it 'focuses confirmation field on remove group' do
click_button ( 'Remove group' )
expect ( page ) . to have_selector '#confirm_name_input:focus'
end
2019-12-26 22:10:19 +05:30
it 'removes group' , :sidekiq_might_not_need_inline do
2022-08-27 11:52:29 +05:30
expect { remove_with_confirm ( 'Remove group' , group . path ) } . to change { Group . count } . by ( - 1 )
2017-09-10 17:25:29 +05:30
expect ( group . members . all . count ) . to be_zero
2016-11-03 12:29:30 +05:30
expect ( page ) . to have_content " scheduled for deletion "
2016-08-24 12:49:21 +05:30
end
end
2016-11-03 12:29:30 +05:30
describe 'group page with markdown description' do
2021-02-22 17:27:13 +05:30
let_it_be ( :group ) { create ( :group ) }
2021-04-29 21:17:54 +05:30
2021-02-22 17:27:13 +05:30
let ( :path ) { group_path ( group ) }
before do
group . add_owner ( user )
end
2015-09-11 14:41:01 +05:30
it 'parses Markdown' do
group . update_attribute ( :description , 'This is **my** group' )
2016-11-03 12:29:30 +05:30
2015-09-11 14:41:01 +05:30
visit path
2016-11-03 12:29:30 +05:30
2019-03-02 22:35:43 +05:30
expect ( page ) . to have_css ( '.home-panel-description-markdown > p > strong' )
2015-09-11 14:41:01 +05:30
end
it 'passes through html-pipeline' do
group . update_attribute ( :description , 'This group is the :poop:' )
2016-11-03 12:29:30 +05:30
2015-09-11 14:41:01 +05:30
visit path
2016-11-03 12:29:30 +05:30
2019-03-02 22:35:43 +05:30
expect ( page ) . to have_css ( '.home-panel-description-markdown > p > gl-emoji' )
2015-09-11 14:41:01 +05:30
end
it 'sanitizes unwanted tags' do
group . update_attribute ( :description , '# Group Description' )
2016-11-03 12:29:30 +05:30
2015-09-11 14:41:01 +05:30
visit path
2016-11-03 12:29:30 +05:30
2019-03-02 22:35:43 +05:30
expect ( page ) . not_to have_css ( '.home-panel-description-markdown h1' )
2015-09-11 14:41:01 +05:30
end
it 'permits `rel` attribute on links' do
group . update_attribute ( :description , 'https://google.com/' )
2016-11-03 12:29:30 +05:30
2015-09-11 14:41:01 +05:30
visit path
2016-11-03 12:29:30 +05:30
2019-03-02 22:35:43 +05:30
expect ( page ) . to have_css ( '.home-panel-description-markdown a[rel]' )
2017-08-17 22:00:37 +05:30
end
end
2019-10-12 21:52:04 +05:30
describe 'group page with nested groups' , :js do
2021-02-22 17:27:13 +05:30
let_it_be ( :group ) { create ( :group ) }
let_it_be ( :nested_group ) { create ( :group , parent : group ) }
let_it_be ( :project ) { create ( :project , namespace : group ) }
before do
group . add_owner ( user )
end
2017-08-17 22:00:37 +05:30
2019-07-07 11:18:12 +05:30
it 'renders projects and groups on the page' do
2019-12-26 22:10:19 +05:30
visit group_path ( group )
2018-03-17 18:26:18 +05:30
wait_for_requests
2017-08-17 22:00:37 +05:30
expect ( page ) . to have_content ( nested_group . name )
2018-03-17 18:26:18 +05:30
expect ( page ) . to have_content ( project . name )
2021-06-08 01:23:25 +05:30
expect ( page ) . to have_link ( 'Group information' )
2019-12-26 22:10:19 +05:30
end
2021-06-08 01:23:25 +05:30
it 'renders subgroup page with the text "Subgroup information"' do
2019-12-26 22:10:19 +05:30
visit group_path ( nested_group )
wait_for_requests
2021-06-08 01:23:25 +05:30
expect ( page ) . to have_link ( 'Subgroup information' )
2019-12-26 22:10:19 +05:30
end
2021-06-08 01:23:25 +05:30
it 'renders project page with the text "Project information"' do
2019-12-26 22:10:19 +05:30
visit project_path ( project )
wait_for_requests
2021-06-08 01:23:25 +05:30
expect ( page ) . to have_link ( 'Project information' )
2015-09-11 14:41:01 +05:30
end
end
2017-09-10 17:25:29 +05:30
2020-05-24 23:13:21 +05:30
describe 'new subgroup / project button' do
2021-02-22 17:27:13 +05:30
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
before do
group . add_owner ( user )
end
2020-05-24 23:13:21 +05:30
2021-01-29 00:20:46 +05:30
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-05-24 23:13:21 +05:30
2021-01-29 00:20:46 +05:30
page . within '[data-testid="group-buttons"]' do
expect ( page ) . to have_link ( 'New subgroup' )
expect ( page ) . not_to have_link ( 'New project' )
end
2020-05-24 23:13:21 +05:30
end
end
2021-01-29 00:20:46 +05:30
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-05-24 23:13:21 +05:30
2021-01-29 00:20:46 +05:30
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-05-24 23:13:21 +05:30
end
end
2021-01-29 00:20:46 +05:30
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 )
2021-02-22 17:27:13 +05:30
2021-01-29 00:20:46 +05:30
visit group_path ( group )
2020-05-24 23:13:21 +05:30
2021-01-29 00:20:46 +05:30
page . within '[data-testid="group-buttons"]' do
expect ( page ) . to have_link ( 'New subgroup' )
expect ( page ) . to have_link ( 'New project' )
end
2020-05-24 23:13:21 +05:30
end
end
end
2017-09-10 17:25:29 +05:30
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-09-11 14:41:01 +05:30
end