diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-04-20 13:00:54 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-04-20 13:00:54 +0300 |
commit | 3cccd102ba543e02725d247893729e5c73b38295 (patch) | |
tree | f36a04ec38517f5deaaacb5acc7d949688d1e187 /spec/support/shared_examples/features | |
parent | 205943281328046ef7b4528031b90fbda70c75ac (diff) |
Add latest changes from gitlab-org/gitlab@14-10-stable-eev14.10.0-rc42
Diffstat (limited to 'spec/support/shared_examples/features')
8 files changed, 366 insertions, 22 deletions
diff --git a/spec/support/shared_examples/features/access_tokens_shared_examples.rb b/spec/support/shared_examples/features/access_tokens_shared_examples.rb index ae246a87bb6..215d9d3e5a8 100644 --- a/spec/support/shared_examples/features/access_tokens_shared_examples.rb +++ b/spec/support/shared_examples/features/access_tokens_shared_examples.rb @@ -29,15 +29,15 @@ RSpec.shared_examples 'resource access tokens creation' do |resource_type| click_on '1' # Scopes - check 'api' check 'read_api' + check 'read_repository' click_on "Create #{resource_type} access token" expect(active_resource_access_tokens).to have_text(name) expect(active_resource_access_tokens).to have_text('in') - expect(active_resource_access_tokens).to have_text('api') expect(active_resource_access_tokens).to have_text('read_api') + expect(active_resource_access_tokens).to have_text('read_repository') expect(active_resource_access_tokens).to have_text('Maintainer') expect(created_resource_access_token).not_to be_empty end diff --git a/spec/support/shared_examples/features/content_editor_shared_examples.rb b/spec/support/shared_examples/features/content_editor_shared_examples.rb index 2332285540a..5c44cb7f04b 100644 --- a/spec/support/shared_examples/features/content_editor_shared_examples.rb +++ b/spec/support/shared_examples/features/content_editor_shared_examples.rb @@ -1,14 +1,48 @@ # frozen_string_literal: true RSpec.shared_examples 'edits content using the content editor' do - it 'formats text as bold using bubble menu' do - content_editor_testid = '[data-testid="content-editor"] [contenteditable]' + content_editor_testid = '[data-testid="content-editor"] [contenteditable].ProseMirror' - expect(page).to have_css(content_editor_testid) + describe 'formatting bubble menu' do + it 'shows a formatting bubble menu for a regular paragraph' do + expect(page).to have_css(content_editor_testid) - find(content_editor_testid).send_keys 'Typing text in the content editor' - find(content_editor_testid).send_keys [:shift, :left] + find(content_editor_testid).send_keys 'Typing text in the content editor' + find(content_editor_testid).send_keys [:shift, :left] - expect(page).to have_css('[data-testid="formatting-bubble-menu"]') + expect(page).to have_css('[data-testid="formatting-bubble-menu"]') + end + + it 'does not show a formatting bubble menu for code' do + find(content_editor_testid).send_keys 'This is a `code`' + find(content_editor_testid).send_keys [:shift, :left] + + expect(page).not_to have_css('[data-testid="formatting-bubble-menu"]') + end + end + + describe 'code block bubble menu' do + it 'shows a code block bubble menu for a code block' do + find(content_editor_testid).send_keys '```js ' # trigger input rule + find(content_editor_testid).send_keys 'var a = 0' + find(content_editor_testid).send_keys [:shift, :left] + + expect(page).not_to have_css('[data-testid="formatting-bubble-menu"]') + expect(page).to have_css('[data-testid="code-block-bubble-menu"]') + end + + it 'sets code block type to "javascript" for `js`' do + find(content_editor_testid).send_keys '```js ' + find(content_editor_testid).send_keys 'var a = 0' + + expect(find('[data-testid="code-block-bubble-menu"]')).to have_text('Javascript') + end + + it 'sets code block type to "Custom (nomnoml)" for `nomnoml`' do + find(content_editor_testid).send_keys '```nomnoml ' + find(content_editor_testid).send_keys 'test' + + expect(find('[data-testid="code-block-bubble-menu"]')).to have_text('Custom (nomnoml)') + end end end diff --git a/spec/support/shared_examples/features/inviting_members_shared_examples.rb b/spec/support/shared_examples/features/inviting_members_shared_examples.rb new file mode 100644 index 00000000000..58357b262f5 --- /dev/null +++ b/spec/support/shared_examples/features/inviting_members_shared_examples.rb @@ -0,0 +1,175 @@ +# frozen_string_literal: true + +RSpec.shared_examples 'inviting members' do |snowplow_invite_label| + before_all do + group.add_owner(user1) + end + + it 'adds user as member', :js, :snowplow, :aggregate_failures do + visit members_page_path + + invite_member(user2.name, role: 'Reporter') + + page.within find_member_row(user2) do + expect(page).to have_button('Reporter') + end + + expect_snowplow_event( + category: 'Members::InviteService', + action: 'create_member', + label: snowplow_invite_label, + property: 'existing_user', + user: user1 + ) + end + + it 'invites user by email', :js, :snowplow, :aggregate_failures do + visit members_page_path + + invite_member('test@example.com', role: 'Reporter') + + click_link 'Invited' + + page.within find_invited_member_row('test@example.com') do + expect(page).to have_button('Reporter') + end + + expect_snowplow_event( + category: 'Members::InviteService', + action: 'create_member', + label: snowplow_invite_label, + property: 'net_new_user', + user: user1 + ) + end + + it 'invites user by username and invites user by email', :js, :aggregate_failures do + visit members_page_path + + invite_member([user2.name, 'test@example.com'], role: 'Reporter') + + page.within find_member_row(user2) do + expect(page).to have_button('Reporter') + end + + click_link 'Invited' + + page.within find_invited_member_row('test@example.com') do + expect(page).to have_button('Reporter') + end + end + + context 'when member is already a member by username' do + it 'updates the member for that user', :js do + visit members_page_path + + invite_member(user2.name, role: 'Developer') + + invite_member(user2.name, role: 'Reporter', refresh: false) + + expect(page).not_to have_selector(invite_modal_selector) + + page.refresh + + page.within find_invited_member_row(user2.name) do + expect(page).to have_button('Reporter') + end + end + end + + context 'when member is already a member by email' do + it 'fails with an error', :js do + visit members_page_path + + invite_member('test@example.com', role: 'Developer') + + invite_member('test@example.com', role: 'Reporter', refresh: false) + + expect(page).to have_selector(invite_modal_selector) + expect(page).to have_content("The member's email address has already been taken") + + page.refresh + + click_link 'Invited' + + page.within find_invited_member_row('test@example.com') do + expect(page).to have_button('Developer') + end + end + end + + context 'when inviting a parent group member to the sub-entity' do + before_all do + group.add_owner(user1) + group.add_developer(user2) + end + + context 'when role is higher than parent group membership' do + let(:role) { 'Maintainer' } + + it 'adds the user as a member on sub-entity with higher access level', :js do + visit subentity_members_page_path + + invite_member(user2.name, role: role, refresh: false) + + expect(page).not_to have_selector(invite_modal_selector) + + page.refresh + + page.within find_invited_member_row(user2.name) do + expect(page).to have_button(role) + end + end + end + + context 'when role is lower than parent group membership' do + let(:role) { 'Reporter' } + + it 'fails with an error', :js do + visit subentity_members_page_path + + invite_member(user2.name, role: role, refresh: false) + + expect(page).to have_selector(invite_modal_selector) + expect(page).to have_content "Access level should be greater than or equal to Developer inherited membership " \ + "from group #{group.name}" + + page.refresh + + page.within find_invited_member_row(user2.name) do + expect(page).to have_content('Developer') + expect(page).not_to have_button('Developer') + end + end + + context 'when there are multiple users invited with errors' do + let_it_be(:user3) { create(:user) } + + before do + group.add_maintainer(user3) + end + + it 'only shows the first user error', :js do + visit subentity_members_page_path + + invite_member([user2.name, user3.name], role: role, refresh: false) + + expect(page).to have_selector(invite_modal_selector) + expect(page).to have_text("Access level should be greater than or equal to", count: 1) + + page.refresh + + page.within find_invited_member_row(user2.name) do + expect(page).to have_content('Developer') + expect(page).not_to have_button('Developer') + end + + page.within find_invited_member_row(user3.name) do + expect(page).to have_content('Maintainer') + expect(page).not_to have_button('Maintainer') + end + end + end + end + end +end diff --git a/spec/support/shared_examples/features/project_upload_files_shared_examples.rb b/spec/support/shared_examples/features/project_upload_files_shared_examples.rb index 066c3e17a09..0a5ad5a59c0 100644 --- a/spec/support/shared_examples/features/project_upload_files_shared_examples.rb +++ b/spec/support/shared_examples/features/project_upload_files_shared_examples.rb @@ -62,7 +62,7 @@ RSpec.shared_examples 'it uploads and commits a new image file' do |drop: false| visit(project_blob_path(project, 'upload_image/logo_sample.svg')) - expect(page).to have_css('.file-content img') + expect(page).to have_css('.file-holder img') end end diff --git a/spec/support/shared_examples/features/runners_shared_examples.rb b/spec/support/shared_examples/features/runners_shared_examples.rb new file mode 100644 index 00000000000..d9460c7b8f1 --- /dev/null +++ b/spec/support/shared_examples/features/runners_shared_examples.rb @@ -0,0 +1,141 @@ +# frozen_string_literal: true + +RSpec.shared_examples 'shows and resets runner registration token' do + include Spec::Support::Helpers::ModalHelpers + include Spec::Support::Helpers::Features::RunnersHelpers + + before do + click_on dropdown_text + end + + describe 'shows registration instructions' do + before do + click_on 'Show runner installation and registration instructions' + + wait_for_requests + end + + it 'opens runner installation modal', :aggregate_failures do + within_modal do + expect(page).to have_text "Install a runner" + expect(page).to have_text "Environment" + expect(page).to have_text "Architecture" + expect(page).to have_text "Download and install binary" + end + end + + it 'dismisses runner installation modal' do + within_modal do + click_button('Close', match: :first) + end + + expect(page).not_to have_text "Install a runner" + end + end + + it 'has a registration token' do + click_on 'Click to reveal' + expect(page.find('[data-testid="token-value"] input').value).to have_content(registration_token) + end + + describe 'reset registration token' do + let!(:old_registration_token) { find('[data-testid="token-value"] input').value } + + before do + click_on 'Reset registration token' + + within_modal do + click_button('Reset token', match: :first) + end + + wait_for_requests + end + + it 'changes registration token' do + expect(find('.gl-toast')).to have_content('New registration token generated!') + + click_on dropdown_text + click_on 'Click to reveal' + + expect(old_registration_token).not_to eq registration_token + end + end +end + +RSpec.shared_examples 'shows no runners' do + it 'shows counts with 0' do + expect(page).to have_text "Online runners 0" + expect(page).to have_text "Offline runners 0" + expect(page).to have_text "Stale runners 0" + end + + it 'shows "no runners" message' do + expect(page).to have_text 'No runners found' + end +end + +RSpec.shared_examples 'shows runner in list' do + it 'does not show empty state' do + expect(page).not_to have_content 'No runners found' + end + + it 'shows runner row' do + within_runner_row(runner.id) do + expect(page).to have_text "##{runner.id}" + expect(page).to have_text runner.short_sha + expect(page).to have_text runner.description + end + end +end + +RSpec.shared_examples 'pauses, resumes and deletes a runner' do + include Spec::Support::Helpers::ModalHelpers + + it 'pauses and resumes runner' do + within_runner_row(runner.id) do + click_button "Pause" + + expect(page).to have_text 'paused' + expect(page).to have_button 'Resume' + expect(page).not_to have_button 'Pause' + + click_button "Resume" + + expect(page).not_to have_text 'paused' + expect(page).not_to have_button 'Resume' + expect(page).to have_button 'Pause' + end + end + + describe 'deletes runner' do + before do + within_runner_row(runner.id) do + click_on 'Delete runner' + end + end + + it 'shows a confirmation modal' do + expect(page).to have_text "Delete runner ##{runner.id} (#{runner.short_sha})?" + expect(page).to have_text "Are you sure you want to continue?" + end + + it 'deletes a runner' do + within_modal do + click_on 'Delete runner' + end + + expect(page.find('.gl-toast')).to have_text(/Runner .+ deleted/) + expect(page).not_to have_content runner.description + end + + it 'cancels runner deletion' do + within_modal do + click_on 'Cancel' + end + + wait_for_requests + + expect(page).to have_content runner.description + end + end +end diff --git a/spec/support/shared_examples/features/search/search_timeouts_shared_examples.rb b/spec/support/shared_examples/features/search/search_timeouts_shared_examples.rb index bb5460e2a6f..095c48cade8 100644 --- a/spec/support/shared_examples/features/search/search_timeouts_shared_examples.rb +++ b/spec/support/shared_examples/features/search/search_timeouts_shared_examples.rb @@ -11,6 +11,7 @@ RSpec.shared_examples 'search timeouts' do |scope| end it 'renders timeout information' do + # expect(page).to have_content('This endpoint has been requested too many times.') expect(page).to have_content('Your search timed out') end diff --git a/spec/support/shared_examples/features/wiki/user_creates_wiki_page_shared_examples.rb b/spec/support/shared_examples/features/wiki/user_creates_wiki_page_shared_examples.rb index f676b6aa60d..41b1964cff0 100644 --- a/spec/support/shared_examples/features/wiki/user_creates_wiki_page_shared_examples.rb +++ b/spec/support/shared_examples/features/wiki/user_creates_wiki_page_shared_examples.rb @@ -20,6 +20,12 @@ RSpec.shared_examples 'User creates wiki page' do click_link "Create your first page" end + it 'shows all available formats in the dropdown' do + Wiki::VALID_USER_MARKUPS.each do |key, markup| + expect(page).to have_css("#wiki_format option[value=#{key}]", text: markup[:name]) + end + end + it "disables the submit button", :js do page.within(".wiki-form") do fill_in(:wiki_content, with: "") diff --git a/spec/support/shared_examples/features/wiki/user_updates_wiki_page_shared_examples.rb b/spec/support/shared_examples/features/wiki/user_updates_wiki_page_shared_examples.rb index 85490bffc0e..12a4c6d7583 100644 --- a/spec/support/shared_examples/features/wiki/user_updates_wiki_page_shared_examples.rb +++ b/spec/support/shared_examples/features/wiki/user_updates_wiki_page_shared_examples.rb @@ -145,19 +145,6 @@ RSpec.shared_examples 'User updates wiki page' do it_behaves_like 'edits content using the content editor' end - - context 'with feature flag off' do - before do - stub_feature_flags(wiki_switch_between_content_editor_raw_markdown: false) - visit(wiki_path(wiki)) - - click_link('Edit') - - click_button 'Use the new editor' - end - - it_behaves_like 'edits content using the content editor' - end end end |