diff options
Diffstat (limited to 'spec/features/projects/fork_spec.rb')
-rw-r--r-- | spec/features/projects/fork_spec.rb | 270 |
1 files changed, 143 insertions, 127 deletions
diff --git a/spec/features/projects/fork_spec.rb b/spec/features/projects/fork_spec.rb index 8d0500f5e13..7abbd207b24 100644 --- a/spec/features/projects/fork_spec.rb +++ b/spec/features/projects/fork_spec.rb @@ -12,45 +12,27 @@ RSpec.describe 'Project fork' do sign_in(user) end - it 'allows user to fork project from the project page' do - visit project_path(project) - - expect(page).not_to have_css('a.disabled', text: 'Fork') - end - - context 'user has exceeded personal project limit' do - before do - user.update!(projects_limit: 0) - end - - it 'disables fork button on project page' do + shared_examples 'fork button on project page' do + it 'allows user to fork project from the project page' do visit project_path(project) - expect(page).to have_css('a.disabled', text: 'Fork') + expect(page).not_to have_css('a.disabled', text: 'Fork') end - context 'with a group to fork to' do - let!(:group) { create(:group).tap { |group| group.add_owner(user) } } - - it 'enables fork button on project page' do - visit project_path(project) - - expect(page).not_to have_css('a.disabled', text: 'Fork') + context 'user has exceeded personal project limit' do + before do + user.update!(projects_limit: 0) end - it 'allows user to fork only to the group on fork page', :js do - visit new_project_fork_path(project) - - to_personal_namespace = find('[data-qa-selector=fork_namespace_button].disabled') - to_group = find(".fork-groups button[data-qa-name=#{group.name}]") + it 'disables fork button on project page' do + visit project_path(project) - expect(to_personal_namespace).not_to be_nil - expect(to_group).not_to be_disabled + expect(page).to have_css('a.disabled', text: 'Fork') end end end - context 'forking enabled / disabled in project settings' do + shared_examples 'create fork page' do |fork_page_text| before do project.project_feature.update_attribute( :forking_access_level, forking_access_level) @@ -70,7 +52,7 @@ RSpec.describe 'Project fork' do visit new_project_fork_path(project) expect(page.status_code).to eq(200) - expect(page).to have_text(' Select a namespace to fork the project ') + expect(page).to have_text(fork_page_text) end end @@ -127,92 +109,88 @@ RSpec.describe 'Project fork' do visit new_project_fork_path(project) expect(page.status_code).to eq(200) - expect(page).to have_text(' Select a namespace to fork the project ') + expect(page).to have_text(fork_page_text) end end end end - it 'forks the project', :sidekiq_might_not_need_inline do - visit project_path(project) - - click_link 'Fork' + it_behaves_like 'fork button on project page' + it_behaves_like 'create fork page', 'Fork project' - page.within '.fork-thumbnail-container' do - click_link 'Select' + context 'with fork_project_form feature flag disabled' do + before do + stub_feature_flags(fork_project_form: false) + sign_in(user) end - expect(page).to have_content 'Forked from' + it_behaves_like 'fork button on project page' - visit project_path(project) + context 'user has exceeded personal project limit' do + before do + user.update!(projects_limit: 0) + end - expect(page).to have_content(/new merge request/i) + context 'with a group to fork to' do + let!(:group) { create(:group).tap { |group| group.add_owner(user) } } - page.within '.nav-sidebar' do - first(:link, 'Merge Requests').click - end + it 'allows user to fork only to the group on fork page', :js do + visit new_project_fork_path(project) - expect(page).to have_content(/new merge request/i) + to_personal_namespace = find('[data-qa-selector=fork_namespace_button].disabled') + to_group = find(".fork-groups button[data-qa-name=#{group.name}]") - page.within '#content-body' do - click_link('New merge request') + expect(to_personal_namespace).not_to be_nil + expect(to_group).not_to be_disabled + end + end end - expect(current_path).to have_content(/#{user.namespace.path}/i) - end + it_behaves_like 'create fork page', ' Select a namespace to fork the project ' - it 'shows avatars when Gravatar is disabled' do - stub_application_setting(gravatar_enabled: false) + it 'forks the project', :sidekiq_might_not_need_inline do + visit project_path(project) - visit project_path(project) + click_link 'Fork' - click_link 'Fork' + page.within '.fork-thumbnail-container' do + click_link 'Select' + end - page.within('.fork-thumbnail-container') do - expect(page).to have_css('div.identicon') - end - end + expect(page).to have_content 'Forked from' - it 'shows the forked project on the list' do - visit project_path(project) + visit project_path(project) - click_link 'Fork' + expect(page).to have_content(/new merge request/i) - page.within '.fork-thumbnail-container' do - click_link 'Select' - end + page.within '.nav-sidebar' do + first(:link, 'Merge Requests').click + end - visit project_forks_path(project) + expect(page).to have_content(/new merge request/i) - forked_project = user.fork_of(project.reload) + page.within '#content-body' do + click_link('New merge request') + end - page.within('.js-projects-list-holder') do - expect(page).to have_content("#{forked_project.namespace.human_name} / #{forked_project.name}") + expect(current_path).to have_content(/#{user.namespace.path}/i) end - forked_project.update!(path: 'test-crappy-path') - - visit project_forks_path(project) + it 'shows avatars when Gravatar is disabled' do + stub_application_setting(gravatar_enabled: false) - page.within('.js-projects-list-holder') do - expect(page).to have_content("#{forked_project.namespace.human_name} / #{forked_project.name}") - end - end + visit project_path(project) - context 'when the project is private' do - let(:project) { create(:project, :repository) } - let(:another_user) { create(:user, name: 'Mike') } + click_link 'Fork' - before do - project.add_reporter(user) - project.add_reporter(another_user) + page.within('.fork-thumbnail-container') do + expect(page).to have_css('div.identicon') + end end - it 'renders private forks of the project' do + it 'shows the forked project on the list' do visit project_path(project) - another_project_fork = Projects::ForkService.new(project, another_user).execute - click_link 'Fork' page.within '.fork-thumbnail-container' do @@ -221,79 +199,117 @@ RSpec.describe 'Project fork' do visit project_forks_path(project) + forked_project = user.fork_of(project.reload) + page.within('.js-projects-list-holder') do - user_project_fork = user.fork_of(project.reload) - expect(page).to have_content("#{user_project_fork.namespace.human_name} / #{user_project_fork.name}") + expect(page).to have_content("#{forked_project.namespace.human_name} / #{forked_project.name}") end - expect(page).not_to have_content("#{another_project_fork.namespace.human_name} / #{another_project_fork.name}") - end - end + forked_project.update!(path: 'test-crappy-path') - context 'when the user already forked the project' do - before do - create(:project, :repository, name: project.name, namespace: user.namespace) - end + visit project_forks_path(project) - it 'renders error' do - visit project_path(project) + page.within('.js-projects-list-holder') do + expect(page).to have_content("#{forked_project.namespace.human_name} / #{forked_project.name}") + end + end - click_link 'Fork' + context 'when the project is private' do + let(:project) { create(:project, :repository) } + let(:another_user) { create(:user, name: 'Mike') } - page.within '.fork-thumbnail-container' do - click_link 'Select' + before do + project.add_reporter(user) + project.add_reporter(another_user) end - expect(page).to have_content "Name has already been taken" - end - end + it 'renders private forks of the project' do + visit project_path(project) - context 'maintainer in group' do - let(:group) { create(:group) } + another_project_fork = Projects::ForkService.new(project, another_user).execute - before do - group.add_maintainer(user) - end + click_link 'Fork' - it 'allows user to fork project to group or to user namespace', :js do - visit project_path(project) - wait_for_requests + page.within '.fork-thumbnail-container' do + click_link 'Select' + end - expect(page).not_to have_css('a.disabled', text: 'Fork') + visit project_forks_path(project) - click_link 'Fork' + page.within('.js-projects-list-holder') do + user_project_fork = user.fork_of(project.reload) + expect(page).to have_content("#{user_project_fork.namespace.human_name} / #{user_project_fork.name}") + end - expect(page).to have_css('.fork-thumbnail') - expect(page).to have_css('.group-row') - expect(page).not_to have_css('.fork-thumbnail.disabled') + expect(page).not_to have_content("#{another_project_fork.namespace.human_name} / #{another_project_fork.name}") + end end - it 'allows user to fork project to group and not user when exceeded project limit', :js do - user.projects_limit = 0 - user.save! + context 'when the user already forked the project' do + before do + create(:project, :repository, name: project.name, namespace: user.namespace) + end - visit project_path(project) - wait_for_requests + it 'renders error' do + visit project_path(project) - expect(page).not_to have_css('a.disabled', text: 'Fork') + click_link 'Fork' - click_link 'Fork' + page.within '.fork-thumbnail-container' do + click_link 'Select' + end - expect(page).to have_css('.fork-thumbnail.disabled') - expect(page).to have_css('.group-row') + expect(page).to have_content "Name has already been taken" + end end - it 'links to the fork if the project was already forked within that namespace', :sidekiq_might_not_need_inline, :js do - forked_project = fork_project(project, user, namespace: group, repository: true) + context 'maintainer in group' do + let(:group) { create(:group) } + + before do + group.add_maintainer(user) + end + + it 'allows user to fork project to group or to user namespace', :js do + visit project_path(project) + wait_for_requests + + expect(page).not_to have_css('a.disabled', text: 'Fork') + + click_link 'Fork' + + expect(page).to have_css('.fork-thumbnail') + expect(page).to have_css('.group-row') + expect(page).not_to have_css('.fork-thumbnail.disabled') + end + + it 'allows user to fork project to group and not user when exceeded project limit', :js do + user.projects_limit = 0 + user.save! + + visit project_path(project) + wait_for_requests + + expect(page).not_to have_css('a.disabled', text: 'Fork') - visit new_project_fork_path(project) - wait_for_requests + click_link 'Fork' - expect(page).to have_css('.group-row a.btn', text: 'Go to fork') + expect(page).to have_css('.fork-thumbnail.disabled') + expect(page).to have_css('.group-row') + end + + it 'links to the fork if the project was already forked within that namespace', :sidekiq_might_not_need_inline, :js do + forked_project = fork_project(project, user, namespace: group, repository: true) + + visit new_project_fork_path(project) + wait_for_requests + + expect(page).to have_css('.group-row a.btn', text: 'Go to fork') - click_link 'Go to fork' + click_link 'Go to fork' - expect(current_path).to eq(project_path(forked_project)) + expect(current_path).to eq(project_path(forked_project)) + end end end end |