Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/features')
-rw-r--r--spec/features/admin/admin_broadcast_messages_spec.rb1
-rw-r--r--spec/features/admin/admin_groups_spec.rb25
-rw-r--r--spec/features/admin/admin_runners_spec.rb64
-rw-r--r--spec/features/admin/admin_settings_spec.rb44
-rw-r--r--spec/features/admin/admin_users_impersonation_tokens_spec.rb14
-rw-r--r--spec/features/admin/users/users_spec.rb8
-rw-r--r--spec/features/boards/boards_spec.rb1
-rw-r--r--spec/features/dashboard/datetime_on_tooltips_spec.rb4
-rw-r--r--spec/features/dashboard/issues_filter_spec.rb2
-rw-r--r--spec/features/dashboard/projects_spec.rb3
-rw-r--r--spec/features/dashboard/user_filters_projects_spec.rb7
-rw-r--r--spec/features/discussion_comments/issue_spec.rb1
-rw-r--r--spec/features/discussion_comments/merge_request_spec.rb1
-rw-r--r--spec/features/expand_collapse_diffs_spec.rb5
-rw-r--r--spec/features/global_search_spec.rb1
-rw-r--r--spec/features/groups/empty_states_spec.rb4
-rw-r--r--spec/features/groups/group_runners_spec.rb46
-rw-r--r--spec/features/groups/labels/sort_labels_spec.rb4
-rw-r--r--spec/features/groups/merge_requests_spec.rb10
-rw-r--r--spec/features/groups/milestones_sorting_spec.rb4
-rw-r--r--spec/features/groups/new_group_page_spec.rb32
-rw-r--r--spec/features/groups/settings/repository_spec.rb34
-rw-r--r--spec/features/help_dropdown_spec.rb4
-rw-r--r--spec/features/ide/user_commits_changes_spec.rb35
-rw-r--r--spec/features/incidents/incident_timeline_events_spec.rb1
-rw-r--r--spec/features/issuables/markdown_references/jira_spec.rb6
-rw-r--r--spec/features/issues/incident_issue_spec.rb28
-rw-r--r--spec/features/issues/related_issues_spec.rb116
-rw-r--r--spec/features/issues/resource_label_events_spec.rb9
-rw-r--r--spec/features/issues/service_desk_spec.rb1
-rw-r--r--spec/features/issues/user_interacts_with_awards_spec.rb2
-rw-r--r--spec/features/issues/user_scrolls_to_deeplinked_note_spec.rb1
-rw-r--r--spec/features/markdown/gitlab_flavored_markdown_spec.rb9
-rw-r--r--spec/features/markdown/metrics_spec.rb2
-rw-r--r--spec/features/merge_request/batch_comments_spec.rb18
-rw-r--r--spec/features/merge_request/close_reopen_report_toggle_spec.rb10
-rw-r--r--spec/features/merge_request/merge_request_discussion_lock_spec.rb4
-rw-r--r--spec/features/merge_request/user_comments_on_diff_spec.rb1
-rw-r--r--spec/features/merge_request/user_comments_on_merge_request_spec.rb1
-rw-r--r--spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb4
-rw-r--r--spec/features/merge_request/user_jumps_to_discussion_spec.rb29
-rw-r--r--spec/features/merge_request/user_manages_subscription_spec.rb6
-rw-r--r--spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb4
-rw-r--r--spec/features/merge_request/user_posts_diff_notes_spec.rb4
-rw-r--r--spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb15
-rw-r--r--spec/features/merge_request/user_sees_merge_widget_spec.rb32
-rw-r--r--spec/features/merge_request/user_views_user_status_on_merge_request_spec.rb34
-rw-r--r--spec/features/milestone_spec.rb12
-rw-r--r--spec/features/milestones/user_creates_milestone_spec.rb99
-rw-r--r--spec/features/oauth_registration_spec.rb175
-rw-r--r--spec/features/profiles/password_spec.rb23
-rw-r--r--spec/features/profiles/two_factor_auths_spec.rb8
-rw-r--r--spec/features/profiles/user_edit_profile_spec.rb50
-rw-r--r--spec/features/projects/blobs/blob_show_spec.rb2
-rw-r--r--spec/features/projects/blobs/edit_spec.rb39
-rw-r--r--spec/features/projects/blobs/user_creates_new_blob_in_new_project_spec.rb63
-rw-r--r--spec/features/projects/branches_spec.rb8
-rw-r--r--spec/features/projects/ci/editor_spec.rb13
-rw-r--r--spec/features/projects/ci/lint_spec.rb9
-rw-r--r--spec/features/projects/environments/environment_metrics_spec.rb2
-rw-r--r--spec/features/projects/environments/environment_spec.rb4
-rw-r--r--spec/features/projects/fork_spec.rb53
-rw-r--r--spec/features/projects/infrastructure_registry_spec.rb2
-rw-r--r--spec/features/projects/labels/sort_labels_spec.rb4
-rw-r--r--spec/features/projects/milestones/milestones_sorting_spec.rb4
-rw-r--r--spec/features/projects/packages_spec.rb2
-rw-r--r--spec/features/projects/pipeline_schedules_spec.rb4
-rw-r--r--spec/features/projects/pipelines/legacy_pipeline_spec.rb2
-rw-r--r--spec/features/projects/pipelines/pipeline_spec.rb2
-rw-r--r--spec/features/projects/pipelines/pipelines_spec.rb4
-rw-r--r--spec/features/projects/releases/user_creates_release_spec.rb3
-rw-r--r--spec/features/projects/settings/repository_settings_spec.rb2
-rw-r--r--spec/features/projects/settings/user_changes_default_branch_spec.rb13
-rw-r--r--spec/features/projects/settings/user_transfers_a_project_spec.rb2
-rw-r--r--spec/features/projects/settings/webhooks_settings_spec.rb8
-rw-r--r--spec/features/projects/show/user_interacts_with_stars_spec.rb12
-rw-r--r--spec/features/projects/show/user_sees_collaboration_links_spec.rb6
-rw-r--r--spec/features/projects/user_sorts_projects_spec.rb20
-rw-r--r--spec/features/projects/wiki/user_views_wiki_in_project_page_spec.rb33
-rw-r--r--spec/features/protected_branches_spec.rb2
-rw-r--r--spec/features/runners_spec.rb10
-rw-r--r--spec/features/search/user_searches_for_code_spec.rb2
-rw-r--r--spec/features/search/user_searches_for_comments_spec.rb1
-rw-r--r--spec/features/search/user_searches_for_commits_spec.rb10
-rw-r--r--spec/features/search/user_searches_for_issues_spec.rb3
-rw-r--r--spec/features/search/user_searches_for_merge_requests_spec.rb1
-rw-r--r--spec/features/search/user_searches_for_milestones_spec.rb1
-rw-r--r--spec/features/search/user_searches_for_projects_spec.rb1
-rw-r--r--spec/features/search/user_searches_for_users_spec.rb1
-rw-r--r--spec/features/search/user_searches_for_wiki_pages_spec.rb5
-rw-r--r--spec/features/search/user_uses_header_search_field_spec.rb1
-rw-r--r--spec/features/snippets/search_snippets_spec.rb4
-rw-r--r--spec/features/tags/developer_creates_tag_spec.rb25
-rw-r--r--spec/features/unsubscribe_links_spec.rb13
-rw-r--r--spec/features/uploads/user_uploads_avatar_to_profile_spec.rb2
-rw-r--r--spec/features/user_opens_link_to_comment_spec.rb2
-rw-r--r--spec/features/users/signup_spec.rb1
-rw-r--r--spec/features/work_items/work_item_spec.rb33
98 files changed, 802 insertions, 690 deletions
diff --git a/spec/features/admin/admin_broadcast_messages_spec.rb b/spec/features/admin/admin_broadcast_messages_spec.rb
index 875eb9dd0ce..b5416f539f1 100644
--- a/spec/features/admin/admin_broadcast_messages_spec.rb
+++ b/spec/features/admin/admin_broadcast_messages_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe 'Admin Broadcast Messages' do
before do
admin = create(:admin)
sign_in(admin)
+ stub_feature_flags(vue_broadcast_messages: false)
gitlab_enable_admin_mode_sign_in(admin)
create(
:broadcast_message,
diff --git a/spec/features/admin/admin_groups_spec.rb b/spec/features/admin/admin_groups_spec.rb
index 040c6a65b7c..657dd52228e 100644
--- a/spec/features/admin/admin_groups_spec.rb
+++ b/spec/features/admin/admin_groups_spec.rb
@@ -207,31 +207,6 @@ RSpec.describe 'Admin Groups' do
end
describe 'add user into a group', :js do
- shared_examples 'adds user into a group' do
- it do
- visit admin_group_path(group)
-
- select2(user_selector, from: '#user_id', multiple: true)
- page.within '#new_project_member' do
- select2(Gitlab::Access::REPORTER, from: '#access_level')
- end
- click_button "Add users to group"
-
- page.within ".group-users-list" do
- expect(page).to have_content(user.name)
- expect(page).to have_content('Reporter')
- end
- end
- end
-
- it_behaves_like 'adds user into a group' do
- let(:user_selector) { user.id }
- end
-
- it_behaves_like 'adds user into a group' do
- let(:user_selector) { user.email }
- end
-
context 'when membership is set to expire' do
it 'renders relative time' do
expire_time = Time.current + 2.days
diff --git a/spec/features/admin/admin_runners_spec.rb b/spec/features/admin/admin_runners_spec.rb
index fe9fd01d3d5..35e57213bdb 100644
--- a/spec/features/admin/admin_runners_spec.rb
+++ b/spec/features/admin/admin_runners_spec.rb
@@ -66,10 +66,26 @@ RSpec.describe "Admin Runners" do
it 'has all necessary texts' do
expect(page).to have_text "Register an instance runner"
+ expect(page).to have_text "#{s_('Runners|All')} 3"
expect(page).to have_text "#{s_('Runners|Online')} 1"
expect(page).to have_text "#{s_('Runners|Offline')} 2"
expect(page).to have_text "#{s_('Runners|Stale')} 1"
end
+
+ describe 'delete all runners in bulk' do
+ before do
+ check s_('Runners|Select all')
+ click_button s_('Runners|Delete selected')
+
+ within_modal do
+ click_on 'Permanently delete 3 runners'
+ end
+
+ wait_for_requests
+ end
+
+ it_behaves_like 'shows no runners registered'
+ end
end
it 'shows a job count' do
@@ -351,14 +367,15 @@ RSpec.describe "Admin Runners" do
end
describe 'filter by tag' do
- before_all do
- create(:ci_runner, :instance, description: 'runner-blue', tag_list: ['blue'])
- create(:ci_runner, :instance, description: 'runner-red', tag_list: ['red'])
- end
+ let_it_be(:runner_1) { create(:ci_runner, :instance, description: 'runner-blue', tag_list: ['blue']) }
+ let_it_be(:runner_2) { create(:ci_runner, :instance, description: 'runner-2-blue', tag_list: ['blue']) }
+ let_it_be(:runner_3) { create(:ci_runner, :instance, description: 'runner-red', tag_list: ['red']) }
- it 'shows tags suggestions' do
+ before do
visit admin_runners_path
+ end
+ it 'shows tags suggestions' do
open_filtered_search_suggestions('Tags')
page.within(search_bar_selector) do
@@ -367,23 +384,25 @@ RSpec.describe "Admin Runners" do
end
end
- it 'shows correct runner when tag matches' do
- visit admin_runners_path
+ it_behaves_like 'filters by tag' do
+ let(:tag) { 'blue' }
+ let(:found_runner) { runner_1.description }
+ let(:missing_runner) { runner_3.description }
+ end
- expect(page).to have_content 'runner-blue'
- expect(page).to have_content 'runner-red'
+ context 'when tag does not match' do
+ before do
+ input_filtered_search_filter_is_only('Tags', 'green')
+ end
- input_filtered_search_filter_is_only('Tags', 'blue')
+ it_behaves_like 'shows no runners found'
- expect(page).to have_content 'runner-blue'
- expect(page).not_to have_content 'runner-red'
+ it 'shows no runner' do
+ expect(page).not_to have_content 'runner-blue'
+ end
end
it 'shows correct runner when tag is selected and search term is entered' do
- create(:ci_runner, :instance, description: 'runner-2-blue', tag_list: ['blue'])
-
- visit admin_runners_path
-
input_filtered_search_filter_is_only('Tags', 'blue')
expect(page).to have_content 'runner-blue'
@@ -396,19 +415,6 @@ RSpec.describe "Admin Runners" do
expect(page).not_to have_content 'runner-blue'
expect(page).not_to have_content 'runner-red'
end
-
- context 'when tag does not match' do
- before do
- visit admin_runners_path
- input_filtered_search_filter_is_only('Tags', 'green')
- end
-
- it_behaves_like 'shows no runners found'
-
- it 'shows no runner' do
- expect(page).not_to have_content 'runner-blue'
- end
- end
end
it 'sorts by last contact date' do
diff --git a/spec/features/admin/admin_settings_spec.rb b/spec/features/admin/admin_settings_spec.rb
index a5df142d188..94c5f397670 100644
--- a/spec/features/admin/admin_settings_spec.rb
+++ b/spec/features/admin/admin_settings_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe 'Admin updates settings' do
include TermsHelper
include UsageDataHelpers
- let(:admin) { create(:admin) }
+ let_it_be(:admin) { create(:admin) }
let(:dot_com?) { false }
context 'application setting :admin_mode is enabled', :request_store do
@@ -177,10 +177,10 @@ RSpec.describe 'Admin updates settings' do
end
it 'change Dormant users period' do
- expect(page).to have_field _('Period of inactivity (days)')
+ expect(page).to have_field _('Days of inactivity before deactivation')
page.within(find('[data-testid="account-limit"]')) do
- fill_in _('application_setting_deactivate_dormant_users_period'), with: '35'
+ fill_in _('application_setting_deactivate_dormant_users_period'), with: '90'
click_button 'Save changes'
end
@@ -188,7 +188,7 @@ RSpec.describe 'Admin updates settings' do
page.refresh
- expect(page).to have_field _('Period of inactivity (days)'), with: '35'
+ expect(page).to have_field _('Days of inactivity before deactivation'), with: '90'
end
end
end
@@ -400,39 +400,19 @@ RSpec.describe 'Admin updates settings' do
end
context 'Runner Registration' do
- context 'when feature is enabled' do
- before do
- stub_feature_flags(runner_registration_control: true)
- end
-
- it 'allows admins to control who has access to register runners' do
- visit ci_cd_admin_application_settings_path
-
- expect(current_settings.valid_runner_registrars).to eq(ApplicationSetting::VALID_RUNNER_REGISTRAR_TYPES)
+ it 'allows admins to control who has access to register runners' do
+ visit ci_cd_admin_application_settings_path
- page.within('.as-runner') do
- find_all('input[type="checkbox"]').each(&:click)
+ expect(current_settings.valid_runner_registrars).to eq(ApplicationSetting::VALID_RUNNER_REGISTRAR_TYPES)
- click_button 'Save changes'
- end
-
- expect(current_settings.valid_runner_registrars).to eq([])
- expect(page).to have_content "Application settings saved successfully"
- end
- end
+ page.within('.as-runner') do
+ find_all('input[type="checkbox"]').each(&:click)
- context 'when feature is disabled' do
- before do
- stub_feature_flags(runner_registration_control: false)
+ click_button 'Save changes'
end
- it 'does not allow admins to control who has access to register runners' do
- visit ci_cd_admin_application_settings_path
-
- expect(current_settings.valid_runner_registrars).to eq(ApplicationSetting::VALID_RUNNER_REGISTRAR_TYPES)
-
- expect(page).not_to have_css('.as-runner')
- end
+ expect(current_settings.valid_runner_registrars).to eq([])
+ expect(page).to have_content "Application settings saved successfully"
end
end
diff --git a/spec/features/admin/admin_users_impersonation_tokens_spec.rb b/spec/features/admin/admin_users_impersonation_tokens_spec.rb
index 7e57cffc791..45dccf9921f 100644
--- a/spec/features/admin/admin_users_impersonation_tokens_spec.rb
+++ b/spec/features/admin/admin_users_impersonation_tokens_spec.rb
@@ -9,15 +9,11 @@ RSpec.describe 'Admin > Users > Impersonation Tokens', :js do
let!(:user) { create(:user) }
def active_impersonation_tokens
- find(".table.active-tokens")
- end
-
- def no_personal_access_tokens_message
- find(".settings-message")
+ find("[data-testid='active-tokens']")
end
def created_impersonation_token
- find("#created-personal-access-token").value
+ find_field('new-access-token').value
end
before do
@@ -80,8 +76,7 @@ RSpec.describe 'Admin > Users > Impersonation Tokens', :js do
accept_gl_confirm(button_text: 'Revoke') { click_on "Revoke" }
- expect(page).to have_selector(".settings-message")
- expect(no_personal_access_tokens_message).to have_text("This user has no active impersonation tokens.")
+ expect(active_impersonation_tokens).to have_text("This user has no active impersonation tokens.")
end
it "removes expired tokens from 'active' section" do
@@ -89,8 +84,7 @@ RSpec.describe 'Admin > Users > Impersonation Tokens', :js do
visit admin_user_impersonation_tokens_path(user_id: user.username)
- expect(page).to have_selector(".settings-message")
- expect(no_personal_access_tokens_message).to have_text("This user has no active impersonation tokens.")
+ expect(active_impersonation_tokens).to have_text("This user has no active impersonation tokens.")
end
end
diff --git a/spec/features/admin/users/users_spec.rb b/spec/features/admin/users/users_spec.rb
index 236327ea687..9c59f0226e0 100644
--- a/spec/features/admin/users/users_spec.rb
+++ b/spec/features/admin/users/users_spec.rb
@@ -366,7 +366,7 @@ RSpec.describe 'Admin::Users' do
expect(user.projects_limit)
.to eq(Gitlab.config.gitlab.default_projects_limit)
expect(user.can_create_group)
- .to eq(Gitlab.config.gitlab.default_can_create_group)
+ .to eq(Gitlab::CurrentSettings.can_create_group)
end
it 'creates user with valid data' do
@@ -481,14 +481,14 @@ RSpec.describe 'Admin::Users' do
end
it 'lists groups' do
- within(:css, '.gl-mb-3 + .card') do
+ within(:css, '.gl-mb-3 + .gl-card') do
expect(page).to have_content 'Groups'
expect(page).to have_link group.name, href: admin_group_path(group)
end
end
it 'allows navigation to the group details' do
- within(:css, '.gl-mb-3 + .card') do
+ within(:css, '.gl-mb-3 + .gl-card') do
click_link group.name
end
expect(page).to have_content "Group: #{group.name}"
@@ -496,7 +496,7 @@ RSpec.describe 'Admin::Users' do
end
it 'shows the group access level' do
- within(:css, '.gl-mb-3 + .card') do
+ within(:css, '.gl-mb-3 + .gl-card') do
expect(page).to have_content 'Developer'
end
end
diff --git a/spec/features/boards/boards_spec.rb b/spec/features/boards/boards_spec.rb
index f279af90aa3..a09c9d258dc 100644
--- a/spec/features/boards/boards_spec.rb
+++ b/spec/features/boards/boards_spec.rb
@@ -23,7 +23,6 @@ RSpec.describe 'Project issue boards', :js do
project.add_maintainer(user2)
sign_in(user)
- stub_feature_flags(gl_avatar_for_all_user_avatars: false)
set_cookie('sidebar_collapsed', 'true')
end
diff --git a/spec/features/dashboard/datetime_on_tooltips_spec.rb b/spec/features/dashboard/datetime_on_tooltips_spec.rb
index 48a6976f263..875ae41c55d 100644
--- a/spec/features/dashboard/datetime_on_tooltips_spec.rb
+++ b/spec/features/dashboard/datetime_on_tooltips_spec.rb
@@ -41,9 +41,9 @@ RSpec.describe 'Tooltips on .timeago dates', :js do
end
it 'has the datetime formated correctly' do
- expect(page).to have_selector('.js-timeago.snippet-created-ago', text: '1 day ago')
+ expect(page).to have_selector('[data-testid=snippet-created-at] .js-timeago', text: '1 day ago')
- page.find('.js-timeago.snippet-created-ago').hover
+ page.find('[data-testid=snippet-created-at] .js-timeago').hover
expect(datetime_in_tooltip).to eq(created_date)
end
diff --git a/spec/features/dashboard/issues_filter_spec.rb b/spec/features/dashboard/issues_filter_spec.rb
index 3c774f8b269..0d10aed955a 100644
--- a/spec/features/dashboard/issues_filter_spec.rb
+++ b/spec/features/dashboard/issues_filter_spec.rb
@@ -44,7 +44,7 @@ RSpec.describe 'Dashboard Issues filtering', :js do
it 'updates atom feed link' do
visit_issues(milestone_title: '', assignee_username: user.username)
- link = find('.nav-controls a[title="Subscribe to RSS feed"]')
+ link = find('[data-testid="rss-feed-link"]')
params = CGI.parse(URI.parse(link[:href]).query)
auto_discovery_link = find('link[type="application/atom+xml"]', visible: false)
auto_discovery_params = CGI.parse(URI.parse(auto_discovery_link[:href]).query)
diff --git a/spec/features/dashboard/projects_spec.rb b/spec/features/dashboard/projects_spec.rb
index 847d0faf60d..0b468854322 100644
--- a/spec/features/dashboard/projects_spec.rb
+++ b/spec/features/dashboard/projects_spec.rb
@@ -112,13 +112,12 @@ RSpec.describe 'Dashboard Projects' do
end
context 'when on Starred projects tab', :js do
- it 'shows the empty state when there are no starred projects', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/222357' do
+ it 'shows the empty state when there are no starred projects' do
visit(starred_dashboard_projects_path)
element = page.find('.row.empty-state')
expect(element).to have_content("You don't have starred projects yet.")
- expect(element.find('.svg-content img')['src']).to have_content('illustrations/starred_empty')
end
it 'shows only starred projects' do
diff --git a/spec/features/dashboard/user_filters_projects_spec.rb b/spec/features/dashboard/user_filters_projects_spec.rb
index 2cf56f93cf9..e25da5854ab 100644
--- a/spec/features/dashboard/user_filters_projects_spec.rb
+++ b/spec/features/dashboard/user_filters_projects_spec.rb
@@ -145,7 +145,14 @@ RSpec.describe 'Dashboard > User filters projects' do
end
it 'filters any project' do
+ # Selecting the same option in the `GlListbox` does not emit `select` event
+ # and that is why URL update won't be triggered. Given that `Any` is a default option
+ # we need to explicitly switch from some other option (e.g. `Internal`) to `Any`
+ # to trigger the page update
+ select_dropdown_option '#filtered-search-visibility-dropdown > .dropdown', 'Internal', '.dropdown-item'
+
select_dropdown_option '#filtered-search-visibility-dropdown > .dropdown', 'Any', '.dropdown-item'
+
list = page.all('.projects-list .project-name').map(&:text)
expect(list).to contain_exactly("Internal project", "Private project", "Treasure", "Victorialand")
diff --git a/spec/features/discussion_comments/issue_spec.rb b/spec/features/discussion_comments/issue_spec.rb
index 0bb43343ecd..ebb57b37918 100644
--- a/spec/features/discussion_comments/issue_spec.rb
+++ b/spec/features/discussion_comments/issue_spec.rb
@@ -8,7 +8,6 @@ RSpec.describe 'Thread Comments Issue', :js do
let(:issue) { create(:issue, project: project) }
before do
- stub_feature_flags(remove_user_attributes_projects: false)
project.add_maintainer(user)
sign_in(user)
diff --git a/spec/features/discussion_comments/merge_request_spec.rb b/spec/features/discussion_comments/merge_request_spec.rb
index 4fa82de3b4b..a90ff3721d3 100644
--- a/spec/features/discussion_comments/merge_request_spec.rb
+++ b/spec/features/discussion_comments/merge_request_spec.rb
@@ -8,7 +8,6 @@ RSpec.describe 'Thread Comments Merge Request', :js do
let(:merge_request) { create(:merge_request, source_project: project) }
before do
- stub_feature_flags(remove_user_attributes_projects: false)
project.add_maintainer(user)
sign_in(user)
diff --git a/spec/features/expand_collapse_diffs_spec.rb b/spec/features/expand_collapse_diffs_spec.rb
index 98282e47488..c3096677a73 100644
--- a/spec/features/expand_collapse_diffs_spec.rb
+++ b/spec/features/expand_collapse_diffs_spec.rb
@@ -4,12 +4,13 @@ require 'spec_helper'
RSpec.describe 'Expand and collapse diffs', :js do
let(:branch) { 'expand-collapse-diffs' }
- let(:project) { create(:project, :repository) }
+
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:admin) { create(:admin) }
before do
allow(Gitlab::CurrentSettings).to receive(:diff_max_patch_bytes).and_return(100.kilobytes)
- admin = create(:admin)
sign_in(admin)
gitlab_enable_admin_mode_sign_in(admin)
diff --git a/spec/features/global_search_spec.rb b/spec/features/global_search_spec.rb
index baa691d244e..666bf3594de 100644
--- a/spec/features/global_search_spec.rb
+++ b/spec/features/global_search_spec.rb
@@ -9,6 +9,7 @@ RSpec.describe 'Global search' do
let(:project) { create(:project, namespace: user.namespace) }
before do
+ stub_feature_flags(search_page_vertical_nav: false)
project.add_maintainer(user)
sign_in(user)
end
diff --git a/spec/features/groups/empty_states_spec.rb b/spec/features/groups/empty_states_spec.rb
index f11e5c56545..84882fc674e 100644
--- a/spec/features/groups/empty_states_spec.rb
+++ b/spec/features/groups/empty_states_spec.rb
@@ -94,9 +94,7 @@ RSpec.describe 'Group empty states' do
end
it "shows a new #{issuable_name} button" do
- within '.empty-state' do
- expect(page).to have_content("create #{issuable_name}")
- end
+ expect(page).to have_content("create #{issuable_name}")
end
it "the new #{issuable_name} button opens a project dropdown" do
diff --git a/spec/features/groups/group_runners_spec.rb b/spec/features/groups/group_runners_spec.rb
index ada03726c97..e9807c487d5 100644
--- a/spec/features/groups/group_runners_spec.rb
+++ b/spec/features/groups/group_runners_spec.rb
@@ -114,6 +114,35 @@ RSpec.describe "Group Runners" do
end
end
+ context "with an online instance runner" do
+ let!(:instance_runner) do
+ create(:ci_runner, :instance, description: 'runner-baz', contacted_at: Time.zone.now)
+ end
+
+ before do
+ visit group_runners_path(group)
+ end
+
+ context "when selecting 'Show only inherited'" do
+ before do
+ find("[data-testid='runner-membership-toggle'] button").click
+
+ wait_for_requests
+ end
+
+ it_behaves_like 'shows runner in list' do
+ let(:runner) { instance_runner }
+ end
+
+ it 'shows runner details page' do
+ click_link("##{instance_runner.id} (#{instance_runner.short_sha})")
+
+ expect(current_url).to include(group_runner_path(group, instance_runner))
+ expect(page).to have_content "#{s_('Runners|Description')} runner-baz"
+ end
+ end
+ end
+
context 'with a multi-project runner' do
let(:project) { create(:project, group: group) }
let(:project_2) { create(:project, group: group) }
@@ -123,7 +152,7 @@ RSpec.describe "Group Runners" do
visit group_runners_path(group)
within_runner_row(runner.id) do
- expect(page).to have_button 'Delete runner', disabled: true
+ expect(page).not_to have_button 'Delete runner'
end
end
end
@@ -142,6 +171,21 @@ RSpec.describe "Group Runners" do
end
end
end
+
+ describe 'filter by tag' do
+ let!(:runner_1) { create(:ci_runner, :group, groups: [group], description: 'runner-blue', tag_list: ['blue']) }
+ let!(:runner_2) { create(:ci_runner, :group, groups: [group], description: 'runner-red', tag_list: ['red']) }
+
+ before do
+ visit group_runners_path(group)
+ end
+
+ it_behaves_like 'filters by tag' do
+ let(:tag) { 'blue' }
+ let(:found_runner) { runner_1.description }
+ let(:missing_runner) { runner_2.description }
+ end
+ end
end
describe "Group runner show page", :js do
diff --git a/spec/features/groups/labels/sort_labels_spec.rb b/spec/features/groups/labels/sort_labels_spec.rb
index fba166449f8..9d05703aae6 100644
--- a/spec/features/groups/labels/sort_labels_spec.rb
+++ b/spec/features/groups/labels/sort_labels_spec.rb
@@ -28,7 +28,7 @@ RSpec.describe 'Sort labels', :js do
it 'sorts by date' do
click_button 'Name'
- sort_options = find('ul.dropdown-menu').all('li').collect(&:text)
+ sort_options = find('ul[role="listbox"]').all('li').collect(&:text)
expect(sort_options[0]).to eq('Name')
expect(sort_options[1]).to eq('Name, descending')
@@ -37,7 +37,7 @@ RSpec.describe 'Sort labels', :js do
expect(sort_options[4]).to eq('Updated date')
expect(sort_options[5]).to eq('Oldest updated')
- click_button 'Name, descending'
+ find('li', text: 'Name, descending').click
# assert default sorting
within '.other-labels' do
diff --git a/spec/features/groups/merge_requests_spec.rb b/spec/features/groups/merge_requests_spec.rb
index be1db970e9d..296b839c8fc 100644
--- a/spec/features/groups/merge_requests_spec.rb
+++ b/spec/features/groups/merge_requests_spec.rb
@@ -57,6 +57,16 @@ RSpec.describe 'Group merge requests page' do
expect(find('#js-dropdown-assignee .filter-dropdown')).to have_content(user.name)
expect(find('#js-dropdown-assignee .filter-dropdown')).not_to have_content(user2.name)
end
+
+ it 'will still show the navbar with no results' do
+ search_term = 'some-search-term-that-produces-zero-results'
+
+ filtered_search.set(search_term)
+ filtered_search.send_keys(:enter)
+
+ expect(page).to have_content('filter produced no results')
+ expect(page).to have_link('Open', href: "/groups/#{group.name}/-/merge_requests?scope=all&search=#{search_term}&state=opened")
+ end
end
describe 'new merge request dropdown' do
diff --git a/spec/features/groups/milestones_sorting_spec.rb b/spec/features/groups/milestones_sorting_spec.rb
index 22d7ff91d41..125bf9ce3a7 100644
--- a/spec/features/groups/milestones_sorting_spec.rb
+++ b/spec/features/groups/milestones_sorting_spec.rb
@@ -29,9 +29,9 @@ RSpec.describe 'Milestones sorting', :js do
within '[data-testid=milestone_sort_by_dropdown]' do
click_button 'Due soon'
- expect(find('.gl-new-dropdown-contents').all('.gl-new-dropdown-item-text-wrapper p').map(&:text)).to eq(['Due soon', 'Due later', 'Start soon', 'Start later', 'Name, ascending', 'Name, descending'])
+ expect(find('ul[role="listbox"]').all('li').map(&:text)).to eq(['Due soon', 'Due later', 'Start soon', 'Start later', 'Name, ascending', 'Name, descending'])
- click_button 'Due later'
+ find('li', text: 'Due later').click
expect(page).to have_button('Due later')
end
diff --git a/spec/features/groups/new_group_page_spec.rb b/spec/features/groups/new_group_page_spec.rb
new file mode 100644
index 00000000000..6a8af9c31fd
--- /dev/null
+++ b/spec/features/groups/new_group_page_spec.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'New group page', :js do
+ let(:user) { create(:user) }
+ let(:group) { create(:group) }
+
+ before do
+ sign_in(user)
+ end
+
+ describe 'new top level group alert' do
+ context 'when a user visits the new group page' do
+ it 'shows the new top level group alert' do
+ visit new_group_path(anchor: 'create-group-pane')
+
+ expect(page).to have_selector('[data-testid="new-top-level-alert"]')
+ end
+ end
+
+ context 'when a user visits the new sub group page' do
+ let(:parent_group) { create(:group) }
+
+ it 'does not show the new top level group alert' do
+ visit new_group_path(parent_id: parent_group.id, anchor: 'create-group-pane')
+
+ expect(page).not_to have_selector('[data-testid="new-top-level-alert"]')
+ end
+ end
+ end
+end
diff --git a/spec/features/groups/settings/repository_spec.rb b/spec/features/groups/settings/repository_spec.rb
index 159deb2a4e3..f6b8bbdd35f 100644
--- a/spec/features/groups/settings/repository_spec.rb
+++ b/spec/features/groups/settings/repository_spec.rb
@@ -2,14 +2,17 @@
require 'spec_helper'
-RSpec.describe 'Group Repository settings' do
+RSpec.describe 'Group Repository settings', :js do
include WaitForRequests
- let(:user) { create(:user) }
- let(:group) { create(:group) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group, reload: true) { create(:group) }
- before do
+ before_all do
group.add_owner(user)
+ end
+
+ before do
sign_in(user)
end
@@ -20,9 +23,26 @@ RSpec.describe 'Group Repository settings' do
stub_container_registry_config(enabled: true)
end
- it_behaves_like 'a deploy token in settings' do
- let(:entity_type) { 'group' }
- let(:page_path) { group_settings_repository_path(group) }
+ context 'when ajax deploy tokens is enabled' do
+ before do
+ stub_feature_flags(ajax_new_deploy_token: true)
+ end
+
+ it_behaves_like 'a deploy token in settings' do
+ let(:entity_type) { 'group' }
+ let(:page_path) { group_settings_repository_path(group) }
+ end
+ end
+
+ context 'when ajax deploy tokens is disabled' do
+ before do
+ stub_feature_flags(ajax_new_deploy_token: false)
+ end
+
+ it_behaves_like 'a deploy token in settings' do
+ let(:entity_type) { 'group' }
+ let(:page_path) { group_settings_repository_path(group) }
+ end
end
end
diff --git a/spec/features/help_dropdown_spec.rb b/spec/features/help_dropdown_spec.rb
index e64c19d4708..a9c014a9408 100644
--- a/spec/features/help_dropdown_spec.rb
+++ b/spec/features/help_dropdown_spec.rb
@@ -59,6 +59,10 @@ RSpec.describe "Help Dropdown", :js do
expect(page).to have_text('Your GitLab Version')
expect(page).to have_text("#{Gitlab.version_info.major}.#{Gitlab.version_info.minor}")
expect(page).to have_selector('.version-check-badge')
+ expect(page).to have_selector(
+ 'a[data-testid="gitlab-version-container"][href="/help/update/index"]'
+ )
+ expect(page).to have_selector('.version-check-badge[href="/help/update/index"]')
expect(page).to have_text(ui_text)
end
end
diff --git a/spec/features/ide/user_commits_changes_spec.rb b/spec/features/ide/user_commits_changes_spec.rb
deleted file mode 100644
index 04b215710b3..00000000000
--- a/spec/features/ide/user_commits_changes_spec.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'IDE user commits changes', :js do
- include WebIdeSpecHelpers
-
- let(:project) { create(:project, :public, :repository) }
- let(:user) { project.first_owner }
-
- before do
- stub_feature_flags(vscode_web_ide: false)
-
- sign_in(user)
-
- ide_visit(project)
- end
-
- it 'user updates nested files' do
- content = <<~HEREDOC
- Lorem ipsum
- Dolar sit
- Amit
- HEREDOC
-
- ide_create_new_file('foo/bar/lorem_ipsum.md', content: content)
- ide_delete_file('foo/bar/.gitkeep')
-
- ide_commit
-
- expect(page).to have_content('All changes are committed')
- expect(project.repository.blob_at('master', 'foo/bar/.gitkeep')).to be_nil
- expect(project.repository.blob_at('master', 'foo/bar/lorem_ipsum.md').data).to eql(content)
- end
-end
diff --git a/spec/features/incidents/incident_timeline_events_spec.rb b/spec/features/incidents/incident_timeline_events_spec.rb
index 6db9f87d6f2..ef0eb27d310 100644
--- a/spec/features/incidents/incident_timeline_events_spec.rb
+++ b/spec/features/incidents/incident_timeline_events_spec.rb
@@ -12,7 +12,6 @@ RSpec.describe 'Incident timeline events', :js do
end
before do
- stub_feature_flags(incident_timeline: true)
sign_in(developer)
visit project_issues_incident_path(project, incident)
diff --git a/spec/features/issuables/markdown_references/jira_spec.rb b/spec/features/issuables/markdown_references/jira_spec.rb
index 9d46b3a274e..66d0022f7e9 100644
--- a/spec/features/issuables/markdown_references/jira_spec.rb
+++ b/spec/features/issuables/markdown_references/jira_spec.rb
@@ -15,8 +15,6 @@ RSpec.describe "Jira", :js do
before do
remotelink = double(:remotelink, all: [], build: double(save!: true))
- stub_feature_flags(remove_user_attributes_projects: false)
-
stub_request(:get, "https://jira.example.com/rest/api/2/issue/JIRA-5")
stub_request(:post, "https://jira.example.com/rest/api/2/issue/JIRA-5/comment")
allow_next_instance_of(JIRA::Resource::Issue) do |instance|
@@ -59,7 +57,7 @@ RSpec.describe "Jira", :js do
visit(issue_path(issue_actual_project))
page.within("#notes") do
- expect(page).to have_content("#{user.to_reference} mentioned in merge request #{merge_request.to_reference}")
+ expect(page).to have_content("#{user.name} mentioned in merge request #{merge_request.to_reference}")
end
end
@@ -67,7 +65,7 @@ RSpec.describe "Jira", :js do
visit(issue_path(issue_other_project))
page.within("#notes") do
- expect(page).to have_content("#{user.to_reference} mentioned in merge request #{merge_request.to_reference(other_project)}")
+ expect(page).to have_content("#{user.name} mentioned in merge request #{merge_request.to_reference(other_project)}")
end
end
end
diff --git a/spec/features/issues/incident_issue_spec.rb b/spec/features/issues/incident_issue_spec.rb
index 56be1493ed2..d6cde466d1b 100644
--- a/spec/features/issues/incident_issue_spec.rb
+++ b/spec/features/issues/incident_issue_spec.rb
@@ -26,7 +26,6 @@ RSpec.describe 'Incident Detail', :js do
context 'when user displays the incident' do
before do
- stub_feature_flags(incident_timeline: project)
project.add_developer(user)
sign_in(user)
@@ -52,8 +51,8 @@ RSpec.describe 'Incident Detail', :js do
aggregate_failures 'when on summary tab (default tab)' do
hidden_items = find_all('.js-issue-widgets')
- # Linked Issues/MRs and comment box
- expect(hidden_items.count).to eq(2)
+ # Linked Issues/MRs and comment box and emoji block
+ expect(hidden_items.count).to eq(3)
expect(hidden_items).to all(be_visible)
edit_button = find_all('[aria-label="Edit title and description"]')
@@ -67,13 +66,13 @@ RSpec.describe 'Incident Detail', :js do
expect(incident_tabs).to have_content('"yet.another": 73')
# does not show the linked issues and notes/comment components' do
- hidden_items = find_all('.js-issue-widgets')
+ hidden_items = find_all('.js-issue-widgets', wait: false)
# Linked Issues/MRs and comment box are hidden on page
expect(hidden_items.count).to eq(0)
# does not show the edit title and description button
- edit_button = find_all('[aria-label="Edit title and description"]')
+ edit_button = find_all('[aria-label="Edit title and description"]', wait: false)
expect(edit_button.count).to eq(0)
end
end
@@ -83,32 +82,19 @@ RSpec.describe 'Incident Detail', :js do
before do
visit project_issue_path(project, incident)
wait_for_requests
+
click_link 'Timeline'
+ wait_for_requests
end
it 'does not show the linked issues and notes/comment components' do
page.within('.issuable-details') do
- hidden_items = find_all('.js-issue-widgets')
+ hidden_items = find_all('.js-issue-widgets', wait: false)
# Linked Issues/MRs and comment box are hidden on page
expect(hidden_items.count).to eq(0)
end
end
end
-
- context 'when incident_timeline feature flag is disabled' do
- before do
- stub_feature_flags(incident_timeline: false)
-
- visit project_issues_incident_path(project, incident)
- wait_for_requests
- end
-
- it 'does not show Timeline tab' do
- tabs = find('[data-testid="incident-tabs"]')
-
- expect(tabs).not_to have_content('Timeline')
- end
- end
end
end
diff --git a/spec/features/issues/related_issues_spec.rb b/spec/features/issues/related_issues_spec.rb
index 818e99f2ec9..62127295a7c 100644
--- a/spec/features/issues/related_issues_spec.rb
+++ b/spec/features/issues/related_issues_spec.rb
@@ -3,42 +3,41 @@
require 'spec_helper'
RSpec.describe 'Related issues', :js do
- let(:user) { create(:user) }
- let(:project) { create(:project_empty_repo, :public) }
- let(:project_b) { create(:project_empty_repo, :public) }
- let(:project_unauthorized) { create(:project_empty_repo, :public) }
- let(:issue_a) { create(:issue, project: project) }
- let(:issue_b) { create(:issue, project: project) }
- let(:issue_c) { create(:issue, project: project) }
- let(:issue_d) { create(:issue, project: project) }
- let(:issue_project_b_a) { create(:issue, project: project_b) }
- let(:issue_project_unauthorized_a) { create(:issue, project: project_unauthorized) }
+ let_it_be(:user) { create(:user) }
+
+ let_it_be(:project) { create(:project_empty_repo, :public) }
+ let_it_be(:project_b) { create(:project_empty_repo, :public) }
+ let_it_be(:project_unauthorized) { create(:project_empty_repo, :public) }
+ let_it_be(:internal_project) { create(:project_empty_repo, :internal) }
+ let_it_be(:private_project) { create(:project_empty_repo, :private) }
+ let_it_be(:public_project) { create(:project_empty_repo, :public) }
+
+ let_it_be(:issue_a) { create(:issue, project: project) }
+ let_it_be(:issue_b) { create(:issue, project: project) }
+ let_it_be(:issue_c) { create(:issue, project: project) }
+ let_it_be(:issue_d) { create(:issue, project: project) }
+ let_it_be(:issue_project_b_a) { create(:issue, project: project_b) }
+ let_it_be(:issue_project_unauthorized_a) { create(:issue, project: project_unauthorized) }
+ let_it_be(:internal_issue) { create(:issue, project: internal_project) }
+ let_it_be(:private_issue) { create(:issue, project: private_project) }
+ let_it_be(:public_issue) { create(:issue, project: public_project) }
context 'widget visibility' do
context 'when not logged in' do
it 'does not show widget when internal project' do
- project = create :project_empty_repo, :internal
- issue = create :issue, project: project
-
- visit project_issue_path(project, issue)
+ visit project_issue_path(internal_project, internal_issue)
expect(page).not_to have_css('.related-issues-block')
end
it 'does not show widget when private project' do
- project = create :project_empty_repo, :private
- issue = create :issue, project: project
-
- visit project_issue_path(project, issue)
+ visit project_issue_path(private_project, private_issue)
expect(page).not_to have_css('.related-issues-block')
end
it 'shows widget when public project' do
- project = create :project_empty_repo, :public
- issue = create :issue, project: project
-
- visit project_issue_path(project, issue)
+ visit project_issue_path(public_project, public_issue)
expect(page).to have_css('.related-issues-block')
expect(page).not_to have_button 'Add a related issue'
@@ -51,39 +50,29 @@ RSpec.describe 'Related issues', :js do
end
it 'shows widget when internal project' do
- project = create :project_empty_repo, :internal
- issue = create :issue, project: project
-
- visit project_issue_path(project, issue)
+ visit project_issue_path(internal_project, internal_issue)
expect(page).to have_css('.related-issues-block')
expect(page).not_to have_button 'Add a related issue'
end
it 'does not show widget when private project' do
- project = create :project_empty_repo, :private
- issue = create :issue, project: project
-
- visit project_issue_path(project, issue)
+ visit project_issue_path(private_project, private_issue)
expect(page).not_to have_css('.related-issues-block')
end
it 'shows widget when public project' do
- project = create :project_empty_repo, :public
- issue = create :issue, project: project
-
- visit project_issue_path(project, issue)
+ visit project_issue_path(public_project, public_issue)
expect(page).to have_css('.related-issues-block')
expect(page).not_to have_button 'Add a related issue'
end
it 'shows widget on their own public issue' do
- project = create :project_empty_repo, :public
- issue = create :issue, project: project, author: user
+ issue = create :issue, project: public_project, author: user
- visit project_issue_path(project, issue)
+ visit project_issue_path(public_project, issue)
expect(page).to have_css('.related-issues-block')
expect(page).not_to have_button 'Add a related issue'
@@ -96,33 +85,27 @@ RSpec.describe 'Related issues', :js do
end
it 'shows widget when internal project' do
- project = create :project_empty_repo, :internal
- issue = create :issue, project: project
- project.add_guest(user)
+ internal_project.add_guest(user)
- visit project_issue_path(project, issue)
+ visit project_issue_path(internal_project, internal_issue)
expect(page).to have_css('.related-issues-block')
expect(page).not_to have_button 'Add a related issue'
end
it 'shows widget when private project' do
- project = create :project_empty_repo, :private
- issue = create :issue, project: project
- project.add_guest(user)
+ private_project.add_guest(user)
- visit project_issue_path(project, issue)
+ visit project_issue_path(private_project, private_issue)
expect(page).to have_css('.related-issues-block')
expect(page).not_to have_button 'Add a related issue'
end
it 'shows widget when public project' do
- project = create :project_empty_repo, :public
- issue = create :issue, project: project
- project.add_guest(user)
+ public_project.add_guest(user)
- visit project_issue_path(project, issue)
+ visit project_issue_path(public_project, public_issue)
expect(page).to have_css('.related-issues-block')
expect(page).not_to have_button 'Add a related issue'
@@ -135,44 +118,37 @@ RSpec.describe 'Related issues', :js do
end
it 'shows widget when internal project' do
- project = create :project_empty_repo, :internal
- issue = create :issue, project: project
- project.add_reporter(user)
+ internal_project.add_reporter(user)
- visit project_issue_path(project, issue)
+ visit project_issue_path(internal_project, internal_issue)
expect(page).to have_css('.related-issues-block')
expect(page).to have_button 'Add a related issue'
end
it 'shows widget when private project' do
- project = create :project_empty_repo, :private
- issue = create :issue, project: project
- project.add_reporter(user)
+ private_project.add_reporter(user)
- visit project_issue_path(project, issue)
+ visit project_issue_path(private_project, private_issue)
expect(page).to have_css('.related-issues-block')
expect(page).to have_button 'Add a related issue'
end
it 'shows widget when public project' do
- project = create :project_empty_repo, :public
- issue = create :issue, project: project
- project.add_reporter(user)
+ public_project.add_reporter(user)
- visit project_issue_path(project, issue)
+ visit project_issue_path(public_project, public_issue)
expect(page).to have_css('.related-issues-block')
expect(page).to have_button 'Add a related issue'
end
it 'shows widget on their own public issue' do
- project = create :project_empty_repo, :public
- issue = create :issue, project: project, author: user
- project.add_reporter(user)
+ issue = create :issue, project: public_project, author: user
+ public_project.add_reporter(user)
- visit project_issue_path(project, issue)
+ visit project_issue_path(public_project, issue)
expect(page).to have_css('.related-issues-block')
expect(page).to have_button 'Add a related issue'
@@ -184,8 +160,11 @@ RSpec.describe 'Related issues', :js do
let!(:issue_link_b) { create :issue_link, source: issue_a, target: issue_b }
let!(:issue_link_c) { create :issue_link, source: issue_a, target: issue_c }
- before do
+ before_all do
project.add_guest(user)
+ end
+
+ before do
sign_in(user)
end
@@ -213,9 +192,12 @@ RSpec.describe 'Related issues', :js do
end
context 'when user has permission to manage related issues' do
- before do
+ before_all do
project.add_maintainer(user)
project_b.add_maintainer(user)
+ end
+
+ before do
sign_in(user)
end
diff --git a/spec/features/issues/resource_label_events_spec.rb b/spec/features/issues/resource_label_events_spec.rb
index e4da2f67516..e8158b3e2aa 100644
--- a/spec/features/issues/resource_label_events_spec.rb
+++ b/spec/features/issues/resource_label_events_spec.rb
@@ -14,7 +14,6 @@ RSpec.describe 'List issue resource label events', :js do
let!(:event) { create(:resource_label_event, user: user, issue: issue, label: label) }
before do
- stub_feature_flags(remove_user_attributes_projects: false)
visit project_issue_path(project, issue)
wait_for_requests
end
@@ -22,13 +21,7 @@ RSpec.describe 'List issue resource label events', :js do
it 'shows both notes and resource label events' do
page.within('#notes') do
expect(find("#note_#{note.id}")).to have_content 'some note'
- expect(find("#note_#{event.discussion_id}")).to have_content 'added foo label'
- end
- end
-
- it 'shows the user status on the system note for the label' do
- page.within("#note_#{event.discussion_id}") do
- expect(page).to show_user_status user_status
+ expect(find("#note_#{event.reload.discussion_id}")).to have_content 'added foo label'
end
end
end
diff --git a/spec/features/issues/service_desk_spec.rb b/spec/features/issues/service_desk_spec.rb
index cc0d35afd60..87cd00fac6b 100644
--- a/spec/features/issues/service_desk_spec.rb
+++ b/spec/features/issues/service_desk_spec.rb
@@ -90,7 +90,6 @@ RSpec.describe 'Service Desk Issue Tracker', :js do
it 'displays the small info box, documentation, a button to configure service desk, and the address' do
aggregate_failures do
- expect(page).to have_css('.non-empty-state')
expect(page).to have_link('Learn more.', href: help_page_path('user/project/service_desk'))
expect(page).not_to have_link('Enable Service Desk')
expect(page).to have_content(project.service_desk_address)
diff --git a/spec/features/issues/user_interacts_with_awards_spec.rb b/spec/features/issues/user_interacts_with_awards_spec.rb
index 8ed56108f00..47b28b88108 100644
--- a/spec/features/issues/user_interacts_with_awards_spec.rb
+++ b/spec/features/issues/user_interacts_with_awards_spec.rb
@@ -218,7 +218,7 @@ RSpec.describe 'User interacts with awards' do
expect(first('[data-testid="award-button"]')).to have_content '1'
end
- it 'removes award from issue' do
+ it 'removes award from issue', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/375241' do
first('[data-testid="award-button"]').click
find('[data-testid="award-button"].selected').click
diff --git a/spec/features/issues/user_scrolls_to_deeplinked_note_spec.rb b/spec/features/issues/user_scrolls_to_deeplinked_note_spec.rb
index 5aae5abaf10..1fa8f533869 100644
--- a/spec/features/issues/user_scrolls_to_deeplinked_note_spec.rb
+++ b/spec/features/issues/user_scrolls_to_deeplinked_note_spec.rb
@@ -10,7 +10,6 @@ RSpec.describe 'User scrolls to deep-linked note' do
context 'on issue page', :js do
it 'on comment' do
- stub_feature_flags(gl_avatar_for_all_user_avatars: false)
visit project_issue_path(project, issue, anchor: "note_#{comment_1.id}")
wait_for_requests
diff --git a/spec/features/markdown/gitlab_flavored_markdown_spec.rb b/spec/features/markdown/gitlab_flavored_markdown_spec.rb
index e831d1be608..17fe2dab8f7 100644
--- a/spec/features/markdown/gitlab_flavored_markdown_spec.rb
+++ b/spec/features/markdown/gitlab_flavored_markdown_spec.rb
@@ -3,8 +3,6 @@
require 'spec_helper'
RSpec.describe "GitLab Flavored Markdown" do
- include CycleAnalyticsHelpers
-
let(:user) { create(:user) }
let(:project) { create(:project) }
let(:issue) { create(:issue, project: project) }
@@ -24,7 +22,12 @@ RSpec.describe "GitLab Flavored Markdown" do
let(:commit) { project.commit }
before do
- create_commit("fix #{issue.to_reference}\n\nask #{fred.to_reference} for details", project, user, 'master')
+ project.repository.commit_files(
+ user,
+ branch_name: 'master',
+ message: "fix #{issue.to_reference}\n\nask #{fred.to_reference} for details",
+ actions: [{ action: :create, file_path: 'a/new.file', content: 'This is a file' }]
+ )
end
it "renders title in commits#index" do
diff --git a/spec/features/markdown/metrics_spec.rb b/spec/features/markdown/metrics_spec.rb
index 44354c9df47..61dd41204f8 100644
--- a/spec/features/markdown/metrics_spec.rb
+++ b/spec/features/markdown/metrics_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe 'Metrics rendering', :js, :kubeclient, :use_clean_rails_memory_st
include MetricsDashboardUrlHelpers
let_it_be(:user) { create(:user) }
- let_it_be(:project) { create(:prometheus_project) }
+ let_it_be(:project) { create(:project, :with_prometheus_integration) }
let_it_be(:environment) { create(:environment, project: project) }
let(:issue) { create(:issue, project: project, description: description) }
diff --git a/spec/features/merge_request/batch_comments_spec.rb b/spec/features/merge_request/batch_comments_spec.rb
index bccdc3c4c62..f01217df8c5 100644
--- a/spec/features/merge_request/batch_comments_spec.rb
+++ b/spec/features/merge_request/batch_comments_spec.rb
@@ -74,6 +74,24 @@ RSpec.describe 'Merge request > Batch comments', :js do
expect(page).to have_selector('.draft-note-component', text: 'Testing update')
end
+ context 'multiple times on the same diff line' do
+ it 'shows both drafts at once' do
+ write_diff_comment
+
+ # All of the Diff helpers like click_diff_line (or write_diff_comment)
+ # fail very badly when run a second time.
+ # This recreates the relevant logic.
+ line = find_by_scrolling("[id='#{sample_compare.changes[0][:line_code]}']")
+ line.hover
+ line.find('.js-add-diff-note-button').click
+
+ write_comment(text: 'A second draft!', button_text: 'Add to review')
+
+ expect(page).to have_text('Line is wrong')
+ expect(page).to have_text('A second draft!')
+ end
+ end
+
context 'with image and file draft note' do
let(:merge_request) { create(:merge_request_with_diffs, :with_image_diffs, source_project: project) }
let!(:draft_on_text) { create(:draft_note_on_text_diff, merge_request: merge_request, author: user, path: 'README.md', note: 'Lorem ipsum on text...') }
diff --git a/spec/features/merge_request/close_reopen_report_toggle_spec.rb b/spec/features/merge_request/close_reopen_report_toggle_spec.rb
index dea9a10a4ec..5e9400935c3 100644
--- a/spec/features/merge_request/close_reopen_report_toggle_spec.rb
+++ b/spec/features/merge_request/close_reopen_report_toggle_spec.rb
@@ -24,14 +24,14 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle' do
context 'close/reopen/report toggle' do
it 'opens a dropdown when toggle is clicked' do
- click_button 'Toggle dropdown'
+ find('[data-testid="merge-request-actions"]').click
expect(container).to have_link("Close merge request")
expect(container).to have_link('Report abuse')
end
it 'links to Report Abuse' do
- click_button 'Toggle dropdown'
+ find('[data-testid="merge-request-actions"]').click
click_link 'Report abuse'
expect(page).to have_content('Report abuse to admin')
@@ -42,7 +42,7 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle' do
let(:issuable) { create(:merge_request, :opened, source_project: project) }
it 'shows the `Edit` and `Mark as draft` buttons' do
- click_button 'Toggle dropdown'
+ find('[data-testid="merge-request-actions"]').click
expect(container).to have_link('Edit')
expect(container).to have_link('Mark as draft')
@@ -56,7 +56,7 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle' do
let(:issuable) { create(:merge_request, :closed, source_project: project) }
it 'shows both the `Edit` and `Reopen` button' do
- click_button 'Toggle dropdown'
+ find('[data-testid="merge-request-actions"]').click
expect(container).to have_link('Edit')
expect(container).to have_link('Report abuse')
@@ -68,7 +68,7 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle' do
let(:issuable) { create(:merge_request, :closed, source_project: project, author: user) }
it 'shows both the `Edit` and `Reopen` button' do
- click_button 'Toggle dropdown'
+ find('[data-testid="merge-request-actions"]').click
expect(container).to have_link('Edit')
expect(container).to have_link('Reopen merge request')
diff --git a/spec/features/merge_request/merge_request_discussion_lock_spec.rb b/spec/features/merge_request/merge_request_discussion_lock_spec.rb
index a7bc2a062af..d69295744f7 100644
--- a/spec/features/merge_request/merge_request_discussion_lock_spec.rb
+++ b/spec/features/merge_request/merge_request_discussion_lock_spec.rb
@@ -90,7 +90,7 @@ RSpec.describe 'Merge Request Discussion Lock', :js do
end
it 'the user can lock the merge_request' do
- click_button 'Toggle dropdown'
+ find('[data-testid="merge-request-actions"]').click
expect(page).to have_content('Lock merge request')
end
@@ -103,7 +103,7 @@ RSpec.describe 'Merge Request Discussion Lock', :js do
end
it 'the user can unlock the merge_request' do
- click_button 'Toggle dropdown'
+ find('[data-testid="merge-request-actions"]').click
expect(page).to have_content('Unlock merge request')
end
diff --git a/spec/features/merge_request/user_comments_on_diff_spec.rb b/spec/features/merge_request/user_comments_on_diff_spec.rb
index fd33731cb7b..ffaf403e873 100644
--- a/spec/features/merge_request/user_comments_on_diff_spec.rb
+++ b/spec/features/merge_request/user_comments_on_diff_spec.rb
@@ -14,7 +14,6 @@ RSpec.describe 'User comments on a diff', :js do
let(:user) { create(:user) }
before do
- stub_feature_flags(remove_user_attributes_projects: false)
project.add_maintainer(user)
sign_in(user)
diff --git a/spec/features/merge_request/user_comments_on_merge_request_spec.rb b/spec/features/merge_request/user_comments_on_merge_request_spec.rb
index ec1e2fea851..dbcfc2b968f 100644
--- a/spec/features/merge_request/user_comments_on_merge_request_spec.rb
+++ b/spec/features/merge_request/user_comments_on_merge_request_spec.rb
@@ -10,7 +10,6 @@ RSpec.describe 'User comments on a merge request', :js do
let(:user) { create(:user) }
before do
- stub_feature_flags(remove_user_attributes_projects: false)
project.add_maintainer(user)
sign_in(user)
diff --git a/spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb b/spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb
index f5b5460769e..07d99a786ba 100644
--- a/spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb
+++ b/spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb
@@ -6,8 +6,8 @@ RSpec.describe 'Batch diffs', :js do
include MergeRequestDiffHelpers
include RepoHelpers
- let(:project) { create(:project, :repository) }
- let(:merge_request) { create(:merge_request, source_project: project, source_branch: 'master', target_branch: 'empty-branch') }
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:merge_request) { create(:merge_request, source_project: project, source_branch: 'master', target_branch: 'empty-branch') }
before do
sign_in(project.first_owner)
diff --git a/spec/features/merge_request/user_jumps_to_discussion_spec.rb b/spec/features/merge_request/user_jumps_to_discussion_spec.rb
deleted file mode 100644
index 9bded1c5572..00000000000
--- a/spec/features/merge_request/user_jumps_to_discussion_spec.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'User jumps to the next unresolved discussion', :js do
- let(:project) { create(:project, :repository) }
- let(:merge_request) do
- create(:merge_request_with_diffs, source_project: project, target_project: project, source_branch: 'merge-test')
- end
-
- let(:user) { create(:user) }
-
- before do
- create(:discussion_note, noteable: merge_request, project: project, author: user)
-
- project.add_maintainer(user)
- sign_in(user)
-
- visit(diffs_project_merge_request_path(project, merge_request))
-
- wait_for_requests
- end
-
- it 'jumps to overview tab' do
- find('.discussion-next-btn').click
-
- expect(page).to have_css('.notes-tab.active')
- end
-end
diff --git a/spec/features/merge_request/user_manages_subscription_spec.rb b/spec/features/merge_request/user_manages_subscription_spec.rb
index 9fb85957979..a8d59a6ffb5 100644
--- a/spec/features/merge_request/user_manages_subscription_spec.rb
+++ b/spec/features/merge_request/user_manages_subscription_spec.rb
@@ -43,22 +43,18 @@ RSpec.describe 'User manages subscription', :js do
it 'toggles subscription' do
wait_for_requests
- click_button 'Toggle dropdown'
+ find('[data-testid="merge-request-actions"]').click
expect(page).to have_selector('.gl-toggle:not(.is-checked)')
find('[data-testid="notifications-toggle"] .gl-toggle').click
wait_for_requests
- click_button 'Toggle dropdown'
-
expect(page).to have_selector('.gl-toggle.is-checked')
find('[data-testid="notifications-toggle"] .gl-toggle').click
wait_for_requests
- click_button 'Toggle dropdown'
-
expect(page).to have_selector('.gl-toggle:not(.is-checked)')
end
end
diff --git a/spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb b/spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb
index c3a61476442..d85f275b724 100644
--- a/spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb
+++ b/spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb
@@ -16,12 +16,12 @@ RSpec.describe 'Merge request > User marks merge request as draft', :js do
end
it 'toggles draft status' do
- click_button 'Toggle dropdown'
+ find('[data-testid="merge-request-actions"]').click
click_link 'Mark as draft'
expect(page).to have_content("Draft: #{merge_request.title}")
- click_button 'Toggle dropdown'
+ find('[data-testid="merge-request-actions"]').click
page.within('.detail-page-header-actions') do
click_link 'Mark as ready'
diff --git a/spec/features/merge_request/user_posts_diff_notes_spec.rb b/spec/features/merge_request/user_posts_diff_notes_spec.rb
index 1eebb6c2e28..8af0e957c14 100644
--- a/spec/features/merge_request/user_posts_diff_notes_spec.rb
+++ b/spec/features/merge_request/user_posts_diff_notes_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe 'Merge request > User posts diff notes', :js do
include MergeRequestDiffHelpers
include Spec::Support::Helpers::ModalHelpers
- let(:merge_request) { create(:merge_request) }
+ let_it_be(:merge_request) { create(:merge_request) }
let(:project) { merge_request.source_project }
let(:user) { project.creator }
let(:comment_button_class) { '.add-diff-note' }
@@ -219,7 +219,7 @@ RSpec.describe 'Merge request > User posts diff notes', :js do
end
context 'with a match line' do
- it 'does not allow commenting' do
+ it 'does not allow commenting', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/375024' do
match_should_not_allow_commenting(find_by_scrolling('.match', match: :first))
end
end
diff --git a/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb b/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb
index 8225fcbfd89..a6c024be698 100644
--- a/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb
+++ b/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb
@@ -8,10 +8,11 @@ RSpec.describe 'Merge request > User sees avatars on diff notes', :js do
include Spec::Support::Helpers::ModalHelpers
include MergeRequestDiffHelpers
- let(:project) { create(:project, :public, :repository) }
- let(:user) { project.creator }
- let(:merge_request) { create(:merge_request_with_diffs, source_project: project, author: user, title: 'Bug NS-04') }
- let(:path) { 'files/ruby/popen.rb' }
+ let_it_be(:project) { create(:project, :public, :repository) }
+ let_it_be(:user) { project.creator }
+ let_it_be(:merge_request) { create(:merge_request_with_diffs, source_project: project, author: user, title: 'Bug NS-04') }
+
+ let(:path) { 'files/ruby/popen.rb' }
let(:position) do
build(:text_diff_position, :added,
file: path,
@@ -22,10 +23,12 @@ RSpec.describe 'Merge request > User sees avatars on diff notes', :js do
let!(:note) { create(:diff_note_on_merge_request, project: project, noteable: merge_request, position: position) }
- before do
+ before_all do
project.add_maintainer(user)
+ end
+
+ before do
sign_in user
- stub_feature_flags(gl_avatar_for_all_user_avatars: false)
set_cookie('sidebar_collapsed', 'true')
end
diff --git a/spec/features/merge_request/user_sees_merge_widget_spec.rb b/spec/features/merge_request/user_sees_merge_widget_spec.rb
index c2a0e528ea7..77ac6fac22f 100644
--- a/spec/features/merge_request/user_sees_merge_widget_spec.rb
+++ b/spec/features/merge_request/user_sees_merge_widget_spec.rb
@@ -13,13 +13,15 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
let(:merge_request) { create(:merge_request, source_project: project) }
let(:merge_request_in_only_mwps_project) { create(:merge_request, source_project: project_only_mwps) }
+ def click_expand_button
+ find('[data-testid="report-section-expand-button"]').click
+ end
+
before do
project.add_maintainer(user)
project_only_mwps.add_maintainer(user)
sign_in(user)
- stub_feature_flags(refactor_mr_widgets_extensions: false)
- stub_feature_flags(refactor_mr_widgets_extensions_user: false)
stub_feature_flags(refactor_mr_widget_test_summary: false)
end
@@ -606,7 +608,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
it 'shows test reports summary which includes the new failure' do
within(".js-reports-container") do
- click_button 'Expand'
+ click_expand_button
expect(page).to have_content('Test summary contained 1 failed out of 2 total tests')
within(".js-report-section-container") do
@@ -621,7 +623,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
context 'when user clicks the new failure' do
it 'shows the test report detail' do
within(".js-reports-container") do
- click_button 'Expand'
+ click_expand_button
within(".js-report-section-container") do
click_button 'addTest'
@@ -654,7 +656,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
it 'shows test reports summary which includes the existing failure' do
within(".js-reports-container") do
- click_button 'Expand'
+ click_expand_button
expect(page).to have_content('Test summary contained 1 failed out of 2 total tests')
within(".js-report-section-container") do
@@ -668,7 +670,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
context 'when user clicks the existing failure' do
it 'shows test report detail of it' do
within(".js-reports-container") do
- click_button 'Expand'
+ click_expand_button
within(".js-report-section-container") do
click_button 'Test#sum when a is 1 and b is 3 returns summary'
@@ -701,7 +703,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
it 'shows test reports summary which includes the resolved failure' do
within(".js-reports-container") do
- click_button 'Expand'
+ click_expand_button
expect(page).to have_content('Test summary contained 1 fixed test result out of 2 total tests')
within(".js-report-section-container") do
@@ -715,7 +717,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
context 'when user clicks the resolved failure' do
it 'shows test report detail of it' do
within(".js-reports-container") do
- click_button 'Expand'
+ click_expand_button
within(".js-report-section-container") do
click_button 'addTest'
@@ -747,7 +749,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
it 'shows test reports summary which includes the new error' do
within(".js-reports-container") do
- click_button 'Expand'
+ click_expand_button
expect(page).to have_content('Test summary contained 1 error out of 2 total tests')
within(".js-report-section-container") do
@@ -762,7 +764,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
context 'when user clicks the new error' do
it 'shows the test report detail' do
within(".js-reports-container") do
- click_button 'Expand'
+ click_expand_button
within(".js-report-section-container") do
click_button 'addTest'
@@ -794,7 +796,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
it 'shows test reports summary which includes the existing error' do
within(".js-reports-container") do
- click_button 'Expand'
+ click_expand_button
expect(page).to have_content('Test summary contained 1 error out of 2 total tests')
within(".js-report-section-container") do
@@ -808,7 +810,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
context 'when user clicks the existing error' do
it 'shows test report detail of it' do
within(".js-reports-container") do
- click_button 'Expand'
+ click_expand_button
within(".js-report-section-container") do
click_button 'Test#sum when a is 4 and b is 4 returns summary'
@@ -840,7 +842,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
it 'shows test reports summary which includes the resolved error' do
within(".js-reports-container") do
- click_button 'Expand'
+ click_expand_button
expect(page).to have_content('Test summary contained 1 fixed test result out of 2 total tests')
within(".js-report-section-container") do
@@ -854,7 +856,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
context 'when user clicks the resolved error' do
it 'shows test report detail of it' do
within(".js-reports-container") do
- click_button 'Expand'
+ click_expand_button
within(".js-report-section-container") do
click_button 'addTest'
@@ -894,7 +896,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
it 'shows test reports summary which includes the resolved failure' do
within(".js-reports-container") do
- click_button 'Expand'
+ click_expand_button
expect(page).to have_content('Test summary contained 20 failed out of 20 total tests')
within(".js-report-section-container") do
diff --git a/spec/features/merge_request/user_views_user_status_on_merge_request_spec.rb b/spec/features/merge_request/user_views_user_status_on_merge_request_spec.rb
deleted file mode 100644
index d3ea8b955f2..00000000000
--- a/spec/features/merge_request/user_views_user_status_on_merge_request_spec.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Project > Merge request > View user status' do
- let(:project) { create(:project, :public, :repository) }
- let(:merge_request) do
- create(:merge_request, source_project: project, target_project: project, author: create(:user))
- end
-
- before do
- stub_feature_flags(remove_user_attributes_projects: false)
- end
-
- subject { visit merge_request_path(merge_request) }
-
- context 'for notes', :js do
- describe 'the status of the author of a note on a merge request' do
- let(:note) { create(:note, noteable: merge_request, project: project, author: create(:user)) }
-
- it_behaves_like 'showing user status' do
- let(:user_with_status) { note.author }
- end
- end
-
- describe 'the status of the author of a diff note on a merge request' do
- let(:note) { create(:diff_note_on_merge_request, noteable: merge_request, project: project, author: create(:user)) }
-
- it_behaves_like 'showing user status' do
- let(:user_with_status) { note.author }
- end
- end
- end
-end
diff --git a/spec/features/milestone_spec.rb b/spec/features/milestone_spec.rb
index 2a1ea1a4e73..98d623902a5 100644
--- a/spec/features/milestone_spec.rb
+++ b/spec/features/milestone_spec.rb
@@ -23,11 +23,17 @@ RSpec.describe 'Milestone' do
fill_in "milestone_due_date", with: '2016-12-16'
end
- find('input[name="commit"]').click
+ click_button 'Create milestone'
expect(find('[data-testid="no-issues-alert"]')).to have_content('Assign some issues to this milestone.')
expect(page).to have_content('Nov 16, 2016–Dec 16, 2016')
end
+
+ it 'passes redirect_path through to form' do
+ visit new_project_milestone_path(project, redirect_path: 'new_release')
+
+ expect(find('#redirect_path', visible: :all)[:value]).to eq('new_release')
+ end
end
describe 'Open a milestone with closed issues' do
@@ -49,7 +55,7 @@ RSpec.describe 'Milestone' do
page.within '.milestone-form' do
fill_in "milestone_title", with: milestone.title
end
- find('input[name="commit"]').click
+ click_button 'Create milestone'
expect(find('.gl-alert-danger')).to have_content('already being used for another group or project milestone.')
end
@@ -62,7 +68,7 @@ RSpec.describe 'Milestone' do
page.within '.milestone-form' do
fill_in "milestone_title", with: milestone.title
end
- find('input[name="commit"]').click
+ click_button 'Create milestone'
expect(find('.gl-alert-danger')).to have_content('already being used for another group or project milestone.')
end
diff --git a/spec/features/milestones/user_creates_milestone_spec.rb b/spec/features/milestones/user_creates_milestone_spec.rb
index dd377aa4a26..1ab231632fb 100644
--- a/spec/features/milestones/user_creates_milestone_spec.rb
+++ b/spec/features/milestones/user_creates_milestone_spec.rb
@@ -3,29 +3,100 @@
require 'spec_helper'
RSpec.describe "User creates milestone", :js do
- let_it_be(:user) { create(:user) }
- let_it_be(:project) { create(:project) }
+ let_it_be(:developer) { create(:user) }
+ let_it_be(:inherited_guest) { create(:user) }
+ let_it_be(:inherited_developer) { create(:user) }
+ let_it_be(:group) { create(:group, :public) }
+
+ shared_examples 'creates milestone' do
+ specify do
+ title = "v2.3"
+
+ fill_in("Title", with: title)
+ fill_in("Description", with: "# Description header")
+ click_button("Create milestone")
+
+ expect(page).to have_content(title)
+ .and have_content("Issues")
+ .and have_header_with_correct_id_and_link(1, "Description header", "description-header")
+
+ visit(activity_project_path(project))
+
+ expect(page).to have_content("#{user.name} #{user.to_reference} opened milestone")
+ end
+ end
+
+ shared_examples 'renders not found' do
+ specify do
+ expect(page).to have_title('Not Found')
+ expect(page).to have_content('Page Not Found')
+ end
+ end
+
+ before_all do
+ group.add_guest(inherited_guest)
+ group.add_developer(inherited_developer)
+ end
before do
- project.add_developer(user)
sign_in(user)
-
visit(new_project_milestone_path(project))
end
- it "creates milestone" do
- title = "v2.3"
+ context 'when project is public' do
+ let_it_be(:project) { create(:project, :public, group: group) }
+
+ context 'and issues and merge requests are private' do
+ before_all do
+ project.project_feature.update!(
+ issues_access_level: ProjectFeature::PRIVATE,
+ merge_requests_access_level: ProjectFeature::PRIVATE
+ )
+ end
+
+ context 'when user is an inherited member from the group' do
+ context 'and user is a guest' do
+ let(:user) { inherited_guest }
+
+ it_behaves_like 'renders not found'
+ end
+
+ context 'and user is a developer' do
+ let(:user) { inherited_developer }
+
+ it_behaves_like 'creates milestone'
+ end
+ end
+ end
+ end
+
+ context 'when project is private' do
+ let_it_be(:project) { create(:project, :private, group: group) }
+
+ context 'and user is a direct project member' do
+ before_all do
+ project.add_developer(developer)
+ end
+
+ context 'when user is a developer' do
+ let(:user) { developer }
+
+ it_behaves_like 'creates milestone'
+ end
+ end
- fill_in("Title", with: title)
- fill_in("Description", with: "# Description header")
- click_button("Create milestone")
+ context 'and user is an inherited member from the group' do
+ context 'when user is a guest' do
+ let(:user) { inherited_guest }
- expect(page).to have_content(title)
- .and have_content("Issues")
- .and have_header_with_correct_id_and_link(1, "Description header", "description-header")
+ it_behaves_like 'renders not found'
+ end
- visit(activity_project_path(project))
+ context 'when user is a developer' do
+ let(:user) { inherited_developer }
- expect(page).to have_content("#{user.name} #{user.to_reference} opened milestone")
+ it_behaves_like 'creates milestone'
+ end
+ end
end
end
diff --git a/spec/features/oauth_registration_spec.rb b/spec/features/oauth_registration_spec.rb
index cb8343b8065..0a35b5a7e42 100644
--- a/spec/features/oauth_registration_spec.rb
+++ b/spec/features/oauth_registration_spec.rb
@@ -3,126 +3,139 @@
require 'spec_helper'
RSpec.describe 'OAuth Registration', :js, :allow_forgery_protection do
- include DeviseHelpers
include LoginHelpers
include TermsHelper
using RSpec::Parameterized::TableSyntax
+ let(:uid) { 'my-uid' }
+ let(:email) { 'user@example.com' }
+
around do |example|
with_omniauth_full_host { example.run }
end
- context 'when the user registers using single-sign on provider' do
- let(:uid) { 'my-uid' }
- let(:email) { 'user@example.com' }
-
- where(:provider, :additional_info) do
- :github | {}
- :twitter | {}
- :bitbucket | {}
- :gitlab | {}
- :google_oauth2 | {}
- :facebook | {}
- :cas3 | {}
- :auth0 | {}
- :authentiq | {}
- :salesforce | { extra: { email_verified: true } }
- :dingtalk | {}
- :alicloud | {}
+ where(:provider, :additional_info) do
+ :github | {}
+ :twitter | {}
+ :bitbucket | {}
+ :gitlab | {}
+ :google_oauth2 | {}
+ :facebook | {}
+ :cas3 | {}
+ :auth0 | {}
+ :authentiq | {}
+ :salesforce | { extra: { email_verified: true } }
+ :dingtalk | {}
+ :alicloud | {}
+ end
+
+ with_them do
+ before do
+ stub_omniauth_provider(provider)
+ stub_feature_flags(update_oauth_registration_flow: true)
end
- with_them do
+ context 'when block_auto_created_users is true' do
before do
- stub_omniauth_provider(provider)
- stub_feature_flags(update_oauth_registration_flow: true)
+ stub_omniauth_setting(block_auto_created_users: true)
end
- context 'when block_auto_created_users is true' do
- before do
- stub_omniauth_setting(block_auto_created_users: true)
- end
+ it 'redirects back to the sign-in page' do
+ register_via(provider, uid, email, additional_info: additional_info)
- it 'redirects back to the sign-in page' do
- register_via(provider, uid, email, additional_info: additional_info)
+ expect(page).to have_current_path new_user_session_path
+ expect(page).to have_content('Your account is pending approval')
+ end
+ end
- expect(page).to have_current_path new_user_session_path
- expect(page).to have_content('Your account is pending approval')
- end
+ context 'when block_auto_created_users is false' do
+ before do
+ stub_omniauth_setting(block_auto_created_users: false)
+ end
+
+ it 'redirects to the initial welcome path' do
+ register_via(provider, uid, email, additional_info: additional_info)
+
+ expect(page).to have_current_path users_sign_up_welcome_path
+ expect(page).to have_content('Welcome to GitLab, mockuser!')
end
- context 'when block_auto_created_users is false' do
+ context 'when terms are enforced' do
before do
- stub_omniauth_setting(block_auto_created_users: false)
+ enforce_terms
end
- it 'redirects to the initial welcome path' do
+ it 'auto accepts terms and redirects to the initial welcome path' do
register_via(provider, uid, email, additional_info: additional_info)
expect(page).to have_current_path users_sign_up_welcome_path
expect(page).to have_content('Welcome to GitLab, mockuser!')
end
+ end
- context 'when terms are enforced' do
- before do
- enforce_terms
- end
+ context 'when provider does not send a verified email address' do
+ let(:email) { 'temp-email-for-oauth@email.com' }
- it 'auto accepts terms and redirects to the initial welcome path' do
- register_via(provider, uid, email, additional_info: additional_info)
+ it 'redirects to the profile path' do
+ register_via(provider, uid, email, additional_info: additional_info)
- expect(page).to have_current_path users_sign_up_welcome_path
- expect(page).to have_content('Welcome to GitLab, mockuser!')
- end
+ expect(page).to have_current_path profile_path
+ expect(page).to have_content('Please complete your profile with email address')
end
+ end
- context 'when provider does not send a verified email address' do
- let(:email) { 'temp-email-for-oauth@email.com' }
+ context 'when registering via an invitation email' do
+ let_it_be(:owner) { create(:user) }
+ let_it_be(:group) { create(:group, name: 'Owned') }
+ let_it_be(:project) { create(:project, :repository, namespace: group) }
+
+ let(:invite_email) { generate(:email) }
+ let(:extra_params) { { invite_type: Emails::Members::INITIAL_INVITE } }
+ let(:group_invite) do
+ create(
+ :group_member, :invited,
+ group: group,
+ invite_email: invite_email,
+ created_by: owner
+ )
+ end
- it 'redirects to the profile path' do
- register_via(provider, uid, email, additional_info: additional_info)
+ before do
+ project.add_maintainer(owner)
+ group.add_owner(owner)
+ group_invite.generate_invite_token!
- expect(page).to have_current_path profile_path
- expect(page).to have_content('Please complete your profile with email address')
- end
+ mock_auth_hash(provider, uid, invite_email, additional_info: additional_info)
end
- context 'when registering via an invitation email' do
- let_it_be(:owner) { create(:user) }
- let_it_be(:group) { create(:group, name: 'Owned') }
- let_it_be(:project) { create(:project, :repository, namespace: group) }
-
- let(:invite_email) { generate(:email) }
- let(:extra_params) { { invite_type: Emails::Members::INITIAL_INVITE } }
- let(:group_invite) do
- create(
- :group_member, :invited,
- group: group,
- invite_email: invite_email,
- created_by: owner
- )
- end
-
- before do
- project.add_maintainer(owner)
- group.add_owner(owner)
- group_invite.generate_invite_token!
-
- mock_auth_hash(provider, uid, invite_email, additional_info: additional_info)
- end
-
- it 'redirects to the activity page with all the projects/groups invitations accepted' do
- visit invite_path(group_invite.raw_invite_token, extra_params)
- click_link_or_button "oauth-login-#{provider}"
- fill_in_welcome_form
-
- expect(page).to have_content('You have been granted Owner access to group Owned.')
- expect(page).to have_current_path(activity_group_path(group), ignore_query: true)
- end
+ it 'redirects to the activity page with all the projects/groups invitations accepted' do
+ visit invite_path(group_invite.raw_invite_token, extra_params)
+ click_link_or_button "oauth-login-#{provider}"
+ fill_in_welcome_form
+
+ expect(page).to have_content('You have been granted Owner access to group Owned.')
+ expect(page).to have_current_path(activity_group_path(group), ignore_query: true)
end
end
end
end
+ context 'when update_oauth_registration_flow is disabled' do
+ before do
+ stub_omniauth_provider(:github)
+ stub_omniauth_setting(block_auto_created_users: false)
+ stub_feature_flags(update_oauth_registration_flow: false)
+
+ enforce_terms
+ end
+
+ it 'presents the terms page' do
+ register_via(:github, uid, email)
+
+ expect(page).to have_content('These are the terms')
+ end
+ end
+
def fill_in_welcome_form
select 'Software Developer', from: 'user_role'
click_button 'Get started!'
diff --git a/spec/features/profiles/password_spec.rb b/spec/features/profiles/password_spec.rb
index 1d0db488751..6c860740354 100644
--- a/spec/features/profiles/password_spec.rb
+++ b/spec/features/profiles/password_spec.rb
@@ -51,11 +51,11 @@ RSpec.describe 'Profile > Password' do
end
context 'Password authentication unavailable' do
- before do
- gitlab_sign_in(user)
- end
-
context 'Regular user' do
+ before do
+ gitlab_sign_in(user)
+ end
+
let(:user) { create(:user) }
it 'renders 404 when password authentication is disabled for the web interface and Git' do
@@ -69,7 +69,22 @@ RSpec.describe 'Profile > Password' do
end
context 'LDAP user' do
+ include LdapHelpers
+
+ let(:ldap_settings) { { enabled: true } }
let(:user) { create(:omniauth_user, provider: 'ldapmain') }
+ let(:provider) { 'ldapmain' }
+ let(:provider_label) { 'Main LDAP' }
+
+ before do
+ stub_ldap_setting(ldap_settings)
+ stub_ldap_access(user, provider, provider_label)
+ sign_in_using_ldap!(user, provider_label, provider)
+ end
+
+ after(:all) do
+ Rails.application.reload_routes!
+ end
it 'renders 404' do
visit edit_profile_password_path
diff --git a/spec/features/profiles/two_factor_auths_spec.rb b/spec/features/profiles/two_factor_auths_spec.rb
index 9a58950b8f3..b4355f2d669 100644
--- a/spec/features/profiles/two_factor_auths_spec.rb
+++ b/spec/features/profiles/two_factor_auths_spec.rb
@@ -6,6 +6,8 @@ RSpec.describe 'Two factor auths' do
include Spec::Support::Helpers::ModalHelpers
context 'when signed in' do
+ let(:invalid_current_pwd_msg) { 'You must provide a valid current password' }
+
before do
sign_in(user)
end
@@ -18,7 +20,7 @@ RSpec.describe 'Two factor auths' do
register_2fa(user.current_otp, '123')
- expect(page).to have_content('You must provide a valid current password')
+ expect(page).to have_selector('.gl-alert-title', text: invalid_current_pwd_msg, count: 1)
register_2fa(user.reload.current_otp, user.password)
@@ -76,7 +78,7 @@ RSpec.describe 'Two factor auths' do
click_button 'Disable'
end
- expect(page).to have_content('You must provide a valid current password')
+ expect(page).to have_selector('.gl-alert-title', text: invalid_current_pwd_msg, count: 1)
fill_in 'current_password', with: user.password
@@ -97,7 +99,7 @@ RSpec.describe 'Two factor auths' do
click_button 'Regenerate recovery codes'
- expect(page).to have_content('You must provide a valid current password')
+ expect(page).to have_selector('.gl-alert-title', text: invalid_current_pwd_msg, count: 1)
fill_in 'current_password', with: user.password
diff --git a/spec/features/profiles/user_edit_profile_spec.rb b/spec/features/profiles/user_edit_profile_spec.rb
index d887a367fcb..56a70f37779 100644
--- a/spec/features/profiles/user_edit_profile_spec.rb
+++ b/spec/features/profiles/user_edit_profile_spec.rb
@@ -5,10 +5,9 @@ require 'spec_helper'
RSpec.describe 'User edit profile' do
include Spec::Support::Helpers::Features::NotesHelpers
- let(:user) { create(:user) }
+ let_it_be(:user) { create(:user) }
before do
- stub_feature_flags(remove_user_attributes_projects: false)
sign_in(user)
visit(profile_path)
end
@@ -456,6 +455,8 @@ RSpec.describe 'User edit profile' do
end
context 'Remove status button' do
+ let(:user) { create(:user) }
+
before do
user.status = UserStatus.new(message: 'Eating bread', emoji: 'stuffed_flatbread')
@@ -495,45 +496,6 @@ RSpec.describe 'User edit profile' do
expect(page).to have_emoji('speech_balloon')
end
-
- context 'note header' do
- let(:project) { create(:project_empty_repo, :public) }
- let(:issue) { create(:issue, project: project) }
- let(:emoji) { "stuffed_flatbread" }
-
- before do
- project.add_guest(user)
- create(:user_status, user: user, message: 'Taking notes', emoji: emoji)
-
- visit(project_issue_path(project, issue))
-
- add_note("This is a comment")
- visit(project_issue_path(project, issue))
-
- wait_for_requests
- end
-
- it 'displays the status emoji' do
- first_note = page.find_all(".main-notes-list .timeline-entry").first
-
- expect(first_note).to have_emoji(emoji)
- end
-
- it 'clears the status emoji' do
- open_edit_status_modal
-
- page.within "#set-user-status-modal" do
- click_button 'Remove status'
- end
-
- visit(project_issue_path(project, issue))
- wait_for_requests
-
- first_note = page.find_all(".main-notes-list .timeline-entry").first
-
- expect(first_note).not_to have_css('.user-status-emoji')
- end
- end
end
context 'User time preferences', :js do
@@ -551,13 +513,13 @@ RSpec.describe 'User edit profile' do
it 'allows the user to select a time zone from a dropdown list of options' do
expect(page.find('.user-time-preferences .dropdown')).not_to have_css('.show')
- page.find('.user-time-preferences .js-timezone-dropdown').click
+ page.find('.user-time-preferences .dropdown').click
expect(page.find('.user-time-preferences .dropdown')).to have_css('.show')
- page.find("a", text: "Nuku'alofa").click
+ page.find("button", text: "Arizona").click
- expect(page).to have_field(:user_timezone, with: 'Pacific/Tongatapu', type: :hidden)
+ expect(page).to have_field(:user_timezone, with: 'America/Phoenix', type: :hidden)
end
it 'timezone defaults to empty' do
diff --git a/spec/features/projects/blobs/blob_show_spec.rb b/spec/features/projects/blobs/blob_show_spec.rb
index 13a4c1b5912..93e5be18229 100644
--- a/spec/features/projects/blobs/blob_show_spec.rb
+++ b/spec/features/projects/blobs/blob_show_spec.rb
@@ -675,7 +675,7 @@ RSpec.describe 'File blob', :js do
expect(page).to have_content('This project is licensed under the MIT License.')
# shows a learn more link
- expect(page).to have_link('Learn more', href: 'http://choosealicense.com/licenses/mit/')
+ expect(page).to have_link('Learn more', href: 'https://opensource.org/licenses/MIT')
end
end
end
diff --git a/spec/features/projects/blobs/edit_spec.rb b/spec/features/projects/blobs/edit_spec.rb
index f198a1f42e2..5587b8abab3 100644
--- a/spec/features/projects/blobs/edit_spec.rb
+++ b/spec/features/projects/blobs/edit_spec.rb
@@ -7,8 +7,8 @@ RSpec.describe 'Editing file blob', :js do
include TreeHelper
include BlobSpecHelpers
- let(:project) { create(:project, :public, :repository) }
- let(:merge_request) { create(:merge_request, source_project: project, source_branch: 'feature', target_branch: 'master') }
+ let_it_be(:project) { create(:project, :public, :repository) }
+ let_it_be(:merge_request) { create(:merge_request, source_project: project, source_branch: 'feature', target_branch: 'master') }
let(:branch) { 'master' }
let(:file_path) { project.repository.ls_files(project.repository.root_ref)[1] }
let(:readme_file_path) { 'README.md' }
@@ -82,6 +82,34 @@ RSpec.describe 'Editing file blob', :js do
end
end
+ context 'blob edit toolbar' do
+ toolbar_buttons = [
+ "Add bold text",
+ "Add italic text",
+ "Add strikethrough text",
+ "Insert a quote",
+ "Insert code",
+ "Add a link",
+ "Add a bullet list",
+ "Add a numbered list",
+ "Add a checklist",
+ "Add a collapsible section",
+ "Add a table"
+ ]
+
+ before do
+ visit project_edit_blob_path(project, tree_join(branch, readme_file_path))
+ end
+
+ it "has defined set of toolbar buttons" do
+ buttons = page.all('.file-buttons .md-header-toolbar button[type="button"]')
+ expect(buttons.length).to eq(toolbar_buttons.length)
+ toolbar_buttons.each_with_index do |button_title, i|
+ expect(buttons[i]['title']).to include(button_title)
+ end
+ end
+ end
+
context 'from blob file path' do
before do
visit project_blob_path(project, tree_join(branch, file_path))
@@ -156,11 +184,14 @@ RSpec.describe 'Editing file blob', :js do
end
context 'as developer' do
- let(:user) { create(:user) }
+ let_it_be(:user) { create(:user) }
let(:protected_branch) { 'protected-branch' }
- before do
+ before_all do
project.add_developer(user)
+ end
+
+ before do
project.repository.add_branch(user, protected_branch, 'master')
create(:protected_branch, project: project, name: protected_branch)
sign_in(user)
diff --git a/spec/features/projects/blobs/user_creates_new_blob_in_new_project_spec.rb b/spec/features/projects/blobs/user_creates_new_blob_in_new_project_spec.rb
deleted file mode 100644
index d2774aa74c9..00000000000
--- a/spec/features/projects/blobs/user_creates_new_blob_in_new_project_spec.rb
+++ /dev/null
@@ -1,63 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'User creates new blob', :js do
- include WebIdeSpecHelpers
-
- let(:user) { create(:user) }
- let(:project) { create(:project, :empty_repo) }
-
- before do
- stub_feature_flags(vscode_web_ide: false)
- end
-
- shared_examples 'creating a file' do
- it 'allows the user to add a new file in Web IDE' do
- visit project_path(project)
-
- click_link 'New file'
-
- wait_for_requests
-
- ide_create_new_file('dummy-file', content: "Hello world\n")
-
- ide_commit
-
- expect(page).to have_content('All changes are committed')
- expect(project.repository.blob_at('master', 'dummy-file').data).to eql("Hello world\n")
- end
- end
-
- describe 'as a maintainer' do
- before do
- project.add_maintainer(user)
- sign_in(user)
- end
-
- it_behaves_like 'creating a file'
- end
-
- describe 'as an admin' do
- let(:user) { create(:user, :admin) }
-
- before do
- sign_in(user)
- gitlab_enable_admin_mode_sign_in(user)
- end
-
- it_behaves_like 'creating a file'
- end
-
- describe 'as a developer' do
- before do
- project.add_developer(user)
- sign_in(user)
- visit project_path(project)
- end
-
- it 'does not allow pushing to the default branch' do
- expect(page).not_to have_content('New file')
- end
- end
-end
diff --git a/spec/features/projects/branches_spec.rb b/spec/features/projects/branches_spec.rb
index 727f9aa486e..361a07ebd0b 100644
--- a/spec/features/projects/branches_spec.rb
+++ b/spec/features/projects/branches_spec.rb
@@ -3,8 +3,8 @@
require 'spec_helper'
RSpec.describe 'Branches' do
- let(:user) { create(:user) }
- let(:project) { create(:project, :public, :repository) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :public, :repository) }
let(:repository) { project.repository }
context 'logged in as developer' do
@@ -175,7 +175,7 @@ RSpec.describe 'Branches' do
search_for_branch('fix')
expect(page).not_to have_content('fix')
- expect(all('.all-branches').last).to have_selector('li', count: 0)
+ expect(all('.all-branches', wait: false).last).to have_selector('li', count: 0)
end
end
@@ -233,7 +233,7 @@ RSpec.describe 'Branches' do
end
context 'with one or more pipeline', :js do
- let(:project) { create(:project, :public, :empty_repo) }
+ let_it_be(:project) { create(:project, :public, :empty_repo) }
before do
sha = create_file(branch_name: "branch")
diff --git a/spec/features/projects/ci/editor_spec.rb b/spec/features/projects/ci/editor_spec.rb
index 8197fe46c7b..c96d5f5823f 100644
--- a/spec/features/projects/ci/editor_spec.rb
+++ b/spec/features/projects/ci/editor_spec.rb
@@ -135,6 +135,19 @@ RSpec.describe 'Pipeline Editor', :js do
end
end
+ describe 'Commit Form' do
+ it 'is preserved when changing tabs' do
+ find('#commit-message').set('message', clear: :backspace)
+ find('#source-branch-field').set('new_branch', clear: :backspace)
+
+ click_link 'Validate'
+ click_link 'Edit'
+
+ expect(find('#commit-message').value).to eq('message')
+ expect(find('#source-branch-field').value).to eq('new_branch')
+ end
+ end
+
describe 'Editor content' do
it 'user can reset their CI configuration' do
page.within('#source-editor-') do
diff --git a/spec/features/projects/ci/lint_spec.rb b/spec/features/projects/ci/lint_spec.rb
index 608511ae5a5..8d5f62d8a06 100644
--- a/spec/features/projects/ci/lint_spec.rb
+++ b/spec/features/projects/ci/lint_spec.rb
@@ -5,13 +5,16 @@ require 'spec_helper'
RSpec.describe 'CI Lint', :js do
include Spec::Support::Helpers::Features::SourceEditorSpecHelpers
- let(:project) { create(:project, :repository) }
- let(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:user) { create(:user) }
let(:content_selector) { '.content .view-lines' }
- before do
+ before_all do
project.add_developer(user)
+ end
+
+ before do
sign_in(user)
visit project_ci_lint_path(project)
diff --git a/spec/features/projects/environments/environment_metrics_spec.rb b/spec/features/projects/environments/environment_metrics_spec.rb
index bf0949443de..d486d8cf551 100644
--- a/spec/features/projects/environments/environment_metrics_spec.rb
+++ b/spec/features/projects/environments/environment_metrics_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe 'Environment > Metrics' do
include PrometheusHelpers
let(:user) { create(:user) }
- let(:project) { create(:prometheus_project, :repository) }
+ let(:project) { create(:project, :with_prometheus_integration, :repository) }
let(:pipeline) { create(:ci_pipeline, project: project) }
let(:build) { create(:ci_build, pipeline: pipeline) }
let(:environment) { create(:environment, project: project) }
diff --git a/spec/features/projects/environments/environment_spec.rb b/spec/features/projects/environments/environment_spec.rb
index be4b21dfff4..dc6e496d081 100644
--- a/spec/features/projects/environments/environment_spec.rb
+++ b/spec/features/projects/environments/environment_spec.rb
@@ -97,6 +97,10 @@ RSpec.describe 'Environment' do
it 'does show deployments' do
expect(page).to have_link("#{build.name} (##{build.id})")
end
+
+ it 'shows a tooltip on the job name' do
+ expect(page).to have_css("[title=\"#{build.name} (##{build.id})\"].has-tooltip")
+ end
end
context 'when there is a failed deployment' do
diff --git a/spec/features/projects/fork_spec.rb b/spec/features/projects/fork_spec.rb
index b8c127f0078..24943e7dd0f 100644
--- a/spec/features/projects/fork_spec.rb
+++ b/spec/features/projects/fork_spec.rb
@@ -118,17 +118,28 @@ RSpec.describe 'Project fork' do
end
end
+ shared_examples "increments the fork counter on the source project's page" do
+ specify :sidekiq_might_not_need_inline do
+ create_forks
+
+ visit project_path(project)
+
+ expect(page).to have_css('.fork-count', text: 2)
+ end
+ end
+
it_behaves_like 'fork button on project page'
it_behaves_like 'create fork page', 'Fork project'
context 'fork form', :js do
let(:group) { create(:group) }
+ let(:group2) { create(:group) }
let(:user) { create(:group_member, :maintainer, user: create(:user), group: group ).user }
- def submit_form
+ def submit_form(group_obj = group)
find('[data-testid="select_namespace_dropdown"]').click
- find('[data-testid="select_namespace_dropdown_search_field"]').fill_in(with: group.name)
- click_button group.name
+ find('[data-testid="select_namespace_dropdown_search_field"]').fill_in(with: group_obj.name)
+ click_button group_obj.name
click_button 'Fork project'
end
@@ -166,5 +177,41 @@ RSpec.describe 'Project fork' do
expect(page).to have_content("#{group.name} / #{fork_name}")
end
end
+
+ context 'with cache_home_panel feature flag' do
+ before do
+ create(:group_member, :maintainer, user: user, group: group2 )
+ end
+
+ context 'when caching is enabled' do
+ before do
+ stub_feature_flags(cache_home_panel: project)
+ end
+
+ it_behaves_like "increments the fork counter on the source project's page"
+ end
+
+ context 'when caching is disabled' do
+ before do
+ stub_feature_flags(cache_home_panel: false)
+ end
+
+ it_behaves_like "increments the fork counter on the source project's page"
+ end
+ end
end
end
+
+private
+
+def create_fork(group_obj = group)
+ visit project_path(project)
+ find('.fork-btn').click
+ submit_form(group_obj)
+ wait_for_requests
+end
+
+def create_forks
+ create_fork
+ create_fork(group2)
+end
diff --git a/spec/features/projects/infrastructure_registry_spec.rb b/spec/features/projects/infrastructure_registry_spec.rb
index 27d0866bc69..aab1cec8762 100644
--- a/spec/features/projects/infrastructure_registry_spec.rb
+++ b/spec/features/projects/infrastructure_registry_spec.rb
@@ -57,7 +57,7 @@ RSpec.describe 'Infrastructure Registry' do
it 'allows you to delete a module', :aggregate_failures do
# this is still using the package copy in the UI too
click_button('Remove package')
- click_button('Delete package')
+ click_button('Permanently delete')
expect(page).to have_content 'Package deleted successfully'
expect(page).not_to have_content(terraform_module.name)
diff --git a/spec/features/projects/labels/sort_labels_spec.rb b/spec/features/projects/labels/sort_labels_spec.rb
index ecbc4b524dc..f2f1acd2348 100644
--- a/spec/features/projects/labels/sort_labels_spec.rb
+++ b/spec/features/projects/labels/sort_labels_spec.rb
@@ -28,7 +28,7 @@ RSpec.describe 'Sort labels', :js do
it 'sorts by date' do
click_button 'Name'
- sort_options = find('ul.dropdown-menu').all('li').collect(&:text)
+ sort_options = find('ul[role="listbox"]').all('li').collect(&:text)
expect(sort_options[0]).to eq('Name')
expect(sort_options[1]).to eq('Name, descending')
@@ -37,7 +37,7 @@ RSpec.describe 'Sort labels', :js do
expect(sort_options[4]).to eq('Updated date')
expect(sort_options[5]).to eq('Oldest updated')
- click_button 'Name, descending'
+ find('li', text: 'Name, descending').click
# assert default sorting
within '.other-labels' do
diff --git a/spec/features/projects/milestones/milestones_sorting_spec.rb b/spec/features/projects/milestones/milestones_sorting_spec.rb
index c47350fb663..5ba4289fd11 100644
--- a/spec/features/projects/milestones/milestones_sorting_spec.rb
+++ b/spec/features/projects/milestones/milestones_sorting_spec.rb
@@ -42,10 +42,10 @@ RSpec.describe 'Milestones sorting', :js do
milestones_for_sort_by.each do |sort_by, expected_milestones|
within '[data-testid=milestone_sort_by_dropdown]' do
click_button selected_sort_order
- milestones = find('.gl-new-dropdown-contents').all('.gl-new-dropdown-item-text-wrapper p').map(&:text)
+ milestones = find('ul[role="listbox"]').all('li').map(&:text)
expect(milestones).to eq(ordered_milestones)
- click_button sort_by
+ find('li', text: sort_by).click
expect(page).to have_button(sort_by)
end
diff --git a/spec/features/projects/packages_spec.rb b/spec/features/projects/packages_spec.rb
index f518cc1fc63..bbe913cf1e5 100644
--- a/spec/features/projects/packages_spec.rb
+++ b/spec/features/projects/packages_spec.rb
@@ -49,7 +49,7 @@ RSpec.describe 'Packages' do
it 'allows you to delete a package' do
find('[data-testid="delete-dropdown"]').click
find('[data-testid="action-delete"]').click
- click_button('Delete package')
+ click_button('Permanently delete')
expect(page).to have_content 'Package deleted successfully'
expect(page).not_to have_content(package.name)
diff --git a/spec/features/projects/pipeline_schedules_spec.rb b/spec/features/projects/pipeline_schedules_spec.rb
index dcc46f5d223..4ed0a11da38 100644
--- a/spec/features/projects/pipeline_schedules_spec.rb
+++ b/spec/features/projects/pipeline_schedules_spec.rb
@@ -11,6 +11,10 @@ RSpec.describe 'Pipeline Schedules', :js do
let(:scope) { nil }
let!(:user) { create(:user) }
+ before do
+ stub_feature_flags(pipeline_schedules_vue: false)
+ end
+
context 'logged in as the pipeline schedule owner' do
before do
project.add_developer(user)
diff --git a/spec/features/projects/pipelines/legacy_pipeline_spec.rb b/spec/features/projects/pipelines/legacy_pipeline_spec.rb
index 250a336469c..d93c951791d 100644
--- a/spec/features/projects/pipelines/legacy_pipeline_spec.rb
+++ b/spec/features/projects/pipelines/legacy_pipeline_spec.rb
@@ -735,6 +735,8 @@ RSpec.describe 'Pipeline', :js do
end
it 'displays the PipelineSchedule in an inactive state' do
+ stub_feature_flags(pipeline_schedules_vue: false)
+
visit project_pipeline_schedules_path(project)
page.click_link('Inactive')
diff --git a/spec/features/projects/pipelines/pipeline_spec.rb b/spec/features/projects/pipelines/pipeline_spec.rb
index 51a6fbc4d36..0b43e13996f 100644
--- a/spec/features/projects/pipelines/pipeline_spec.rb
+++ b/spec/features/projects/pipelines/pipeline_spec.rb
@@ -860,6 +860,8 @@ RSpec.describe 'Pipeline', :js do
end
it 'displays the PipelineSchedule in an inactive state' do
+ stub_feature_flags(pipeline_schedules_vue: false)
+
visit project_pipeline_schedules_path(project)
page.click_link('Inactive')
diff --git a/spec/features/projects/pipelines/pipelines_spec.rb b/spec/features/projects/pipelines/pipelines_spec.rb
index 404e51048bc..1190b0f3558 100644
--- a/spec/features/projects/pipelines/pipelines_spec.rb
+++ b/spec/features/projects/pipelines/pipelines_spec.rb
@@ -673,7 +673,7 @@ RSpec.describe 'Pipelines', :js do
end
context 'when variables are specified' do
- it 'creates a new pipeline with variables' do
+ it 'creates a new pipeline with variables', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/375552' do
page.within(find("[data-testid='ci-variable-row']")) do
find("[data-testid='pipeline-form-ci-variable-key']").set('key_name')
find("[data-testid='pipeline-form-ci-variable-value']").set('value')
@@ -701,7 +701,7 @@ RSpec.describe 'Pipelines', :js do
it { expect(page).to have_content('Missing CI config file') }
- it 'creates a pipeline after first request failed and a valid gitlab-ci.yml file is available when trying again' do
+ it 'creates a pipeline after first request failed and a valid gitlab-ci.yml file is available when trying again', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/375552' do
stub_ci_pipeline_to_return_yaml_file
expect do
diff --git a/spec/features/projects/releases/user_creates_release_spec.rb b/spec/features/projects/releases/user_creates_release_spec.rb
index d82c4229b71..4eb7581222e 100644
--- a/spec/features/projects/releases/user_creates_release_spec.rb
+++ b/spec/features/projects/releases/user_creates_release_spec.rb
@@ -11,6 +11,7 @@ RSpec.describe 'User creates release', :js do
let_it_be(:user) { create(:user) }
let(:new_page_url) { new_project_release_path(project) }
+ let(:tag_name) { 'new-tag' }
before do
project.add_developer(user)
@@ -33,6 +34,8 @@ RSpec.describe 'User creates release', :js do
end
it 'defaults the "Create from" dropdown to the project\'s default branch' do
+ select_new_tag_name(tag_name)
+
expect(page.find('[data-testid="create-from-field"] .ref-selector button')).to have_content(project.default_branch)
end
diff --git a/spec/features/projects/settings/repository_settings_spec.rb b/spec/features/projects/settings/repository_settings_spec.rb
index 63e0ee4a251..d9bdbf7aa1a 100644
--- a/spec/features/projects/settings/repository_settings_spec.rb
+++ b/spec/features/projects/settings/repository_settings_spec.rb
@@ -25,7 +25,7 @@ RSpec.describe 'Projects > Settings > Repository settings' do
context 'for maintainer' do
let(:role) { :maintainer }
- context 'Deploy tokens' do
+ context 'Deploy tokens', :js do
let!(:deploy_token) { create(:deploy_token, projects: [project]) }
before do
diff --git a/spec/features/projects/settings/user_changes_default_branch_spec.rb b/spec/features/projects/settings/user_changes_default_branch_spec.rb
index 84e6c50cf61..508bbcc5327 100644
--- a/spec/features/projects/settings/user_changes_default_branch_spec.rb
+++ b/spec/features/projects/settings/user_changes_default_branch_spec.rb
@@ -3,8 +3,6 @@
require 'spec_helper'
RSpec.describe 'Projects > Settings > User changes default branch' do
- include Select2Helper
-
let(:user) { create(:user) }
before do
@@ -17,16 +15,21 @@ RSpec.describe 'Projects > Settings > User changes default branch' do
let(:project) { create(:project, :repository, namespace: user.namespace) }
it 'allows to change the default branch', :js do
+ dropdown_selector = '[data-testid="default-branch-dropdown"]'
# Otherwise, running JS may overwrite our change to project_default_branch
wait_for_requests
- select2('fix', from: '#project_default_branch')
+ expect(page).to have_selector(dropdown_selector)
+ find(dropdown_selector).click
+
+ fill_in 'Search branch', with: 'fix'
+ click_button 'fix'
page.within '#default-branch-settings' do
click_button 'Save changes'
end
- expect(find('#project_default_branch', visible: false).value).to eq 'fix'
+ expect(find("#{dropdown_selector} input", visible: false).value).to eq 'fix'
end
end
@@ -34,7 +37,7 @@ RSpec.describe 'Projects > Settings > User changes default branch' do
let(:project) { create(:project_empty_repo, namespace: user.namespace) }
it 'does not show default branch selector' do
- expect(page).not_to have_selector('#project_default_branch')
+ expect(page).not_to have_selector('[data-testid="default-branch-dropdown"]')
end
end
end
diff --git a/spec/features/projects/settings/user_transfers_a_project_spec.rb b/spec/features/projects/settings/user_transfers_a_project_spec.rb
index 6041dca305b..23e10a36cee 100644
--- a/spec/features/projects/settings/user_transfers_a_project_spec.rb
+++ b/spec/features/projects/settings/user_transfers_a_project_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe 'Projects > Settings > User transfers a project', :js do
let(:group) { create(:group) }
before do
- stub_const('Gitlab::QueryLimiting::Transaction::THRESHOLD', 120)
+ allow(Gitlab::QueryLimiting::Transaction).to receive(:threshold).and_return(120)
group.add_owner(user)
sign_in(user)
diff --git a/spec/features/projects/settings/webhooks_settings_spec.rb b/spec/features/projects/settings/webhooks_settings_spec.rb
index d525544ac15..25752bcaf45 100644
--- a/spec/features/projects/settings/webhooks_settings_spec.rb
+++ b/spec/features/projects/settings/webhooks_settings_spec.rb
@@ -48,10 +48,10 @@ RSpec.describe 'Projects > Settings > Webhook Settings' do
expect(page).to have_content('Releases events')
end
- it 'create webhook' do
+ it 'create webhook', :js do
visit webhooks_path
- fill_in 'hook_url', with: url
+ fill_in 'URL', with: url
check 'Tag push events'
fill_in 'hook_push_events_branch_filter', with: 'master'
check 'Enable SSL verification'
@@ -66,12 +66,12 @@ RSpec.describe 'Projects > Settings > Webhook Settings' do
expect(page).to have_content('Job events')
end
- it 'edit existing webhook' do
+ it 'edit existing webhook', :js do
hook
visit webhooks_path
click_link 'Edit'
- fill_in 'hook_url', with: url
+ fill_in 'URL', with: url
check 'Enable SSL verification'
click_button 'Save changes'
diff --git a/spec/features/projects/show/user_interacts_with_stars_spec.rb b/spec/features/projects/show/user_interacts_with_stars_spec.rb
index e0dd4f65010..158b6aa9b46 100644
--- a/spec/features/projects/show/user_interacts_with_stars_spec.rb
+++ b/spec/features/projects/show/user_interacts_with_stars_spec.rb
@@ -13,6 +13,14 @@ RSpec.describe 'Projects > Show > User interacts with project stars' do
visit(project_path(project))
end
+ it 'retains the star count even after a page reload' do
+ star_project
+
+ reload_page
+
+ expect(page).to have_css('.star-count', text: 1)
+ end
+
it 'toggles the star' do
star_project
@@ -63,6 +71,10 @@ end
private
+def reload_page
+ visit current_path
+end
+
def star_project
click_button(_('Star'))
wait_for_requests
diff --git a/spec/features/projects/show/user_sees_collaboration_links_spec.rb b/spec/features/projects/show/user_sees_collaboration_links_spec.rb
index 1440db141a6..c63427e56e6 100644
--- a/spec/features/projects/show/user_sees_collaboration_links_spec.rb
+++ b/spec/features/projects/show/user_sees_collaboration_links_spec.rb
@@ -5,8 +5,8 @@ require 'spec_helper'
RSpec.describe 'Projects > Show > Collaboration links', :js do
using RSpec::Parameterized::TableSyntax
- let(:project) { create(:project, :repository, :public) }
- let(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :repository, :public) }
+ let_it_be(:user) { create(:user) }
before do
sign_in(user)
@@ -17,7 +17,7 @@ RSpec.describe 'Projects > Show > Collaboration links', :js do
end
context 'with developer user' do
- before do
+ before_all do
project.add_developer(user)
end
diff --git a/spec/features/projects/user_sorts_projects_spec.rb b/spec/features/projects/user_sorts_projects_spec.rb
index b9b28398279..c40f01f3aa1 100644
--- a/spec/features/projects/user_sorts_projects_spec.rb
+++ b/spec/features/projects/user_sorts_projects_spec.rb
@@ -24,7 +24,6 @@ RSpec.describe 'User sorts projects and order persists' do
end
it "is set on the group_canonical_path" do
- stub_feature_flags(group_overview_tabs_vue: false)
visit(group_canonical_path(group))
within '[data-testid=group_sort_by_dropdown]' do
@@ -33,7 +32,6 @@ RSpec.describe 'User sorts projects and order persists' do
end
it "is set on the details_group_path" do
- stub_feature_flags(group_overview_tabs_vue: false)
visit(details_group_path(group))
within '[data-testid=group_sort_by_dropdown]' do
@@ -42,7 +40,7 @@ RSpec.describe 'User sorts projects and order persists' do
end
end
- context "from explore projects" do
+ context "from explore projects", :js do
before do
sign_in(user)
visit(explore_projects_path)
@@ -50,10 +48,10 @@ RSpec.describe 'User sorts projects and order persists' do
first(:link, 'Updated date').click
end
- it_behaves_like "sort order persists across all views", 'Updated date', 'Updated date'
+ it_behaves_like "sort order persists across all views", 'Updated date', 'Updated'
end
- context 'from dashboard projects' do
+ context 'from dashboard projects', :js do
before do
sign_in(user)
visit(dashboard_projects_path)
@@ -66,29 +64,29 @@ RSpec.describe 'User sorts projects and order persists' do
context 'from group homepage', :js do
before do
- stub_feature_flags(group_overview_tabs_vue: false)
sign_in(user)
visit(group_canonical_path(group))
within '[data-testid=group_sort_by_dropdown]' do
find('button.gl-dropdown-toggle').click
- first(:button, 'Last created').click
+ first(:button, 'Created').click
+ wait_for_requests
end
end
- it_behaves_like "sort order persists across all views", "Created date", "Last created"
+ it_behaves_like "sort order persists across all views", "Created date", "Created"
end
context 'from group details', :js do
before do
- stub_feature_flags(group_overview_tabs_vue: false)
sign_in(user)
visit(details_group_path(group))
within '[data-testid=group_sort_by_dropdown]' do
find('button.gl-dropdown-toggle').click
- first(:button, 'Most stars').click
+ first(:button, 'Stars').click
+ wait_for_requests
end
end
- it_behaves_like "sort order persists across all views", "Stars", "Most stars"
+ it_behaves_like "sort order persists across all views", "Stars", "Stars"
end
end
diff --git a/spec/features/projects/wiki/user_views_wiki_in_project_page_spec.rb b/spec/features/projects/wiki/user_views_wiki_in_project_page_spec.rb
index fbb5c24f6e1..db2b3fc2f4b 100644
--- a/spec/features/projects/wiki/user_views_wiki_in_project_page_spec.rb
+++ b/spec/features/projects/wiki/user_views_wiki_in_project_page_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe 'Projects > Wiki > User views wiki in project page' do
end
context 'when repository is disabled for project' do
- let_it_be(:project) do
+ let(:project) do
create(:project,
:wiki_repo,
:repository_disabled,
@@ -17,16 +17,31 @@ RSpec.describe 'Projects > Wiki > User views wiki in project page' do
end
context 'when wiki homepage contains a link' do
- before do
- create(:wiki_page, wiki: project.wiki, title: 'home', content: '[some link](other-page)')
+ shared_examples 'wiki homepage contains a link' do
+ it 'displays the correct URL for the link' do
+ visit project_path(project)
+ expect(page).to have_link(
+ 'some link',
+ href: project_wiki_path(project, 'other-page')
+ )
+ end
end
- it 'displays the correct URL for the link' do
- visit project_path(project)
- expect(page).to have_link(
- 'some link',
- href: project_wiki_path(project, 'other-page')
- )
+ context 'when using markdown' do
+ before do
+ create(:wiki_page, wiki: project.wiki, title: 'home', content: '[some link](other-page)')
+ end
+
+ it_behaves_like 'wiki homepage contains a link'
+ end
+
+ context 'when using asciidoc' do
+ before do
+ create(:wiki_page, wiki: project.wiki, title: 'home', content: 'link:other-page[some link]',
+ format: :asciidoc)
+ end
+
+ it_behaves_like 'wiki homepage contains a link'
end
end
end
diff --git a/spec/features/protected_branches_spec.rb b/spec/features/protected_branches_spec.rb
index 389a51a10e0..174716d646d 100644
--- a/spec/features/protected_branches_spec.rb
+++ b/spec/features/protected_branches_spec.rb
@@ -183,7 +183,7 @@ RSpec.describe 'Protected Branches', :js do
end
include_examples 'Deploy keys with protected branches' do
- let(:all_dropdown_sections) { %w(Roles Deploy\ Keys) }
+ let(:all_dropdown_sections) { ['Roles', 'Deploy Keys'] }
end
end
end
diff --git a/spec/features/runners_spec.rb b/spec/features/runners_spec.rb
index 482f3d62f36..cee0910aef7 100644
--- a/spec/features/runners_spec.rb
+++ b/spec/features/runners_spec.rb
@@ -160,16 +160,6 @@ RSpec.describe 'Runners' do
end
context 'shared runner text' do
- context 'when application settings have no shared_runners_text' do
- it 'user sees default shared runners description' do
- visit project_runners_path(project)
-
- page.within("[data-testid='shared-runners-description']") do
- expect(page).to have_content('The same shared runner executes code from multiple projects')
- end
- end
- end
-
context 'when application settings have shared_runners_text' do
let(:shared_runners_text) { 'custom **shared** runners description' }
let(:shared_runners_html) { 'custom shared runners description' }
diff --git a/spec/features/search/user_searches_for_code_spec.rb b/spec/features/search/user_searches_for_code_spec.rb
index e2c8708be78..50e6eb66466 100644
--- a/spec/features/search/user_searches_for_code_spec.rb
+++ b/spec/features/search/user_searches_for_code_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe 'User searches for code' do
context 'when signed in' do
before do
+ stub_feature_flags(search_page_vertical_nav: false)
project.add_maintainer(user)
sign_in(user)
end
@@ -214,6 +215,7 @@ RSpec.describe 'User searches for code' do
let(:project) { create(:project, :public, :repository) }
before do
+ stub_feature_flags(search_page_vertical_nav: false)
visit(project_path(project))
end
diff --git a/spec/features/search/user_searches_for_comments_spec.rb b/spec/features/search/user_searches_for_comments_spec.rb
index 5185a2460dc..a6793bc3aa7 100644
--- a/spec/features/search/user_searches_for_comments_spec.rb
+++ b/spec/features/search/user_searches_for_comments_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe 'User searches for comments' do
let(:user) { create(:user) }
before do
+ stub_feature_flags(search_page_vertical_nav: false)
project.add_reporter(user)
sign_in(user)
diff --git a/spec/features/search/user_searches_for_commits_spec.rb b/spec/features/search/user_searches_for_commits_spec.rb
index 2dceda09d7c..4ec2a9e6cff 100644
--- a/spec/features/search/user_searches_for_commits_spec.rb
+++ b/spec/features/search/user_searches_for_commits_spec.rb
@@ -3,13 +3,12 @@
require 'spec_helper'
RSpec.describe 'User searches for commits', :js do
- include CycleAnalyticsHelpers
-
let(:project) { create(:project, :repository) }
let(:sha) { '6d394385cf567f80a8fd85055db1ab4c5295806f' }
let(:user) { create(:user) }
before do
+ stub_feature_flags(search_page_vertical_nav: false)
project.add_reporter(user)
sign_in(user)
@@ -34,7 +33,12 @@ RSpec.describe 'User searches for commits', :js do
context 'when searching by message' do
it 'finds a commit and holds on /search page' do
- create_commit('Message referencing another sha: "deadbeef"', project, user, 'master')
+ project.repository.commit_files(
+ user,
+ message: 'Message referencing another sha: "deadbeef"',
+ branch_name: 'master',
+ actions: [{ action: :create, file_path: 'a/new.file', contents: 'new file' }]
+ )
submit_search('deadbeef')
diff --git a/spec/features/search/user_searches_for_issues_spec.rb b/spec/features/search/user_searches_for_issues_spec.rb
index c23a54594d4..51d2f355848 100644
--- a/spec/features/search/user_searches_for_issues_spec.rb
+++ b/spec/features/search/user_searches_for_issues_spec.rb
@@ -18,6 +18,7 @@ RSpec.describe 'User searches for issues', :js do
before do
project.add_maintainer(user)
sign_in(user)
+ stub_feature_flags(search_page_vertical_nav: false)
visit(search_path)
end
@@ -110,6 +111,7 @@ RSpec.describe 'User searches for issues', :js do
before do
stub_feature_flags(block_anonymous_global_searches: false)
+ stub_feature_flags(search_page_vertical_nav: false)
visit(search_path)
end
@@ -127,6 +129,7 @@ RSpec.describe 'User searches for issues', :js do
context 'when block_anonymous_global_searches is enabled' do
before do
+ stub_feature_flags(search_page_vertical_nav: false)
visit(search_path)
end
diff --git a/spec/features/search/user_searches_for_merge_requests_spec.rb b/spec/features/search/user_searches_for_merge_requests_spec.rb
index 61c61d793db..a4fbe3a6e59 100644
--- a/spec/features/search/user_searches_for_merge_requests_spec.rb
+++ b/spec/features/search/user_searches_for_merge_requests_spec.rb
@@ -15,6 +15,7 @@ RSpec.describe 'User searches for merge requests', :js do
end
before do
+ stub_feature_flags(search_page_vertical_nav: false)
project.add_maintainer(user)
sign_in(user)
diff --git a/spec/features/search/user_searches_for_milestones_spec.rb b/spec/features/search/user_searches_for_milestones_spec.rb
index 61f2e8e0c8f..6773059830c 100644
--- a/spec/features/search/user_searches_for_milestones_spec.rb
+++ b/spec/features/search/user_searches_for_milestones_spec.rb
@@ -11,6 +11,7 @@ RSpec.describe 'User searches for milestones', :js do
before do
project.add_maintainer(user)
sign_in(user)
+ stub_feature_flags(search_page_vertical_nav: false)
visit(search_path)
end
diff --git a/spec/features/search/user_searches_for_projects_spec.rb b/spec/features/search/user_searches_for_projects_spec.rb
index 562da56275c..5902859d1f5 100644
--- a/spec/features/search/user_searches_for_projects_spec.rb
+++ b/spec/features/search/user_searches_for_projects_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe 'User searches for projects', :js do
context 'when signed out' do
context 'when block_anonymous_global_searches is disabled' do
before do
+ stub_feature_flags(search_page_vertical_nav: false)
allow(Gitlab::ApplicationRateLimiter).to receive(:threshold).with(:search_rate_limit).and_return(1000)
allow(Gitlab::ApplicationRateLimiter).to receive(:threshold).with(:search_rate_limit_unauthenticated).and_return(1000)
stub_feature_flags(block_anonymous_global_searches: false)
diff --git a/spec/features/search/user_searches_for_users_spec.rb b/spec/features/search/user_searches_for_users_spec.rb
index a5cf12fa068..e21a66fed92 100644
--- a/spec/features/search/user_searches_for_users_spec.rb
+++ b/spec/features/search/user_searches_for_users_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe 'User searches for users' do
let(:user3) { create(:user, username: 'gob_2018', name: 'George Oscar Bluth') }
before do
+ stub_feature_flags(search_page_vertical_nav: false)
sign_in(user1)
end
diff --git a/spec/features/search/user_searches_for_wiki_pages_spec.rb b/spec/features/search/user_searches_for_wiki_pages_spec.rb
index 9808383adb7..2e390309022 100644
--- a/spec/features/search/user_searches_for_wiki_pages_spec.rb
+++ b/spec/features/search/user_searches_for_wiki_pages_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe 'User searches for wiki pages', :js do
let!(:wiki_page) { create(:wiki_page, wiki: project.wiki, title: 'directory/title', content: 'Some Wiki content') }
before do
+ stub_feature_flags(search_page_vertical_nav: false)
project.add_maintainer(user)
sign_in(user)
@@ -18,6 +19,10 @@ RSpec.describe 'User searches for wiki pages', :js do
include_examples 'search timeouts', 'wiki_blobs'
shared_examples 'search wiki blobs' do
+ before do
+ stub_feature_flags(search_page_vertical_nav: false)
+ end
+
it 'finds a page' do
find('[data-testid="project-filter"]').click
diff --git a/spec/features/search/user_uses_header_search_field_spec.rb b/spec/features/search/user_uses_header_search_field_spec.rb
index 41288a34fb2..827e3984896 100644
--- a/spec/features/search/user_uses_header_search_field_spec.rb
+++ b/spec/features/search/user_uses_header_search_field_spec.rb
@@ -17,6 +17,7 @@ RSpec.describe 'User uses header search field', :js do
end
before do
+ stub_feature_flags(search_page_vertical_nav: false)
allow(Gitlab::ApplicationRateLimiter).to receive(:threshold).and_return(0)
allow(Gitlab::ApplicationRateLimiter).to receive(:threshold).with(:search_rate_limit).and_return(1000)
allow(Gitlab::ApplicationRateLimiter).to receive(:threshold).with(:search_rate_limit_unauthenticated).and_return(1000)
diff --git a/spec/features/snippets/search_snippets_spec.rb b/spec/features/snippets/search_snippets_spec.rb
index 46bc3b7caad..69b9a0aa64d 100644
--- a/spec/features/snippets/search_snippets_spec.rb
+++ b/spec/features/snippets/search_snippets_spec.rb
@@ -3,6 +3,10 @@
require 'spec_helper'
RSpec.describe 'Search Snippets' do
+ before do
+ stub_feature_flags(search_page_vertical_nav: false)
+ end
+
it 'user searches for snippets by title' do
public_snippet = create(:personal_snippet, :public, title: 'Beginning and Middle')
private_snippet = create(:personal_snippet, :private, title: 'Middle and End')
diff --git a/spec/features/tags/developer_creates_tag_spec.rb b/spec/features/tags/developer_creates_tag_spec.rb
index ca76a94092e..5657115fb3c 100644
--- a/spec/features/tags/developer_creates_tag_spec.rb
+++ b/spec/features/tags/developer_creates_tag_spec.rb
@@ -46,18 +46,6 @@ RSpec.describe 'Developer creates tag' do
end
end
- it 'with multiline release notes parses the release note as Markdown' do
- create_tag_in_form(tag: 'v4.0', ref: 'master', desc: "Awesome release notes\n\n- hello\n- world")
-
- expect(page).to have_current_path(
- project_tag_path(project, 'v4.0'), ignore_query: true)
- expect(page).to have_content 'v4.0'
- page.within '.description' do
- expect(page).to have_content 'Awesome release notes'
- expect(page).to have_selector('ul li', count: 2)
- end
- end
-
it 'opens dropdown for ref', :js do
click_link 'New tag'
ref_row = find('.form-group:nth-of-type(2) .col-sm-12')
@@ -73,19 +61,6 @@ RSpec.describe 'Developer creates tag' do
end
end
- context 'from new tag page' do
- before do
- visit new_project_tag_path(project)
- end
-
- it 'description has emoji autocomplete', :js do
- find('#release_description').native.send_keys('')
- fill_in 'release_description', with: ':'
-
- expect(page).to have_selector('.atwho-view')
- end
- end
-
def create_tag_in_form(tag:, ref:, message: nil, desc: nil)
click_link 'New tag'
fill_in 'tag_name', with: tag
diff --git a/spec/features/unsubscribe_links_spec.rb b/spec/features/unsubscribe_links_spec.rb
index 5317f586390..12d2f0a9bb6 100644
--- a/spec/features/unsubscribe_links_spec.rb
+++ b/spec/features/unsubscribe_links_spec.rb
@@ -2,14 +2,15 @@
require 'spec_helper'
-RSpec.describe 'Unsubscribe links', :sidekiq_might_not_need_inline do
+RSpec.describe 'Unsubscribe links', :sidekiq_inline do
include Warden::Test::Helpers
- let(:recipient) { create(:user) }
- let(:author) { create(:user) }
- let(:project) { create(:project, :public) }
- let(:params) { { title: 'A bug!', description: 'Fix it!', assignees: [recipient] } }
- let(:issue) { Issues::CreateService.new(project: project, current_user: author, params: params, spam_params: nil).execute }
+ let_it_be(:project) { create(:project, :public) }
+ let_it_be(:author) { create(:user).tap { |u| project.add_reporter(u) } }
+ let_it_be(:recipient) { create(:user) }
+
+ let(:params) { { title: 'A bug!', description: 'Fix it!', assignee_ids: [recipient.id] } }
+ let(:issue) { Issues::CreateService.new(project: project, current_user: author, params: params, spam_params: nil).execute[:issue] }
let(:mail) { ActionMailer::Base.deliveries.last }
let(:body) { Capybara::Node::Simple.new(mail.default_part_body.to_s) }
diff --git a/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb b/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb
index cbd2d30d726..02f9d57fcfe 100644
--- a/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb
+++ b/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb
@@ -31,7 +31,7 @@ RSpec.describe 'User uploads avatar to profile' do
wait_for_all_requests
- data_uri = find('.avatar-image .avatar')['src']
+ data_uri = find('.avatar-image .gl-avatar')['src']
expect(page.find('.header-user-avatar')['src']).to eq data_uri
expect(page.find('[data-testid="sidebar-user-avatar"]')['src']).to eq data_uri
end
diff --git a/spec/features/user_opens_link_to_comment_spec.rb b/spec/features/user_opens_link_to_comment_spec.rb
index 3fb1505ff5b..59dea91c666 100644
--- a/spec/features/user_opens_link_to_comment_spec.rb
+++ b/spec/features/user_opens_link_to_comment_spec.rb
@@ -20,7 +20,7 @@ RSpec.describe 'User opens link to comment', :js do
wait_for_requests
- expect(find('#discussion-preferences-dropdown')).to have_content('Sort or filter')
+ expect(find('#discussion-preferences-dropdown')).to have_content(_('Sort or filter'))
expect(page).not_to have_content('Something went wrong while fetching comments')
# Auto-switching to show all notes shouldn't be persisted
diff --git a/spec/features/users/signup_spec.rb b/spec/features/users/signup_spec.rb
index de53e722603..9b1a102f07b 100644
--- a/spec/features/users/signup_spec.rb
+++ b/spec/features/users/signup_spec.rb
@@ -349,7 +349,6 @@ RSpec.describe 'Signup' do
end
it 'redirects to step 2 of the signup process, sets the role and redirects back' do
- stub_feature_flags(about_your_company_registration_flow: false)
visit new_user_registration_path
fill_in_signup_form
diff --git a/spec/features/work_items/work_item_spec.rb b/spec/features/work_items/work_item_spec.rb
new file mode 100644
index 00000000000..686b82de868
--- /dev/null
+++ b/spec/features/work_items/work_item_spec.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Work item', :js do
+ let_it_be(:project) { create(:project, :public) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:work_item) { create(:work_item, project: project) }
+
+ context 'for signed in user' do
+ before do
+ project.add_developer(user)
+
+ sign_in(user)
+
+ visit project_work_items_path(project, work_items_path: work_item.id)
+ end
+
+ context 'in work item description' do
+ it 'shows GFM autocomplete', :aggregate_failures do
+ click_button "Edit description"
+
+ find('[aria-label="Description"]').send_keys("@#{user.username}")
+
+ wait_for_requests
+
+ page.within('.atwho-container') do
+ expect(page).to have_text(user.name)
+ end
+ end
+ end
+ end
+end